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

Eksperymentalny odbiornik SDR (Software-Defined Radio) na MxL5007 i STM32F407 - dalsze prace

maciej_333 21 Sie 2025 02:36 4983 80

TL;DR

  • Rozwinięto eksperymentalny odbiornik SDR na tunerze DVB-T z MxL5007T i STM32F407, wykorzystując wyjście pośredniej częstotliwości do cyfrowego mieszania I/Q.
  • Płytę tunera przerobiono zworkami, wyprowadzono I2C, VAGC, zasilanie i IF_OUT_P/N oraz dodano wzmacniacz p.cz. ze starego projektu dla R820T.
  • MxL5007T pracuje z adresem I2C 0xC0, częstotliwością pośrednią 4,5 MHz i pasmem 6 MHz; krok strojenia wynosi 7,8124 kHz.
  • Układ uruchomiono z oryginalnym driverem producenta, odbierając DVB-T, FM 88–108 MHz oraz krótkie fale, a całe wzmocnienie toru przekroczyło 100 dB.
  • Brak wewnętrznego ARW w MxL5007T utrudnia odbiór przy zmianach poziomu sygnału, a selektywność pozostaje słaba mimo poprawionego filtra audio DSP.
Wygenerowane przez model językowy.
📢 Słuchaj (AI):
  • Uruchomiona płytka STM32 z dołączonym tunerem DVB-T i płytką wzmacniacza p.cz.
    Chciałbym zaprezentować rozwinięcie eksperymentalnego odbiornika SDR, jaki opisałem ostatnio: Link. Wówczas zastosowałem głowicę z tunera DVB-T z układem R820T. Tym razem jednak zdecydowałem się uruchomić inny układ tj. MxL5007T. Układ ten występuje w tunerze DVB-T02 firmy Manta, który szerzej opisałem pod koniec zeszłego roku: Link. Płyta tunera jest przedstawiona na poniższych zdjęciach:
    Płyta główna tunera DVB-T Manta z widocznymi komponentami. Dolna warstwa płyty głównej tunera Manta DVB-T02 z widocznymi lutowaniami i ścieżkami.
    Najbardziej w tym momencie interesującym fragmentem płyty jest głowica:
    Zbliżenie na głowicę tunera DVB-T z układem MxL5007T na niebieskiej płytce PCB
    Znaleźć tu można układ MxL5007T:
    Głowica tunera DVB-T z układem MxL5007T zamontowana na płytce drukowanej
    Teraz pojawia się podstawowy problem. Brak jest datasheet tego układu. To, co jest dostępne stanowi tylko skrótowy opis funkcjonalności MxL5007T. Nie ma nawet opisu wyprowadzeń czy rejestrów programowanych przez I2C. Można jednak znaleźć bardzo uproszczony schemat blokowy:
    Schemat blokowy układu MxL5007T z torem p.cz., syntezą i regulacją wzmocnienia
    Wynika z tego, że jest to układ o podwójnej przemianie częstotliwości. Można zaprogramować różne częstotliwości pośrednie i szerokości pasma dla toru p.cz. Wzmocnienie ma być zadawane zewnętrznym napięciem Vagc. Zgodnie z opisem ma być też wewnętrzne ARW (AGC). Zatem mamy tu wielopoziomowe ARW, z tą różnicą, że w R820T są trzy poziomy ARW, tu zaś tylko dwa. Jest też wspomniany opis:
    Lista cech układu MxL5007T dotyczących jego parametrów i możliwości konfiguracji.
    Początkowo poszukiwałem w Google chociaż jakiegoś kodu drivera do MxL5007T. Łatwo coś znaleźć na Githubie: Link. Byłoby sporo pracy, by przeprotować ten kod (Linux) pod STM32. Widać też, że ktoś uruchomił ten układ pod Arduino - jest nawet dostępna biblioteka: Link. Przeportowanie tego kodu jest bardzo łatwe. Ciekawe materiały w Google o takich układach można znaleźć po zmianie języka wyszukiwania na chiński. W ten sposób znalazłem wręcz "Święty Graal": Link. Jest to oryginalny driver dla MxL5007, jaki przygotował producent układu! Zatem jest już niezła baza odnośnie kodu. Wciąż jednak brak opisu wyprowadzeń. Na tej samej chińskiej stronie znalazłem schemat tunera na MSD7818 (na tym chipsecie jest oparty DVB-T02). Założyłem, że może tam być MxL5007T. Tak jest faktycznie:
    Schemat fragmentu tunera z układem MxL5007T i elementami wejściowymi RF
    Widzimy tu fragment schematu z głowicą. Powinno to wystarczyć do uruchomienia MxL5007T. Wstępnie jednak trzeba rozpracować płytę, czyli znaleźć punkty do jakich można dołączyć STM32. Potrzeba więc zlokalizować I2C (SDA i SCL), VAGC (zmiana wzmocnienia), +3,3V (zasilanie) oraz wyjście p.cz. IF_OUT_P i IF_OUT_N. Należy to zrobić omomierzem wg powyższego schematu. Poniżej to, co udało się ustalić:
    Płyta tunera DVB-T z oznaczeniami głównych sygnałów i układu MxL5007T.
    Większość łatwo można znaleźć. Najtrudniej było z ARW i zasilaniem. To ostatnie stanowi ścieżkę idącą pod trzema kondensatorami (prowizorycznie trzeba je było wylutować):
    Zbliżenie na głowicę tunera z układem MxL5007T i kablami połączeniowymi
    Najprościej byłoby oczywiście wyciąć głowicę z całej płyty, ale szkoda mi było tego tunera. Wciąż można coś zrobić z MSD7818. Na chińskich stronach można sporo znaleźć o platformie MSTAR. Postanowiłem więc przerobić tuner tak, by dało się odciąć MxL5007T od reszty układu za pomocą zworek i zasilić go z zewnątrz. Dodałem też dodatkowe kołki, by ułatwić dołączanie oscyloskopu i analizatora stanów logicznych. Powstało coś takiego:
    Zmodyfikowana płyta tunera DVB-T z dołączonymi przewodami i zworkami Płyta tunera DVB-T z układem MxL5007T i przewodami do wyprowadzeń sygnałowych
    Dodałem dodatkowe płytki uniwersalne lutowane do złącza HDMI, pól masy na płycie i ekranu głowicy. Okazało się to być całkiem wygodne. Część elementów trzeba było oczywiście odlutować z płyty tunera. Obecnie można wstawić zworki i wszystko działa tak samo jak przedtem. Sprawdzenie tunera:
    Płyta tunera DVB-T z podłączonymi przewodami testowymi i urządzeniem analizującym Zgrabny adapter USB Video DVR podłączony do kabli RCA na drewnianym biurku
    Wykorzystałem przedstawiony z prawej strony USB Grabber. Można tym przechwytywać analogowy sygnał composite video. Od strony komputera PC USB Grabber jest zainstalowany jako zwykła kamera "internetowa". Tuner działał poprawnie. Jak widać na zdjęciu taki tuner łatwo jest zasilić z zewnętrznego zasilacza. Wystarczy podać +5 V na katodę diody w prostowniku zasilacza flyback. Udało się nawet coś odebrać na MUX-8 (prawie brak możliwości odbioru - słaby sygnał w Grudziądzu):
    Mężczyzna w garniturze w programie TV; zniekształcenia obrazu i pasek z wiadomością Zrzut ekranu z programu informacyjnego z zakłóceniami obrazu i napisem o migrantach Prezenter w studiu informacyjnym z zakłóceniami sygnału na ekranie
    Są to obrazy uzyskane z USB Grabbera, który to był dołączony do wyjścia composite viedo w tunerze. W dalszej kolejności można sprawdzić konsolę UART. Podczas startu i bootowania jest coś takiego z dołączonym MxL5007T:
    Spoiler:
    UART_115200

    BIST0-OK

    _snPDMDrv_PM_RtcGetCounter(CurrentCounter=0)


    Hello U-Boot


    U-Boot 1.1.6 (Jul 19 2012 - 03:28:39)

    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][768] 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 0x2839B3
    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=0x2839B3, out= 0x80000180, alloc_buf = 0x81000000
    in=0x80B00000, in_size=0x2839B3, out= 0x80000180, alloc_buf = 0x81000000
    in_size=2636211 out_size=7234292 unpack_size=0


    LZMA Decompression...CRC_result F1E891C2 CRC_value F1E891C2
    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(0x8068f568)
    New domain internet at 0x00000000
    [cyg_net_init] Init: cyg_net_add_domain(0x8068f130)
    New domain route at 0x00000000
    [cyg_net_init] Init: call_route_init(0x00000000)
    [cyg_net_init] Done
    [SysInit][1972]
    [SysInit][1974]
    ****** 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][1976]

    Customer info: 00660630002f000000000000000000000000000408f81800
    Hash: 57896ceada56f7bbb0af9151e38029b1
    Auth OK

    [SysInit][1978]
    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 = 90F958
    mdrv_gpio_init
    [SysInit][1987]
    MIU Initialize...
    Get IOMap u32NonPmBase = 0xbf200000
    Get IOMap u32PmBase = 0xbf000000
    Disable MIU1
    [SysInit][1995]
    WDT_Init
    [SysInit][2002]
    [SysInit][2005]
    MDrv_WDT_IsReset = 0
    [SysInit][2011]
    [MAPI_MEMINFO] DVBC System Memory Usage
    [MAPI_MEMINFO] ============================ START END SIZE
    [MAPI_MEMINFO] POOL_START 0x00000000 0x016ce800 0x016ce800
    [MAPI_MEMINFO] Cached Pool Start 0x0090f958 0x00c2f958 0x00320000
    [MAPI_MEMINFO] NONCACHED_POOL_START 0x00c2f958 0x016ce800 0x00a9eea8
    [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 0x8090f958


    [SysInit][2015]
    [SysInit][2024]
    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] [0;32m 01.74 00486343
    [mMDrv_PNL_Init u32PnlRiuBaseAddr = bf200000
    MDrv_PNL_Init u32PMRiuBaseAddr = bf000000
    [XC,Version] [0;36m 00489048
    [mMDrv_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: 80c2c7c0
    hcd: 80c2c7f4
    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][1178] 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]
    tvvideo_SetDCOutputTiming : 0, 1
    Check the Source type 6

    MDrv_HDMITx_SetAVMUTE
    [tvvideo_SetDCOutputTiming][473]: ## Change Resolution ##, eCompType = 6
    [msAPI_XC_ReMapComponentType][246]: msAPI_XC eTiming = 6
    DAC eTiming =6
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    HDMITx eTiming =7

    ##########$$$$$$$$$$$2into 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][438]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][438]_Zapper_Disable_AV: Enter at 4350.
    alloc mem 0x40000
    alloc mem 0x2400
    alloc mem 0x2000
    alloc mem 0x1000

    W trakcie próby inicjalizacji MxL5007T pojawia się coś takiego:
     MXL5007T SetTuner 
    
     MXL5007 SetTuner dwFreq = -1000, ucBw = 8 
    MxL_RFSynth_Lock_Status = 0xc 
    RFSynth bLock = 1 
    REFSynth bLock = 1 
    Tuner Success 

    Bez MxL5007T pojawia się oczywiście to:
    InitTuner fail 

    Myślałem, że tuner się nie uruchomi przy braku MxL5007T, ale jednak startuje. Można się domyślać, że "ucBw = 8" to pasmo 8 MHz. Potem okazało się, że tajemnicze "RFSynth bLock = 1" i "REFSynth bLock = 1" to flagi tego, że obie pętle PLL (pierwsza i druga przemiana częstotliwości) weszły w zakres chwytania. Przytrzymując CR podczas bootowania można wejść do samego bootladera U-Boot. Można więc pobawić się MxL5007T i zobaczyć co jest na szynie I2C za pomocą analizatora stanów logicznych. Początkowo można wykorzystać komendę "tuner_init<CR>":
    Zrzut ekranu terminala z komunikatami błędów dotyczącymi inicjalizacji tunera
    Jak widać MxL5007T jest inicjalizowany. Jego adres na I2C to 192(dec)=0xC0. Dalej wynik z analizatora stanów logicznych:
    Zrzut ekranu z analizatora logicznego pokazujący sygnały I2C SDA i SCL oraz dekodowane dane Zrzut z analizatora logicznego pokazujący analizę transmisji I2C między układem a MxL5007T Zrzut ekranu z analizatora stanów logicznych pokazujący komunikację I2C z układem MxL5007T
    Trochę to trwa. Są jakieś opóźnienia i dziwna sprawa na początku. Dochodzi do zapisu pod adres 0x00. Nie wiem po co. Częstotliwość SCL na szynie I2C to ok. 150 kHz. Za pomocą generatora w.cz. i oscyloskopu udało się ustalić, że częstotliwość pośrednia to ok. 5 MHz. Generalnie dla inicjalizacji jest coś takiego:
    Spoiler:
    Time,Packet ID,Address,Read/Write,Data
    0.0000084320,1,0x00,W
    0.0020556640,1,0x00,W
    0.0069490960,2,0xC0,W,0xFF
    0.0135358800,3,0xC0,W,0x02 0x03 0x03 0x40 0x05 0x04 0x06 0x11 0x2E 0x15 0x30 0x10 0x45 0x58 0x48 0x19 0x52 0x03 0x53 0x44 0x6A 0x4B 0x76 0x00 0x78 0x18 0x7A 0x17 0x85 0x06 0x01 0x01

    Kolejna komenda to "tuner_demodtype [param]<CR>":
    Zrzut ekranu z konsoli MStar z wywołaniem komendy tuner_demodtype
    Tutaj nie dochodzi do żadnej aktywności na I2C. Widać, że ustawiana jest jednak zmienna środowiskowa. Ostatecznie można użyć "tuner_tune". Da się dzięki temu ustawić częstotliwość i pasmo. Wybrałem 100 MHz i pasmo 6 MHz:
    Spoiler:


    do_tuner_setfreq u32Freq = 100000KHz, eRfBandwidth = 0x1
    FE 100000 BW 0

    MXL5007T SetTuner

    MXL5007 SetTuner dwFreq = 100000000, ucBw = 6
    MxL_RFSynth_Lock_Status = 0xC
    RFSynth bLock = 1
    REFSynth bLock = 1
    [cmd_tuner.c][53] (Freq, bandth) = (100000 1) Try Lock
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    MApi_FE_GetSignalQuality Lock Failed
    [cmd_tuner.c][64] Signal quality 0 0
    FE un-lock
    << MStar >>#

    Oczywiście sygnał z generatora nie zostanie rozpoznany jako DVB-T. Stąd wynika otrzymany komunikat w konsoli UART. Jednak zmiany poziomu sygnału z generatora mają oczywiście wpływ na wartość napięcia ARW. Na szynie I2C jest znowu programowanie jakichś rejestrów:
    Spoiler:
    Time,Packet ID,Address,Read/Write,Data
    0.0000198720,1,0xC0,W,0x0F 0x00 0x0C 0x15 0x0D 0x00 0x0E 0x19 0x1F 0x87 0x20 0x1F 0x21 0x87 0x22 0x1F 0x80 0x01 0x0F 0x01
    0.0096766960,2,0xC0,W,0xF8 0xD8
    0.0098780720,2,0xC1,R,0x0F
    0.0143467200,3,0xC0,W,0xF8 0xD8
    0.0145480160,3,0xC1,R,0x0F

    Jak widać najpierw coś jest programowane, potem odczytywane. Jak się potem okazało w rejestrze 0xD8 jest status obu pętli PLL. Byłoby trudno to rozpracować bez opisu rejestrów. Jednak układ ten wydaje się trochę prostszy w programowaniu od R820T. Jest to więc bardzo wstępna zabawa z MxL5007T. Można by to pominąć, ale zakładałem, że ze znalezionym kodem będą problemy. Stąd musiałem mieć zapis tego, co jest na I2C dla porównania. Co ciekawe znalazłem też kod dla MxL5007, ale pod platformę MSTAR: Link. Kod ten pasuje do zachowania tunera i tego, co jest w konsoli UART. Przykładowo taka funkcja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Odpowiada czemuś takiemu w konsoli po wywołaniu "tuner_tune":
    MXL5007T SetTuner 
    
     MXL5007 SetTuner dwFreq = 100000000, ucBw = 6 
    MxL_RFSynth_Lock_Status = 0xC 
    RFSynth bLock = 1 
    REFSynth bLock = 1 

    Widać, że jest to nieco inaczej wg kodu, bo nie powinno być "MxL_RFSynth_Lock_Status = 0xC", ale reszta się zgadza. Na tym etapie można zakończyć wstępną inżynierię wsteczną płyty tunera.

    W dalszej kolejności można dołączyć STM32. Schemat blokowy odbiornika ma odpowiadać koncepcji podanej wcześniej. Chodzi więc o próbkowanie sygnału pasmowego z wyjścia p.cz. i w dalszej kolejności mieszanie cyfrowe dla otrzymania i(n) i q(n). Zatem schemat blokowy jest prawie identyczny:
    Schemat blokowy odbiornika SDR z MxL5007T i STM32F407
    Wykorzystałem tu wzmacniacz p.cz., jaki opracowałem dla R820T. Powstał więc uproszczony schemat dołączenia STM32 i wzmacniacz p.cz. do płyty tunera:
    Schemat blokowy tuner SDR z układem MxL5007T i wzmacniaczem p.cz.
    Dzięki wspomnianym zworkom (widoczne na fotografiach i schemacie) można po odłączeniu płytki p.cz. i STM32F4DISCOVERY przywrócić tuner do stanu pierwotnego.

    Odnośnie samego programowania MxL5007T początkowo przeportowałem kod Arduino. Wyniki tych prac zamieściłem na chińskiej stronie: Link. Działało to poprawnie, ale uznałem, że ciekawiej będzie jak uruchomię oryginalny kod producenta. Jak się okazuje kody, które można znaleźć w Internecie są oparte właśnie na tym źródle. Warto na początek poczytać dokumentację wspomnianego drivera:
    Okładka dokumentu MaxLinear MxL5007T Driver API User Guide, wersja 4.1.3
    Ma to być niby tak zrobione (nie do końca tak ostatecznie jest):
    Schemat struktury oprogramowania API dla MxL5007T z podziałem na warstwy
    Widzimy warstwowość tego kodu i osobny plik na implementację kodu zależnego od danej platformy. Adres I2C ustawia się przez wyprowadzenie AS (6):
    Tabela z wartościami rezystorów a odpowiadającymi adresami I2C dla układu MxL5007T
    Linia ta jest zwarta do masy, więc adres to 96(dec). Po przesunięciu w lewo o jeden bit jest właśnie widoczne wcześniej 0xC0. Przykładowo dla komendy RESET trzeba wysłać 0xFF. Stąd na początku inicjalizacji było "0xC0,W,0xFF". Jest to więc właśnie RESET. Zapis czegoś do MxL5007T jest ciekawy:
    Format danych I2C w trybie zapisu dla dwóch bajtów według tabeli
    Generalnie najpierw wysyłany jest adres 0xC0. Potem zaś pary: adres rejestru i jego wartość. W większości układów wysyła się tylko adres pierwszego rejestru. Potem wszystko idzie już po kolei z autoinkrementacją wewnętrznego licznika. Tu jest inne rozwiązanie. Nigdy się z czymś takim nie spotkałem. Odczyt rejestru jest bardziej skomplikowany:
    Diagram przedstawiający dwustopniowy format danych I2C dla trybu odczytu MxL5007T
    Najpierw trzeba wysłać adres 0xC0, 0xFB (komenda) i adres rejestru do odczytu. Potem wysyłamy adres do odczytu 0xC1 i odczytujemy rejestr. W dokumentacji drivera jest też opis funkcji API, tego jak zrobić własne funkcje zależne od platformy i przykładowy kod (nie do końca poprawny). Uruchomienie drivera było proste, ale są tam błędy. Poprawiłem funkcję od sprawdzania ID układu na bazie podanego wcześniej kodu: Link. Konsola UART w STM32 została z poprzedniego projektu. Dodałem tylko odpowiednie polecenia, inne zaś usunąłem i zamieniłem kod od R820T na MxL5007T.

    MxL5007T zaprogramowałem tak, by pasował do projektu. Zatem częstotliwość pośrednia to 4,5 MHz i pasmo 6 MHz. Generalnie pasmo toru p.cz. i tak musi być wąskie, więc lepiej ustawić jaknajwęższe pasmo dla filtra p.cz. w MxL5007T.

    Mając już uruchomiony MxL5007T trzeba go przetestować za pomocą oscyloskopu i generatora w.cz. Należy też podać jakieś napięcie na wyprowadzenie VAGC. Wykorzystałem więc generator G4-116 i oscyloskop PM3233:
    Radziecki generator sygnałowy G4-116 z pokrętłami i wskaźnikami analogowymi Ekran oscyloskopu Philips PM3233 pokazujący sygnał prostokątny
    Sygnały na wyjściach p.cz. dla sygnału w.cz. 100 MHz:
    Dwa przebiegi sinusoidalne na ekranie oscyloskopu z opisami IF_OUT_P i IF_OUT_N
    Jak widać wyjście jest różnicowe. Widoczna niesymetryczność wynika częściowo z nieco rozstrojonego kanału B oscyloskopu. Faktycznie jest dużo mniejsza. W tym momencie można już było wstępnie dołączyć MxL5007T do toru p.cz. i uruchomić odbiornik. Dało się odebrać już jakieś stacje. Jednak o tym napiszę w dalszej części.

    Mając wstępnie uruchomiony MxL5007T można było przystąpić do jego badań, ponieważ nic o tym układzie nie wiadomo. Wg cytowanego wcześniej szczątkowego datasheet miało być bardzo dobre ARW (pierwszy poziom ARW). Można to łatwo sprawdzić ustawiając stałą wartość napięcia na VAGC i zmieniając poziom sygnału z generatora po dostrojeniu odbiornika do jego częstotliwości. Wzrost poziomu powinien powodować ograniczanie wzmocnienia. Poniżej wyniki:
    Zrzut ekranu z arkusza kalkulacyjnego z zestawieniem danych pomiarowych dla toru p.cz.
    Ma tam być niby ARW o dynamice 100 dB. W moim wypadku zmiany poziomu sygnału są rzędu 25...28 dB. Oczywiście mogłem zwiększać poziom jeszcze znacznie bardziej, ale MxL5007T przestawał pracować liniowo. Wzmocnienie jest prawie stałe. Z uwagi na szumy w skrajnych przypadkach był problem by to dokładnie pomierzyć. Zatem wniosek jest taki, że ARW nie jest włączone przez jakieś rejestry. W tym kodzie jest coś o ARW, ale zmiany w rejestrze 0x12 nic nie dają, zaś ustawianie rejestrów w podany tam sposób prowadzi do tego, że MxL5007T przestaje działać. Skoro jesteśmy przy ARW, to należy wyznaczyć zależność wzmocnienia od napięcia na VAGC tj. ku=f(Uvagc) przy f=const. Uzyskałem taki wynik dla f=100 MHz:
    Wykres zależności wzmocnienia ku od napięcia sterującego UVAGC
    Wzmocnienie jest podane w V/V. Napięcie VAGC było mierzone bezpośrednio na wyprowadzeniu 27 (VAGC). Wyjścia IF MxL5007T nie były obciążone. W celu wyznaczenia wzmocnienia w tak szerokim zakresie zmian na VAGC konieczna była zmiana poziomu na generatorze i jej stopniowe redukowanie w trakcie badania, tak by uzyskać sensowny sygnał na wyjściu i liniową pracę. Skoro nie ma wewnętrznego ARW to taki eksperyment ma sens. Jest to nieliniowa zależność i w dodatku o bardzo dużym nachyleniu. Co to za funkcja? Z pewnością jakaś wykładnicza. Będzie to więc coś w stylu:
    Wzór wykładniczy wzmocnienia jako funkcji napięcia VAGC
    gdzie: a, b - stałe. Można zrobić aproksymację, by wyznaczyć te współczynniki (metoda najmniejszych kwadratów - minimalizacja błędu średniokwadratowego), ale nie widzę potrzeby. Znacznie korzystniej przedstawić to w skali log-lin:
    Wykres zależności wzmocnienia ku w dB od napięcia UVAGC w woltach
    Jest to ta sama zależność. Jednak tym razem jest ku[dB]=20*log10(ku[V/V). Skoro poprzednia funkcja jest wykładnicza i podstawę ma 10, to logarytm o podstawie 10 jest funkcją odwrotną. Stąd powstaje zależność liniowa. W Excelu można wyznaczyć linię trendu (też metoda najmniejszych kwadratów). Jest to bardzo praktyczny wzór. Można wyznaczyć funkcję odwrotną:
    //Gain [dB] = 65.441*V_if_agc [V] - 36.681  ->  V_if_agc [V] = 1.5281E-2*Gain [dB] + 5.6052E-1

    Wstawiając te stałe do programu poprzez #define można już obliczyć potrzebne napięcie dla VAGC przy zadanym wzmocnieniu MxL5007T. Należy jednak uwzględnić jeszcze korektę z uwagi na obciążenie filtra dolnoprzepustowego dla PWM (R17-C11). Ustaliłem ze spadków napięć w obwodzie i znajomości rezystancji, że rezystancja wejściowa dla VAGC wynosi 54,5 kΩ. Ostatecznie w programie wychodzi to bardzo ładnie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Z uwagi na silne obciążenie filtra R17-C11 musiałem znacznie zmniejszyć wartość R17 i zwiększyć pojemność C11. Było to projektowane dla innych warunków pracy tj. przy R820T. Skoro już zajmujemy się wzmocnieniem, to można powiedzieć, że wzmocnienie wzmacniacza p.cz. dla częstotliwości środkowej wynosi 16,95 dB. Z kolei po dołączeniu toru p.cz. do wyjść IF MxL5007T napięcie spada, bo dochodzi do obciążenia. Warto więc wiedzieć ile wynosi rezystancja wyjściowa (różnicowa). Można to wyznaczyć różnie. Ja zmierzyłem napięcie wyjściowe wyjść obciążonych rezystorem o znanej rezystancji i przy braku obciążenia (włączenie obciążenia pomiędzy wyprowadzenia IF).
    Płytka tunera DVB-T z sondą oscyloskopową i analizatorem stanów logicznych Sonda oscyloskopowa podłączona do płyty tunera DVB-T z modyfikacjami

    Potem można obliczyć rezystancję wyjściową wykorzystując model Thevenina. Obciążałem wyjście rezystorem 2,64 kΩ (wartość zmierzona). Uzyskałem wynik pomiaru rezystancji wyjściowej 600 Ω. Tor p.cz. ma dość małą rezystancję wejściową. Wynika to z wartości R1 i R2. Tutaj Rwe zależy głównie od nich. Rezystancja wejściowa samego tranzystora z uwagi na brak zwarcia emitera do masy dla składowej zmiennej jest duża i wyniesie r1=rbb'+rb'e+(β+1)*R4||R5. Ostatecznie Rw=R1||R2||r1, ale R1||R2<<r1. Trzeba to teraz sprowadzić na stronę pierwotną transformatora, czyli dzielimy przez kwadrat przekładni. Stąd z punktu widzenia uzwojenia pierwotnego mamy mniejszą Rwe', bo przekładnia to 1:2. Wynikające z tego tłumienie wynosi -5,46 dB. Można to wszystko wziąć pod uwagę i zadawać przez konsolę wzmocnienie całego toru. Stąd zadaję Total_Gain i obliczam potrzebne wzmocnienie dla MxL5007T.
    float MxL_gain = Total_Gain - (IF_Gain + Attenuation);

    Pokazuje to jak praktyczna i wygodna jest miara wzmocnienia w dB. Tak to wygląda w konsoli:
    Zrzut ekranu konsoli UART z wynikami poleceń ustawienia wzmocnienia w MxL5007T
    Pytanie na ile dobrze to działa? Zbadałem wzmocnienie przy kilku częstotliwościach. Obawiałem się, że dla częstotliwości innej, niż 100 MHz (przy takiej częstotliwości robiłem pomiary) już to się nie będzie zgadzać, ale jest nieźle:
    Tabela porównawcza wzmocnienia toru odbiorczego dla 50, 150 i 300 MHz
    Tutaj Gset to wzmocnienie zadane z konsoli UART, zaś Gmeas zmierzone. Można uzyskać wzmocnienie całego toru ponad 100 dB. Inna sprawa czy ma to jakiś sens w związku z SNR.

    Pytanie też na ile zgadza się częstotliwość zaprogramowana w MxL5007T z faktycznie odbieraną? Zrobiłem kilka eksperymentów. Poniżej fotografie wyniku pomiaru na mierniku częstotliwości:
    Miernik częstotliwości RFT G-2002.500 pokazuje wartość 49,99988 MHz Licznik częstotliwości RFT Zähler G-2002.500 z wyświetloną wartością 100.0014 MHz Częstotliwościomierz RFT pokazujący wartość 159,9915 MHz Miernik częstotliwości RFT G-2002.500 z wynikiem pomiaru 199,9830 MHz
    Idąc od lewej zaprogramowana częstotliwość wynosiła: 50,00000 MHz; 100,00000 MHz; 160,00000 MHz i 200,00000 MHz. Jest zatem bardzo dobrze. W tym przypadku oczywiście dostrajałem generator do uzyskania maksymalnej wartości sygnału na wyjściu wzmacniacza p.cz.

    Bawiąc się dalej chciałem zrobić RSSI (Received Signal Strength Indication). W tym kodzie jest jakaś funkcja, ale nie działa. Zacząłem więc przeglądać rejestry. Wstępnie zrobiłem komendę dump. Poniżej efekt:
    Spoiler:

    0x00=0x3F
    0x01=0x01
    0x02=0x02
    0x03=0x40
    0x04=0x01
    0x05=0x04
    0x06=0x11
    0x07=0x0A
    0x08=0x80
    0x09=0x3F
    0x0A=0x3F
    0x0B=0x3F
    0x0C=0x15
    0x0D=0x00
    0x0E=0x19
    0x0F=0x01
    0x10=0x00
    0x11=0x00
    0x12=0x05
    0x13=0x01
    0x14=0x3C
    0x15=0x0A
    0x16=0x10
    0x17=0x66
    0x18=0x1D
    0x19=0x01
    0x1A=0x08
    0x1B=0x05
    0x1C=0x06
    0x1D=0x00
    0x1E=0x00
    0x1F=0x87
    0x20=0x1F
    0x21=0x87
    0x22=0x1F
    0x23=0x00
    0x24=0x83
    0x25=0x03
    0x26=0xC8
    0x27=0x0C
    0x28=0x00
    0x29=0x00
    0x2A=0x0F
    0x2B=0x02
    0x2C=0x00
    0x2D=0x36
    0x2E=0x15
    0x2F=0x17
    0x30=0x10
    0x31=0x00
    0x32=0x00
    0x33=0x00
    0x34=0x07
    0x35=0x00
    0x36=0x00
    0x37=0x27
    0x38=0x00
    0x39=0x80
    0x3A=0xE4
    0x3B=0x08
    0x3C=0x00
    0x3D=0x00
    0x3E=0x00
    0x3F=0x00
    0x40=0x00
    0x41=0x00
    0x42=0x02
    0x43=0x00
    0x44=0x12
    0x45=0x58
    0x46=0x14
    0x47=0x1D
    0x48=0x19
    0x49=0x00
    0x4A=0x00
    0x4B=0x00
    0x4C=0x08
    0x4D=0x24
    0x4E=0x04
    0x4F=0x13
    0x50=0x45
    0x51=0x01
    0x52=0x03
    0x53=0x44
    0x54=0x08
    0x55=0x00
    0x56=0x00
    0x57=0x00
    0x58=0x00
    0x59=0x08
    0x5A=0x00
    0x5B=0x00
    0x5C=0x80
    0x5D=0x00
    0x5E=0x00
    0x5F=0x00
    0x60=0x00
    0x61=0x00
    0x62=0x03
    0x63=0x00
    0x64=0x0C
    0x65=0x02
    0x66=0x8F
    0x67=0x28
    0x68=0x4C
    0x69=0x26
    0x6A=0x4B
    0x6B=0x0F
    0x6C=0x00
    0x6D=0x00
    0x6E=0x30
    0x6F=0x00
    0x70=0x08
    0x71=0x17
    0x72=0x04
    0x73=0x27
    0x74=0x1E
    0x75=0x06
    0x76=0x00
    0x77=0x17
    0x78=0x18
    0x79=0x27
    0x7A=0x17
    0x7B=0x57
    0x7C=0x00
    0x7D=0x64
    0x7E=0xD7
    0x7F=0x1A
    0x80=0x01
    0x81=0x02
    0x82=0x00
    0x83=0x00
    0x84=0x00
    0x85=0x06
    0x86=0x00
    0x87=0x09
    0x88=0x00
    0x89=0x06
    0x8A=0xAA
    0x8B=0x00
    0x8C=0x00
    0x8D=0x00
    0x8E=0x00
    0x8F=0x21
    0x90=0xF0
    0x91=0x70
    0x92=0x00
    0x93=0x18
    0x94=0x74
    0x95=0x8A
    0x96=0xA2
    0x97=0x00
    0x98=0x41
    0x99=0x7C
    0x9A=0x30
    0x9B=0x00
    0x9C=0x60
    0x9D=0x20
    0x9E=0x28
    0x9F=0x10
    0xA0=0x52
    0xA1=0x00
    0xA2=0x00
    0xA3=0x00
    0xA4=0x00
    0xA5=0x00
    0xA6=0x90
    0xA7=0x2C
    0xA8=0x0B
    0xA9=0x0B
    0xAA=0x00
    0xAB=0x1F
    0xAC=0x1F
    0xAD=0x00
    0xAE=0x39
    0xAF=0x03
    0xB0=0x17
    0xB1=0x00
    0xB2=0x27
    0xB3=0x12
    0xB4=0x00
    0xB5=0x00
    0xB6=0x6A
    0xB7=0x00
    0xB8=0x24
    0xB9=0x00
    0xBA=0x00
    0xBB=0x00
    0xBC=0x00
    0xBD=0x00
    0xBE=0x08
    0xBF=0x00
    0xC0=0x00
    0xC1=0x00
    0xC2=0x00
    0xC3=0x00
    0xC4=0x48
    0xC5=0x00
    0xC6=0x17
    0xC7=0xB0
    0xC8=0xAA
    0xC9=0x2A
    0xCA=0x27
    0xCB=0x85
    0xCC=0x55
    0xCD=0xF0
    0xCE=0x00
    0xCF=0x15
    0xD0=0x17
    0xD1=0x10
    0xD2=0x04
    0xD3=0x31
    0xD4=0x1E
    0xD5=0x4C
    0xD6=0x3A
    0xD7=0x11
    0xD8=0x0F
    0xD9=0x14
    0xDA=0x00
    0xDB=0x00
    0xDC=0x00
    0xDD=0x00
    0xDE=0x00
    0xDF=0x00
    0xE0=0x00
    0xE1=0x00
    0xE2=0x00
    0xE3=0x00
    0xE4=0x00
    0xE5=0x00
    0xE6=0x00
    0xE7=0x00
    0xE8=0x00
    0xE9=0x00
    0xEA=0x00
    0xEB=0x00
    0xEC=0x00
    0xED=0x00
    0xEE=0x00
    0xEF=0x00
    0xF0=0x00
    0xF1=0x00
    0xF2=0x00
    0xF3=0x00
    0xF4=0x00
    0xF5=0x00
    0xF6=0x00
    0xF7=0x00
    0xF8=0x00
    0xF9=0x00
    0xFA=0x00
    0xFB=0x00
    0xFC=0x00
    0xFD=0x00
    0xFE=0x00
    0xFF=0x00

    Command>

    Jak widać od rejestru 0xDA są już same zera (zawsze tak jest). Stąd potem ograniczyłem to tylko do 0xD9, czyli wszystkich rejestrów jest chyba 218. Potem zrobiłem komendę reg_diff do sprawdzania co się zmieniło w jakich rejestrach pomiędzy wywołaniami tej komendy:
    Zrzut ekranu z konsoli UART pokazujący różnice rejestrów MxL5007T
    Wielokrotne wywołanie reg_diff:
    Zrzuty ekranu z konsoli UART pokazujące zmiany rejestrów układu MxL5007T
    Właśnie te rejestry często się zmieniają. RSSI z uwagi na szumy nie jest stabilne, więc jest to jakiś trop. Potem mogłem zrobić komendę test do sprawdzania zmian tylko w tych specyficznych rejestrach:
    Zrzut ekranu z konsoli UART wskazujący zmiany w rejestrach MxL5007T
    Obserwując co tu się dzieje próbowałem analizować bliżej różne pary tych rejestrów. Najbardziej obiecujące moim zdaniem były 0xAE i 0xAD. W 0xAD są prawdopodobnie jeszcze jakieś flagi. Musiałem też zrobić wielokrotny odczyt słowa w 0xAE i 0xAD, by wyznaczać wartość maksymalną (tylko tak jakoś to działa). Ogólnie słowo to zależy od napięcia na VAGC i od poziomu na wejściu. Wyszła po wielu eksperymentach dosyć dziwna funkcja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Co to daje? Jest to zapisane w komentarzu. Zrobiłem poprzez wysyłanie danych do LabVIEW wykres zmian RSSI przy stałym wzmocnieniu i zmianach poziomu:
    Wykres amplitudy sygnału w czasie, przedstawiony jako przebieg fali
    Problem w tym, by to uzyskać trzeba zmieniać poziom o ±20 dB. Inaczej brak jest reakcji. Wywołanie komendy RSSI w konsoli:
    dla Urf=60,0 µV
    Zrzut ekranu terminala pokazujący polecenia set_gain i rssi dla MxL5007T Zrzut ekranu z konsoli pokazujący wyniki komendy RSSI i ustawione wzmocnienie
    i dla Urf=240,0 µV:
    Zrzut ekranu z konsoli UART z wynikami działania poleceń set_gain i rssi Okno terminala pokazujące wynik polecenia set_gain i wielokrotne odczyty RSSI
    Zmieniałem tu wzmocnienie. Z uwagi na czułość tak uzyskanego RSSI odpuściłem sobie jego skalowanie, chociaż zależność od napięcia wejściowego wygląda na logarytmiczną. Z analizy kodu dla MSTAR nie wynika, by tuner odczytywał jakieś RSSI. Zresztą z analizy analizatorem stanów logicznych wynika, że tuner nawet nie odczytuje ID. Jedyne, co jest odczytywane to status PLL.

    Dalej chcąc się jak najwięcej dowiedzieć o MxL5007T postanowiłem dla zabawy ustalić częstotliwość pośrednią pierwszej przemiany częstotliwości.
    Schemat blokowy tunera MxL5007T z zaznaczonym filtrem kanałowym
    Jak to zrobić? Generalnie jeśli nie ma tu jakichś specyficznych rozwiązań, to można wykorzystać częstotliwości lustrzane. Chodzi o coś takiego:
    Wykres ilustrujący pojęcie częstotliwości lustrzanej z oznaczeniami fp, fs1, fh i fs2
    [Boksa J. Analogowe układy elektroniczne, BTC, Warszawa 2007]

    Pamiętajmy zatem, że w prostym mieszaczu produkt f_p.cz. powstaje dla fs=|fh±f_p.cz.|. Stąd ustawiłem:
    -duże Urf=180 µV i gain=70,00 dB
    -zaprogramowałem częstotliwość w MxL5007: 140 MHz.
    Potem po dostrojeniu generatora do 140 MHz odstrajałem go w górę, by znaleźć częstotliwość lustrzaną. Nic jednak nie było aż do 300 MHz (koniec zakresu generatora). Wątpiłem, by była tak wielka częstotliwość pośrednia. Zatem przestawiłem dla wygody MxL5007 na 220 MHz i odstrajałem w dół. Układ zareagował przy 145,2 MHz. Oczywiście wzmocnienie było dużo mniejsze. Z uzyskanego wyniku można wnioskować, że heterodyna ma mniejszą częstotliwość od sygnału fs, czyli tutaj fs2=220 MHz i fs1=145,2 MHz. Ile jest f_p.cz.? Otóż częstotliwość lustrzana jest odległa od tej "podstawowej" o 2*f_p.cz., więc f_p.cz.=(220-145,2)/2=37,4 MHz. Blisko typowej wartości 38 MHz z telewizorów analogowych.

    Jaki jest krok przestrajania w MxL5007T? Z kodu drivera wynika, że jest to 7,8124 kHz.

    Robiłem też porównanie do R820T. Okazuje się, że wzmocnienie jest znacznie większe w MxL5007T. Wychodzi na to, że R820T to jakaś słabsza wersja tak popularnego R820T2. Z R820T jest też znacznie więcej szumu. Największe wzmocnienie jakie uzyskałem dla całego toru z R820T wynosi raptem 61,43 dB. Jest znacząca różnica do 100 dB dla całego toru z MxL5007T.

    W programie dla STM32 poprawiłem też filtr audio dla demodulacji AM. Okazał się być on trochę niestabilny, co wynikało z błędów obliczeń zmiennoprzecinkowych pojedynczej precyzji. Niby w Matlabie to uwzględniałem, ale widocznie znaczenie ma też konkretna implementacja i to co zrobi z tym kompilator. Musiałem to przerobić na filtr dwu sekcyjny, bo inaczej nie dało się tego zrobić. Chodzi o coś takiego:
    Schemat połączeń kaskadowych i równoległych dwóch filtrów cyfrowych.
    [R. G. Lyons: Wprowadzenie do cyfrowego przetwarzania sygnałów, WKŁ, Warszawa1999]
    Tutaj jest rozwiązanie a. Generalnie takie coś może prowadzić do zmniejszenia błędów zaokrągleń. Obecnie jest 100 razy lepszy odbiór. Słyszalny w poprzednim artykule szum dla AM wynikał właśnie w dużej mierze z tego problemu. Ponadto znacznie większe wzmocnienie pozwala słuchać całej masy aktywności jaka jest na falach krótkich. Zatem również i do MxL5007T można dołączyć opracowany wcześnie up-converter:
    Eksperymentalny układ SDR z STM32, płytką stykową i tunerem DVB-T
    Ponieważ znam wzmocnienie całego toru, to mogłem wyznaczyć tłumienie up-convertera. Ustawiłem gain na 70 dB i zaprogramowałem częstotliwość na MxL5007T na 60 MHz. Na wejście up-convertera podałem 10 MHz i napięcie Urf=150 µV. Wzmocnienie całego toru wynosiło teraz 64,10 dB. Czyli up-converter tłumi 64,10 dB-70 dB=-5,90 dB. Jest to zgodne z datasheet, bo dla tego mieszacza szerokopasmowego ma to być rzędu -5 dB.

    Poniżej nagrania dla odbioru kilku stacji komercyjnych na falach krótkich, zresztą teraz jest w czym wybierać:
    11,65 MHz




    11,98 MHz




    13,81 MHz




    15,23 MHz



    Spory problem stanowi brak jakiegokolwiek ARW. W R820T miałem przynajmniej dwa poziomy wewnętrznego ARW. Tu nie ma niczego. Stąd bywa z tym kłopot przy zmianach poziomu sygnału:



    Na oscyloskopie widać sygnał p.cz. Widoczne są znaczne wahania poziomu sygnału, co mocno utrudnia odbiór. Jest to oczywiście dla AM. Niestety nie ma szans na dorobienie ARW z uwagi na brak możliwości obliczeniowych w STM32.

    Inny kłopot to słaba selektywność tego odbiornika. To jest jednak w dużym stopniu poprawiane przez DSP, ale to nie zawsze wystarcza.

    Bardzo aktywne okazują się być pasma amatorskie z okolic 7 MHz i 14 MHz. Udało się odebrać CW i również SSB, ale tego na tym odbiorniku się nie odbierze poprawnie. Do odbioru CW zwyczajnie wystawiałem na C/A sygnały i(n) i q(n). W ten sposób powstawał odbiornik homodynowy tj. o bezpośredniej przemianie częstotliwości. Tak też można zrobić podejście do SSB, ale nie dało się tego zrozumieć. Duży problem to krok strojenia w takim przypadku i stała wartość częstotliwości heterodyny w mieszaniu cyfrowym (można to traktować jak BFO). Udało się np. odebrać w ten sposób coś na 14,01 MHz może RTTY?




    Robiłem też podejście do odbioru CW (również w improwizowany sposób homodynowy). Tutaj przeprowadzałem też jakieś próby dekodowania. W nagraniach pominąłem obraz, bo tym razem nagrywałem tylko dźwięk rejestratorem dźwięku w Windows. Potem skonwertowałem pliki WMA na MP4, by wygodnie je tu zamieścić:
    7,03 MHz



    Ledwo to słychać. Nie udało mi się tego zdekodować.

    14,025 MHz



    To już jakoś udało się zdekodować. Skorzystałem tu ze strony: Link. Po ustawieniu "Volume threshold" na 240 i dwukrotnym odtworzeniu tego pliku (dobór parametrów) uzyskuje się coś takiego:
    TEST N AA AA3T HRT TNT WN TU TE RTIEE CME E ST UET5 E IR UA3RBS TEST URBR TEST UA3RBR UT

    Jest w tym pewnie sporo błędów, ale np. UA3RBR i UA3RBS to faktycznie znaki rosyjskich krótkofalowców. Dla odmiany AA3T, to ktoś z USA.

    Ponownie 14,01 MHz:



    Tym razem udało się zdekodować tylko tyle:
    GS R5BS A5DA TU TEST RK5K/P

    Tylko R5BS faktycznie istnieje. Reszta odebrana jest błędnie.

    Odbiór stacji z zakresu 88-108 MHz też jest dobry.
    95,60 MHz




    106,60 MHz




    Na zakończenie dodam jeszcze jakieś wyniki z konsoli UART. Tak w tej chwili wygląda start odbiornika:
    Ekran konsoli UART z komunikatami inicjalizacji tunera MxL5007T i STM32F407
    Jak widać mam tu wersję MxL5007T_V4. W takim wypadku w rejstrze 0xD9 będzie 0x14. Kilka komend po kolei:
    Okno konsoli UART z poleceniami: freq, set_gain i demod_type

    Również i tym razem projekt zamieściłem w repozytorium na Githubie: MxL5007-and-STM32F407-SDR-receiver. Mam nadzieję, że tym razem nie przesadziłem ze szczegółowością opisu. Chciałem jednak przedstawić cały tok rozumowania. Mam nadzieję, że ktoś dotarł do tego miejsca. W razie pojawienia się zainteresowania chętnie odpowiem na wszelkie pytania.

    Fajne? Ranking DIY
    O autorze
    maciej_333
    Poziom 38  
    Offline 
    Specjalizuje się w: programowanie
    maciej_333 napisał 4218 postów o ocenie 1578, pomógł 486 razy. Mieszka w mieście Grudziądz. Jest z nami od 2003 roku.
  • #2 21640516
    aadeer
    Poziom 17  
    Posty: 265
    Pomógł: 11
    Ocena: 162
    maciej_333 napisał:
    Wyniki tych prac zamieściłem na chińskiej stronie: Link.

    Myślałem, że się przejęzyczyłeś i znalazłeś na tej stronie, ale rzeczywiście, plik by maciej_3**** - co to za strona i dlaczego tam? Wszedłem z translatorem na główną i widzę, że ciekawe źródło - od botów transakcyjnych przez cracki ;) do projektów uC.

    //first AM audio filter section
    		tmp = module - Z_audio*a_AM_HPF;
    		module = tmp*b_AM_HPF[0] + Z_audio*b_AM_HPF[1];
    		Z_audio = tmp;
    
    		//second AM audio filter section
    		tmp = module - (Z1_audio*a_AM_LPF[0] + Z2_audio*a_AM_LPF[1]);
    		module = tmp*b_AM_LPF[0] + Z1_audio*b_AM_LPF[1] + Z2_audio*b_AM_LPF[2];
    		Z2_audio = Z1_audio;
    		Z1_audio = tmp;
    
    
    		DAC_value = A_DAC_scale_AM*module*AM_AGC_sig + B_DAC_scale_AM;


    Jaka jest różnica przy tych filtrach względem poprzedniego projektu? Bo chyba masz tak samo - połączenie szeregowe filtra HP i LF?

    Ogólnie bardzo fajny opis, bardziej tutorial wyszedł tutorial niż opis projektu ;)
  • #3 21640649
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    aadeer napisał:
    maciej_333 napisał:
    Wyniki tych prac zamieściłem na chińskiej stronie: Link.

    Myślałem, że się przejęzyczyłeś i znalazłeś na tej stronie, ale rzeczywiście, plik by maciej_3**** - co to za strona i dlaczego tam? Wszedłem z translatorem na główną i widzę, że ciekawe źródło - od botów transakcyjnych przez cracki do projektów uC.

    Nie wiem co to za strona. Wygląda na jakąś bazę, gdzie właściwie każdy może coś dodać. W przypadku, gdy ktoś pobierze nasz plik mamy jakieś punkty. Punkty te można też kupić. Z tego, co zrozumiałem za pomocą Google Translatora za 10 yuanów jest 10 punktów. Jednak trzeba płacić przez jakąś chińską aplikację. Po założeniu konta dostałem trochę punktów, więc mogłem za darmo pobrać jakieś pliki. Swój plik dodałem, bo liczyłem na punkty.

    Bardzo dużo materiałów jest tam o MSTAR. To akurat mnie bardzo interesuje. Może jakoś dałoby się rozwinąć swój kod np. na MSD7818.

    aadeer napisał:
    Kod: [rozwiń][zwiń] [zaznacz wszystko][Kopiuj do schowka] //first AM audio filter section
    tmp = module - Z_audio*a_AM_HPF;
    module = tmp*b_AM_HPF[0] + Z_audio*b_AM_HPF[1];
    Z_audio = tmp;

    //second AM audio filter section
    tmp = module - (Z1_audio*a_AM_LPF[0] + Z2_audio*a_AM_LPF[1]);
    module = tmp*b_AM_LPF[0] + Z1_audio*b_AM_LPF[1] + Z2_audio*b_AM_LPF[2];
    Z2_audio = Z1_audio;
    Z1_audio = tmp;


    DAC_value = A_DAC_scale_AM*module*AM_AGC_sig + B_DAC_scale_AM;

    Jaka jest różnica przy tych filtrach względem poprzedniego projektu? Bo chyba masz tak samo - połączenie szeregowe filtra HP i LF?

    Wyszło mi, że dla FM nie trzeba filtru pasmowego, może być dolnoprzepustowy. W przypadku AM powinien być pasmowy. Moduł bardzo się zmienia i nie zależy tylko od chwilowej głębokości modulacji. Powstaje więc składowa o niskiej częstotliwości, która psuje odbiór. Ma to też jednak związek z algorytmem autoskalowania dla AM, jaki wymyśliłem.

    Dlaczego połączenie kaskadowe? Przecież i tak wyjdzie z tego filtr pasmowy. Można to zrobić w jednej sekcji. Jednak nie zawsze uda się tak zaprojektować filtr IIR, by to się udało. Filtr IIR ma odpowiedź zależną nie tylko od historii wejścia (jak w FIR), ale też od historii wyjścia. Jest to struktura już zmodyfikowana "direct form II". Dzięki temu jest tylko jeden człon opóźnienia. Można to wyprowadzić z równania różnicowego. Jest to więc robione w taki sposób:
    Schemat struktury filtru IIR w formie bezpośredniej II z opóźnieniami Z^-1
    Stąd jak w każdym układzie ze sprzężeniem zwrotnym może to być niestabilne. Niestabilność filtru może się wiązać z generowaniem jakiegoś sygnału na wyjściu, nawet jeśli wejście jest zerowe. Stąd powstawał ten szum.

    Problemy z tymi filtrami wynikają nie tylko z samego projektu i rozłożenia zer i biegunów, ale też implementacji. Przy takich obliczeniach, zapętleniach itd. pojawią się błędy zaokrągleń. Nie jest tak, że nie ma problemów z obliczeniami zmiennoprzecinkowymi. Nie jest to problem akademicki. W Google jest o tym sporo: Link. Przepraszam, ale nie mam już sił, by to opisywać i wstawiać konkretne przykłady, tego co mi wychodziło.

    Podział na sekcje redukuje te problemy.
  • #4 21640995
    ORMO_PL
    Poziom 19  
    Posty: 770
    Pomógł: 15
    Ocena: 79
    Świetny materiał. Trochę inżynierii wstecznej by z popularnego urządzenia zrobić coś przydatnego. Jak dopracujesz gotowe rozwiązanie, z przyjemnością sam to odtworzę
  • #5 21641224
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Podoba mi się dalsze odkrywanie dekoderów. Mam ze dwa, muszę zobaczyć w wolnej chwili co tam jest, za główny procek oraz głowica.
    Miałem je wyrzucić, ale liczyłem po cichu, że kiedyś coś się będzie dało z tego zrobić. Fajnie byłoby zrobić z tego SDR, podłączyć telewizor, wyświetlić waterfalla.
    Zrobić prosty skaner widma. Więc jakby była jakaś dokumentacja, albo kod driverów do linuxa, do bloku HDMI , ADC, I2C, uboot, oraz config kernela, to by to znacząco ułatwiło reverse i robienie projektów na bazie tego.
  • #6 21641309
    sq3evp
    Poziom 39  
    Posty: 6451
    Pomógł: 215
    Ocena: 854
    Też mam stary tube DVB-T, chyba Cabletech.
    Działał dzielnie aż do zmiany na DVB-T2.
    Trzba zajrzeć do niego, może dostanie drugie życie.
  • #7 21641571
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    bulek01 napisał:
    Fajnie byłoby zrobić z tego SDR, podłączyć telewizor, wyświetlić waterfalla.
    Zrobić prosty skaner widma. Więc jakby była jakaś dokumentacja, albo kod driverów do linuxa, do bloku HDMI , ADC, I2C, uboot, oraz config kernela, to by to znacząco ułatwiło reverse i robienie projektów na bazie tego

    Niestety można o tym tylko pomarzyć. Załączam kod do obsługi MxL5007T na platformie MSTAR. Tunery takie, jak Manta, Wiwa są właśnie na tej platformie. Na Githubie zamieściłem oryginalny driver do MxL5007T: Link.

    sq3evp napisał:
    Też mam stary tube DVB-T, chyba Cabletech.
    Działał dzielnie aż do zmiany na DVB-T2.
    Trzba zajrzeć do niego, może dostanie drugie życie.

    Jak jest tam jakiś ciekawy układ w głowicy, to byłbym tym tunerem zainteresowany.
    Załączniki:
    • MxL5007T_API_Files_V4.1.3_mstar.rar (9.33 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 21643680
    rinafjabber
    Poziom 1  
    Posty: 1
    maciej_333 napisał:
    MXL5007T SetTuner 

     MXL5007 SetTuner dwFreq = 100000000, ucBw = 6 
    MxL_RFSynth_Lock_Status = 0xC 
    RFSynth bLock = 1 
    REFSynth bLock = 1
  • #9 21643839
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    rinafjabber napisał:
    maciej_333 napisał:
    MXL5007T SetTuner 

     MXL5007 SetTuner dwFreq = 100000000, ucBw = 6 
    MxL_RFSynth_Lock_Status = 0xC 
    RFSynth bLock = 1 
    REFSynth bLock = 1

    You have just quoted something from my first post here. What's going on? Do you have any questions or issues with MxL5007 or generally speaking with Software-Defined Radio?

    It's obvious that Polish is an issue but I suggest to use Google Translator.
  • #10 21645734
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Jaki zakres przestrajania częstotliwości osiąga ten scalak MxL?
  • #11 21645865
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    bulek01 napisał:
    Jaki zakres przestrajania częstotliwości osiąga ten scalak MxL?

    Nie pamiętam dokładnie minimalnej wartości. Jest to jednak jakieś 35 MHz. Z kolei od góry jest to 1023,97 MHz. Nie ma możliwości ustawienia więcej, bo częstotliwość jak wynika z kodu to 16 bitów. Krok wynosi 7,8124 kHz. Jeżeli w rejestrach 0x0D i 0x0E jest 0xFFFF, to wtedy częstotliwość: 0xFFFF * 7,8124 kHz * 2 ≈ 1023,97 MHz.
  • #12 21645895
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Znalazłem ciekawy opis na temat tego scalaka: https://www.elecfans.com/tongxin/rf/20100104217561.html
    Wrzucili tam zdjęcie krzemu z oznaczonymi blokami oraz schemat blokowy wnętrza.
    Zdjęcie wnętrza układu scalonego z opisanymi blokami funkcjonalnymi

    Schemat blokowy odbiornika RF z mieszaczem IQ, dwoma PLL i przetwarzaniem cyfrowym

    Wygląda na to, że pierwsza pośrednia zrobiona jest analogowo z użyciem mieszacza IQ. Druga jest zrobiona cyfrowo i wyprowadzona za pomocą DACA.
    Układ ma dwie pętle PLL, pierwsza do analogowego mieszania, a druga używana dla DAC i ADC.
    Ciekawe dlaczego tak to rozwiązali. Bo łatwiej robić filtry cyfrowe, na niższe częstotliwości?
    I dlaczego użyli mieszacza IQ?
  • #13 21645919
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    Ten pierwszy mieszacz jest specyficzny. Nie wiem dlaczego sygnał z wstępnego LNA trafia wprost i przez jakby jakiś bufor do dwóch demodulatorów kwadraturowych. Potem są specyficzne sumowania. Nie wiem czemu to ma służyć. Potem jest już wszystko dosyć typowo i dalej są dwa ADC i blok DSP. Wszystko to tłumaczyłoby dlaczego MxL5007 ma tak równomierne wzmocnienie w funkcji częstotliwości i małe szumy. Postąpili tak, by łatwiej było zrobić filtry p.cz. i łatwo zmieniać częstotliwość pośrednią. Realizacja cyfrowa będzie dużo prostsza.
  • #14 21646543
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Zaciekawiły mnie te równolegle połączone modulatory kwadraturowe. Poszukałem materiałów na ten temat. Rozwiązanie jest to stosowane, aby zwiększyć moc na wyjściu mieszacza gdy pojedynczy blok kwadraturowy mieszacza ma za duże tłumienie. A spore tłumienie może wynikać ze słabych częstotliwościowo tranzystorów w danej technologi CMOS. Skoro to było produkowane masowo i musiało być tanie i proste w produkcji, więc całość jest pewnie zrobiona w technologii CMOS.(artykuł który znalazłem dotyczył 300GHz, ale myślę, że można to przeskalować do tego rozwiązania).
    Choć może trochę zgadując chodziło, o to, aby pokryć całe pasmo i jeden jest lepszy(ma mniejsze tłumienie) w innym zakresie częstotliwości niż ten drugi.
  • #15 21647640
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    bulek01 napisał:
    Zaciekawiły mnie te równolegle połączone modulatory kwadraturowe. Poszukałem materiałów na ten temat. Rozwiązanie jest to stosowane, aby zwiększyć moc na wyjściu mieszacza gdy pojedynczy blok kwadraturowy mieszacza ma za duże tłumienie.

    Miałoby to sens. Może nie odnośnie tłumienia, skoro połączenie jest równoległe, nie zaś kaskadowe, ale faktycznie mocy dostarczanej do kolejnego stopnia.

    Dołączyłem też analizator stanów logicznych do szyny I2C w tunerze Ferguson Ariva 150 combo. W głowicy DVB-T występuje tam również MxL5007T. Okazuje się, że jest to tak samo programowane. Nic czego bym już nie wiedział się z tego nie dowiedziałem. Różnica jest tylko taka, że w tunerze Ferguson nie ma sprawdzania stanu obu pętli PLL.
  • #16 21651200
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Znalazłem odbiornik DVB-T Wiwa HD95, posiada on ten sam scalak w głowicy. Jak na ten moment podpiąłem się UARTEM i zapisałem log.

    Cytat:
    UART_115200
    BIST0-OK
    _snPDMDrv_PM_RtcGetCounter(CurrentCounter=0)

    Hello U-Boot


    U-Boot 1.1.6 (May 24 2012 - 07:38:11)

    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 (0x0804, 0x01, 0x02, 0x15)
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    In: serial
    Out: serial
    Err: serial
    MSVC00B000100100208768TH0000000T
    [do_set_paneltype][772] 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 0xBFD0
    offset 0x70000, size 0xBFD0
    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 (0x0804, 0x01, 0x02, 0x15)
    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: 0x7BFCE
    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
    WDT Initialize ...
    Start 75F2000 End 769E000
    UnProtect MIU block 0 : 0x75F2000 0x769E000
    offset 0x8001C, size 0x289977
    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=0x289977, out= 0x80000180, alloc_buf = 0x81000000
    in=0x80B00000, in_size=0x289977, out= 0x80000180, alloc_buf = 0x81000000
    in_size=2660727 out_size=7324916 unpack_size=0

    LZMA Decompression...CRC_result D814DE68 CRC_value D814DE68
    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(0x806a5c00)
    New domain internet at 0x00000000
    [cyg_net_init] Init: cyg_net_add_domain(0x806a57c8)
    New domain route at 0x00000000
    [cyg_net_init] Init: call_route_init(0x00000000)
    [cyg_net_init] Done
    [SysInit][1973]
    [SysInit][1975]
    ****** 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][1977]

    Customer info: 00660630002f000000000000000000000000000408f81800
    Hash: 57896ceada56f7bbb0af9151e38029b1
    Auth OK

    [SysInit][1979]
    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 = 92DED0
    mdrv_gpio_init
    [SysInit][1988]
    MIU Initialize...
    Get IOMap u32NonPmBase = 0xbf200000
    Get IOMap u32PmBase = 0xbf000000
    Disable MIU1
    [SysInit][1996]
    WDT_Init
    [SysInit][2003]
    [SysInit][2006]
    MDrv_WDT_IsReset = 0
    [SysInit][2012]
    [MAPI_MEMINFO] DVBC System Memory Usage
    [MAPI_MEMINFO] ============================ START END SIZE
    [MAPI_MEMINFO] POOL_START 0x00000000 0x016ce800 0x016ce800
    [MAPI_MEMINFO] Cached Pool Start 0x0092ded0 0x00c4ded0 0x00320000
    [MAPI_MEMINFO] NONCACHED_POOL_START 0x00c4ded0 0x016ce800 0x00a80930
    [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 0x8092ded0


    [SysInit][2016]
    [SysInit][2025]
    Hello Hummingbird!!
    _appDemo_Task.iId = 1985216513
    ----------Hello World----------
    -------Welcome to Demo AP------
    >> [_SysInit_InitAPI][1691]SPI Flash Driver Init !!
    Flash is detected (0x0804, 0x01, 0x02, 0x15)
    [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: 80c4ad30
    hcd: 80c4ad64
    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
    **************** Database Debug Info BEGIN *****************
    sizeof(MS_GENSETTING) = 1284
    sizeof(DTVPROGRAMDATA) = 160
    BASEADDRESS_PCH_DATA = 0x86C
    BASEADDRESS_PCH_PHYCHTABLEMAP = 0x86C
    BASEADDRESS_PCH_PHYCHTABLE = 0x87C
    END_ADDRESS_OF_PHYSICAL_CHANNEL_DATA_STRUCTURE = 0x168C
    BASEADDRESS_PR_DATA = 0x168C
    BASEADDRESS_PR_IDENT = 0x168E
    BASEADDRESS_PR_IS_LCN_ARRANGED = 0x1690
    BASEADDRESS_PR_CURRENTORDER_TV = 0x1698
    BASEADDRESS_PR_CURRENTORDER_RADIO = 0x169A
    BASEADDRESS_PR_CURRENT_SERVICETYPE = 0x1694
    BASEADDRESS_PR_DTVPRTABLEMAP = 0x16A2
    BASEADDRESS_PR_DTVPRTABLE = 0x16D4
    END_ADDRESS_OF_DTVDATA_STRUCTURE = 0x110D8
    **************** Database Debug Info END *******************
    [MApp_CheckFlash][1379] 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)= (0xa14e21c0, 0xa14e2210, 0x00000050)
    [EPGDB][000694] _pu8EitBufMask: (Start, End, Length)= (0xa14e21a0, 0xa14e21a5, 0x00000005)
    [EPGDB][000695] _pMapBufIdxTable: (Start, End, Length)= (0xa14e2000, 0xa14e2190, 0x00000190)
    [EPGDB][000696] _pu8EpgDbEvtMask (Start, End, Length)= (0xa14e1c00, 0xa14e1fe8, 0x000003e8)
    [EPGDB][000697] _pu8EpgDbScheHdrList (Start, End, Length)= (0xa14e10b0, 0xa14e1bf0, 0x00000b40)
    [EPGDB][000698] _pu8EpgDbSrvEvtList (Start, End, Length)= (0xa14d7320, 0xa14e10a0, 0x00009d80)
    [EPGDB][000699] _pu8EpgDbSrvSecList (Start, End, Length)= (0xa14c3310, 0xa14d7310, 0x00014000)
    [EPGDB][000700] _pu8EpgDbEvtHdrList (Start, End, Length)= (0xa14a5e40, 0xa14c3300, 0x0001d4c0)
    [EPGDB][000701] _pu8EpgDbEvtNameList (Start, End, Length)= (0xa12afef0, 0xa14a5e30, 0x001f5f40)
    [EPGDB][000702] _pu8EpgDbPfHdrList (Start, End, Length)= (0xa12afe10, 0xa12afed8, 0x000000c8)
    [EPGDB][000703] _pu8EpgDbPfPresent (Start, End, Length)= (0xa12ade00, 0xa12afe00, 0x00002000)
    [EPGDB][000704] _pu8EpgDbPfFollow (Start, End, Length)= (0xa12abdf0, 0xa12addf0, 0x00002000)
    [EPGDB][000708] _pu8EpgDbScheExtStrBuf (Start, End, Length)= (0xa0dcbde0, 0xa12abde0, 0x004e0000)
    [EPGDB][000710] EPG database allocate 0x00716355 bytes
    [EPGDB][000716] =========================================================================
    [-]MApi_EpgDB_Init
    MDrv_SERFLASH_GetInfo()
    u32AccessWidth = 1
    u32TotalSize = 4194304
    u32SecNum = 64
    u32SecSize = 65536
    MDrv_HDMITx_SetVideoOnOff: csc flag= 0
    MDrv_HDMITx_SetHDMITxMode: HDMI mode
    MApp_ZUI_ACT_StartupOSD TV_PROG
    [MApp_ZUI_ACT_PrepareOSDPage][442]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
    [MApp_ZUI_ACT_PrepareOSDPage][442]_Zapper_Disable_AV: Enter at 4142.
    alloc mem 0x40000
    alloc mem 0x2400
    alloc mem 0x2000
    alloc mem 0x1000

    FATAL: read zero bytes from port
    term_exitfunc: reset failed for dev UNKNOWN: Input/output error


    Jeszcze nie wiem jaki jest tam procesor, ale na pewno MStar. Radiatora nie chciałem odrywać aby nic nie uszkodzić.



    Wnętrze odbiornika DVB-T Wiwa HD-95 z widoczną płytą główną i podłączonym interfejsem UART.
  • #17 21651210
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    Jak go uruchomisz z wciśniętym <CR>, to zablokujesz bootowanie i będziesz się mógł pobawić bootloaderem. Można dzięki temu np. odczytać obraz pamięci flash i zapisać go sobie na pendrive. Wygodne, bo nic nie trzeba lutować. Co zamierzasz zrobić z tym tunerem?
  • #18 21651257
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Raczej nic nie zamierzam robić z tym tunerem. Miałem pomysł czy dałoby się zrobić sdra na tym Mstarze. Ale po weryfikacji czy da się zrobić odczyty po ADC do pamięci RAM, wydaje mi się że się nie da.
    Znalazłem schemat blokowy jakiegoś Mstara:

    Schemat blokowy układu scalonego MStar z zaznaczonymi modułami przetwarzania obrazu i dźwięku.
    Schemat blokowy systemu MStar z tunerem, ADC, demodulatorem DVB-T/T2 i interfejsem I2C.

    Jak widać ADC podaje dane do sprzętowego demodulatora i dekodera. Dzieje się to bez użycia procesora w układach peryferyjnych, do których ma dostęp Cpu.
    Po schemacie blokowym widać, że ADC nie ma też dostępu do wspólnej magistrali. Więc jak na ten moment wydaje się, że nic nie da się zrobić. Nie znalazłem też żadnych materiałów. Jak byłbyś chętny lub ktokolwiek, to mogę oddać ten tuner.

    A jako ciekawostka komuś się udało na tunerze z MSD7818 uruchomić Dooma z Linuxem https://www.youtube.com/watch?v=2o0w-_0nYQ8/
  • #19 21651347
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    Odbiornik SDR można na tym tunerze zrobić prawdopodobnie tylko tak, jak ja to zrobiłem tj. dołączając się do samej głowicy.

    bulek01 napisał:
    Jak widać ADC podaje dane do sprzętowego demodulatora i dekodera.

    Spotkałem nawet w jednym tunerze układ w głowicy z którego wychodził już od razu strumień MPEG zamiast zwykłego sygnału p.cz. lub IQ.

    bulek01 napisał:
    A jako ciekawostka komuś się udało na tunerze z MSD7818 uruchomić Dooma z Linuxem

    To jest akurat bardzo ciekawe. Generalnie rozumiem o co chodzi, ale nigdy nie kompilowałem jądra Linuxa, więc miałbym problem ze zrobieniem jego obrazu, ale może spróbuję to jakoś powtórzyć.
  • #20 21651837
    aadeer
    Poziom 17  
    Posty: 265
    Pomógł: 11
    Ocena: 162
    maciej_333 napisał:
    Jak go uruchomisz z wciśniętym <CR>, to zablokujesz bootowanie i będziesz się mógł pobawić bootloaderem.


    Ja też zacząłem eksperymentować i takie małe pytanko: jak wysłać ten znak w PuTTY? Po czcionce sądze, że używasz tego programu, mi się nie udało. Znalazłem właściwe polecenie klikając na ikonę ale zawsze było za późno i finalnie musiałem napisać kawałek kodu w Pythonie, który wysyła mi ten znak w pętli aż się uda.
  • #21 21651953
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    aadeer napisał:
    jak wysłać ten znak w PuTTY?

    Robię to bardzo prosto. Wstępnie tuner musi być wyłączony. Używam akurat RealTerm. Ponieważ RealTerm to "zwykły" terminal, więc otwieram w nim port, ustawiam parametry transmisji tj. 115200 b/s i 8N1. Potem wciskam ENTER na klawiaturze i trzymam go cały czas. Wtedy będzie wysyłanie CR. Wystarczy teraz uruchomić tuner w trakcie trzymania ENTER i w końcu dojdzie do odpowiedniego momentu w którym będzie oczekiwanie na CR. To w zupełności wystarczy. ENTER puszczam, kiedy już wejdę do bootloadera. Generalnie powinno to działać z dowolnym innym klawiszem.

    Poniżej przydatne linki, ale pewnie już to znalazłeś:
    -komendy MBoot
    -opis MBoot - jest np. struktura flash
    -flash backup - wygodny sposób, by zrobić backup flash i zapisać to sobie na pendrive. Nie trzeba stosować programatora. Podobnie można zaprogramować flash, ale oczywiście bootloader nie może być uszkodzony.
  • #22 21652483
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Udało mi się skompilować kernela w wersji 6.7(https://github.com/maniekx86/linux_msd781x/commits/mstar_v6_7_rebase/).
    Trochę zabawy z tym było, bo najpierw próbowałem 6.1 jak z tego filmiku, ale się nie chciał skompilować za pomocą gcc 12.2.
    Wogóle pierwszy raz coś robiłem z architekturą MIPS. Zawsze dla mnie to był archaizm, którego nigdy nie spotkałem.
    Trochę było rozkmin jak to zbootować. Ten mboot nie wspiera ładowania device tree bo jest bardzo stary.
    Ale grzebiąc w kodzie znalazłem że można go zintegrować wraz z obrazem kernela i ta opcja była już włączona w użytym configu.(https://gist.github.com/maniekx86/abbbdef38c84eae7efed8118df665ca3)
    W załączniku wrzucam binarkę jądra ze zintergrowanym device tree blob.
    Jakby ktoś chciał go przygotować, to wystarczy pobrać żródła z odpowiedniego brancha, wkleić plik .config. Następnie należy wykonać komendy:
    
    make ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- -j6
    cp vmlinux vmlinux_dtb
    mipsel-linux-gnu-objcopy --update-section .appended_dtb=arch/mips/boot/dts/mstar/msd7816-test.dtb vmlinux_dtb
    mipsel-linux-gnu-objcopy  -O binary vmlinux_dtb vmlinux.bin


    Aby go odpalić wystarczy skopiować vmlinux.bin na pendriva sformatowanego w FAT, a następnie z konsoli Mboota wpisać
    
    usb reset 0
    fatload usb 0 0x80000000 vmlinux.bin
    go 0x805db8a0



    Tak jeszcze infomacyjnie skąd wziąłem adres gdzie załadować kernel i pod jaki adres skoczyć:
    
    readelf -l vmlinux | grep LOAD
      LOAD           0x001000 0x80000000 0x80000000 0x933f00 0x984a80 RWE 0x1000
    gdzieL
    0x80000000   Physical addr i Virtual addr – gdzie kernel ma być załadowany   
    0x933f00   Rozmiar danych w pliku (~9.3 MB)   
    0x984a80   Rozmiar w pamięci RAM (czyli po załadowaniu)
    


    oraz skok:
    
    readelf -h vmlinux | grep Entry
      Entry point address:               0x805db8a0
    


    Cytat:

    << MStar >># usb reset 0
    (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
    << MStar >># fatload usb 0 0x80000000 vmlinux.bin
    reading vmlinux.bin

    9649920 bytes read
    << MStar >># go 0x805db8a0
    ## Starting application at 0x805DB8A0 ...
    [ 0.000000] Linux version 6.7.0-rc6+ (tulip@arch-linux-tulip-t440p) (mipsel-linux-gnu-gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.45) #1 SMP Wed Sep 3 17:34:28 CEST 2025
    [ 0.000000] DSPRAM0: PA=1c100000,Size=00002000,enabled
    [ 0.000000] CPU0 revision is: 00019555 (MIPS 34Kc)
    [ 0.000000] FPU revision is: 01739300
    [ 0.000000] MIPS: machine is MStar MSD7816 test
    [ 0.000000] OF: reserved mem: 0x02100000..0x024fffff (4096 KiB) map non-reusable fb-memory@2100000
    [ 0.000000] OF: reserved mem: 0x03200000..0x0339ffff (1664 KiB) map non-reusable ve-memory@3200000
    [ 0.000000] OF: reserved mem: 0x03c00000..0x03ffffff (4096 KiB) map non-reusable tsukasa@3c00000
    [ 0.000000] Detected 1 available secondary CPU(s)
    [ 0.000000] Primary instruction cache 16kB, VIPT, 4-way, linesize 32 bytes.
    [ 0.000000] Primary data cache 16kB, 4-way, VIPT, no aliases, linesize 32 bytes
    [ 0.000000] Zone ranges:
    [ 0.000000] Normal [mem 0x0000000000000000-0x0000000003ffffff]
    [ 0.000000] HighMem empty
    [ 0.000000] Movable zone start for each node
    [ 0.000000] Early memory node ranges
    [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000003ffffff]
    [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000003ffffff]
    [ 0.000000] percpu: Embedded 8 pages/cpu s11904 r0 d20864 u32768
    [ 0.000000] pcpu-alloc: s11904 r0 d20864 u32768 alloc=8*4096
    [ 0.000000] pcpu-alloc: [0] 0 [0] 1
    [ 0.000000] Kernel command line: console=ttyS0,115200 root=/dev/sda2 rootwait clk_ignore_unused rw fbcon=font:TER16x32
    [ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
    [ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
    [ 0.000000] Writing ErrCtl register=00050409
    [ 0.000000] Readback ErrCtl register=00050409
    [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 16256
    [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
    [ 0.000000] Memory: 45236K/65536K available (6025K kernel code, 697K rwdata, 1472K rodata, 1268K init, 274K bss, 20300K reserved, 0K cma-reserved, 0K highmem)
    [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
    [ 0.000000] rcu: Hierarchical RCU implementation.
    [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
    [ 0.000000] NR_IRQS: 256
    [ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
    [ 0.000000] CPU clock frequency: 552 MHz
    [ 0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6924856690 ns
    [ 0.000003] sched_clock: 32 bits at 276MHz, resolution 3ns, wraps every 7780738046ns
    [ 0.000306] Console: colour dummy device 80x25
    [ 0.000432] Calibrating delay loop... 364.54 BogoMIPS (lpj=729088)
    [ 0.032204] pid_max: default: 32768 minimum: 301
    [ 0.032761] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
    [ 0.032832] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
    [ 0.041045] rcu: Hierarchical SRCU implementation.
    [ 0.041077] rcu: Max phase no-delay instances is 1000.
    [ 0.042932] smp: Bringing up secondary CPUs ...
    [ 0.045754] DSPRAM0: PA=1c100000,Size=00002000,enabled
    [ 0.045865] Primary instruction cache 16kB, VIPT, 4-way, linesize 32 bytes.
    [ 0.045918] Primary data cache 16kB, 4-way, VIPT, no aliases, linesize 32 bytes
    [ 0.046023] CPU1 revision is: 00019555 (MIPS 34Kc)
    [ 0.072770] Synchronize counters for CPU 1: done.
    [ 0.073326] smp: Brought up 1 node, 2 CPUs
    [ 0.076762] devtmpfs: initialized
    [ 0.086870] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
    [ 0.086956] futex hash table entries: 512 (order: 2, 16384 bytes, linear)
    [ 0.088905] NET: Registered PF_NETLINK/PF_ROUTE protocol family
    [ 0.091402] FPU Affinity set after 2952 emulations
    [ 0.117001] SCSI subsystem initialized
    [ 0.117574] usbcore: registered new interface driver usbfs
    [ 0.117949] usbcore: registered new interface driver hub
    [ 0.118185] usbcore: registered new device driver usb
    [ 0.118531] mc: Linux media interface: v0.10
    [ 0.118877] videodev: Linux video capture interface: v2.00
    [ 0.119441] Advanced Linux Sound Architecture Driver Initialized.
    [ 0.123196] clocksource: Switched to clocksource MIPS
    [ 0.174778] NET: Registered PF_INET protocol family
    [ 0.175499] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear)
    [ 0.176982] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear)
    [ 0.177074] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
    [ 0.177144] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)
    [ 0.177228] TCP bind hash table entries: 1024 (order: 2, 16384 bytes, linear)
    [ 0.177336] TCP: Hash tables configured (established 1024 bind 1024)
    [ 0.177628] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
    [ 0.177737] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
    [ 0.178243] NET: Registered PF_UNIX/PF_LOCAL protocol family
    [ 0.181529] workingset: timestamp_bits=30 max_order=14 bucket_order=0
    [ 0.184101] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 250)
    [ 0.184146] io scheduler mq-deadline registered
    [ 0.184167] io scheduler kyber registered
    [ 0.186765] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
    [ 0.192642] printk: legacy console [ttyS0] disabled
    [ 0.213909] 1f201300.serial: ttyS0 at MMIO 0x1f201300 (irq = 10, base_baud = 7714285) is a 16550A
    [ 0.214098] printk: legacy console [ttyS0] enabled
    [ 0.728955] stackdepot: allocating hash table of 4096 entries via kvcalloc
    [ 0.736242] simple-framebuffer 2100000.framebuffer: [drm] could not acquire memory region [mem 0x02100000-0x024fffff flags 0x200]
    [ 0.750306] [drm] Initialized simpledrm 1.0.0 20200625 for 2100000.framebuffer on minor 0
    [ 1.089493] Console: switching to colour frame buffer device 120x33
    [ 1.403300] simple-framebuffer 2100000.framebuffer: [drm] fb0: simpledrmdrmfb frame buffer device
    [ 1.415348] usbcore: registered new interface driver rtl8150
    [ 1.421303] usbcore: registered new device driver r8152-cfgselector
    [ 1.427906] usbcore: registered new interface driver r8152
    [ 1.433777] usbcore: registered new interface driver cdc_ether
    [ 1.439947] usbcore: registered new interface driver rndis_host
    [ 1.446239] usbcore: registered new interface driver cdc_ncm
    [ 1.452240] usbcore: registered new interface driver r8153_ecm
    [ 1.458900] usbcore: registered new interface driver cdc_acm
    [ 1.464737] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
    [ 1.473061] usbcore: registered new interface driver usblp
    [ 1.479683] usbcore: registered new interface driver uas
    [ 1.485344] usbcore: registered new interface driver usb-storage
    [ 1.491889] usbcore: registered new interface driver ch341
    [ 1.497677] usbserial: USB Serial support registered for ch341-uart
    [ 1.504312] usbcore: registered new interface driver cp210x
    [ 1.510178] usbserial: USB Serial support registered for cp210x
    [ 1.516457] usbcore: registered new interface driver qcserial
    [ 1.522500] usbserial: USB Serial support registered for Qualcomm USB modem
    [ 1.530256] i2c_dev: i2c /dev entries driver
    [ 1.534956] usbcore: registered new interface driver i2c-cp2615
    [ 1.541220] usbcore: registered new interface driver i2c-tiny-usb
    [ 1.548000] usbcore: registered new interface driver uvcvideo
    [ 1.554159] usbcore: registered new interface driver usbtv
    [ 1.560942] hid: raw HID events driver (C) Jiri Kosina
    [ 1.568281] usbcore: registered new interface driver usbhid
    [ 1.574017] usbhid: USB HID core driver
    [ 1.579547] usbcore: registered new interface driver snd-usb-audio
    [ 1.587864] NET: Registered PF_INET6 protocol family
    [ 1.596957] Segment Routing with IPv6
    [ 1.601050] In-situ OAM (IOAM) with IPv6
    [ 1.605337] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
    [ 1.613402] NET: Registered PF_PACKET protocol family
    [ 1.671855] fotg210-ehci 1f220600.uhc: EHCI Host Controller
    [ 1.677725] fotg210-ehci 1f220600.uhc: new USB bus registered, assigned bus number 1
    [ 1.685919] fotg210-ehci 1f220600.uhc: irq 15, io mem 0x1f220600
    [ 1.707249] fotg210-ehci 1f220600.uhc: USB 2.0 started, EHCI 1.00
    [ 1.714958] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.07
    [ 1.723439] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
    [ 1.730830] usb usb1: Product: EHCI Host Controller
    [ 1.735878] usb usb1: Manufacturer: Linux 6.7.0-rc6+ ehci_hcd
    [ 1.741804] usb usb1: SerialNumber: 1f220600.uhc
    [ 1.748840] hub 1-0:1.0: USB hub found
    [ 1.753023] hub 1-0:1.0: 1 port detected
    [ 1.760544] clk: Not disabling unused clocks
    [ 1.764978] ALSA device list:
    [ 1.768087] No soundcards found.
    [ 1.772678] dw-apb-uart 1f201300.serial: forbid DMA for kernel console
    [ 1.779979] Waiting for root device /dev/sda2...
    [ 2.075240] usb 1-1: new high-speed USB device number 2 using fotg210-ehci
    [ 2.237554] usb 1-1: New USB device found, idVendor=346d, idProduct=5678, bcdDevice= 2.00
    [ 2.245971] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [ 2.253413] usb 1-1: Product: PHILIPS
    [ 2.257257] usb 1-1: SerialNumber: FC257F595101E
    [ 2.264015] usb-storage 1-1:1.0: USB Mass Storage device detected
    [ 2.272798] scsi host0: usb-storage 1-1:1.0
    [ 3.297012] scsi 0:0:0:0: Direct-Access PHILIPS 3.00 PQ: 0 ANSI: 4
    [ 3.308174] sd 0:0:0:0: Attached scsi generic sg0 type 0
    [ 3.316143] sd 0:0:0:0: [sda] 61440000 512-byte logical blocks: (31.5 GB/29.3 GiB)
    [ 3.325939] sd 0:0:0:0: [sda] Write Protect is off
    [ 3.331037] sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00
    [ 3.337694] sd 0:0:0:0: [sda] No Caching mode page found
    [ 3.343322] sd 0:0:0:0: [sda] Assuming drive cache: write through
    [ 3.361408] sda: sda1
    [ 3.365116] sd 0:0:0:0: [sda] Attached SCSI removable disk
    [ 3.372362] /dev/root: Can't open blockdev
    [ 3.376773] VFS: Cannot open root device "/dev/sda2" or unknown-block(8,2): error -6
    [ 3.384779] Please append a correct "root=" boot option; here are the available partitions:
    [ 3.393421] 0800 30720000 sda
    [ 3.393462] driver: sd
    [ 3.399911] 0801 30719984 sda1 fcb105bf-01
    [ 3.399952]
    [ 3.406494] List of all bdev filesystems:
    [ 3.410672] ext3
    [ 3.410703] ext2
    [ 3.412763] ext4
    [ 3.414745] vfat
    [ 3.416813] msdos
    [ 3.418793]
    [ 3.422451] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,2)
    [ 3.430800] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,2) ]---


    Jak widać kernel spanikował bo nie znalazł żadnego rootfsa, bo go nie ma. Nie ma też partycji /dev/sda2 na pendrive.
    To teraz pasuje przygotować pendrive z rootfs na MIPS. Autor filmiku uruchamiał rootfs Debiana, tylko nie wiem skąd go zdobył, bo na szybko gotowca nie znajduje, a chciałbym ściągnąć gotowca bo będzie najszybciej.
    Załączniki:
    • vmlinux.bin (9.2 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #23 21652553
    flinc
    Poziom 30  
    Posty: 1559
    Pomógł: 92
    Ocena: 153
    @-Maciej_ 333 Fonia z 14.025 MHz to jest Mode CW Automatyczne stacje krótkofalarskie Pasmo 20m 14.000 MHz-14.350 Mhz Od 14.000 -14.100 mode CW- SSB
  • #24 21652691
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    @bulek01 -> Bardzo ciekawa sprawa. Nie mam niestety aktualnie dostępu do tego tunera. Jak tylko będę miał możliwość to oczywiście spróbuję to zabootować. Można by to też skompresować przez LZMA, przez co może obraz ten zmieściłby się we flashu.

    Nie znam się na takich sprawach, ale widzę, że są różne dystrybucje Debiana na MIPS. Cały ten zestaw plików jaki ma być w root można odzyskać z obrazów ISO, jakie są pod tym linkiem. Tylko co na tej platformie będzie działało, jaki ma być "endianness"?

    @flinc -> Czyli mam rozumieć, że taka stacja nadaje stale coś w stylu znaku i słowo "TEST" po jakimś jej wywołaniu?
  • #25 21653181
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    maciej_333 napisał:
    Bardzo ciekawa sprawa. Nie mam niestety aktualnie dostępu do tego tunera. Jak tylko będę miał możliwość to oczywiście spróbuję to zabootować. Można by to też skompresować przez LZMA, przez co może obraz ten zmieściłby się we flashu


    Można by, choć z mojej perspektywy na ten moment nie ma sensu. Mam pendriva który ma ogromny rozmiar w stosunku do wewnętrznego flasha więc to niecałe 10MB jak zostanie skompresowane i wrzucone do flasha nic nie zmieni.
    Rootfs w wersji minimalnej zajmuje niecałe 50MB więc zmieszczenie tam kernela nic nie ratuje. Chyba, żeby to okroił tak aby był tam minimalny system w podstawowymi aplikacjami to pewnie dałoby się wszystko zmieścić, ciekawe byłoby to wyzwanie.

    maciej_333 napisał:
    Nie znam się na takich sprawach, ale widzę, że są różne dystrybucje Debiana na MIPS. Cały ten zestaw plików jaki ma być w root można odzyskać z obrazów ISO, jakie są pod tym linkiem. Tylko co na tej platformie będzie działało, jaki ma być "endianness"?

    To jest little endian dlatego nazywany jest mipsel. Samego wydobycia z iso nie widze. Tam jest instalator, nie ma rootfs. Jest jakiś minimalny initrd tylko. Chyba, że czegoś tu nie wiem.

    Mój pomysł to zainstalować ten system z użyciem quemu-mipsel i skopiować rootfs na pendrive. Ewentualnie spróbować odpalić instalke z pendriva i zainstalować na drugim.
    Choć mi się z tym nie pali, bo nie lubię Debiana za bardzo, a mam drobrą zabawę z buildrootem.

    Ogólnie mam krok na przód udało mi się linuxa odpalić. Rootfs przygotowałem z użyciem buildroota. Ciekawe narzędzie, dość szybko poszło, a nigdy nie używałem.

    Pomógł mi bardzo chatgpt.
    Tak w skrócie to pobranie z gita wybranie architektury oraz tego aby wygenerowało plik rootfs.ext2
    Cytat:

    git clone https://github.com/buildroot/buildroot.git
    cd buildroot
    make menuconfig

    Wybranie ustawień:

    Cytat:
    Ustaw:
    Target Options-> Target Architecture -> MIPS
    Target Architecture → MIPS
    Target Architecture Variant → (np. mips32r2)
    W ToolChain -> Kernel Cheaders zmieniłem na linux 6.6.x bo mam 6.7 a domyslnie było 6.16


    Cytat:

    make -j6
    Po niecałej godzinie miałem zbudowane.


    Następnie na pendrive zrobiłem dwie partycje za pomocą fdiska, pierwsza fat o rozmiarze 100MB z kernelem, aby Mboot mógł go załadować.
    Druga partycja typu linux(sda2)
    Następnie wrzuciłem rootfs:
    Cytat:
    sudo dd if=output/images/rootfs.ext2 of=/dev/sdb2 bs=1M status=progress


    W pliku /etc/inittab dodałem jeszcze linie aby mi dodało konsolę na ekran, bo framebuffer jest podpięty pod /dev/tty1

    Cytat:
    tty1::respawn:/sbin/getty -L tty1 115200 vt100


    Potem się zorientowałem że można dać jeszcze zamiast vt100 parametr linux wtedy kolory działają.(wymusiła to na mnie gra)
    Cytat:
    tty1::respawn:/sbin/getty -L tty1 115200 linux


    Wrzuciłem huba USB z ethernetem, pod którego wpiąłem pendrive z systemem, oraz klawiaturę.
    Mam dostęp teraz zdalny po ssh, przez port szeregowy, oraz przez monitor i klawiaturę.

    Zanim jeszcze uruchomiłem getty na monitorze, przetestowałem czy framebuffer działa.
    Cytat:
    fb-test

    Wygenerowało to ciekawy wzór na ekranie.

    Ekran monitora z wyświetlonym kolorowym wzorem RGB w paski

    Następnie po dodaniu startowania getty można było się zalogować.

    Monitor z ekranem logowania systemu Buildroot buildroot login:

    Odpaliłem htopa:


    Ekran monitora pokazujący uruchomioną aplikację htop w trybie tekstowym na systemie Linux
    Co ciekawe był czarno biały zamiast kolorowy.

    Następnie odpaliłem ascii-invaders, który był wraz z buildrootem.(trzeba było wlączyć jego kompilację w menuconfig)https://github.com/macdice/ascii-invaders


    Monitor wyświetlający grę Ascii-Invaders w trybie tekstowym na czarnym tle

    Następnie próbowałem odpalić grę xorcurses, która była też w configu buildroota do zainstalowania. I tu się dowiedziałem, że można konsolę przełączyć na typ linux zamiast vt100. Wtedy nawet ascii-invaders dostało kolorów.

    Kolorowa gra ASCII na ekranie monitora z mapą i tekstową grafiką.

    Tak wygląda kolorowy htop


    Kolorowy interfejs programu htop uruchomiony na monitorze z konsolą tekstową

    W buildroocie znalazłem jeszcze dooma o nazwie chocolate-doom. Ale mi się coś nie uruchomił, nie znajduje video. On używa SDL2, ale coś mi się nie skompilował, coś namieszałem zmieniając ciągle opcje buildroota.

    Próbowałem też sprawdzić i2C ale coś mi go system nie znajduje. Chyba w device tree muszę coś pozmieniać może są złe adresy.
    Bo ten kernel został skompilowany pod MSD7816, a ja mam MSD7818.
    Więc dobrze, że wogóle działa.

    Dodatkowo zmieniłem jeszcze envy w mboocie, aby mi się domyślnie linux uruchamiał z pendrive bez podłączania serial portu.
    setenv bootcmd 'usb reset 0;fatload usb 0 0x80000000 vmlinux.bin;go 0x805db8a0'
    saveenv
    run bootcmd
    


    To zadziałało, ale po restarcie był problem, kernel się uruchamiał i nagle był restart i tak w nieskończoność.
    Okazuje się że tam jest watchdog i jak się przerwie za pomocą CR start to on nie jest włączany albo jest wyłączany, a jak się tego nie zrobi,
    to system jest resetowany.

    Nie wiedziałem co z tym zrobić, jak się dobrać do rejestrów watchdoga jakie ma adresy. Napisałem do maniek86 autora filmiku z youtuba i dostałem rozwiązanie:
    
    setenv bootlinux osd_create 1 1\;usb start\;fatload usb 0 0x80000000 vmlinux.bin\;go 0x805db8a0\;
    setenv bootcmd mw.w 0xBF006040 0 1\;mw.w 0xBF006010 0 1\;mw.w 0xBF006014 0 1\;run bootlinux\;
    saveenv
    


    W tym momencie system startuje sam z pendrive nie potrzebuję portu szeregowego i ręcznego wpisywania komend.
    Wystarczy klawiatura i monitor lub ethernet wraz z ssh.

    Wrzucam jeszcze informację z cpuinfo
    
     cat /proc/cpuinfo 
    system type      : MStar MIPS SoC [Linux-ChenXing]
    machine         : MStar MSD7816 test
    processor      : 0
    cpu model      : MIPS 34Kc V5.5  FPU V0.0
    BogoMIPS      : 364.54
    wait instruction   : yes
    microsecond timers   : yes
    tlb_entries      : 32
    extra interrupt vector   : yes
    hardware watchpoint   : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
    isa         : mips1 mips2 mips32r1 mips32r2
    ASEs implemented   : mips16 dsp mt
    Options implemented   : tlb 4kex 4k_cache 32fpr prefetch mcheck ejtag llsc userlocal vint perf_cntr_intr_bit nan_legacy perf mm_full
    shadow register sets   : 1
    kscratch registers   : 0
    package         : 0
    core         : 1
    VPE         : 0
    VCED exceptions      : not available
    VCEI exceptions      : not available
    
    processor      : 1
    cpu model      : MIPS 34Kc V5.5
    BogoMIPS      : 369.66
    wait instruction   : yes
    microsecond timers   : yes
    tlb_entries      : 32
    extra interrupt vector   : yes
    hardware watchpoint   : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
    isa         : mips1 mips2 mips32r1 mips32r2
    ASEs implemented   : mips16 dsp mt
    Options implemented   : tlb 4kex 4k_cache 32fpr prefetch mcheck ejtag llsc userlocal vint perf_cntr_intr_bit nan_legacy perf mm_full
    shadow register sets   : 1
    kscratch registers   : 0
    package         : 0
    core         : 1
    VPE         : 1
    VCED exceptions      : not available
    VCEI exceptions      : not available
    
    
    
  • #26 21655786
    kassans
    Poziom 32  
    Posty: 1820
    Pomógł: 130
    Ocena: 411
    Podziwiam za umiejętności :)
    W tunerach Setty, Techbite DVB-T2 Oznaczenie PCB : HL-140AD-GX6702S5-R836-V1.0 siedzi głowica: Rafael Micro R836 czyżby to nie był jakiś następca R820T?
    Swoją drogą w wyżej wymienionych tunerach nagminnie padają kondensatory filtrujące stronę wtórną.
    P.s Z tego co znalazłem to R863 siedzi również w tunerze Wiwa H265.

    W załączniku PDF do tegoż tunera
    Załączniki:
    • Rafael_Micro_R836_High_Performance_DTV_Silicon_Tuner_Datasheet.pdf (491.75 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #27 21655851
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    kassans napisał:
    Rafael Micro R836 czyżby to nie był jakiś następca R820T?

    Nie wiem, czy tak jest. W dokumentacji nic o tym nie piszą. Nie ma opisu rejestrów dla R836. Nie mam pojęcia, czy jest zgodny z R820T2. Następcą dla tego ostatniego ma być podobno R860.
  • #28 21656473
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Jest postęp udało mi się odpalić dooma, ale trochę w inny sposób.
    chocolate-doom jednak nie wstał. On wymaga SDL2, a ten wymaga menadżera okien Xorg. Udało mi się odpalić Xorga, ale nie dokońca bo mi coś klawiatura nie chciała działać. Ale wymagało to dodania partycji Swap, bo mi ramu brakowało i wszystko się zawieszało. Ze względu na ten fakt stwierdziłem, że to nie ma prawa dobrze działać i spróbowałem uruchomić dooma z zaimplementowanym intefejsem przez framebuffer, czyli tak jak to działa na tej płycie.

    Użyłem projektu https://github.com/nyorem/fbdoom
    Obecnie buildroot bez przeróbek nie pozwala zbudować gcc na płytę docelową, można jedynie mieć crosscompilator na hoście i na nim budować aplikacje.
    Więc tak też zrobiłem zbudowałem sobie SDK z crosscompilatorem za pomocą buildroota, oraz wypakowałem kompilator do katalogu domowego.
    
    make sdk
    tar -xzf output/images/host-sdk.tar.gz -C ~/toolchains/mipsel
    


    Następnie zmodyfikowałem w pliku makefile projektu nazwę kompilatora, oraz dodałem kompilator do ścieżki path i skompilowałem.
    
    export PATH=~/toolchains/mipsel/mipsel-buildroot-linux-gnu/bin:$PATH
    make
    


    Następnie przez scp wrzuciłem na płytę:
    
    scp -O fbdoom root@192.168.2.115:/home
    


    Doom jeszcze poza aplikacją potrzebuje pliku iwad z zasobami gry jak poziomy, grafika. W mojej wersji skorzystałem z pliku doom1,wad shareware. Który jest wersją demo
    i zawiera tylko jeden poziom. Na moje potrzeby idealnie, bo nie zamierzam w to grać.
    Plik można pobrać ze strony: https://doomwiki.org/wiki/DOOM1.WAD

    Po wgraniu plików z poziomu klawiatury podłączonej przez USB uruchomiłem dooma:
    
    cd /home
    ./fbdoom -iwad doom1.wad
    




    Menu główne gry Doom uruchomione na ekranie monitora w trybie framebuffer




    Jak widać działa to słabo, tnie. Można by spróbować zmniejszyć skalowanie i wyświetlać tylko 800x600. Może wtedy będzie grywalne.
    Widoczne jest migotanie obrazu, bo nie ma synchronizacji między wyświetlaniem, a pisaniem po buforze.
    Tutaj używany jest sterownik jądra simple-framebuffer. Według mojego rozpoznania działa to tak, że Mboot konfiguruje peryferium OSD(on screen display),
    a ktoś odkrył pod jakim adresem jest zmapowany bufor obrazu i podpiął go do framebuffer. Kernel jedynie co robi to pisze do pamięci pod tym adresem
    uzupełniając klatki obrazu. Mamy stałą rozdzielczość, której nie da się zmienić, bo nie wiadomo jak, bo nie ma żadnej dokumentacji.

    Udało mi się jeszcze doczytać informację, że MSD7818, to jest to samo co MSD7816, ale ma wbudowany w krzem demodulator. (https://linux-chenxing.org/kronus/#msd7818)
    Wcześniej na płytach z MSD7816 demodulatorem był scalak MSB1236C, który przyjmował pośrednią,a na wyjściu podawał strumień MPEG-TS.

    Wracając do głównego tematu SDRa, to pojawił mi się w głowie pomysł, aby teraz uruchomić komunikację I2C z poziomu linuxa.
    Dzięki temu mógłbym nawiązać komunikację z Tunerem i go przestrajać. I tu się mi zrodził nowy pomysł co można by zrobić.
    Wziąłbym RP2040 i jego ADC podłączył pod pośrednią. RP2040 ma przetwornik 500kSample/s 12bit z którego dane mógłbym przesyłać dane po USB do linuxa.
    W ten sposób mógłbym zrealizować prosty skaner widma. Z próbek obliczać moc i rysować waterfalla na monitorze.
    I tu byłby sens aby zmieścić całego linuxa w pamięci wewnętrznej. Ale zobaczymy na ile realne z tym co jest łatwo dostępne będzie uruchomienie sterownika do I2C.
  • #29 21656632
    maciej_333
    Poziom 38  
    Posty: 4218
    Pomógł: 486
    Ocena: 1578
    Bardzo ciekawe wyniki prac. Jak będę w Grudziądzu spróbuję to przynajmniej częściowo powtórzyć. Mam przez to motywację do zajęcia się Linuxem.

    bulek01 napisał:
    Wracając do głównego tematu SDRa, to pojawił mi się w głowie pomysł, aby teraz uruchomić komunikację I2C z poziomu linuxa.
    Dzięki temu mógłbym nawiązać komunikację z Tunerem i go przestrajać. I tu się mi zrodził nowy pomysł co można by zrobić.
    Wziąłbym RP2040 i jego ADC podłączył pod pośrednią. RP2040 ma przetwornik 500kSample/s 12bit z którego dane mógłbym przesyłać dane po USB do linuxa.
    W ten sposób mógłbym zrealizować prosty skaner widma. Z próbek obliczać moc i rysować waterfalla na monitorze.
    I tu byłby sens aby zmieścić całego linuxa w pamięci wewnętrznej. Ale zobaczymy na ile realne z tym co jest łatwo dostępne będzie uruchomienie sterownika do I2C.

    Trochę mała częstotliwość próbkowania. Zresztą i tak musiałbyś mieć jakiś wzmacniacz o określonej selektywności. Zobacz do mojego poprzedniego tematu o SDR. Ponadto czy przetwornik A/C w RP przeniesie ponad 4,5 MHz? Musisz przenieść całe pasmo analogowe - nawet jak próbkujesz sygnał pasmowy.

    Następna sprawa to przepływność bitowa przy przesyłaniu tego strumienia. Jak masz 500 ksps i 12 bitów to na 1 s jest 12 b*500k=6000 kb. Zatem masz 6 Mb/s i to tylko dla samej warstwy aplikacji przy USB. Dochodzą jeszcze wszystkie naddatki od protokołu komunikacyjnego. USB 2.0 ma te 12,5 Mb/s, ale czy dasz radę to odbierać i przetwarzać w czasie rzeczywistym? Może jakbyś zrobił 8 bitów, to dałbyś radę.

    Odnośnie uruchomienia I2C na MSD7818 i próbkowaniu IF przez RP, to już chyba prościej zrobić, tak, jak ja to zrobiłem. Możesz konfigurować MxL5007 przez I2C w RP.
  • #30 21656783
    bulek01
    Poziom 17  
    Posty: 337
    Pomógł: 12
    Ocena: 294
    Jeśli chodzi o układ wzmacniacza to myślałem zbudować ten twój z pewnymi modyfikacjami. Plan był, aby wyrzucić transformator(nie mam takich pod reką) i nie brać sygnału symetrycznie, tylko wziąć go z jednego pinu i podać na wzmacniacz. Następnie pomyślałem aby dodać filtr, choćby na początek RC na 250kHz wzmocnić i podać na przetwornik. Tranzystorów BF194 nie dostałem. Za to udało mi się kupić BF195.
    Jeśli chodzi o temat przesyłu danych to tak jak napisałeś jest tu problem. W najprostszej wersji z Arduino można wyciągnąć 180k sampli, przynajmniej tyle znalazłem, że komuś się udało(https://github.com/earlephilhower/arduino-pico/discussions/1070).
    Skoro nie zamierzam robić demodulacji to:
    Mój pomysł na to był trochę taki, aby zebrać paczkę danych 250k, bo mikrokontroler ma 264kB RAMU. Na taką paczkę na
    rzucić okno i z tego policzyć moc. Druga wersja jaka mi przyszła do głowy to na RP2040 policzyć moc i wynik tylko wysłać po USB. Tutaj znalazłem że komuś się udało zrobić overclocking RP2040 i wyciągnął 4Msample.(https://forums.raspberrypi.com/viewtopic.php?t=365702)
    Następnie przestroić tuner o 250k i tak przeskanować pasmo.(jeszcze nie sprawdziłem czy da się tak przestrajać).

    Bardziej patrze na ten projekt pod tym kątem aby spróbować użyć I2C z poziomu linuxa, bo jeszcze nigdy tego nie robiłem.
📢 Słuchaj (AI):

Podsumowanie tematu

✨ Dyskusja dotyczy rozwoju eksperymentalnego odbiornika SDR opartego na układzie MxL5007T i mikrokontrolerze STM32F407, wykorzystującego głowicę tunera DVB-T02 firmy Manta. Brak pełnej dokumentacji (datasheet) układu MxL5007T stanowi wyzwanie, jednak uczestnicy wymieniają się informacjami na temat funkcjonowania i programowania tego tunera, w tym sterowników dostępnych na platformie MSTAR. Omawiane są szczegóły techniczne, takie jak zakres strojenia częstotliwości (ok. 35 MHz do 1023,97 MHz z krokiem 7,8124 kHz), architektura układu (mieszacze IQ, dwie pętle PLL, ADC i DAC), a także metody inżynierii wstecznej i programowania przez interfejsy I2C, UART i JTAG.

Wątek obejmuje także próby uruchomienia systemu Linux (kernel 6.7) na platformie MSD7818, kompilację Buildroota, konfigurację środowiska wirtualnego Linux Mint oraz problemy z instalacją VirtualBox Guest Additions i współdzielonymi folderami. Dyskutowane są kwestie sprzętowe, takie jak kompatybilność i stabilność hubów USB 2.0, wykrywanie klawiatury USB przez bootloader Mboot i Linux, a także metody backupu i modyfikacji firmware (np. zmiana logo bootowania).

Dodatkowo opisano uruchomienie gry Doom na platformie z Buildrootem, wykorzystując framebuffer bez SDL, wraz z analizą skalowania obrazu i możliwości optymalizacji rozdzielczości dla płynniejszej gry. Wskazano na ograniczenia sprzętowe i programowe, takie jak brak dostępu do ADC w pamięci RAM tunera, konieczność dołączania się do głowicy oraz problemy z przepływnością danych USB. Wymieniono także doświadczenia z różnymi tunerami DVB-T i DVB-T2, ich głowicami (R820T, R836, R860) oraz problemami z kondensatorami filtrującymi.

Całość stanowi kompleksowy przegląd prac nad odbiornikiem SDR na bazie MxL5007T i platformy MSTAR, łącząc aspekty sprzętowe, programowe i systemowe, z naciskiem na praktyczne rozwiązania i narzędzia do dalszego rozwoju projektu.
Wygenerowane przez model językowy.
REKLAMA