Ostatnio eksperymentowałem z prostym kodem flashującym dla płytki BW16E (RTL8720DN AmebaD), teoretycznie działającym również dla dowolnej z rodziny RTL872xDx. RTL8720DN to MCU z WiFi (2,4 GHz i 5 GHz) i Bluetooth (LE 5.0) wyposażony w dwurdzeniowy procesor wykorzystujący rdzenie KM4 i KM0. Można go kupić już za 1$. Poniżej przedstawię moje doświadczenia z programowaniem tej płytki i krótko opiszę proces flashowania.
Celem tego tematu będzie stworzenie prostego narzędzia C# do flashowania, które będzie w stanie wgrać OpenBeken firwmare port do RTL8720DN.
Pierwsze eksperymenty .
Zacząłem od poszukiwania prostych i łatwych w obsłudze flasherów obsługujących RTL8720DN. Po jakimś czasie zdecydowałem się na RTL872xDx python tool.rar, który był pokazywany wcześniej na naszym forum . Odczyt wydawał się działać dobrze, jednak musieliśmy dodać dłuższe opóźnienie do funkcji oczekującej na odpowiedź MCU . Polecenie odczytu:
python rtltool.py -p COM7 -b1500000 rf 0x0 0x400000 bw16_rtltool.bin
Nie udało mi się jednak uzyskać zapisu. Działało na innych płytach, ale na RTL8720DN za każdym razem się nie udawało:
python rtltool.py -p COM4 -b 100000 wf 0 ff1_4mb.binKomunikat o błędzie brzmiał:
error: Set Flash StatusTen sam problem został zgłoszony przez 9bb8b7658 innych użytkowników[/url] . Bawiłem się kodem i doszedłem do wniosku, że winowajcą jest nieobsługiwany flash unprotect , który wydaje się działać na innych RTL, ale psuje się na RTL8720. Skomentowanie go rozwiązało problem i flashowanie przebiegło poprawnie.
Prosta implementacja flashera
Mój prosty flasher jest dostępny na Githubie, tutaj:
https://github.com/openshwprojects/SharpRTL872xTool
Udostępnione repozytorium zawiera również przykładowe skrypty i zrzuty:
https://github.com/openshwprojects/SharpRTL872xTool/tree/main/samples
Jeśli nie ma imgtool_flashloader_amebad.bin obok pobranego exe, upewnij się, że pobrałeś go stamtąd!
Procedura odczytu pamięci flash wydaje się dość prosta. Można ją podzielić na następujące kroki:
- najpierw MCU jest wprowadzany w tryb flashowania i resetowany poprzez piny RTS/DTS
- następnie prosty kod ładujący xmodem jest odczytywany z pliku i umieszczany w pamięci RAM urządzenia (krok ten jest pomijany, jeśli bajty nagłówka sekcji kodu są już obecne w pamięci RAM)
- na koniec, pamięć flash jest odczytywana w 1024/128 kawałkach za pomocą protokołu Xmodem.
Podobne podejście stosuje się przy zapisie do pamięci flash, z tą różnicą, że najpierw wymagane sektory są kasowane, a następnie zapisywane.
Rozważmy procedurę w szczegółach.
Sekwencja resetu początkowego
Płyta BW16E, podobnie jak wiele innych płyt, posiada piny RESET i BOOT. Są one kontrolowane przez linie CH340 DTR i RTS. Boot musi być utrzymywany w stanie niskim, podczas gdy RESET jest zwolniony, aby wejść w tryb flashowania.
Kod: C#
System poleceń
System poleceń jest bardzo prosty. Najpierw zapisywanych jest N bajtów, a następnie flasher czeka na pojedynczy oczekiwany bajt. Jeśli nie ma oczekiwanej odpowiedzi, zakłada się, że komunikacja nie powiodła się. Jestem zaskoczony prostotą tego podejścia, raczej spodziewałem się przynajmniej jakiegoś rodzaju sprawdzania CRC gdzieś po drodze, ale oryginalnemu rtltoolowi też tego brakuje.
Kod: C#
Ustawienie prędkości transmisji
Ustawienie szybkości transmisji jest trudne, ponieważ MCU po prostu straci komunikację, jeśli nie zostanie powiadomiony o zmianie. Dlatego istnieje specjalny pakiet, który najpierw wysyła nową wartość do MCU, następnie czeka na potwierdzenie, a na końcu dostosowuje prędkość transmisji.
Kod: C#
Pisanie kodu RAM
Aby komunikować się z pamięcią flash, do pamięci SRAM MCU należy załadować pomocniczy plik binarny ( imgtool_flashloader_amebad.bin ). Ten plik zawiera flashloader używany przez oficjalne narzędzia Realtek. Przed załadowaniem flasher sprawdza, czy pamięć RAM zawiera już prawidłowy program ładujący, sprawdzając pierwsze 4 bajty. Jeśli go nie ma, plik jest wysyłany przy użyciu protokołu XMODEM.
Kod: C#
UWAGA: 33 dec to 0x21 hex i tak dalej.
Zapisywanie pamięci
Po załadowaniu pamięci RAM kodem programu ładującego można wykonywać polecenia takie jak kasowanie, zapis i odczyt. Zapis wykorzystuje XMODEM i automatycznie dzieli dane na 1024 lub 128 bajtowe fragmenty, w zależności od tego, ile ich pozostało.
Kod: C#
Skrypty testowe
Aby zweryfikować i poeksperymentować z narzędziem flasher, przygotowałem kilka prostych skryptów wsadowych, które wykonują typowe operacje, takie jak kasowanie, zapis i odczyt pamięci flash. Skrypty te automatyzują użycie wiersza poleceń pliku wykonywalnego flasher i pomagają łatwo odtworzyć podstawowe operacje flash.
Pierwszy skrypt, erase_4mb.cmd , kasuje pierwsze 4 megabajty pamięci flash, zaczynając od adresu 0. Jest to przydatne do wyczyszczenia całego głównego regionu pamięci flash przed zapisaniem nowego oprogramowania układowego lub danych. OpenBeken nie uruchamiał się poprawnie bez tego polecenia! Komenda erase (ef) przyjmuje adres początkowy i długość jako parametry:
RTL872xDx_Flasher.exe -p COM3 -b 1500000 ef 0 0x400000
pause
Następnie write_obk.cmd zapisuje pełny plik obrazu firmware do pamięci flash zaczynając od adresu 0. Ten skrypt jest niezbędny do flashowania nowego obrazu programu do urządzenia po skasowaniu:
RTL872xDx_Flasher.exe -p COM3 -b 1500000 wf 0 OpenRTL8720D_1.18.135.bin
pause
OpenBeken powinien być wtedy w stanie się uruchomić:
Dodałem jednak jeszcze kilka skryptów testowych. Działają one na mniejszej sekcji flash, więc są szybsze do uruchomienia.
Dla prostego testu spróbuj erase_4096.cmd a następnie read_4096_dump_bin.cmd , powinieneś otrzymać:
Po wykonaniu write_lorem_ipsum.cmd powinien pojawić się read_4096_dump_bin.cmd :
Analogicznie, odczyt z powrotem po write_obk.cmd powinien pokazać:
W ten sposób można niezawodnie sprawdzić, czy odczyt i zapis działają.
Podsumowanie
Wspomniane repozytorium powinno zapewnić podstawową metodę flashowania RTL8720DN. Nie jestem pewien, czy będzie działać dla innych RTL z tej samej rodziny, ponieważ pominąłem kod zabezpieczający przed flashowaniem. Wkrótce wypróbuję je również, ale najpierw najprawdopodobniej zintegruję przeportowany kod z naszym łatwym flasherem .
Czy masz podobne płyty RTL? Daj nam znać, czy to rozwiązanie działa!
Fajne? Ranking DIY Pomogłem? Kup mi kawę.