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

Wnętrze radia Blaupunkt MS8BK, analiza pamięci Flash i drugie życie wyświetlacza z CD1628 z Arduino

p.kaczmarek2 18 Gru 2025 14:35 1758 4

TL;DR

  • Rozebrano mikrowieżę Blaupunkt MS8BK, analizując płytę główną z Mediatek MT8309QLN i osobną płytkę frontową z kontrolerem CD1628 oraz wyświetlaczem 7-segmentowym.
  • Zgrano 2 MB pamięci Flash, zdekodowano firmware w Ghidrze jako 8051, a potem odtworzono protokół CD1628 na Arduino przez DIO, CLK i STB.
  • W pamięci pojawiły się napisy XVID, 3IV1, MP4S, M4S2, UPGRAD i SCOTT, a porównanie wsadu pokazało duże podobieństwo do MT1369.
  • Wyświetlacz ruszył z Arduino, udało się sterować segmentami, ikonami, dwukropkami i odczytać klawisze, ale prosty „blink LED” na MCU nie zadziałał.
REKLAMA
📢 Słuchaj (AI):
  • Płytka Arduino podłączona do przedniego panelu mikrowieży z wyświetlaczem LED
    Oto krótka prezentacja wnętrza mikrowieży z odtwarzaczem CD i USB firmy Blaupunkt model MS8BK. Sprawdzę tutaj jak jest ona zbudowana, spróbuję przeanalizować jej firmware z nieznanego mikroprocesora i określić jego architekturę w Ghidra, a potem uruchomię jej wyświetlacz z Arduino.
    Etykieta tylnej obudowy mikrowieży Blaupunkt model MS8BK z danymi technicznymi

    Wnętrze MS8BK
    Sprzęt trafił do mnie zdekompletowany, więc prezentacja nie obejmuje zasilacza. Z samej płytki mogę wywnioskować, że zapewniał on standardowe napięcia, takie jak 5 i 12 V. Pewnie to był już zasilacz impulsowy w topologii flyback - tego typu rozwiązania widuję we współczesnych sprzętach. W starszych wieżach audio były klasyczne transformatory na 50/60 Hz, teraz już coraz rzadziej je spotykam.
    Rozebrana mikrowieża Blaupunkt MS8BK z widoczną płytą główną i napędem CD
    Płytki PCB mikrowieży Blaupunkt MS8BK z wyświetlaczem i przyciskami
    Płyta główna opiera się procesor Mediatek, zostawię go na koniec. Tuż obok niego widać pamięć Flash 2 MB, na której być może znajduje się program, a w rogu jest też pamięć EEPROM - może dla konfiguracji.
    Zbliżenie na płytkę PCB z układem PT7314E i złączem z przewodami
    Na płytce znajduje się osobny czterokanałowy procesor do audio - PT7314E, główne CPU steruje nim przez I2C:
    Karta katalogowa układu dźwiękowego PT7314E z opisem i listą cech.
    Osobno mamy wzmacniacz - podwójny 7W+7W, TDA7266SA, zamontowany na dużym radiatorze zapewniającym odpowiednie chłodzenie:
    Radiator na układzie TDA7266SA zamontowanym na płytce mikrowieży Blaupunkt
    Karta katalogowa wzmacniacza TDA7266SA pokazująca jego parametry i rysunek obudowy
    W rogu przykuł jeszcze moją uwagę rezonator kwarcowy zegarkowy i mały układ - początkowo myślałem, że to RTCC, ale tam prowadzi antenka. To pewnie układ odbiorczy radia. Może dałoby się go luzem uruchomić?
    Zbliżenie na fragment płytki drukowanej z rezonatorem, złączem i układem scalonym
    No i został główny MCU:
    Zbliżenie na płytkę drukowaną z układem Mediatek MT8309QLN i elementami SMD.
    Mediatek MT8309QLN. Nie znalazłem o nim konkretnych informacji w sieci, choć ktoś umieścił już z niego wsad na innym forum:

    Czyli MS12BT ma bardzo podobną budowę.

    Płytka z wyświetlaczem jest o wiele prostsza. Laminat jest jednostronny, od strony ścieżek przylutowany powierzchniowo jest tylko główny kontroler, CD1628. Obsługuje on przyciski i wyświetlacz 7-segmentowy. Dodatkowo na płytce mamy odbiornik IR, enkoder i diodę standby.
    Płytka frontowa mikrowieży Blaupunkt z wyświetlaczem i przyciskamiPłytka czołowa mikrowieży z wyświetlaczem 7-segmentowym i wieloma przyciskamiPłytka PCB z układem sterującym CD1628 i widocznymi ścieżkami połączeniowymi


    Analiza pamięci Flash
    Pamięć Flash wylutowałem za pomocą gorącego powietrza i odczytałem programatorem CH341.
    Płytka główna mikrowieży Blaupunkt z podłączonym programatorem CH341
    Binwalk nic ciekawego w niej nie znajdywał. Zacząłem przeglądać ją w xvi32. Nie widać żadnej struktury nagłówka bądź partycji. Pamięć zaczyna się od bajtów 02 1F E0, co przypomina instrukcję skoku 8051:
    Zrzut ekranu z edytora hex pokazujący dane binarne pamięci Flash
    0x02 to kod instrukcji, 0x1FE0 to adres skoku.
    Opis instrukcji LJMP procesora 8051 z przykładem i kodowaniem bajtowym
    Na offsecie 03 znów mamy instrukcję skoku 02 21 D0. Pasuje to z pozycją przerwania 8051. Wygląda na to, ze rzeczywiście mamy tu użyty ten klasyczny rdzeń.
    Spróbujemy to zdekompilować, ale jeszcze warto poszukać napisów w formacie ASCII, mogą one dużo zdradzić o firmware.
    Hex edytor z widokiem danych binarnych z pamięci Flash odczytanej z mikrowieży Blaupunkt MS8BK
    XVID, 3IV1, MP4S, M4S2 - kodeki.
    Tabela ASCII z edytora szesnastkowego przedstawiająca dane z pamięci Flash Blaupunkt MS8BK
    Nic więcej o bootowaniu i linii komend nie ma, więc pewnie UART nie uruchomimy. UPGRAD sugeruje jedynie aktualizacje wsadu. Ciekawe skąd tam SCOTT - czy to podpis autora?
    Zrzut danych binarnych z pliku pamięci FLASH w edytorze XVI32, widoczne teksty ASCII
    MT1369? Nazwa wewnętrzna układu? Chyba coś się nie zgadza? Chociaż tu i tu Mediatek...
    https://www.elektroda.pl/rtvforum/find.php?q=MT1369
    Wygląda na układ z DVD, dziwne. Może to wewnętrznie jest ten sam procesor.

    Pora jednak przejść dalej. Załadowałem flash do dekompilatora Ghidra i zdekodowałem go jako instrukcje 8051. Operacje wyglądają poprawnie, najpierw mamy skok do właściwego programu z adresu 0x0, bo na początku mamy wektory przerwań:
    Zrzut ekranu z dekompilatora Ghidra z analizą kodu w asemblerze 8051
    Pierwsza funkcja przypomina inicjalizację trzech pinów oraz pamięci:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Udało mi się znaleźć też osobną funkcje inicjujące timer, to dobitnie pokazuje, że instrukcje są dekodowane poprawnie:
    Zrzut ekranu z Ghidra z podglądem kodu asemblera i dekodyfikacji funkcji 8051
    Zrzut ekranu z dekompilatora pokazujący funkcję konfigurującą rejestry mikrokontrolera 8051
    Szukałem też komend powiązanych z UART, ale nie znalazłem niczego co by przypominało bezpośrednio wysyłanie bądź odbiór, mimo iż standardowe rejestry UART z 8051 są dobrze udokumentowane i znane.

    Porównanie ze wsadem z MT1369?
    Zaciekawiło mnie jednak to, czemu wedle naszego forum ten sam napis występuje w zrzutach pamięci z DVD.
    Pobrałem kopię wsadu z tego postu:
    https://www.elektroda.pl/rtvforum/topic467658.html#2627620
    Porównanie kodów assemblera dwóch firmware w oknie Ghidra, jeden z lewej, drugi z prawej
    To chyba ten sam proces inicjalizacyjny (bądź bootloader). Szybkie porównanie obu firmware w Ghidra pokazuje bardzo duże podobieństwo.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To potwierdza mocne powiązanie obu firmware i układów, choć głębszej analizy już nie wykonywałem.

    Podjąłem jeszcze próbę skompilowania w SDCC prostego blink dla 8051 ale nie udało mi się wykryć żadnego migania na portach mojego nieznanego procesora. Nie wiem jednak, czy wcześniej on działał - radio rzekomo miało zasilanie a nie startowało, więc może już wcześniej coś było z nim nie tak.

    Pierwszy krok z wyświetlaczem
    Moduł z wyświetlaczem jest bardzo atrakcyjny i przydatny - nie wymaga wielu pinów do sterowania, a w sam raz pasuje na zegarek. Jest dużo cyfr, są dwa dwukropki, warto będzie powalczyć.
    Zacząć trzeba od noty katalogowej CD1628. Na szczęście jest ona dostępna:
    Fragment dokumentacji układu CD1628 z opisem funkcji sterownika LED
    CD1628 sterowany jest trzema pinami - DIO (dane we/wy), CLK (zegar) oraz STB (strobe, wybór układu).
    Schemat blokowy sterownika wyświetlacza i klawiatury CD1628 z oznaczeniami sygnałów i modułów.
    Protokół jest opisany w PDF:
    Tabela komend sterownika CD1628 z trybami wyświetlacza i ustawieniami danych
    Krótka lektura noty wskazuje nam, że to zasadniczo jest taki sam układ jak znana rodzina TM1628, TM1637, TM1650, itd:
    Uruchamiamy sterownik wyświetlacza/przycisków HD2015 po inżynierii wstecznej, porównanie z TM1637itd
    Wyświetlacze 7-segmentowe na TM1637 - 4 i 6 cyfr - Arduino, protokół
    Zasadnicza różnica jest taka, że zamiast generować tu warunki startu i stopu w stylu I2C, operujemy tu pinem STB.
    Pora wpisać to w kod - dla uproszczenia wybrałem Arduino:
    Najpierw piny - 0 i 1 to RX/TX, więc zacząłem od 2:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Potem wysyłanie danych - zgodnie z notą katalogową.
    Format transmisji szeregowej CD1628 z trzema liniami: STB, DIO, CLK
    Bity są wczytywane na rosnącym zboczu zegara, dlatego najpierw ustawiam zegar na stan LOW (niski), potem ustawiam stan DIO, a następnie odczekuję moment i przywracam zegar na stan wysoki.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Strobe musi być w stanie niskim na czas komunikacji, więc dodałem pomocniczą funkcję wysyłającą komendę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To jest podstawowy budulec wysyłania.
    Teraz pytanie co trzeba wysyłać.
    Adresy rejestrów i komendy są takie same jak w TM1650 i podobnych.
    Kolejno:
    - Command 1 - ustawienie trybu wyświetlacza (ile segmentów, ile siatek)
    - Command 2 - ustawienie trybu pracy (tryb normalny)
    - Command 3 - ustawienie adresu wyświetlania oraz dane (segmenty)
    - Command 4 - ustawienie kontroli wyświetlacza (poziom jasności, stan on/off)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tu jedyna niewiadomą jest pierwsza komenda - bo mamy cztery tryby pracy, skąd można wiedzieć, który jest użyty na płytce? Czy trzeba śledzić ścieżki?
    Tabela trybów konfiguracji segmentów i siatek dla układu wyświetlacza CD1628
    Moim zdaniem niekoniecznie - po prostu sprawdziłem każdą z 4 opcji i przystałem na tą, która z moim testowym kodem ustawiającym wszystkie dane naprzemiennie na 1 i 0 zapala i gasi wszystkie fragmenty.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Rezultat - najpierw bez ustawienia poprawnej konfiguracji siatek/segmentów (0x03):
    Wyświetlacz mikrowieży Blaupunkt MS8BK z aktywnymi ikonami i zegarem 7-segmentowym
    Z poprawną konfiguracją:
    Wyświetlacz mikrowieży Blaupunkt z niebieskim podświetleniem pokazuje zegar i ikony źródeł audio

    Segmenty
    Potem zacząłem eksperymentować jak kontrolować segmenty. Okazało się, że segmenty jednej cyfry rozrzucone są po różnych rejestrach. To znaczy, taki kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    gasi pierwszą cyfrę:
    Wyświetlacz LED mikrowieży Blaupunkt z podświetleniem i ikonami trybów pracy
    Zostało tylko ręcznie sprawdzić, która pozycja odpowiada któremu segmentowi - potem w oparciu o to można utworzyć maski cyfr.
    Wyświetlacz 7-segmentowy CD1628 z aktywnymi symbolami i cyframi na płytce PCB


    Cyfry
    Określiłem też potem, które rejestry w ogóle są powiązane z cyframi - nie wszystkie, zasadniczo co drugi:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Powyżej zrealizowane jest proste przewijanie cyfr.
    Wyświetlacz 7-segmentowy CD1628 z zapalonymi cyframi i ikonami w kolorze niebieskim


    Przeróbka na wspólny bufor, ikonki i odliczanie
    Teraz można by zrobić już normalne odliczanie lub zegar, ale jeszcze trzeba wydzielić bufor tak, by był wspólny z ikonkami. To dlatego, że tablica, która jest teraz, reprezentuje wszystkie segmenty - nie tylko same cyfry.
    Tablica on jest teraz globalna, a funkcja drawText odpowiednio zapala lub gasi wszystkie segmenty cyfr. Dodatkowo wydzieliłem funkcję pomocniczą setIcon która zapala lub gasi dany segment określony indeksem bajtu i bitu.
    Co najważniejsze, setIcon można wywołać raz a kolejne drawText nie nadpiszą zmian.
    Udało się też znaleźć oba dwukropki.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pomocnicze funkcje dla ikonek:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod




    Niebieski wyświetlacz 7-segmentowy pokazujący przewijające się cyfry 032754.


    Zostało zdekodować klawisze.
    Odczyt jest bardzo prosty. Po prostu wysyłamy odpowiednią komendę a potem odczytujemy dane z tego samego pinu którym je wysyłaliśmy. Kontroler wystawia dane na zboczu opadającym.
    Schemat odczytu danych przez interfejs STB/DIO/CLK dla sterownika wyświetlacza
    Tu też jest ciekawa sprawa, bo CD1628 zwraca nam 5 bajtów, a tylko wybrane ich bity dotyczą klawiszy - reszta jest bez znaczenia. Nie wiem, skąd taka decyzja projektowa.
    Tabela RAM skanowania klawiszy CD1628 z opisem bajtów i bitów
    Zrezygnowałem z określania tych bitów, po prostu trzymam tablicę pięciu bajtów i z każdym odczytem sprawdzam, które bity się zmieniły, a potem wywołuję funkcje obsługujące zdarzenia, osobno wciśnięcie i zwolnienie klawisza.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Rezultat:
    Logi z odczytu klawiszy interfejsu CD1628 w monitorze portu szeregowego Arduino
    W ten sposób można zrobić funkcjonalny zegar bądź kontroler urządzenia z wyświetlaczem. Można by jeszcze uruchomić enkoder i jego też zaprząc do pracy.

    Podsumowanie
    Sprzęt trafił do mnie niekompletny, choć na pewno wiem, że zasilacz był sprawny i przydał się pierwszemu właścicielowi.
    Oprócz zasilacza była jeszcze płyta główna oraz frontowe PCB z wyświetlaczem.
    Płyta główna okazała się być dość ciekawa, udało się zgrać pamięć Flash, określić architekturę MCU, przeanalizować jego firmware a nawet odnaleźć jego powiązania z układami z odtwarzaczy DVD. Chciałem też wgrać na niego prosty "blink LED", ale ten niestety nie ruszył - nie eksperymentowałem z tym jednak dalej, bo podejrzewam, że coś wcześniej mogło być uszkodzone.
    Płyta frontowa również mnie zainteresowała, i w tym przypadku udało się ją łatwo uruchomić z Arduino. Prawie cała jest zrealizowana w oparciu o układ CD1628, czyli jednolity sterownik wyświetlacza i klawiatury podobny do popularniejszych TM1650, TM1637, TM1636, itd. Nawet adresy rejestrów się zgadzają.
    Podsumowując, przygoda była ciekawa.
    Załączam zgrany wsad 2MB, może ktoś też chce go otworzyć w Ghidra:
    https://github.com/openshwprojects/FlashDumps/commit/dae69584d40094af235c3fbebc51254746f39f4e

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • REKLAMA
  • #2 21784993
    Nepto
    Poziom 24  
    Posty: 564
    Pomógł: 57
    Ocena: 246
    p.kaczmarek2 napisał:
    ale tam prowadzi antenka. To pewnie układ odbiorczy radia. Może dałoby się go luzem uruchomić?

    Może to RDA5807, 10-pinowa obudowa i kwarc może to sugerować.
    Mógłbyś zrobić wyraźniejsze zdjęcie tej okolicy, tak, żeby było widać ścieżki? Może to pozwoli potwierdzić czy to ten układ.
  • REKLAMA
  • #3 21785063
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14657
    Pomógł: 655
    Ocena: 12664
    RDA5807 by się mógł przydać, z tego co widzę, ma on komunikację I2C, więc można by też skanerem I2C sprawdzić.

    Trochę utrudnia mi sprawę to, że PCB jest tam czymś pokryte, na skutek czego nie widać dobrze ścieżek i oznaczeń.

    Skrajna nóżka GND, przeciwległa oscylator... chyba pasuje.
    Zbliżenie na układ scalony U1 na zielonej płytce PCB z elementami SMDZbliżenie na układ scalony U1 na płytce PCB z elementami elektronicznymi i oznaczeniami.Zbliżenie na płytkę PCB z komponentami, w tym kondensator, rezonator i mikroukład SMDZbliżenie na płytkę PCB z przylutowanym czarnym przewodem na skrajnej nodze GNDZbliżenie na fragment płytki PCB z elementami elektronicznymi pokrytej białym nalotem
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #5 21785135
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14657
    Pomógł: 655
    Ocena: 12664
    Ten kondensator elektrolityczny tam jest od zasilania, ale zasilanie załącza tranzystor U2, więc nie ma bezpośrednio ciągłości do 5 V. Pewnie wyłączają zasilanie RDA gdy ten nie jest używany.
    Multimetr mierzący rezystancję na płytce PCB z dwoma sondami podłączonymi do obwodu
    A właśnie szukałem jakieś pomysłu na projekt z PIC, może się RDA właśnie uruchomi, tylko nie wiem czy z PIC12F starczy pamięci.
    Pomogłem? Kup mi kawę.
📢 Słuchaj (AI):
REKLAMA