logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wnętrze tunera Manta DVB-T02

maciej_333 27 Gru 2024 23:30 2451 28

TL;DR LABEL_AI_GENERATED

  • Rozebrano tuner Manta DVB-T02 i sprawdzono jego wnętrze, głowicę MXL5007 oraz układ MSD7818.
  • Do złącza UART dołączono konwerter USB↔UART, ustawiając 115200 b/s, 8N1, i przechwycono pełny start U-Boot oraz systemu.
  • Zasilacz daje +5 V, a pamięć SPI Flash ma 4 MB; w logach pojawia się U-Boot 1.1.6 i pamięć 25FL032.
  • UART ujawnił bootloader, obsługę USB, odczyt pendrive’a, odtwarzanie plików AVI/MP4 oraz uruchomienie tetris i procedury aktualizacji firmware.
  • Konsola U-Boot pozostaje zablokowana, a próby odblokowania utrudnia najpewniej uszkodzony układ panelu przedniego CS1628.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
Słuchaj:
  • Tuner DVB-T Manta z pilotem na drewnianym stole.
    Jakiś czas temu jak wiadomo doszło do wprowadzenia DVB-T2, więc kupiłem nowy tuner. Pozostał mi jednak dotychczas używany tuner Manta DVB-T02. Postanowiłem więc go rozkręcić i zobaczyć, co dzieje się w konsoli UART.

    Fotografie tunera wraz z oryginalnym pilotem:
    Tuner DVB-T Manta z pilotem na drewnianym stole. Pilot do tunera Manta DVB-T02 leży na drewnianym stole. Tylna część tunera Manta DVB-T02 z gniazdami HDMI, SCART i antentowymi.

    Po odkręceniu paru wkrętów:
    Płyta główna tunera DVB-T Manta z widocznymi komponentami.

    Dolna warstwa płyty głównej:
    Dolna warstwa płyty głównej tunera Manta DVB-T02 z widocznymi lutowaniami i ścieżkami.

    Panel przedni:
    Panel przedni tunera Manta DVB-T02 z widoczną płytką elektroniczną. Panel przedni tunera DVB-T Manta z przyciskami i złączem USB.

    Głowica wykonana jest na układzie MXL5007:
    Zbliżenie płyty głównej tunera Manta DVB-T02 z widocznymi komponentami elektronicznymi.
    Nie ma o nim zbyt wiele w Internecie. Datasheet też brak. Ktoś jednak dał radę go uruchomić: Link.

    Cały tuner jak się dosyć szybko okazało jest na układzie MSD7818. Też nie ma o nim zbyt wielu informacji: Link.
    Wnętrze tunera Manta DVB-T02

    Zasilacz to typowy flyback, dostarcza napięcia +5 V. Pozostałe napięcia są wytwarzanie już przez pomocnicze konwertery step-down na płycie.

    Pozostaje dołączyć konwerter USB<->UART do złącza UART na płycie. Od razu widać, że prawdopodobnie będzie to CON1. Od spodu jest opis tego złącza:
    Zbliżenie na zestaw czterech pinów na płytce drukowanej z oznaczeniami: SDA_TX, SCL_RX, GND, NC.
    Problem w tym, że złącze to nie jest do niczego dołączone. Trzeba wstawić dwie zworki, co nie problem ustalić:
    Zbliżenie na płytę główną tunera DVB-T2 z widocznymi kondensatorami i złączem oznaczonym CON1.
    Po wstawieniu innych zworek pewnie da się tu wyprowadzić też I2C. Kolejno po dolutowaniu jakichś goldpinów można dołączyć konwerter. Oczywiście musi być krosowanie RxD i TxD oraz dołączona masa. Całość łatwo uruchomić w programie np. Realterm. Przepływność bitowa to 115200 b/s i format ramki 8N1.

    Teraz najciekawsze, co się tu pokaże? Start i bootowanie tunera:
    Spoiler:
    UART_115200

    BIST0-OK

    _snPDMDrv_PM_RtcGetCounter(CurrentCounter=0)


    Hello U-Boot


    U-Boot 1.1.6 (Jan 31 2012 - 01:43:22)

    Board: MSTAR KRNOUS (CPU Speed 552 MHz)
    DRAM: 64 X 0 MBytes
    U-Boot is running at DRAM 0x87600000
    ###############BOARD CONFIGURATION#####################
    DEFAULT ENBALE L2-Cache
    FPU(ENABLE)
    DDR_FREQUENCY(1066MHz)
    ###############BOARD CONFIGURATION#####################
    Module: USB FAT FLASH SPI LOGO OSD ENV=SERIAL
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    In: serial
    Out: serial
    Err: serial
    MSVC00B000100100208768TH0000000T
    [do_set_paneltype][764] is invoked!!
    MDrv_PNL_Init u32PnlRiuBaseAddr = BF200000
    MDrv_PNL_Init u32PMRiuBaseAddr = BF000000
    MDrv_HDMITx_Init
    Get IOMAP ID:300 Base:BF000000!
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    DAC eTiming =6
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    HDMITx eTiming =7
    MDrv_HDMITx_Exhibit: Create Check Rx timer success!
    HDMITx eTiming =7
    boot_logo=>cmd: spi_rdc 0x80B2C000 0x70000 0x8930
    offset 0x70000, size 0x8930
    WARNING: it is better to set dram start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    initialization done!
    u32ReadBuffVirAddr = A0000000, u32IntBuffVirAddr = A0100000, u32OutBuffVirAddr = A0730000
    verJPD_SetStatus >>>>>>>>>>> w:720, h:576, p:720
    spi_rdc 0x80B00000 0x20000 0x1000
    offset 0x20000, size 0x1000
    WARNING: it is better to set total length aligned to 65536 !!!
    cmd spi_rdc 0x80B00000 0x20000 0x1000 success
    u32UbootInfoAddr: 0x7892F
    K1_INFO_ADDR: 0x80000
    spi_rdc 0x80B00000 0x80000 0x1000
    offset 0x80000, size 0x1000
    WARNING: it is better to set total length aligned to 65536 !!!
    cmd spi_rdc 0x80B00000 0x80000 0x1000 success
    u32LogoMagicFlag ERROR !! return GOP_BUFFER_ADDR
    GE_SetOnePixelMode
    Hit any key to stop autoboot: 0
    Kronus 128-pin package
    Check USB port[0]:
    ??? Waiting for Peripheral Connecting Fail...
    usb init failed
    Error, couldn't init Lowlevel part
    Kronus 128-pin package
    Check USB port[1]:
    ??? Waiting for Peripheral Connecting Fail...
    usb init failed
    Error, couldn't init Lowlevel part
    Kronus 128-pin package
    Check USB port[2]:
    ??? Waiting for Peripheral Connecting Fail...
    usb init failed
    Error, couldn't init Lowlevel part
    WDT Initialize ...
    Start 75F2000 End 769E000
    UnProtect MIU block 0 : 0x75F2000 0x769E000
    offset 0x8001C, size 0x284A14
    WARNING: it is better to set flash start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    in=0x80B00000, in_size=0x284A14, out= 0x80000180, alloc_buf = 0x81000000
    in=0x80B00000, in_size=0x284A14, out= 0x80000180, alloc_buf = 0x81000000
    in_size=2640404 out_size=7232948 unpack_size=0


    LZMA Decompression...CRC_result F5CFD298 CRC_value F5CFD298
    CRC check success !!
    ok

    ## Starting application at 0x80000224 ...
    [cyg_net_init] Init: mbinit(0x00000000)
    [cyg_net_init] Init: cyg_net_init_devs(0x00000000)
    Init device 'pcnet_eth0'
    [cyg_net_init] Init: loopattach(0x00000000)
    [cyg_net_init] Init: ifinit(0x00000000)
    [cyg_net_init] Init: domaininit(0x00000000)
    [cyg_net_init] Init: cyg_net_add_domain(0x8068f040)
    New domain internet at 0x00000000
    [cyg_net_init] Init: cyg_net_add_domain(0x8068ec08)
    New domain route at 0x00000000
    [cyg_net_init] Init: call_route_init(0x00000000)
    [cyg_net_init] Done
    [SysInit][1970]
    [SysInit][1972]
    ****** Customer_info:Before ******
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    abcdef => 0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    ABCDEF => 0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,

    ****** Customer_info ******
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,[SysInit][1974]

    Customer info: 00660630002f000000000000000000000000000408f81800
    Hash: 57896ceada56f7bbb0af9151e38029b1
    Auth OK

    [SysInit][1976]
    Hardware Initialize...
    MDrv_MIOMap_Init
    [HAL_MIU_SetPMIOMapBase][1107] Non implement for MIU _gPM_MapBase= bf000000
    MsOS_Init
    _MApi_SystemInit_CreateMemoryPool
    upoolSize = 320000 and u32Addr = 90E958
    mdrv_gpio_init
    [SysInit][1985]
    MIU Initialize...
    Get IOMap u32NonPmBase = 0xbf200000
    Get IOMap u32PmBase = 0xbf000000
    Disable MIU1
    [SysInit][1993]
    WDT_Init
    [SysInit][2000]
    [SysInit][2003]
    MDrv_WDT_IsReset = 0
    [SysInit][2009]
    [MAPI_MEMINFO] DVBC System Memory Usage
    [MAPI_MEMINFO] ============================ START END SIZE
    [MAPI_MEMINFO] POOL_START 0x00000000 0x016ce800 0x016ce800
    [MAPI_MEMINFO] Cached Pool Start 0x0090e958 0x00c2e958 0x00320000
    [MAPI_MEMINFO] NONCACHED_POOL_START 0x00c2e958 0x016ce800 0x00a9fea8
    [MAPI_MEMINFO]
    [MAPI_MEMINFO] Memory Layout:
    [MAPI_MEMINFO] ============================ START END SIZE
    [MAPI_MEMINFO] XC_MEM_START 0x03d00000 0x04000000 0x00300000
    [MAPI_MEMINFO] MAD_MEM_START 0x03a00000 0x03d00000 0x00300000
    [MAPI_MEMINFO] MVD_MEM_START 0x01d00000 0x03a00000 0x01d00000
    [MAPI_MEMINFO] VE_MEM_START 0x01b60000 0x01d00000 0x001a0000
    [MAPI_MEMINFO] GOP_DMAMEM_START 0x01b5f000 0x01b60000 0x00001000
    [MAPI_MEMINFO] TSP_VQ_START 0x01b5e000 0x01b5f000 0x00001000
    [MAPI_MEMINFO] PM51_MEM_ADR 0x01b5dc00 0x01b5e000 0x00000400
    [MAPI_MEMINFO] PM51_VAR_MEM_ADR 0x01b5d800 0x01b5dc00 0x00000400
    [MAPI_MEMINFO] GOP_GWINMEM_START 0x016ce800 0x01b59800 0x0048b000

    [MAPI_MEMINFO] pFirstAvailableMemory 0x8090e958


    [SysInit][2013]
    [SysInit][2022]
    Hello Hummingbird!!
    _appDemo_Task.iId = 1985216513
    ----------Hello World----------
    -------Welcome to Demo AP------
    >> [_SysInit_InitAPI][1691]SPI Flash Driver Init !!
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    [HAL_AUDIO_AllocateVars], init Shared


    >>

    HAL_MAD_SetMemInfo[DSP_DEC] = 0x03b00000


    HAL_MAD2_SetMemInfo[DSP_SE] = 0x03a00000


    [HAL_AUDSP_DspLoadCode], pau_info->cm_len == 0
    ADEC Done and do default setting 4
    ===== Check Audio Decoder Protection from hash-key IP =====
    Hash-key Support DD.
    Hash-key Support DD+.
    This is Demo Mode!!
    Hash-key Support Generic HE-AAC !!
    ===== Check Protection IP End =====
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    Check Boot Logo OK!! logo_cmd [boot_logo 0 0 1 1]
    Get Boot Panel Type!!
    pEnvStr = set_paneltype 12
    ptr = set_paneltype 12
    ptr+PANEL_CMD_LENGTH = 12
    result = 1
    result = 12
    g_PNL_TypeSel = 12
    eTiming =6
    [MSAPI_XC,Version] 01.74 00486343
    MDrv_PNL_Init u32PnlRiuBaseAddr = bf200000
    MDrv_PNL_Init u32PMRiuBaseAddr = bf000000
    [XC,Version] 00489048
    MDrv_HDMITx_Init
    Get IOMAP ID:300 Base:bf000000!
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    DAC eTiming =6
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    HDMITx eTiming =7
    MDrv_HDMITx_Exhibit: Create Check Rx timer success!
    Wait V Sync!!
    GE_SetOnePixelMode
    driver GE init ok
    [_SysInit_GEGOP][1263]
    [_SysInit_GEGOP][1272]
    [_SysInit_GEGOP][1298]driver GOP0 init ok
    [_SysInit_GEGOP][1298]driver GOP1 init ok
    [_SysInit_GEGOP][1298]driver GOP2 init ok
    Path2
    Set to Mixer
    GE_Init and VE setting done
    BASEADDRESS_STRING_DATABASE_IN_FLASH = 00370000
    BASEADDRESS_BITMAP_DATABASE_IN_FLASH = 00370000
    BASEADDRESS_GENSETTING_IN_FLASH = 00370000
    BASEADDRESS_CURRENT_DTV_ORDER_IN_FLASH = 00380000
    BASEADDRESS_CH_DATABASE_IN_FLASH = 00390000
    BASEADDRESS_MOSAIC_IN_FLASH = 003D0000
    BASEADDRESS_TFCA_MAIL_IN_FLASH = 003E0000
    NUMBER_OF_CURRENT_DTV_PROGRAM = 00001000
    USB init
    MDrv_Usb_Init..
    Usb init
    The base address is 0xA16AE000
    Base addr is 0xA16AE000
    Top addr is 0xA16BDFFF
    Pages per pool is 16
    Bit map base addr is 0xa16ad7d0
    usb_init start
    usb_hcd_cpe_ehci_probe
    ehci: 80c2b7c0
    hcd: 80c2b7f4
    The allocated addr is 0xa16ae000, bit_map[0] is 0xFFFFFFFE
    qh: a16ae000, qh->qh_dma: 16ae000
    The allocated addr is 0xa16af000, bit_map[0] is 0xFFFFFFFC
    The allocated addr is 0xa16b0000, bit_map[0] is 0xFFFFFFF8
    qh: 16ae000
    usb_new_device
    usb_set_address before
    usb_set_address after
    The allocated addr is 0xa16b1000, bit_map[0] is 0xFFFFFFF0
    InitUSBIntr enter
    Usb start..
    MDrv_Usb_Done ...........UsbTask..
    ......................................
    >>> Allocate Addr = A16AA6C0 , FwPhyAddr = 016AA700
    ************************ Start TSP_Init ************************
    <FWTSP> : >> FwVersion:001B210E , Date:20100918
    ************************* End TSP_Init *************************
    [MApi_SI_System_Startup] OK !!
    [AP_NC_Alloc] Size = 1010
    [AP_C_Alloc] Size = 6be00
    [AP_NC_Alloc] Size = c8cf
    MApi_DigiTuner_Init mutex id 1985216537
    MDrv_IIC_Init PORT 1
    MDrv_IIC_InitPort0: FAIL
    MApi_VectorFont_Init total size=3276800, free size=2815824, large size=2815780
    alloc mem 0x330c
    alloc mem 0x1f14
    SysInit done .................................................
    into _appMain_Task
    [MApp_CheckFlash][1170] s8SN0 = 1
    MApi_DB_CM_LoadDTVProgramDatabaseFromFlash -- u16Index[1] [4096]
    MApi_DB_CM_InitDTVDataManager: m_eCurrentServiceType = 1
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfTV = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfRadio = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfMosaic = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfNvod_Ref = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfNvod_TimeShifted = 0

    MXL5007T SetTuner

    MXL5007 SetTuner dwFreq = -1000, ucBw = 8
    MxL_RFSynth_Lock_Status = 0xc
    RFSynth bLock = 1
    REFSynth bLock = 1
    Tuner Success
    into appMain_AddApp
    [ZUI] init: sz_msg_q=6216
    fix appTV_GetInfo before using
    SCART ON, CVBS ON, RGB ON
    [msCHIP_DAC_SetOutputSource][79] input bitmap: 0x00000011
    CVBS on
    SVIDEO off, YPBPR off, RGB on
    SCART on
    problem happen
    App_GetTVFormat:[0]

    MDrv_HDMITx_SetAVMUTE
    tvvideo_SetDCOutputTiming : 0, 1
    Check the Source type 6
    [tvvideo_SetDCOutputTiming][469]: ## Change Resolution ##, eCompType = 6
    [msAPI_XC_ReMapComponentType][245]: msAPI_XC eTiming = 6
    DAC eTiming =6
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    HDMITx eTiming =7
    into appMain_AddApp
    into appMain_AddApp
    into appMain_AddApp
    [+]MApi_EpgDB_Init
    [AP_NC_Alloc] Size = 50
    [AP_NC_Alloc] Size = 5
    [AP_NC_Alloc] Size = 190
    [AP_NC_Alloc] Size = 3e8
    [AP_NC_Alloc] Size = b40
    [AP_NC_Alloc] Size = 9d80
    [AP_NC_Alloc] Size = 14000
    [AP_NC_Alloc] Size = 1d4c0
    [AP_NC_Alloc] Size = 1f5f40
    [AP_NC_Alloc] Size = c8
    [AP_NC_Alloc] Size = 2000
    [AP_NC_Alloc] Size = 2000
    [AP_NC_Alloc] Size = 4e0000
    [EPGDB][000692] =========================================================================
    [EPGDB][000693] _pu16SrvMappingTable: (Start, End, Length)= (0xa14e2940, 0xa14e2990, 0x00000050)
    [EPGDB][000694] _pu8EitBufMask: (Start, End, Length)= (0xa14e2920, 0xa14e2925, 0x00000005)
    [EPGDB][000695] _pMapBufIdxTable: (Start, End, Length)= (0xa14e2780, 0xa14e2910, 0x00000190)
    [EPGDB][000696] _pu8EpgDbEvtMask (Start, End, Length)= (0xa14e2380, 0xa14e2768, 0x000003e8)
    [EPGDB][000697] _pu8EpgDbScheHdrList (Start, End, Length)= (0xa14e1830, 0xa14e2370, 0x00000b40)
    [EPGDB][000698] _pu8EpgDbSrvEvtList (Start, End, Length)= (0xa14d7aa0, 0xa14e1820, 0x00009d80)
    [EPGDB][000699] _pu8EpgDbSrvSecList (Start, End, Length)= (0xa14c3a90, 0xa14d7a90, 0x00014000)
    [EPGDB][000700] _pu8EpgDbEvtHdrList (Start, End, Length)= (0xa14a65c0, 0xa14c3a80, 0x0001d4c0)
    [EPGDB][000701] _pu8EpgDbEvtNameList (Start, End, Length)= (0xa12b0670, 0xa14a65b0, 0x001f5f40)
    [EPGDB][000702] _pu8EpgDbPfHdrList (Start, End, Length)= (0xa12b0590, 0xa12b0658, 0x000000c8)
    [EPGDB][000703] _pu8EpgDbPfPresent (Start, End, Length)= (0xa12ae580, 0xa12b0580, 0x00002000)
    [EPGDB][000704] _pu8EpgDbPfFollow (Start, End, Length)= (0xa12ac570, 0xa12ae570, 0x00002000)
    [EPGDB][000708] _pu8EpgDbScheExtStrBuf (Start, End, Length)= (0xa0dcc560, 0xa12ac560, 0x004e0000)
    [EPGDB][000710] EPG database allocate 0x00716355 bytes
    [EPGDB][000716] =========================================================================
    [-]MApi_EpgDB_Init
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    MApp_ZUI_ACT_StartupOSD TV_PROG
    [MApp_ZUI_ACT_PrepareOSDPage][436]MS_COMPONENT_OUTPUT_TYPE : 6
    fix _MApp_ZUI_SetupDisplayList before using
    SD: 720 x 576, HD: 960 x 1080
    leave MApp_ZUI_API_InitCanvasGDI -> MApp_ZUI_API_GetFontMVF in 131
    Set PAL
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    SD Gwin = 4
    disp[1]'s FBID = 2
    HD Gwin = 0
    [MApp_ZUI_ACT_PrepareOSDPage][436]_Zapper_Disable_AV: Enter at 4228.
    alloc mem 0x40000
    alloc mem 0x2400
    alloc mem 0x2000
    alloc mem 0x1000


    Widać, że jest tu bootloader U-boot: Link. Jednak nie wiele daje ta informacja, bo wszystkie polecenia są i tak zablokowane. Po wpisaniu help i wciśnięciu ENTER:
    Spoiler:
    help
    ------------------------------------help--------------------------------------
    press "HelpTemplate" to show demo Template cmds
    press "Help" to show Help
    press "HelpGOP" to show demo GOP cmds
    press "HelpGE" to show demo GE cmds
    press "HelpGE_More" to show more demo GE cmds
    press "HelpTV" to show demo AV cmds
    press "HelpTV_More" to show more demo AV cmds
    press "HelpXC" to show demo XC cmds
    press "DMX_Help" to show demo DMX cmds
    press "HelpVideo" to show demo Video cmds
    press "HelpSMC" to show demo smart card cmds
    press "HelpIR" to show demo IR cmds
    press "HelpAudio" to show demo Audio cmds
    ---------------------------------End of help----------------------------------


    >> help, OK
    >>
    >>

    Żadna z tych komend nie jest rozpoznawana. Podobno można coś tam rozblokować po przytrzymaniu dowolnego klawisza przez jakiś czas: Link, aż przesłany będzie tekst "<< MStar >>". Jednak niestety w moim egzemplarzu klawiatura nie działa, bo uszkodzony jest najprawdopodobnie układ z panelu przedniego, czyli CS1628: Link.
    Schemat pinów układu scalonego z opisanymi funkcjami każdego wyprowadzenia.
    Zasilanie do niego dochodzi, masa też. Taśma nie jest przerwana. Nic więcej nie sprawdzałem. Może ktoś ma płytkę z tym układem?

    Kolejno można zobaczyć co się dzieje po wsunięciu i wysunięciu pendrive:
    Spoiler:
    hub_irq hcd->product_desc: CPE_AMBA EHCI
    USB is connect
    hub event
    get hub event
    portstatus: 1, portchange:1
    hub_port_connect_change
    port 1, status 1, change 1, 12 Mb/s
    hcd->product_desc: (CPE_AMBA EHCI)
    Reset root hub port
    HOST200_main
    Add CSC
    hub_irq hcd->product_desc: CPE_AMBA EHCI
    PortReset: UTMI 0xbf205400, UHC 0xbf220600
    speed: 2
    RESET temp: f
    usb_new_device
    usb_set_address before
    qh: a16ae080, qh->qh_dma: 16ae080
    usb_set_address after
    get hub event
    portstatus: 403, portchange:2
    found a Mass Storage device, try to init it
    RemoveUSBDiskPort: Can't find match Port:0 Lun:0
    qh: a16ae100, qh->qh_dma: 16ae100
    qh: a16ae180, qh->qh_dma: 16ae180
    Connect USB disk /dev/sdp/
    Port:0 Lun:0 Id:8
    USB Call Back Event 01 Parameter 1 /dev/sdp/
    [_USB_Callback_Test][283] Plug Event happen
    [_USB_Callback_Test][307] Mass Storage /dev/sdp/1
    LUN 0 is init ok
    MSC plug in
    TvBanner_DisplayUsbStatus,1232,u8Event : 1


    Spoiler:
    Add CSC
    hub_irq hcd->product_desc: CPE_AMBA EHCI
    USB port disconnect
    get hub event
    Add CSC here
    portstatus: 0, portchange:3
    hub_port_connect_change
    port 1, status 0, change 3, 12 Mb/s
    storage_disconnect() : ustor_id: 0
    RemoveUSBDiskPort:0 0 8
    Remove USB disk /dev/sdp/
    USB Call Back Event 02 Parameter 1 /dev/sdp/
    [_USB_Callback_Test][318] UnPlug Event happen
    usb_start_wait_urb retv:19
    No device is connecting
    TvBanner_DisplayUsbStatus,1232,u8Event : 2


    Kolejno można np. spróbować odtworzyć jakiś film lub zobaczyć co jest zapisane na pendrive:
    Spoiler:
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    [MApp_ZUI_ACT_PrepareOSDPage][436][MApp_ZUI_ACT_StartupOSD][943][MApp_ZUI_ACT_StartupOSD][945]MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    [MApp_ZUI_ACT_PrepareOSDPage][436]MDrv_WDT_Disable
    _Zapper_Disable_AV: Enter at 3319637.
    [AP_NC_Free] Addr = a14e2940
    [AP_NC_Free] Addr = a14e2920
    [AP_NC_Free] Addr = a14e2780
    [AP_NC_Free] Addr = a14e2380
    [AP_NC_Free] Addr = a14e1830
    [AP_NC_Free] Addr = a14d7aa0
    [AP_NC_Free] Addr = a14c3a90
    [AP_NC_Free] Addr = a14a65c0
    [AP_NC_Free] Addr = a12b0670
    [AP_NC_Free] Addr = a12b0590
    [AP_NC_Free] Addr = a12ae580
    [AP_NC_Free] Addr = a12ac570
    [AP_NC_Free] Addr = a0dcc560

    Detect Device plug in

    [938] 8 0 8

    [955] 8
    _Browser_DetectAllDeviceInfoWithNoFreeSize ===>
    /dev/sdp/1
    -------------- /dev/sdp/1 -------------
    Section size = 512
    Part number 1
    00: (Type, Size(MB)) = (0x0b, 7401)

    [938] 8 0 8

    [955] 8
    u8Handle = 2
    _Browser_DetectCurrentDevDiskInfo ===>
    /dev/sdp/1
    -------------- /dev/sdp/1 -------------
    Section size = 512
    Part number 1
    00: (Type, Size(MB)) = (0x0b, 7401)
    Partition full name = /dev/sdp/1
    MountName = /Usb1/C
    ###start 3325070 #####
    Fs Name = fatfs

    [3471]Mount /Usb1/C

    [3512] 0 8

    [3521] 4
    ###end 3325079 #####

    =====================Partition========================
    Root Path/Usb1/C
    00000 No File name

    =============================================
    [MApp_ZUI_ACT_PrepareOSDPage][436]tvvideo_SetDCOutputTiming : 0, 0
    Check the Source type 6
    [msAPI_XC_GetComponentType][219]: MS_COMPONENT_OUTPUT_TYPE =6
    [HAL_MIU_SetPMIOMapBase][1107] Non implement for MIU _gPM_MapBase= bf000000
    MM codec Mail Box create OK!!

    MM codec Mail Box create OK!!

    _u32VDPlayerDateMEM-----[0xa0fbce10]PA[0xfbce10]KSEG1[0xa0fbce10]
    _u32VDPlayerSubtitleBitstreamMEM-----[0xa0e6ce00]
    _u32VDPlayerMP4SUBBUFMEM-----[0xa0d1cdf0]
    _u32VDPlayerMP4SUBTAGMEM-----[0xa0cfede0]
    [HAL_MIU_SetPMIOMapBase][1107] Non implement for MIU _gPM_MapBase= bf000000
    [HAL_AUDIO_AllocateVars], init Shared
    --- MediaCodec AppMain ------------
    MM TaskEntry
    HAL_MAD_SetCommInfo: infoType[3,0,0] not Supported
    Open dir /Usb1/C

    ====================Open Dir=========================
    Path:/Usb1/C
    0000 HBPVR
    @:0
    0001 NewFolder1
    @:0
    0002 Music
    @:0
    0003 Podcasts
    @:0
    0004 Ringtones
    @:0
    0005 Notifications
    @:0
    0006 Pictures
    @:0
    0007 Movies
    @:0
    0008 Recordings
    @:0
    0009 meritum 2
    @:0
    0010 meritum_schemat
    @:0
    0011 bhp
    @:0
    0012 System Volume Information
    @:0
    0013 Morfina (2008) [Lektor PL].avi
    @:0
    0014 9 kompania - 9 ?o?? (2005) Lektor.avi
    @:0
    0015 Planeta Bur - Planeta Burz (1962) [napisy pl].avi
    @:0
    0016 1990.01.01 - Wiadomo?ci.avi
    @:0
    0017 PORUCZNIK KABURA (WSZYSTKIE ODCINKI) (re?. Bartosz Walaszek) _ CDA Premium.mp4
    @:0
    0018 Trzeci Cz?owiek - The Third Man (1949) - Lektor PL.avi
    @:0
    0019 W?atcy M?ch - Lekcja 85 - Magiczne moce 576p ipla marginesy.mp4
    @:0
    0020 W?atcy M?ch - Lekcja 117 - M??ynek Bambo 576p ipla.mp4
    @:0
    0021 W?atcy M?ch - Lekcja 63 - B?dowa, placek i spl?wa 576p ipla.mp4
    @:0
    0022 W?atcy M?ch - Lekcja 80 - ?ospa Wieczna 576p ipla marginesy.mp4
    @:0

    =============================================
    ###File list 0 #### eSortType 2
    fix MApp_TVPreview_InitContext before using
    rect left[688], top[138], width[500], height[276]

    [938] 8 0 8

    [955] 8
    <HB> MM_SetHDMISpdifOutput sysspdif 1


    [6986] _MediaPlay_PlaybackCb 15


    msAPI_MM_PlayTimeMan_Init!!!!!! <HB> MM_SetHDMISpdifOutput sysspdif 1

    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x11][0x0]
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x11][0x0]

    Customer info: 00660630002f000000000000000000000000000408f81800
    Hash: 57896ceada56f7bbb0af9151e38029b1
    Auth OK

    DRM model id: 0x0 0x0
    Bit2MVD:0, Data2MVD:0
    StrmHdl[0], FileSize[0x0][0x6279c20]
    StrmHdl[1], FileSize[0x0][0x6279c20]
    First element in file is not GUID_HEADER
    First element in file is not EBML
    File format : FILE_FORMAT_AVI

    Subtitle Queue Size:128(128)
    Audio Queue Size:4096(4096)
    Video Queue Size:2048(2048)
    Frame Info Buffer:0x81037000 Size:0x200000
    Index Buffer:0x80fe4000 Size:0x20000
    FB Memory: 25f800
    Choose Audio Track ID: 0, Stream ID: 1, Codec ID: 2000041
    MApi_VDEC_ResetPTS(0)
    Framebuffer MemoryUsage 0x25f800
    **Note**: Borrow 4M Memory form Framebuffer as Bitstreambuffer
    Bit2MVD:1, Data2MVD:1
    Bit2MVD:1, Data2MVD:1
    Initialize MPEG4 HW:TimeStampType:2; FrameRate:25; FrameRateBase:1
    MApi_VDEC_Init() Success!!
    Choose Audio Track ID: 0, Stream ID: 1, Codec ID: 2000041
    MApi_VDEC_ResetPTS(0)
    MApi_VDEC_StepDisp
    Size(432x234), Disp(22464x16614), Par(52x71), FrameRate:25000, Interlace:0
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x1][0x1]
    VideoType[0], VideoCodecID[0x1000100] AudioCodecID[0x2000041]
    MB_VDPLAYER_SETUP_DISPLAY[0][0]
    [HAL_MIU_MaskReq][636] there is no MIU1 for Kronus
    msAPI_VDPlayer_Play
    MB_VDPLAYER_AUDIO_INIT[0x2000041]
    ===== Check Audio Decoder Protection from hash-key IP =====
    Hash-key Support DD.
    Hash-key Support DD+.
    This is Demo Mode!!
    Hash-key Support Generic HE-AAC !!
    ===== Check Protection IP End =====
    ===== Check Audio Decoder Protection from hash-key IP =====
    Hash-key Support DD.
    Hash-key Support DD+.
    This is Demo Mode!!
    Hash-key Support Generic HE-AAC !!
    ===== Check Protection IP End =====
    Audio Start

    MB_VDPLAYER_AUDIO_START[0]
    timo set E_VDP_PLAY_SPEED_X1
    MApi_VDEC_StepDisp
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x10][0x0]
    MApi_VDEC_IsStepDispDone
    MApi_VDEC_SetSpeed(0, 1)
    MApi_VDEC_Play
    FRC u32OutputRate 25 u32VSyncRate 25
    MApi_VDEC_SetControl FRC_OUTPUT Set OutputRate 25 Get OutputRate 0
    MApi_VDEC_SetControl DISP_ONE_FIELD 0
    MApi_VDEC_SetControl FRC_DROP_TYPE (Frame or Field) 0
    MB_VDPLAYER_SET_DISPLAY_INFO[c350][1][0]
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x18][0x1]
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x18][0x1]

    [6986] _MediaPlay_PlaybackCb 16
    <HB> MM_SetHDMISpdifOutput sysspdif 1

    tvvideo_SetDCOutputTiming : 0, 0
    Check the Source type 6
    [msAPI_XC_GetComponentType][219]: MS_COMPONENT_OUTPUT_TYPE =6
    ##############eAS=3
    ####[tvvideo_SetAspectRatio][1361] u16PicWidth = 432
    ####[tvvideo_SetAspectRatio][1362] u16PicHeight = 234
    ####[tvvideo_SetAspectRatio][1363] _setting[eCompType].u16Width = 1920
    ####[tvvideo_SetAspectRatio][1364] _setting[eCompType].u16Height = 1080
    w:1920 h:1080
    =====MS_ASPECT_RATIO_43_LB!=====
    g_bIsPreviewEnable == TRUE
    msAPI_VDPlayer_Stop
    VPTS:8560; APTS:8508; V:1553; A:2387

    Audio Stop

    MApi_VDEC_Flush(E_VDEC_FREEZE_AT_CUR_PIC)
    To Close TSP Success!!
    Error code 0; Stop Pos:0x08e320 Time:8503
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x11][0x0]

    [938] 8 0 8

    [955] 8

    =====================Partition========================
    Root Path/Usb1/C
    00000 No File name

    =============================================

    [938] 8 0 8

    [955] 8
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x11][0x0]
    MB_VDPLAYER_ACK_COPROCESSOR_TO_HK[0x11][0x0]
    Delete Task Succed!!

    Mediacodec Task Exit ......

    [938] 8 0 8

    [955] 8
    [MApp_ZUI_ACT_PrepareOSDPage][436]_Browser_DetectAllDeviceInfoWithNoFreeSize ===>
    MDrv_WDT_IsReset = 0

    [938] 8 0 8

    [955] 8
    Unmount Disk = /Usb1/C

    [919]Unmount /Usb1/C

    [938] 8 0 8

    [955] 8
    [+]MApi_EpgDB_Init
    [AP_NC_Alloc] Size = 50
    [AP_NC_Alloc] Size = 5
    [AP_NC_Alloc] Size = 190
    [AP_NC_Alloc] Size = 3e8
    [AP_NC_Alloc] Size = b40
    [AP_NC_Alloc] Size = 9d80
    [AP_NC_Alloc] Size = 14000
    [AP_NC_Alloc] Size = 1d4c0
    [AP_NC_Alloc] Size = 1f5f40
    [AP_NC_Alloc] Size = c8
    [AP_NC_Alloc] Size = 2000
    [AP_NC_Alloc] Size = 2000
    [AP_NC_Alloc] Size = 4e0000
    [EPGDB][000692] =========================================================================
    [EPGDB][000693] _pu16SrvMappingTable: (Start, End, Length)= (0xa14e2940, 0xa14e2990, 0x00000050)
    [EPGDB][000694] _pu8EitBufMask: (Start, End, Length)= (0xa14e2920, 0xa14e2925, 0x00000005)
    [EPGDB][000695] _pMapBufIdxTable: (Start, End, Length)= (0xa14e2780, 0xa14e2910, 0x00000190)
    [EPGDB][000696] _pu8EpgDbEvtMask (Start, End, Length)= (0xa14e2380, 0xa14e2768, 0x000003e8)
    [EPGDB][000697] _pu8EpgDbScheHdrList (Start, End, Length)= (0xa14e1830, 0xa14e2370, 0x00000b40)
    [EPGDB][000698] _pu8EpgDbSrvEvtList (Start, End, Length)= (0xa14d7aa0, 0xa14e1820, 0x00009d80)
    [EPGDB][000699] _pu8EpgDbSrvSecList (Start, End, Length)= (0xa14c3a90, 0xa14d7a90, 0x00014000)
    [EPGDB][000700] _pu8EpgDbEvtHdrList (Start, End, Length)= (0xa14a65c0, 0xa14c3a80, 0x0001d4c0)
    [EPGDB][000701] _pu8EpgDbEvtNameList (Start, End, Length)= (0xa12b0670, 0xa14a65b0, 0x001f5f40)
    [EPGDB][000702] _pu8EpgDbPfHdrList (Start, End, Length)= (0xa12b0590, 0xa12b0658, 0x000000c8)
    [EPGDB][000703] _pu8EpgDbPfPresent (Start, End, Length)= (0xa12ae580, 0xa12b0580, 0x00002000)
    [EPGDB][000704] _pu8EpgDbPfFollow (Start, End, Length)= (0xa12ac570, 0xa12ae570, 0x00002000)
    [EPGDB][000708] _pu8EpgDbScheExtStrBuf (Start, End, Length)= (0xa0dcc560, 0xa12ac560, 0x004e0000)
    [EPGDB][000710] EPG database allocate 0x00716355 bytes
    [EPGDB][000716] =========================================================================
    [-]MApi_EpgDB_Init
    [MApp_ZUI_ACT_PrepareOSDPage][436][MApp_ZUI_ACT_PrepareOSDPage][436]_Zapper_Disable_AV: Enter at 3358979.


    Uruchomienie gry tetris (tuner ma jeszcze kilka gier):
    Spoiler:
    [MApp_ZUI_ACT_PrepareOSDPage][436][MApp_ZUI_ACT_StartupOSD][943][MApp_ZUI_ACT_StartupOSD][945]MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    [MApp_ZUI_ACT_PrepareOSDPage][436]_Zapper_Disable_AV: Enter at 3527686.
    MS_COMPONENT_OUTPUT_TYPE : 6
    fix _MApp_ZUI_SetupDisplayList before using
    SD: 720 x 576, HD: 960 x 1080
    leave MApp_ZUI_API_InitCanvasGDI -> MApp_ZUI_API_GetFontMVF in 131
    Set PAL
    SD Gwin = 4
    disp[1]'s FBID = 2
    HD Gwin = 0
    ---
    ---
    =====
    ---
    ---
    =====
    ---
    ---
    ---
    ---
    ---
    ---
    ---
    ---
    ---
    ---
    =====
    ---
    ---
    =====
    ---
    ---
    Free pTetrisTaskStack #2


    Można jeszcze spróbować wgrać jakieś inne firmware:
    Spoiler:
    [MApp_ZUI_ACT_PrepareOSDPage][423][MApp_ZUI_ACT_StartupOSD][908][MApp_ZUI_ACT_StartupOSD][910]USB1 is not ready.

    DApi_FS_GetFileName
    1,C:/
    2,C:/[MApp_ShareEnv_LoadEnv][220]ERROR loading Env. EnvInfo = a16be7f0
    [MApp_ShareEnv_EnvSet][414]SetEnv : OAD_NEED_UPGRADE = 0
    [MApp_ShareEnv_EnvSet][414]SetEnv : OAD_NEED_SCAN = 0
    [MApp_ShareEnv_EnvSet][414]SetEnv : USBUpdateFlag = 0
    [MApp_ShareEnv_EnvSet][414]SetEnv : usb_upgrade = 1
    [MApp_ShareEnv_EnvSet][414]SetEnv : usb_upgrade_port = 0
    [MApp_ShareEnv_EnvSet][414]SetEnv : partno = 1
    [MApp_ShareEnv_EnvSet][414]SetEnv : usb_upgrade_path = usb_upgrade_all_flash_2.bin
    [_crc32][127]CRC check Value = 7ABE09C8
    [_WriteFlash][32]Write Flash Addr = 0x003F0000 , Size = 0x003F0000
    [_WriteFlash][32]Write Flash Addr = 0x003E0000 , Size = 0x003E0000
    [MApp_ShareEnv_StoreEnv][298]Memory Free for Env structure : Addr = A0CBC4F0 , Size = 00010000
    UART_115200

    BIST0-OK

    _snPD


    PmRtcParam.u32RtcGetCounter=0x0000



    PmRtcParam.u32RtcGetMatchCounter=0x0000


    Hello U-Boot


    U-Boot 1.1.6 (Aug 16 2011 - 07:19:22)

    Board: MSTAR KRNOUS (CPU Speed 552 MHz)
    DRAM: 64 X 0 MBytes
    U-Boot is running at DRAM 0x87600000
    Module: USB FAT FLASH SPI LOGO OSD ENV=SERIAL
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    In: serial
    Out: serial
    Err: serial
    MSVC00B000100100208768TH0000000T
    [do_set_paneltype][551] is invoked!!
    MDrv_PNL_Init u32PnlRiuBaseAddr = BF200000
    MDrv_PNL_Init u32PMRiuBaseAddr = BF000000
    MDrv_HDMITx_Init
    Get IOMAP ID:300 Base:BF000000!
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    DAC eTiming =6
    HDMITx eTiming =7
    MDrv_HDMITx_Exhibit: Create Check Rx timer success!
    HDMITx eTiming =7
    =>cmd: spi_rdc 0x80B2C000 0x20000 0x80
    offset 0x20000, size 0x80
    WARNING: it is better to set dram start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    initialization done!
    logo addr in spi: 0xBFC70000; logo size:0xD470
    =>cmd: spi_rdc 0x80B2C000 0x70000 0xD470
    offset 0x70000, size 0xD470
    WARNING: it is better to set dram start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    u32ReadBuffVirAddr = A0000000, u32IntBuffVirAddr = A0100000, u32OutBuffVirAddr = A0730000
    verJPD_SetStatus >>>>>>>>>>> w:720, h:576, p:720
    GFX init--
    GE_SetOnePixelMode
    Hit any key to stop autoboot: 0
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    Write addr=0x003E0000, size=0x00010000
    Write addr=0x003F0000, size=0x00010000
    Kronus 128-pin package
    Check USB port[0]:
    Host type:2
    scanning bus for devices... 1 USB Device(s) found
    scanning bus for storage devices... bulk max packet size:200
    usb_stor_Bulk_max_lun: 0
    init_part begin
    init_part end
    1 Storage Device(s) found
    reading usb_upgrade_all_flash_2.bin

    1 bytes read
    [MAPI PNL][000880] Initialization more than once
    GFX init--
    GE_SetOnePixelMode
    driver GE init ok
    DAC eTiming =6
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    HDMITx eTiming =7
    HDMITx eTiming =7
    GOP_GWIN_Set_STRETCHWIN Horizonal Src: 1920 Des 1920
    GOP_GWIN_Set_STRETCHWIN Vertical Src: 1080 Des 1080
    GWIN width:1920, height:1080
    reading usb_upgrade_all_flash_2.bin

    3076888 bytes read

    >> cusid 169b 1 1

    >> spi_wrc 0x80001000 0 2ee314
    offset 0x0, size 0x2EE314
    WARNING: it is better to set dram start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    Erasing...
    Writing...
    Verifying...OK !!!

    >> setenv usb_complete 1

    >> setenv usb_upgrade 0

    >> setenv bootcmd ' spi_rdc 0x80b00000 0x8001c 0x26e2f5; LzmaDec 0x80b00000 0x26e2f5 0x80000180 0x81000000; go 0x80000224;

    >> saveenv
    Saving Environment to spiflash...
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    Write addr=0x003E0000, size=0x00010000
    Write addr=0x003F0000, size=0x00010000

    >> reset
    UART_115200

    BIST0-OK

    _snPD


    PmRtcParam.u32RtcGetCounter=0x0000



    PmRtcParam.u32RtcGetMatchCounter=0x0000


    Hello U-Boot


    U-Boot 1.1.6 (Aug 16 2011 - 07:19:22)

    Board: MSTAR KRNOUS (CPU Speed 552 MHz)
    DRAM: 64 X 0 MBytes
    U-Boot is running at DRAM 0x87600000
    Module: USB FAT FLASH SPI LOGO OSD ENV=SERIAL
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    In: serial
    Out: serial
    Err: serial
    MSVC00B000100100208768TH0000000T
    [do_set_paneltype][551] is invoked!!
    MDrv_PNL_Init u32PnlRiuBaseAddr = BF200000
    MDrv_PNL_Init u32PMRiuBaseAddr = BF000000
    MDrv_HDMITx_Init
    Get IOMAP ID:300 Base:BF000000!
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    DAC eTiming =6
    HDMITx eTiming =7
    MDrv_HDMITx_Exhibit: Create Check Rx timer success!
    HDMITx eTiming =7
    =>cmd: spi_rdc 0x80B2C000 0x20000 0x80
    offset 0x20000, size 0x80
    WARNING: it is better to set dram start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    Flash is detected (0x0703, 0xEF, 0x40, 0x16)
    initialization done!
    logo addr in spi: 0xBFC70000; logo size:0xD470
    =>cmd: spi_rdc 0x80B2C000 0x70000 0xD470
    offset 0x70000, size 0xD470
    WARNING: it is better to set dram start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    u32ReadBuffVirAddr = A0000000, u32IntBuffVirAddr = A0100000, u32OutBuffVirAddr = A0730000
    verJPD_SetStatus >>>>>>>>>>> w:720, h:576, p:720
    GFX init--
    GE_SetOnePixelMode
    Hit any key to stop autoboot: 0
    Kronus 128-pin package
    Check USB port[0]:
    Host type:2
    scanning bus for devices... 1 USB Device(s) found
    scanning bus for storage devices... bulk max packet size:200
    usb_stor_Bulk_max_lun: 0
    init_part begin
    init_part end
    1 Storage Device(s) found
    do fat ls:argc:3, vendor:SanDisk hbpvr/
    newfolder1/
    523812 mm_play_time.ini
    music/
    podcasts/
    ringtones/
    notifications/
    pictures/
    movies/
    recordings/
    meritum 2/
    meritum_schemat/
    bhp/
    system volume information/
    714154384 morfina (2008) [lektor pl].avi
    18990243 komputerowe_systemy_pomiarowe.pptx
    1463703684 9 kompania - 9 @ob0 (2005) lektor.avi
    1468350464 planeta bur - planeta burz (1962) [napisy pl].avi
    35732 planeta bur - planeta burz (1962) [napisy pl].txt
    103259168 1990.01.01 - wiadomo[ci.avi
    447512261 porucznik kabura (wszystkie odcinki) (re|. bartosz walaszek) _ cda premium.mp4
    1464082432 trzeci czbowiek - the third man (1949) - lektor pl.avi
    29169641 magic-dosbox-v- v1.0.96.apk
    117554095 wbatcy móch - lekcja 85 - magiczne moce 576p ipla marginesy.mp4
    195777091 wbatcy móch - lekcja 117 - mó|ynek bambo 576p ipla.mp4
    120763448 wbatcy móch - lekcja 63 - bódowa, placek i splówa 576p ipla.mp4
    107783578 wbatcy móch - lekcja 80 - aospa wieczna 576p ipla marginesy.mp4
    3164628 usb_upgrade_all_flash.bin
    3076888 usb_upgrade_all_flash_2.bin

    16 file(s), 13 dir(s)

    WDT Initialize ...
    Start 75F2000 End 76AA000
    UnProtect MIU block 0 : 0x75F2000 0x76AA000
    offset 0x8001C, size 0x26E2F5
    WARNING: it is better to set flash start addr aligned to 65536 !!!
    WARNING: it is better to set total length aligned to 65536 !!!
    in=0x80B00000, in_size=0x26E2F5, out= 0x80000180, alloc_buf = 0x81000000
    in=0x80B00000, in_size=0x26E2F5, out= 0x80000180, alloc_buf = 0x81000000
    in_size=2548469 out_size=7188980 unpack_size=0


    LZMA Decompression...CRC_result F717C6D CRC_value F717C6D
    CRC check success !!
    ok

    ## Starting application at 0x80000224 ...
    [cyg_net_init] Init: mbinit(0x00000000)
    [cyg_net_init] Init: cyg_net_init_devs(0x00000000)
    Init device 'pcnet_eth0'
    [cyg_net_init] Init: loopattach(0x00000000)
    [cyg_net_init] Init: ifinit(0x00000000)
    [cyg_net_init] Init: domaininit(0x00000000)
    [cyg_net_init] Init: cyg_net_add_domain(0x8067c6e8)
    New domain internet at 0x00000000
    [cyg_net_init] Init: cyg_net_add_domain(0x8067c2b0)
    New domain route at 0x00000000
    [cyg_net_init] Init: call_route_init(0x00000000)
    [cyg_net_init] Done
    ****** Customer_info:Before ******
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    abcdef => 0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    ABCDEF => 0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,

    ****** Customer_info ******
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,
    0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,0xbx,Hardware Initialize...
    MDrv_MIOMap_Init
    MsOS_Init
    _MApi_SystemInit_CreateMemoryPool
    upoolSize = 320000 and u32Addr = 9003F0
    mdrv_gpio_init
    MIU Initialize...
    Get IOMap u32NonPmBase = 0xbf200000
    Get IOMap u32PmBase = 0xbf000000
    Disable MIU1
    WDT_Init
    MDrv_WDT_IsReset = 0
    [MAPI_MEMINFO] DVBC System Memory Usage
    [MAPI_MEMINFO] ============================ START END SIZE
    [MAPI_MEMINFO] POOL_START 0x00000000 0x016ce800 0x016ce800
    [MAPI_MEMINFO] Cached Pool Start 0x009003f0 0x00c203f0 0x00320000
    [MAPI_MEMINFO] NONCACHED_POOL_START 0x00c203f0 0x016ce800 0x00aae410
    [MAPI_MEMINFO]
    [MAPI_MEMINFO] Memory Layout:
    [MAPI_MEMINFO] ============================ START END SIZE
    [MAPI_MEMINFO] XC_MEM_START 0x03d00000 0x04000000 0x00300000
    [MAPI_MEMINFO] MAD_MEM_START 0x03a00000 0x03d00000 0x00300000
    [MAPI_MEMINFO] MVD_MEM_START 0x01d00000 0x03a00000 0x01d00000
    [MAPI_MEMINFO] VE_MEM_START 0x01b60000 0x01d00000 0x001a0000
    [MAPI_MEMINFO] GOP_DMAMEM_START 0x01b5f000 0x01b60000 0x00001000
    [MAPI_MEMINFO] TSP_VQ_START 0x01b5e000 0x01b5f000 0x00001000
    [MAPI_MEMINFO] PM51_MEM_ADR 0x01b5dc00 0x01b5e000 0x00000400
    [MAPI_MEMINFO] PM51_VAR_MEM_ADR 0x01b5d800 0x01b5dc00 0x00000400
    [MAPI_MEMINFO] GOP_GWINMEM_START 0x016ce800 0x01b59800 0x0048b000

    [MAPI_MEMINFO] pFirstAvailableMemory 0x809003f0


    Hello Hummingbird!!
    _appDemo_Task.iId = 1985216513
    ----------Hello World----------
    -------Welcome to Demo AP------
    >> [_SysInit_InitAPI][1618]SPI Flash Driver Init !!
    [HAL_AUDIO_AllocateVars], init Shared


    >>

    HAL_MAD_SetMemInfo[DSP_DEC] = 0x03b00000


    HAL_MAD2_SetMemInfo[DSP_SE] = 0x03a00000


    [HAL_AUDSP_DspLoadCode], pau_info->cm_len == 0
    HAL_MAD_SetMpegInfo: infoType[b,1b00,0] not Supported
    HAL_MAD_SetAACInfo: infoType[5,2166,0] not Supported
    HAL_MAD_SetAC3PInfo: infoType[f,1ee8,0] not Supported
    ADEC Done and do default setting 4
    Hash Key not Support MS10-DDT, No Dolby MS10-DDT license!!
    Hash Key not Support DDCO, No DDCO!!
    Hash Key not Support DTS, No DTS decode license!!
    [MApp_ShareEnv_LoadEnv][226]Memory Allocation for Env structure : Addr = A16BE7F0 , Size = 00010000
    [_crc32][127]CRC check Value = 90A8AFF1
    Check Boot Logo OK!! logo_cmd [boot_logo 0 0 1 1]
    Get Boot Panel Type!!
    pEnvStr = set_paneltype 12
    ptr = set_paneltype 12
    ptr+PANEL_CMD_LENGTH = 12
    result = 1
    result = 12
    g_PNL_TypeSel = 12
    eTiming =6
    MDrv_PNL_Init u32PnlRiuBaseAddr = bf200000
    MDrv_PNL_Init u32PMRiuBaseAddr = bf000000
    [XC,Version] 00409386
    MDrv_HDMITx_Init
    Get IOMAP ID:300 Base:bf000000!
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    DAC eTiming =6
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    HDMITx eTiming =7
    MDrv_HDMITx_Exhibit: Create Check Rx timer success!
    Wait V Sync!!
    GE_SetOnePixelMode
    driver GE init ok
    [_SysInit_GEGOP][1218]
    [_SysInit_GEGOP][1227]
    [_SysInit_GEGOP][1253]driver GOP0 init ok
    [_SysInit_GEGOP][1253]driver GOP1 init ok
    [_SysInit_GEGOP][1253]driver GOP2 init ok
    Path2
    Set to Mixer
    GE_Init and VE setting done
    BASEADDRESS_STRING_DATABASE_IN_FLASH = 00370000
    BASEADDRESS_BITMAP_DATABASE_IN_FLASH = 00370000
    BASEADDRESS_GENSETTING_IN_FLASH = 00370000
    BASEADDRESS_CURRENT_DTV_ORDER_IN_FLASH = 00380000
    BASEADDRESS_CH_DATABASE_IN_FLASH = 00390000
    BASEADDRESS_MOSAIC_IN_FLASH = 003D0000
    BASEADDRESS_TFCA_MAIL_IN_FLASH = 003E0000
    NUMBER_OF_CURRENT_DTV_PROGRAM = 00001000
    USB init
    MDrv_Usb_Init..
    Usb init
    The base address is 0xA16AE000
    Base addr is 0xA16AE000
    Top addr is 0xA16BDFFF
    Pages per pool is 16
    Bit map base addr is 0xa16ad7d0
    usb_init start
    usb_hcd_cpe_ehci_probe
    ehci: 80c1c240
    hcd: 80c1c274
    The allocated addr is 0xa16ae000, bit_map[0] is 0xFFFFFFFE
    qh: a16ae000, qh->qh_dma: 16ae000
    The allocated addr is 0xa16af000, bit_map[0] is 0xFFFFFFFC
    The allocated addr is 0xa16b0000, bit_map[0] is 0xFFFFFFF8
    qh: 16ae000
    usb_new_device
    usb_set_address before
    usb_set_address after
    The allocated addr is 0xa16b1000, bit_map[0] is 0xFFFFFFF0
    InitUSBIntr enter
    Usb start..
    MDrv_Usb_Done ...........UsbTask..
    ......................................
    >>> Allocate Addr = A16AA6C0 , FwPhyAddr = 016AA700
    ************************ Start TSP_Init ************************
    <FWTSP> : [PATCH][HAL_TSP_SetCAPath] === Currently disable CA PAth ===
    >> FwVersion:001B210E , Date:20100918
    ************************* End TSP_Init *************************
    [PATCH][HAL_TSP_SetCAPath] === Currently disable CA PAth ===
    [MApi_SI_System_Startup] OK !!
    [AP_NC_Alloc] Size = 1010
    [AP_C_Alloc] Size = 6be00
    [AP_NC_Alloc] Size = c8cf
    MApi_DigiTuner_Init mutex id 1985216534
    MDrv_IIC_Init PORT 1
    MDrv_IIC_InitPort0: OK
    MApi_VectorFont_Init total size=3276800, free size=2811712, large size=2811668
    alloc mem 0x330c
    alloc mem 0x1f14
    SysInit done .................................................
    into _appMain_Task
    [MApp_CheckFlash][1164] s8SN0 = 1
    MApi_DB_CM_LoadDTVProgramDatabaseFromFlash -- u16Index[1] [4096]
    MApi_DB_CM_InitDTVDataManager: m_eCurrentServiceType = 1
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfTV = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfRadio = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfMosaic = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfNvod_Ref = 0
    MApi_DB_CM_InitDTVDataManager: m_wCurrentOrderOfNvod_TimeShifted = 0

    MXL5007T SetTuner

    MXL5007 SetTuner dwFreq = -1000, ucBw = 8
    MxL_RFSynth_Lock_Status = 0xc
    RFSynth bLock = 1
    REFSynth bLock = 1
    Tuner Success
    into appMain_AddApp
    [ZUI] init: sz_msg_q=6216
    hub_irq hcd->product_desc: CPE_AMBA EHCI
    fix appTV_GetInfo before using
    SCART ON, CVBS ON, RGB ON
    [msCHIP_DAC_SetOutputSource][79] input bitmap: 0x00000011
    CVBS on
    SVIDEO off, YPBPR off, RGB on
    SCART on
    problem happen
    App_GetTVFormat:[0]

    MDrv_HDMITx_SetAVMUTE
    tvvideo_SetDCOutputTiming : 0, 1
    Check the Source type 6
    [tvvideo_SetDCOutputTiming][469]: ## Change Resolution ##, eCompType = 6
    [msAPI_XC_ReMapComponentType][245]: msAPI_XC eTiming = 6
    DAC eTiming =6
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    HDMITx eTiming =7
    into appMain_AddApp
    into appMain_AddApp
    into appMain_AddApp
    [+]MApi_EpgDB_Init
    [AP_NC_Alloc] Size = 50
    [AP_NC_Alloc] Size = 5
    [AP_NC_Alloc] Size = 190
    [AP_NC_Alloc] Size = 3e8
    [AP_NC_Alloc] Size = b40
    [AP_NC_Alloc] Size = 9d80
    [AP_NC_Alloc] Size = 14000
    [AP_NC_Alloc] Size = 1d4c0
    [AP_NC_Alloc] Size = 1f5f40
    [AP_NC_Alloc] Size = c8
    [AP_NC_Alloc] Size = 2000
    [AP_NC_Alloc] Size = 2000
    [AP_NC_Alloc] Size = 580000
    [EPGDB][000687] =========================================================================
    [EPGDB][000688] _pu16SrvMappingTable: (Start, End, Length)= (0xa14e2940, 0xa14e2990, 0x00000050)
    [EPGDB][000689] _pu8EitBufMask: (Start, End, Length)= (0xa14e2920, 0xa14e2925, 0x00000005)
    [EPGDB][000690] _pMapBufIdxTable: (Start, End, Length)= (0xa14e2780, 0xa14e2910, 0x00000190)
    [EPGDB][000691] _pu8EpgDbEvtMask (Start, End, Length)= (0xa14e2380, 0xa14e2768, 0x000003e8)
    [EPGDB][000692] _pu8EpgDbScheHdrList (Start, End, Length)= (0xa14e1830, 0xa14e2370, 0x00000b40)
    [EPGDB][000693] _pu8EpgDbSrvEvtList (Start, End, Length)= (0xa14d7aa0, 0xa14e1820, 0x00009d80)
    [EPGDB][000694] _pu8EpgDbSrvSecList (Start, End, Length)= (0xa14c3a90, 0xa14d7a90, 0x00014000)
    [EPGDB][000695] _pu8EpgDbEvtHdrList (Start, End, Length)= (0xa14a65c0, 0xa14c3a80, 0x0001d4c0)
    [EPGDB][000696] _pu8EpgDbEvtNameList (Start, End, Length)= (0xa12b0670, 0xa14a65b0, 0x001f5f40)
    [EPGDB][000697] _pu8EpgDbPfHdrList (Start, End, Length)= (0xa12b0590, 0xa12b0658, 0x000000c8)
    [EPGDB][000698] _pu8EpgDbPfPresent (Start, End, Length)= (0xa12ae580, 0xa12b0580, 0x00002000)
    [EPGDB][000699] _pu8EpgDbPfFollow (Start, End, Length)= (0xa12ac570, 0xa12ae570, 0x00002000)
    [EPGDB][000703] _pu8EpgDbScheExtStrBuf (Start, End, Length)= (0xa0d2c560, 0xa12ac560, 0x00580000)
    [EPGDB][000705] EPG database allocate 0x007b6355 bytes
    [EPGDB][000711] =========================================================================
    [-]MApi_EpgDB_Init
    MApp_ZUI_ACT_StartupOSD TV_PROG
    [MApp_ZUI_ACT_PrepareOSDPage][423]MS_COMPONENT_OUTPUT_TYPE : 6
    fix _MApp_ZUI_SetupDisplayList before using
    SD: 720 x 576, HD: 960 x 1080
    leave MApp_ZUI_API_InitCanvasGDI -> MApp_ZUI_API_GetFontMVF in 131
    USB is connect
    Set PAL
    SD Gwin = 4
    disp[1]'s FBID = 2
    HD Gwin = 0
    [MApp_ZUI_ACT_PrepareOSDPage][423]_Zapper_Disable_AV: Enter at 3310.
    alloc mem 0x40000
    alloc mem 0x2400
    alloc mem 0x2000
    alloc mem 0x1000
    hub event
    get hub event
    portstatus: 1, portchange:1
    hub_port_connect_change
    port 1, status 1, change 1, 12 Mb/s
    hcd->product_desc: (CPE_AMBA EHCI)
    Reset root hub port
    HOST200_main
    PortReset: UTMI 0xbf205400, UHC 0xbf220600
    hub_irq hcd->product_desc: CPE_AMBA EHCI
    speed: 2
    RESET temp: f
    usb_new_device
    usb_set_address before
    qh: a16ae080, qh->qh_dma: 16ae080
    usb_set_address after
    The allocated addr is 0xa16b2000, bit_map[0] is 0xFFFFFFE0
    get hub event
    portstatus: 403, portchange:2
    found a Mass Storage device, try to init it
    RemoveUSBDiskPort: Can't find match Port:0 Lun:0
    qh: a16ae100, qh->qh_dma: 16ae100
    qh: a16ae180, qh->qh_dma: 16ae180
    Connect USB disk /dev/sdp/
    Port:0 Lun:0 Id:8
    USB Call Back Event 01 Parameter 1 /dev/sdp/
    [_USB_Callback_Test][266] Plug Event happen
    [_USB_Callback_Test][290] Mass Storage /dev/sdp/1
    LUN 0 is init ok
    MSC plug in
    TvBanner_DisplayUsbStatus,1392,u8Event : 1

    Jednak konosla dalej nie rozpoznaje komend U-boot'a.

    Kiedyś odczytałem też z tego tunera pamięć flash: Link. Jest tam układ 25FL032:
    Schemat układu scalonego z oznaczeniem pinów.

    Co dalej można z tym zrobić? Ktoś próbował uruchmić na MSD7818 Linuxa: Link. Może jakoś dałoby się go zabootować z USB, ale najpierw trzebaby rozblokować konsolę.

    Fajne? Ranking DIY
    O autorze
    maciej_333
    Poziom 38  
    Offline 
    Specjalizuje się w: programowanie
    maciej_333 napisał 4247 postów o ocenie 1607, pomógł 488 razy. Mieszka w mieście Grudziądz. Jest z nami od 2003 roku.
  • REKLAMA
  • #2 21365312
    bulek01
    Poziom 17  
    Posty: 338
    Pomógł: 12
    Ocena: 297
    Fajnie wiedzieć, że na tym linux działa, jest potencjał, aby coś z tego zrobić. Widzę, że jest tam procek MIPS 34k. Szkoda, że do takich szrotów których jest najwięcej jest słaba dokumentacja albo nie ma, przez co najłatwiej to wywalić na śmieci, a ciężko coś zrobić.
  • #3 21365899
    Andrzej Ch.
    Poziom 33  
    Posty: 2243
    Pomógł: 223
    Ocena: 393
    Z tego co się orientuję, to generalnie na większości jak nie wszystkich tunerach systemem operacyjnym jest linux w różnej maści.
  • #4 21366593
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    Andrzej Ch. napisał:
    Z tego co się orientuję, to generalnie na większości jak nie wszystkich tunerach systemem operacyjnym jest linux w różnej maści.

    Możliwe, że tak, albo jest to jakiś RTOS. Jednak jest na tym jakaś powłoka i do systemu operacyjnego jako takiego nie ma dostępu. Stąd w sieci widać próby uruchomienia na tym czegoś innego.
  • #5 21366628
    James596
    Poziom 30  
    Posty: 1876
    Pomógł: 140
    Ocena: 575
    A tak właściwie, to czemu miało służyć przejście na DVB-T2 H265? Bo realnych korzyści z tego przejścia jakoś nie widać, a pozostało całe mnóstwo elektrośmieci, które mogły jeszcze działać bez większych problemów.
  • REKLAMA
  • #6 21366644
    Andrzej Ch.
    Poziom 33  
    Posty: 2243
    Pomógł: 223
    Ocena: 393
    Przejście na DVB-T2 to bardziej efektywne kodowanie niż H.264, czyli kodowane H.265, które umożliwia przy wykorzystaniu pasma o tej samej szerokości zmieścić albo więcej programów TV w SD, albo tyle samo ale w HD. To tak oględnie.
  • REKLAMA
  • #7 21368470
    linuxtorpeda
    Poziom 26  
    Posty: 825
    Pomógł: 93
    Ocena: 295
    Przejrzałem na szybko dump pamięci SPI Flash. Moje wnioski:
    1) Wykorzystany chip to jakiś chip od MStara, ktoś wyżej pisał, że to MIPS.
    2) Wykorzystany bootloader to prawdopodobnie MBoot, tj. ichni mocno przerobiony U-Boot. Można pokusić się o przeszukanie neta pod tym kątem.
    3) Bootloader ma zaimplementowaną obsługę wbudowanego w chip 8051, który prawdopodobnie służy do obsługi diody odbiorczej IR w trybie standby.
    4) Bootloader prawdopodobnie bootuje się za pomocą komendy spi_rdc 0x80B00000 0x8001C 0x284A14; LzmaDec 0x80B00000 0x284A14 0x80000180 0x81000000; go 0x80000224; warto sprawdzić co jest pod tymi adresami, w szczególności pamięć pod adresem 0x80B00000 (0x00B00000 na SPI?) może być skompresowana za pomocą LZMA. Warto też sprawdzić, czy sama komenda spi_rdc faktycznie istnieje.
    5) Warto też sprawdzić inne komendy: boot_logo, set_paneltype, echo. Po co? Np. można by było poszukać jakiegoś trywialnego błędu w implementacji, np. buffer overflow, żeby wykonać dowolny kod. Choć z drugiej strony po co, mamy dostęp do flasha, prawdopodobnie nie jest sprawdzana żadna suma kontrolna ani sygnatura przed odpaleniem bootloadera.
    6) Bootloader komunikuje się z aplikacją jeśli chodzi o potrzebę aktualizacji za pomocą zmiennej OAD_NEED_UPGRADE. Może można wykorzystać ten mechanizm do wgrania własnego kodu na platformę.
    7) Warto by było przeanalizować głębiej sam kod dostępny na SPI za pomocą narzędzi typu Ghidra czy IDA Pro.

    Osobiście widzę tu duży potencjał do przeróbek.

    Dodano po 13 [minuty]:

    Pod adresem 0x8001C w SPI faktycznie udało mi się znaleźć skompresowaną treść za pomocą 7z. Rozpakowałem i przeanalizowałem na szybko binwalkiem:
    --------------------------------------------------------------------------------------------------------------------------------------
    DECIMAL                            HEXADECIMAL                        DESCRIPTION
    --------------------------------------------------------------------------------------------------------------------------------------
    0                                  0x0                                eCos kernel exception handler, MIPS little endian
    640                                0x280                              eCos kernel exception handler, MIPS little endian
    3653896                            0x37C108                           CRC32 polynomial table, little endian
    4275221                            0x413C15                           Copyright text: "copyright (c) 2001-8 by D.I. Management 
                                                                          Services Pty Limited <www.di-mgt.com.au>, and is used with p"
    4597828                            0x462844                           SHA256 hash constants, little endian
    4607488                            0x464E00                           CRC32 polynomial table, little endian
    4611584                            0x465E00                           CRC32 polynomial table, big endian
    --------------------------------------------------------------------------------------------------------------------------------------
    

    Krótko mówiać, bootloader ładuje firmware, który jest oparty o kernel eCos, system operacyjny RTOS od RedHata.
  • #8 21368843
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    @linuxtorpeda - Dziękuję za cenne wskazówki. Generalnie w konsoli wszystko jest zablokowane. Niestety komendy U-boot/MBoot i zmienne konfigurujące bootloader są, bo widać, że dochodzi do ich wywołania w trakcie np. aktualizacji firmware. Jednak po zabootowaniu jest to blokowane. Spróbuję z tym jeszcze powalczyć. Zastanawiające jest coś takiego w konsoli podczas startu tunera:
    Hit any key to stop autoboot: 0

    Faktycznie jakby wciśnięcie jakiegoś klawisza miało zatrzymać bootowanie i coś tam zrobić dalej.

    Ewidentnie jest tu układ Mstar MSD7818, jak pisałem powyżej. Tuner nawet to pokazuje po wywołaniu z menu informacji o wersji firmware i sprzętu. Jest tak jednak dopiero po aktualizacji firmware.

    [edit]
    Znalazłem coś takiego: Link. Wprawdzie dotyczy to telewizora z procesorem Mstar, ale wysyłanie CR podczas bootowania faktycznie je zatrzymuje i mamy dostęp do konsoli i nawet komend opisanych tutaj: Link.

    Odpowiedź na help:
    Spoiler:
    help

    ? - alias for 'help'

    do Lzma for compress image

    base - print or set address offset

    bdinfo - print Board Info structure

    boot_logo - Logo display

    bootm - boot application image from memory

    cmp - memory compare

    coninfo - print console devices and information

    cp - memory copy

    cpmsbin - Copy ms bin file (Chakra) from nand to dram

    crc32 - checksum calculation

    cusid check the image is release by the valid guys

    dcache - enable or disable data cache

    dmx_init - initialize the demux setting

    draw_pixel - draw a pixel with color

    draw_string - draw string with color

    draw_rect - draw rect with color

    draw_string - draw string with color

    du - Disable UART

    env2flash - read environment parameter file and restore it to flash

    envbin - read out environment parameter and store it to usb disk

    erase - erase FLASH memory

    fatinfo - print information about filesystem

    fatload - load binary file from a dos filesystem

    fatls - list files in a directory (default /)

    fatwrite - write binary file to a dos filesystem

    flinfo - print FLASH memory information

    go - start application at address 'addr'

    help - print online help

    loop - infinite loop on address range

    md - memory display

    mm - memory modify (auto-incrementing)

    mstar - update kernal & root file system automatically by script file

    mtest - simple RAM test

    mw - memory write (fill)

    ustar - update kernal & root file system automatically by script file

    nm - memory modify (constant address)

    ostar - update kernal & root file system automatically by script file

    oad_get_size - Get the file size from OAD download

    osd_create - create osd layer

    osd_destroy - destroy osd layer

    pnlinfo - set panel info and save to nand flahs

    printenv- print environment variables

    protect - enable or disable FLASH write protection

    reset - Perform RESET of the CPU

    run - run commands in an environment variable

    saveenv - save environment variables to persistent storage

    set_paneltype [type] - Set Mboot panel type and store the type value in env

    setenv - set environment variables

    spi_dma - SPI copy data from flash to DRAM by PIU DMA

    spi_ea - SPI erase all

    spi_eb - SPI erase block

    spi_gfo - SPI get flash info

    spi_gr - SPI get Chip Rev

    spi_id - SPI read ID

    spi_in - SPI initialization

    spi_r - SPI read commands

    spi_rb - SPI read buffer

    spi_rdc - SPI read code from SPI flash to DRAM

    spi_rs - SPI read status

    spi_w - SPI write commands

    spi_wb - SPI write buffer

    spi_wp - SPI write protect

    spi_wrc - SPI write code from DRAM to SPI flash

    sspi - SPI utility commands

    sysinfo - set system info and save to nand flahs

    tuner_demodtype - set frontend type

    tuner_init - frondend initialization

    tuner_tune - tune RF to check lock or not

    usb - USB sub-system

    ustar - update kernal & root file system automatically by script file

    usbboot - boot from USB device

    ustar - update kernal & root file system automatically by script file

    version - print monitor version

    << MStar >>#


    Jest już więc coś ciekawego:
    Ekran konsoli z listą dostępnych komend dla systemu z układem Mstar.

    Przykładowo:
    Konsola MStar pokazująca wersję U-Boot 1.1.6 z 19 lipca 2012 roku.
    Po tej komendzie konsola się wiesza. Zobaczymy co z tego wyjdzie. Będę się tym bawił dalej.

    [edit]
    Udało mi się pobawić z komendami md i mw:
    Zrzut ekranu z konsoli pokazujący polecenia modyfikacji pamięci RAM.
    Da się dostać do pamięci adresując bajty, słowa 16 bit itd.

    Jest też komenda go, więc dałoby się wykonać tak wprowadzony kod. Ram zaczyna się od adresu 0x80000000. Generalnie jak jest próba odczytu błędnego adresu lub wykonania błędnego opcode, to pojawiają się wyjątki, które są wysyłane do konsoli. Jest to więc dosyć przydatne.

    Błędny adres:
    Zrzut ekranu z konsoli pokazujący błąd adresu podczas ładowania, pobierania lub zapisu.

    Błedny opcode:
    Zrzut ekranu z konsoli pokazujący wyjątek: kod instrukcji nierozpoznany z różnymi wartościami rejestrów.
  • #9 21369678
    Konto nie istnieje
    Poziom 1  
  • #10 21369758
    linuxtorpeda
    Poziom 26  
    Posty: 825
    Pomógł: 93
    Ocena: 295
    maciej_333 napisał:
    wysyłanie CR podczas bootowania faktycznie je zatrzymuje i mamy dostęp do konsoli

    Czyli w tej chwili masz wszystko, co jest potrzebne do developmentu na start. Gdyby komuś zależało, mógłby na tą platformę zbudować Linuxa i przerobić tuner na np. konsolę do gier lub pełnoprawny (choć dość słaby obliczeniowo) komputer.

    Opisane zachowanie to standard nie tylko jeśli chodzi o tunery, to samo da się zaobserwować przy routerach, odkurzaczach autonomicznych, etc. Największą ciekawostką jest tu fakt, że wykorzystano eCos zamiast Linuxa. Być może zamiast portować cały system od zera, dałoby radę dostać się do systemu plików i dodać w miarę bezboleśnie swoją funkcjonalność.
  • #11 21369826
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    Aktualnie próbuję zrobić pętlę nieskończoną pod jakimś adresem. Korzystam z asemblera dla MIPS. Problem w tym, że mam błędny opcode, albo adres i tym samym wyskakują wyjątki. Próbowałem np. czegoś takiego:
    Fragment kodu MIPS z instrukcją beq $zero, $zero, -1
    Kod taki jest "przenośny", więc można go wstawić pod dowolny adres. Próbowałem z różnymi adresami powyżej 0x80000000. Wpisałem ten opcode np. pod 0x80000000 i dalej. Dawałem też przed tym nop. Nie wiem więc co robię źle.
  • #12 21369829
    Konto nie istnieje
    Poziom 1  
  • #13 21371294
    linuxtorpeda
    Poziom 26  
    Posty: 825
    Pomógł: 93
    Ocena: 295
    ledo99 napisał:
    Nie mów hop - tam pewnie jest Linux ale preboot jest kontrolowany przez eCos - to częste w takich SoC. Po prostu Linux pluje na innej konsoli - tu jedynie zarządzasz np partycjami z których następuje boot Linuxa - po przekazaniu startu konsola typu tty jest nieaktywna.

    Czemu U-Boot/MBoot miałby odpalać eCosa tylko po to, żeby ten odpalał Linuxa? Widywałem eCos w set top boxach, ale zawsze zamiast U-Boota, nie obok.

    maciej_333 napisał:
    Aktualnie próbuję zrobić pętlę nieskończoną pod jakimś adresem. Korzystam z asemblera dla MIPS. Problem w tym, że mam błędny opcode, albo adres i tym samym wyskakują wyjątki.

    Nie pamiętam, czy skok względny przyjmuje wartość -1 czy 0 dla aktualnie wykonywanej instrukcji - warto to sprawdzić. Po drugie, na MIPSach występuje coś takiego jak delay slot, czyli po instrukcji skoku wykonywana jest jeszcze kolejna instrukcja. Z tego względu po beq dodałbym nop. nop przed też oczywiście nie zaszkodzi.
  • #14 21371931
    Konto nie istnieje
    Poziom 1  
  • #15 21372787
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    linuxtorpeda napisał:
    maciej_333 napisał:
    Aktualnie próbuję zrobić pętlę nieskończoną pod jakimś adresem. Korzystam z asemblera dla MIPS. Problem w tym, że mam błędny opcode, albo adres i tym samym wyskakują wyjątki.

    Nie pamiętam, czy skok względny przyjmuje wartość -1 czy 0 dla aktualnie wykonywanej instrukcji - warto to sprawdzić. Po drugie, na MIPSach występuje coś takiego jak delay slot, czyli po instrukcji skoku wykonywana jest jeszcze kolejna instrukcja. Z tego względu po beq dodałbym nop. nop przed też oczywiście nie zaszkodzi.

    Próbowałem z nop przed i po beq. Nic to nie daje. Kod nie może być też wykonywany spod każdego adresu RAM. Przykładowo można go dać pod 0x80000224, ale nie pod 0x80000000.

    Sprawdzałem działanie instrukcji beq w jakimś symulatorze. Coś takiego, to faktycznie pętla nieskończona:
    Eternity:	beq	$zero, $zero, Eternity	# Infinite Loop

    Mamy tu przecież skok względny, jeśli jeden rejestr jest równy drugiemu. Tu zawsze tak będzie. Jak jest skok, to mamy tutaj PC=PC+4-4 (jest -4, bo etykieta Eternity: jest przed beq). Zatem powinno to skoczyć na samego siebie. PC nie ulega zmianie. Nie mogę tego zrozumieć. Jest tu jakaś inna lista rozkazów lub opcodów??? W komunikacie o wyjątku niestety nie pokazuje się chyba wartość PC dla jakiej wyjątek wystąpił.
  • #16 21373273
    linuxtorpeda
    Poziom 26  
    Posty: 825
    Pomógł: 93
    Ocena: 295
    maciej_333 napisał:
    Kod nie może być też wykonywany spod każdego adresu RAM. Przykładowo można go dać pod 0x80000224, ale nie pod 0x80000000.

    No cóż, bootloader po załadowaniu eCosa skacze do 0x80000224.

    maciej_333 napisał:
    Mamy tu przecież skok względny, jeśli jeden rejestr jest równy drugiemu. Tu zawsze tak będzie. Jak jest skok, to mamy tutaj PC=PC+4-4 (jest -4, bo etykieta Eternity: jest przed beq). Zatem powinno to skoczyć na samego siebie. PC nie ulega zmianie. Nie mogę tego zrozumieć.

    beq + nop powinien działać.

    maciej_333 napisał:
    W komunikacie o wyjątku niestety nie pokazuje się chyba wartość PC dla jakiej wyjątek wystąpił.

    Przecież masz wypisane wszystkie wartości rejestrów, w tym PC, kiedy wystąpił wyjątek (ew. dla instrukcji wykonanej bezpośrednio po skoku ze względu na delay slot, już nie pamiętam).
  • #17 21373363
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    linuxtorpeda napisał:
    maciej_333 napisał:
    Kod nie może być też wykonywany spod każdego adresu RAM. Przykładowo można go dać pod 0x80000224, ale nie pod 0x80000000.

    No cóż, bootloader po załadowaniu eCosa skacze do 0x80000224.

    Tak, widać to podczas bootowania. Ponieważ bootloader tam skacze, to właśnie dlatego spróbowałem tego adresu.

    linuxtorpeda napisał:
    maciej_333 napisał:
    Mamy tu przecież skok względny, jeśli jeden rejestr jest równy drugiemu. Tu zawsze tak będzie. Jak jest skok, to mamy tutaj PC=PC+4-4 (jest -4, bo etykieta Eternity: jest przed beq). Zatem powinno to skoczyć na samego siebie. PC nie ulega zmianie. Nie mogę tego zrozumieć.

    beq + nop powinien działać.

    Niestety to nie pomaga. Mam teraz coś takiego:
    Eternity:	beq	$zero, $zero, Eternity	# Infinite Loop
    nop
    nop

    Zresztą już próbowałem tego wczoraj. Wprowadzam to za pomocą mw. Zatem pod 0x80000224 i kolejno pod 0x80000228 i 0x8000022C jest coś takiego:
    Zrzut ekranu przedstawiający dane w formacie szesnastkowym pod adresem 0x80000244.
    Potem mogę dać go 0x80000224 i jest wyjątek:
    go 0x80000224
    
    ## Starting application at 0x80000224 ...
    
    Exception: 10
    RI: Instruction code not recognized (or not legal)
    $zero: 00000000  $at: 00000000  $v0: 0000002A  $v1: 00000000
      $a0: 00000001  $a1: 87756964  $a2: 00000001  $a3: 00000000
      $t0: 00000003  $t1: 00000001  $t2: 00000003  $t3: 00000002
      $t4: 00000020  $t5: 8768DB5C  $t6: 00000000  $t7: 00000001
      $s0: 80000224  $s1: 87613EC0  $s2: 00000002  $s3: 87756964
      $s4: 00000034  $s5: 00000000  $s6: 00000020  $s7: 87756CA4
      $t8: 876DEE44  $t9: 80000224  $k0: 000000C0  $k1: 02100000
      $gp: 876B7000  $sp: 87756928  $fp: 0000005C  $ra: 87605294
       sr: 34008C02   pc: 80100004  cause : 10000028  badvr : 000002D0
    
    stack backtrace
    stack frame #0: ra = 87605294, sp = 87756928
    stack frame #1: ra = 87601F30, sp = 87756950


    Próbowałem to wstawić nieco dalej, by zobaczyć co się pokaże w wyjątku. Dałem kod pod 0x80100008. Zatem wszystko jest analogicznie, ale po innym adresem. Mam wyjątek ponownie:
    go 0x80100008
    
    ## Starting application at 0x80100008 ...
    
    Exception: 10
    RI: Instruction code not recognized (or not legal)
    $zero: 00000000  $at: 00000000  $v0: 0000002A  $v1: 00000000
      $a0: 00000001  $a1: 87756964  $a2: 00000001  $a3: 00000000
      $t0: 00000003  $t1: 00000001  $t2: 00000003  $t3: 00000002
      $t4: 00000020  $t5: 8768DB5C  $t6: 00000000  $t7: 00000001
      $s0: 80100008  $s1: 87613EC0  $s2: 00000002  $s3: 87756964
      $s4: 00000038  $s5: 00000000  $s6: 00000020  $s7: 87756CA4
      $t8: 876DEE44  $t9: 80100008  $k0: 000000C0  $k1: 02100000
      $gp: 876B7000  $sp: 87756928  $fp: 0000005C  $ra: 87605294
       sr: 34008C02   pc: 80100008  cause : 10000028  badvr : 000002D0
    
    stack backtrace
    stack frame #0: ra = 87605294, sp = 87756928
    stack frame #1: ra = 87601F30, sp = 87756950

    Tym razem o dziwo dla PC=0x80100008. Pod tym adresem jest właśnie beq.

    linuxtorpeda napisał:
    maciej_333 napisał:
    W komunikacie o wyjątku niestety nie pokazuje się chyba wartość PC dla jakiej wyjątek wystąpił.

    Przecież masz wypisane wszystkie wartości rejestrów, w tym PC, kiedy wystąpił wyjątek (ew. dla instrukcji wykonanej bezpośrednio po skoku ze względu na delay slot, już nie pamiętam).

    Wychodzi na to, że podany tam jest faktycznie PC, gdzie wystąpił wyjątek. Pod tym adresem jest sporo jakiegoś tekstu. Jeśli procesor tam dochodzi, to wiadomo, że będzie z tego wyjątek. Tak, jakby beq się wcale nie wykonywał.
  • #18 21373755
    linuxtorpeda
    Poziom 26  
    Posty: 825
    Pomógł: 93
    Ocena: 295
    Sprawdziłem w godbolcie, opkod się zgadza. Może to kwestia endianess? Zapisz bajty do pamięci w odwrotnej kolejności i sprawdź.

    Zauważ, że eCos był ładowany od 0x80000180. Może znajduje się tam tabela wektorów przerwań, inicjalizacja wskaźnika stosu, etc., więc może warto by było najpierw załadować eCosa, a dopiero później zmodyfikować instrukcję pod 0x80000224.
  • #19 21379064
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    linuxtorpeda napisał:
    Sprawdziłem w godbolcie, opkod się zgadza. Może to kwestia endianess? Zapisz bajty do pamięci w odwrotnej kolejności i sprawdź.

    Próbowałem różnych adresów oraz wprowadzania instrukcji beq w Big Endian i Little Endian. Zawsze jest wyjątek.

    linuxtorpeda napisał:
    Zauważ, że eCos był ładowany od 0x80000180. Może znajduje się tam tabela wektorów przerwań, inicjalizacja wskaźnika stosu, etc., więc może warto by było najpierw załadować eCosa, a dopiero później zmodyfikować instrukcję pod 0x80000224.

    Podjąłem też zgodnie z Twoją sugestią próbę załadowania i dekompresji eCos. Zatem dałem komendę spi_rdc 0x80B00000 0x8001C 0x284A14; LzmaDec 0x80B00000 0x284A14 0x80000180 0x81000000. Potem zmodyfikowałem kod pod 0x80000224, czyli wprowadziłem tam beq i dwa nop. Kolejno dałem go 0x80000224. Co ciekawe całość normalnie się uruchamia i tuner startuje. Zatem komenda go musi coś jeszcze robić i zmienia kod pod 0x80000224. Inaczej nie sposób sobie tego wytłumaczyć.
    Inna próba to wstawienie kodu analogicznie, ale pod 0x80100004. Tym razem pojawia się dla adresu, gdzie jest beq zupełnie inny wyjątek, jakiego jeszcze nie było:
    Zrzut ekranu pokazujący wyjątek Breakpoint w emulatorze z informacjami o rejestrach.
    Wyjątek ten wyskakuje tylko po załadowaniu kodu z FLASH.

    Wnioski końcowe:
    -Trzeba rozpakować zawartość FLASH i zobaczyć co jest w poszczególnych plikach. Generalnie jest jakiś opis struktury FLASH dla MBOOT: Link. Przynajmniej częściowo tj. odnośnie bootlogo się to zgadza.
    -Widać, że prawdopodobnie brakuje jakiejś konfiguracji. Myślę, że nie chodzi o wektor przerwań, czy stos. To przecież i powinien mieć bootloader do obsługi konsoli.
    -Należałoby częściowo zdekompilować kod, by uzyskać bliższe informacje o tym, co tu się dzieje. Z tego może dałoby się wywnioskować gdzie i kiedy można wstawić swój kod.
  • #20 21380308
    linuxtorpeda
    Poziom 26  
    Posty: 825
    Pomógł: 93
    Ocena: 295
    Cytat:
    Zatem dałem komendę spi_rdc 0x80B00000 0x8001C 0x284A14; LzmaDec 0x80B00000 0x284A14 0x80000180 0x81000000. Potem zmodyfikowałem kod pod 0x80000224, czyli wprowadziłem tam beq i dwa nop. Kolejno dałem go 0x80000224. Co ciekawe całość normalnie się uruchamia i tuner startuje. Zatem komenda go musi coś jeszcze robić i zmienia kod pod 0x80000224. Inaczej nie sposób sobie tego wytłumaczyć.


    I to jest bardzo ciekawa obserwacja. Założmy, że komenda go nie została zmodyfikowana przez developerów względem U-Boota. Wtedy jej implementacja wygląda dla MIPSów tak:

    Fragment kodu C dotyczący operacji na pamięci dla architektury MIPS.

    Co, jeśli flush_cache z jakiegokolwiek powodu nadpisuje Twoje zmiany zawartością z pamięci niekeszowanej, gdzie znajduje się kod wrzucony za pomocą komendy LzmaDec? Wtedy oczywiście będą zignorowane.

    Nie mówię, że tak jest, bo wydawało mi się, że ten mechanizm działa inaczej, ale bieg lat mógł spowodować moje kłopoty z pamięcią :)

    Co można zrobić? Zerknijmy na memory mapę dla MIPSów:

    Mapa pamięci dla architektury MIPS z oznaczeniem różnych przestrzeni adresowych.

    Wynika z niej, że odpowiednikiem keszowanego adresu 0x80000000 jest niekeszowany adres 0xA0000000. Może po załadowaniu oryginalnego firmware'u wrzuć swoje zmiany tam (tj. 0xA0000224) i użyj komendy go. Daj znać, co z tego wyszło.
  • #21 21384639
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    Przyznam, że nie rozumiem dlaczego cache miałby tak działać. Jest to przecież szybka (statyczna) pamięć podręczna procesora do której sterownik pamięci cache coś tam kopiuje z wolniejszej dynamicznej pamięci DRAM. Oczywiście stara się to robić z jakimś zapasem i przewidywaniem co będzie dalej potrzebne dla procesora. Odwrotnie jak procesor coś wstawi do cache, to sterownik skopiuje to do DRAM. Jednak program różnie się wykonuje, bo są warunki, pętli itd. Potrzebne są więc dane i kod z różnych adresów DRAM. Stąd są też dodatkowe funkcje do sterowania tym procesem częściowo programowo.

    Funkcja flush_cache moim zdaniem powinna unieważnić to, co jest w cache i tym samym doprowadzić do jego ponownego załadowania z DRAM. Zatem moje zmiany niby powinny być uwzględnione. Chyba, że przy okazji dojdzie z jakiegoś powodu do skopiowania tego, co jest w cache do DRAM. To miałoby już w mojej ocenie więcej sensu.

    MBoot ma też funkcję dcache: Link. Można zatem wyłączyć cache za pomocą tego.

    Do tematu tego tunera będę mógł wrócić dopiero za kilka tygodni. Oczywiście napiszę, co udało się uzyskać.

    Przy okazji. Jest jakiś cross kompilator dla asemblera MIPS, ale taki z dostępną dyrektywą ORG? Szukałem i próbowałem różnych, ale nie ma ORG, więc nie mam jak ustawić adresu pod, którym ma się zaczynać kod.
  • REKLAMA
  • #22 21387195
    linuxtorpeda
    Poziom 26  
    Posty: 825
    Pomógł: 93
    Ocena: 295
    maciej_333 napisał:
    Funkcja flush_cache moim zdaniem powinna unieważnić to, co jest w cache i tym samym doprowadzić do jego ponownego załadowania z DRAM. Zatem moje zmiany niby powinny być uwzględnione.

    Też tak myślę, ale to jest jedyne miejsce, gdzie cache mógłby być nadpisywany zgodnie z obserwacją, stąd moja sugestia. Poza tym do cache'u można pisać i o ile nie jest skonfigurowany w trybie write-through to wydaje mi się, że ten proces też jest kontrolowany programowo. Nie ma sensu gdybać, trzeba sprawdzić.

    maciej_333 napisał:
    Przy okazji. Jest jakiś cross kompilator dla asemblera MIPS, ale taki z dostępną dyrektywą ORG? Szukałem i próbowałem różnych, ale nie ma ORG, więc nie mam jak ustawić adresu pod, którym ma się zaczynać kod.

    Niestety nie znam. Czy w nowoczesnych toolchainach nie jest to przypadkiem realizowane przez linker?
  • #23 21652282
    bulek01
    Poziom 17  
    Posty: 338
    Pomógł: 12
    Ocena: 297
    maciej_333 napisał:
    Przy okazji. Jest jakiś cross kompilator dla asemblera MIPS, ale taki z dostępną dyrektywą ORG? Szukałem i próbowałem różnych, ale nie ma ORG, więc nie mam jak ustawić adresu pod, którym ma się zaczynać kod.


    Da się to zrobić zwykłym gcc pisząc odpowiedni skrypt linkera. Podaj jakiś przykładowy kod asemblera, to spróbuję to przygotować.
  • #24 21652317
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    bulek01 napisał:
    Podaj jakiś przykładowy kod asemblera, to spróbuję to przygotować.

    Dziękuję za pomoc. Jak na razie przestałem się tym zajmować. Przerzuciłem się na uruchamianie samych głowic. Ostatnio zacząłem pracować z głowicą od tunera DVB-S. Mam uruchomiony pod STM32 układ AV2012.
  • #25 21693082
    bulek01
    Poziom 17  
    Posty: 338
    Pomógł: 12
    Ocena: 297
    Postanowiłem jednak ten przykład własnego assemblera odpalić, aby zweryfikować czy to w ogóle działa i jak mam dane w pamięci interpretować.
    Przykład kodu w assemblerze:
    
        .global _start              
        .section .text           
    _start:
        li $t0, 0                   
    loop:
        addi $t0, $t0, 1
        nop     
        nop
        j loop
    

    Najpierw wyzerowanie rejestru t0
    Dodanie liczby 1 do rejestru.
    Dwa nopy nic nie robiące.
    Skok do instrukcji inkrementacji

    Aby to skompilować za pomocą gcc potrzeba skrypt linkera:
    ram.ld
    ENTRY(_start)
    SECTIONS
    {
      . = 0x80000000;  /* Adres startowy */
      .text :
      {
        *(.text)
      }
    }


    Teraz kompilacja:
    mipsel-linux-gnu-as -march=mips32r2 -o loop_inc.o loop_inc.asm

    Linkowanie:
    mipsel-linux-gnu-ld -T ram.ld loop_inc.o -o loop_inc.elf



    Wygenerowanie binarki:
    
    mipsel-linux-gnu-objcopy -O binary loop_inc.elf loop_inc.bin
    


    Można sobie jeszcze zrobić dissaemblację pliku elf:
    mipsel-linux-gnu-objdump -D loop_inc.elf


    Gdzie fragmentem wyniku jest sekcja .text
    #Disassembly of section .text:
    #
    #80000000 <_start>:
    #80000000:   24080000    li   t0,0
    #
    #80000004 <loop>:
    #80000004:   21080001    addi   t0,t0,1
    #80000008:   00000000    nop
    #8000000c:   08000001    j   80000004 <loop>
    #80000010:   00000000    nop
    #   ...

    Jak widać zniknął jeden nop, a to pewnie dlatego, że instrukcja skoku zajmuje dwa cykle.
    Za to pojawiła się instrukcja nop na końcu za skokiem. Wyczytałem, że MIPS tak ma, że potrzebuje jakąś instrukcje,
    za instrukcją skoku i jak widać gcc to automatycznie dodało.
    Teraz korzystając z internetowych tłumaczy assemblera
    1.https://www.eg.bucknell.edu/~csci320/mips_web/
    2.https://mips-converter.jeffsieu.com/
    3.https://shell-storm.org/online/Online-Assembler-and-Disassembler/?opcodes=21080001&arch=mips32&endianness=little&baddr=0x80000000&dis_with_addr=True&dis_with_raw=True&dis_with_ins=True#disassembly
    Wrzuciłem pierwszą instrukcję zakodowaną szesnastkowo: 0x21080000
    Wszystkie zdekodowały poprawnie.
    Druga instrukcja:0x21080001
    Pierwszy i drugi dają rade, a trzeci pokazał coś takiego:
    0x0000000080000004:  21 08 00 01    move $at, $t0

    Umknęło mu, że jest tam dodawane 1.
    Kolejna instrukcja to np : 0x00000000

    Trzeci poprawnie stwierdził, że to nop. Pierwszy wyrzucił błąd, a drugi pokazał coś dziwnego.
    Ogólnie opisuję to tak bo straciłem sporo czasu na dekodowanie instrukcji.
    Następnie znalazłem jeszcze czwarty link: 4.https://xfreetool.com/en/mips-converter
    Który miał mniej przycisków i trochę mi się wyjaśniło. Dekompilator z trzeciego linku też działa.
    Tylko jak mu podaje instrukcje w w formacie jak powyżej to trzeba wybrać Big Endian.
    Tak samo w tym trzecim linku i wszystko działa. Pierwszy nie rozpoznaje nopa więc bym, go zdyskwalifikował, drugiego tez bo mi nopa normalnie nie pokazał.

    Wyświetlając zawartość pliku bin:
    xxd loop_inc.bin 
    00000000: 0000 0824 0100 0821 0000 0000 0100 0008  ...$...!........
    00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
    00000020: 0001 0000 0000 0000 0000 0000 0000 0000  ................
    00000030: 0000 0000 0000 0000 0000 2002 0101 0001  .......... .....
    00000040: 0000 0000 0000 0000 0100 0000 0000 0000  ................
    

    Widać że tu jest endiannes zmieniony. Więc podczas generacji binarki jest to zapisywane jako little endian.

    Teraz wklejając ciąg hex z bina, (nie cały, bo pozostałe dane to śmieci informacyjne z kompilatora) do linku 3. I wpisując mu Base addr 0x80000000, wybierając little endian
     0000 0824 0100 0821 0000 0000 0100 0008 0000 0000 


    Dostałem następujący wynik
    0x0000000080000000:  00 00 08 24    addiu $t0, $zero, 0
    0x0000000080000004:  01 00 08 21    addi  $t0, $t0, 1
    0x0000000080000008:  00 00 00 00    nop   
    0x000000008000000c:  01 00 00 08    j     0x80000004
    0x0000000080000010:  00 00 00 00    nop  

    Więc działa pokrywa się z tym co kompilator wygenerował.

    Wrzuciłem też to w ghidre, muszę klikać na każdej linii dissaemble, ogólnie nie potrafię tego programu używać. Niby mam zaznaczone, aby robiła to automatycznie ale tego nie robi.
    Nawet zdekompilowała to do C, ale pomineła że jest tam inkrementacja rejestru.

    Wnętrze tunera Manta DVB-T02

    Teraz wrzucenie tego na płytę tunera.
    Wykonałem kilka prób zanim zaczęło mi to działać. A opis wyżej jest efektem tych prób.
    Pisząc komendą mw pod adres 0x80000000 i skacząc do niego nie działa.
    Zadziałało dopiero pisanie pod 0xA0000000 i skoczenie pod 0x80000000
    mw.l A0000000 24080000
    mw.l A0000004 21080001
    mw.l A0000008 00000000
    mw.l A000000C 08000001
    mw.l A0000010 00000000
    md 80000000
    go 80000000
    Dodatkowo w RAM muszę wpisywać dane w formacie Big endian a nie tak jak zapisane w pliku bin. T

    W ramie wygląda to tak:
    
    << MStar >># md 80000000
    80000000: 24080000 21080001 00000000 08000001    ...$...!........
    80000010: 00000000 5A5AA5A5 5A5AA5A5 5A5AA5A5    ......ZZ..ZZ..ZZ
    80000020: 5A5AA5A5 5A5AA5A5 5A5AA5A5 5A5AA5A5    ..ZZ..ZZ..ZZ..ZZ
    80000030: 5A5AA5A5 5A5AA5A5 5A5AA5A5 5A5AA5A5    ..ZZ..ZZ..ZZ..ZZ
    80000040: 5A5AA5A5 5A5AA5A5 5A5AA5A5 5A5AA5A5    ..ZZ..ZZ..ZZ..ZZ
    80000050: 5A5AA5A5 5A5AA5A5 5A5AA5A5 5A5AA5A5    ..ZZ..ZZ..ZZ..ZZ
    80000060: 5A5AA5A5 5A5AA5A5 5A5AA5A5 5A5AA5A5    ..ZZ..ZZ..ZZ..ZZ
    


    Po wykonaniu go zadziałało i po pewnym czasie rzuciło wyjątek od przepełnienia rejestru:
    << MStar >># go 80000000
    ## Starting application at 0x80000000 ...
    
    Exception: 12
    Ov: Overflow from trapping form of integer arithmetic instructions.
    $zero: 00000000  $at: 00000000  $v0: 0000002A  $v1: 00000000
      $a0: 00000001  $a1: 87764964  $a2: 00000001  $a3: 00000000
      $t0: 7FFFFFFF  $t1: 00000001  $t2: 00000003  $t3: 00000002
      $t4: 00000020  $t5: 8768EEA4  $t6: 00000000  $t7: 00000001
      $s0: 80000000  $s1: 87613EC8  $s2: 00000002  $s3: 87764964
      $s4: 00000030  $s5: 00000000  $s6: 00000020  $s7: 87764CA4
      $t8: 876ECE48  $t9: 80000000  $k0: 000000C0  $k1: 02100000
      $gp: 876B7000  $sp: 87764928  $fp: 0000005C  $ra: 87605294
       sr: 34008C02   pc: 80000004  cause : 10000030  badvr : 000002D0
    
    stack backtrace
    stack frame #0: ra = 87605294, sp = 87764928
    stack frame #1: ra = 87601F30, sp = 87764950
    


    Jak widać działa można uruchamiać swój kod. Choć zamiast wpisywać go komendami mw, można by załadować go z pendrive.
  • #26 21693120
    maciej_333
    Poziom 38  
    Posty: 4247
    Pomógł: 488
    Ocena: 1607
    bulek01 napisał:
    Zadziałało dopiero pisanie pod 0xA0000000 i skoczenie pod 0x80000000

    Może jakby wyłączyć cache przez "dcache off" to wtedy można by pisać i skakać pod 0x80000000.
  • #27 21693381
    bulek01
    Poziom 17  
    Posty: 338
    Pomógł: 12
    Ocena: 297
    U mnie wpisanie tej komendy powoduje exception

    
    << MStar >># dcache off
    Data (writethrough) Cache is OFF
    
    Exception: 2
    TLBL: Load or fetch, but page marked as invalid in the TLB
    $zero: 00000000  $at: 00000000  $v0: 00000001  $v1: 00000000
      $a0: 876C0000  $a1: BF200000  $a2: 00000001  $a3: 00000000
      $t0: 00000000  $t1: 00000000  $t2: 00000003  $t3: 00000002
      $t4: 00000020  $t5: 8768EEA4  $t6: 00000000  $t7: 00000001
      $s0: 87764CA4  $s1: 0000005C  $s2: 00000176  $s3: 87764B2E
      $s4: 00000066  $s5: 00000000  $s6: 00000020  $s7: 87764CA4
      $t8: 876ECE48  $t9: 8761B458  $k0: 00000000  $k1: 00000000
      $gp: 876B7000  $sp: 87764950  $fp: 0000005C  $ra: 87601F30
       sr: 34008C02   pc: 87601F44  cause : 00000008  badvr : 0000005C
    
    stack backtrace
    stack frame #0: ra = 87601F30, sp = 87764950
    


    Ta opcja dcache jest opisana jako writethrough. Więc powinno działać, gdy jest włączona, ale jednak tak nie jest.
    Nawet sam kod wypakowujący U-Boota pisze po pamięci pod adres 0xAxxxxxx, a potem skacze pod 0x8xxxxxx
    Pewnie jest tu jakiś bug, albo własność, o której nie mamy pojęcia.
  • #28 21695164
    bulek01
    Poziom 17  
    Posty: 338
    Pomógł: 12
    Ocena: 297
    Kusiło mnie, aby napisać coś więcej w asemblerze i w ten sposób powstał przykład hello world.

    Oto kod:
        .section .text
        .globl _start
    
    _start:
        la      $a0, string
        la      $t1, 0xBF201300
        li      $t2, 0 
    
    write_char:
        lb      $t3, 0($a0)
        beq     $t3, $zero, delay_1s
        sb      $t3, 0($t1)     # Zapisz znak do 0xBF20130
        addi    $a0, $a0, 1     # Przejdź do kolejnego znaku
    
        li      $t4, 4000000
    delay_200ms:
        sub     $t4, $t4, 1    
        bnez    $t4, delay_200ms
        j       write_char
    
    delay_1s:
        nop
        li      $t0, 8000000  
    delay_1sec:
        sub     $t0, $t0, 1 
        beq    $t0, $zero, delay_1sec
        j       _start
    
        .section .data
    string:      .asciiz "Hello World\n\r" 


    Jest to bardzo prosty kod, który nie używa nawet stosu. Robi jedynie skoki i pisanie do pamięci, czytanie znaków stringu spod pamięci, oraz czekanie w pętli.
    Wyświetla on napis na UArcie Hello World, gdzie pomiędzy każdym znakiem wysyłanym jest odstęp czasowy, bo nie sprawdzam statusu. Plus jest dwa razy większe opóźnienie pomiędzy wysyłaniem całej sekwencji. Znaki są zapisywane pod adres w pamięci 0xBF201300, gdzie znajduje się przestrzeń adresowa UART.

    Kolejny element to skrypt linkera, teraz pojawiła się tu sekcja .data, bo pojawił się string.
    
    ENTRY(_start)
    
    SECTIONS {
        . = 0x80000000;              
    
        .text : {
            *(.text)               
        }
    
        .data : {
            *(.data)                 
        }
    
        .bss : {
            *(.bss)             
        }
    
        /DISCARD/ : { *(.note*) *(.comment*) }  /* Opcjonalnie, usuwamy niepotrzebne sekcje */
    }


    Kompilacja jak poprzednio.
    Ale tym razem wrzuciłem to w skrypt bashowy, bo musiałem to uruchamiać wiele razy:
    #/bin/bash
    mipsel-linux-gnu-as -march=mips32r2 -o hello.o hello.asm
    mipsel-linux-gnu-ld -T hello.ld hello.o -o hello.elf
    mipsel-linux-gnu-objcopy -O binary hello.elf hello.bin
    


    Następnie plik hello.bin skopiowałem na pendrive i załadowałem i uruchomiłem komendą:

    usb reset 0;fatload usb 0 0x80000000 hello.bin;go 0x80000000

    Zanim stwierdziłem, aby używać pendriva do ładowania pliku robiłem jak poprzednio komendami mw,
    ale po kilku razach miałem dość bo było tego za dużo.

    Rezultat uruchomienia jest następujący:
    
    << MStar >># usb reset 0;fatload usb 0 0x80000000 hello.bin;go 0x80000000
    (Re)start USB 0...
    Kronus 128-pin package
    Check USB port[0]:
    Host type:2 
    scanning bus for devices... 1 USB Device(s) found
           scanning bus for storage devices... bulk max packet size:200
    usb_stor_Bulk_max_lun: 0 
    init_part begin
    init_part end
    find one storage Device
    1 Storage Device(s) found
    reading hello.bin
    
    176 bytes read
    ## Starting application at 0x80000000 ...
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    Hello World
    


    Przy okazji udało mi się uruchomić symulację. Jak przygotowywałem ten kod to mi to za bardzo nie chciało działać.
    Na początku nic się nie wyświetlało, potem coś. Potem jakby się zawieszało i nie wiedziałem co robię nie tak.
    Oczywiście były to drobnostki, ale poznając nową architekturę nie wiadomo czego się złapać.
    Rozwiązanie które powstało to uruchomienie tego kodu pod qemu oraz debugowanie z użyciem gdb.
    Paczkę quemu pod mips zainstalowałem manadrżera pakietów pod moim systemem.
    Po wielu próbach doszedłem do czegoś takiego:

    qemu-system-mipsel -machine malta -device loader,file=hello.elf,cpu-num=0 -device loader,addr=0x80000000,cpu-num=0 -nographic -monitor none -cpu 24Kc -m 64M -no-reboot -d in_asm -s -S

    Wybrana jest tu maszyna malta, która była evalbordem dla mipsów. Próbowałem none, ale wtedy nie działa.
    Ładuję plik elf, jest on automatycznie załadowany pod adres 0x80000000. Następnie ustawiam PC procesora na ten adres.
    Procesor wybrałem 24Kc, ponieważ realizuje on architekturę mips32r2.
    Opcja -d in_asm pozwala na wyświetlanie obecnie dekodowanych TLB w qemu czyli komend assemblera.
    Na początku próbowałem wykorzystać to do zobaczenia jak się program wykonuje. Można dodać wyświetlanie jeszcze stanu rejestrów procesora. ale w momencie gdy mi kod nie działał,
    ten log stawał na pętli nieskończonej i miałem wrażenie że się nic nie dzieje. Nie rozumiem tego zachowania, bo procesor po prostu skakał między trzema instrukcjami co zobaczyłem później na gdb. Może też dlatego, że to były 3 instrukcje które nie musiały być ładowane bo się już w cache zmieściły. Qemu realizuje emulację w dość złożony dla mnie sposób którego nie rozumiem. Ale gdy się krokuje debugerem instrukcje to wyświetla każdą.

    Ostatnie parametry -s -S zatrzymują procesor na starcie w oczekiwaniu na podłączenie debugera oraz druga uruchamia nasłuchiwanie do przyłączenia gdb na porcie 1234.
    Podłączyć się debugerem można w następujący sposób:
    gdb ~/asm/hello/hello.elf -ex 'target remote localhost:1234'

    Tutaj dodam, że na początku skompilowałem gdb pod architekturę mips, a potem się zorientowałem, że moje domyślnie zainstalowane w systemie też działa z mipsem.
    Teraz mogąc krokować, ustawiać breakpointy, wyświetlać stan rejestrów szybko znalazłem problem.

    Dodaję jeszcze screen z logu qemu
    Zrzut ekranu z QEMU pokazujący pętlę instrukcji MIPS na adresie 0x80000030

    oraz screen z gdb
    Zrzut ekranu debuggera GDB pokazujący kod asemblera i rejestry procesora MIPS
  • #29 21695169
    dawidoo2115
    Poziom 13  
    Posty: 100
    Pomógł: 6
    Ocena: 27
    Kawał dobrej roboty. Ja bym chyba nie miał do tego cierpliwości.
Słuchaj:

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy rozbiórki i analizy tunera Manta DVB-T02 w kontekście przejścia na standard DVB-T2. W tunerze zastosowano procesor MIPS 34k oraz układ Mstar MSD7818, a system operacyjny to prawdopodobnie eCos lub Linux z warstwą bootloadera MBoot (zmodyfikowany U-Boot). Użytkownik bada konsolę UART i próbuje uruchomić własny kod asemblera MIPS, napotykając problemy z wyjątkami i nieprawidłowymi instrukcjami, co może wynikać z mechanizmów cache procesora i mapowania pamięci (adresy 0x80000000 i 0xA0000000). Wskazano, że bootloader ładuje eCos do pamięci od 0x80000180, a komenda "go" może nadpisywać zmiany w pamięci cache. Dyskutowano także o kodowaniu i modulacji DVB-T2, wyjaśniając, że DVB-T2 to modulacja OFDM z efektywniejszym wykorzystaniem pasma, a nie bezpośrednio kodek wideo/audio. Użytkownik przygotował przykładowy kod asemblera i skrypt linkera do kompilacji pod MIPS, a także rozważa wyłączenie cache procesora, aby umożliwić modyfikację kodu w pamięci. W dalszych pracach autor przeszedł do uruchamiania głowic DVB-S na mikrokontrolerze STM32 z układem AV2012.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA