LN882H to układ WiFi & BT Wireless ARM Cortex-M4F SOC, który można znaleźć w niektórych urządzeniach IoT. LN882H posiada prosty protokół flashowania UART, który może być używany do odczytu i zapisu zawartości pamięci flash, zwykle w ramach procesu zmiany oprogramowania układowego lub do celów programistycznych.
Protokół flashowania LN882H opiera się głównie na prostych, tekstowych poleceniach ASCII, jednak transfer danych flash odbywa się za pośrednictwem YModem.
Szczegóły protokołu flashowania LN882H
Najpierw LN882H musi zostać wprowadzony w tryb bootloadera, co wymaga uziemienia określonego pinu, jak pokazaliśmy w poprzednim poradniku . Po ponownym uruchomieniu (poprzez wyłączenie/włączenie zasilania lub RESET), LN882H wydrukuje domyślny ciąg tożsamości z prędkością 115200 bodów:
Kod: C#
Można to wykorzystać do ustalenia początkowej konfiguracji i określenia wersji oprogramowania układowego. Następnie można go użyć do przesłania skompilowanego binarnego bloba , który będzie przechowywany w pamięci RAM i będzie działał jak tymczasowy bootloader dla naszych dalszych operacji:
Kod: C#
Bootloader wysyłany jest za pomocą protokołu YModem, który nie będzie tutaj omawiany.
W tym przypadku przesłany plik to LN882H_RAM_BIN.bin z narzędzia do flashowania LN882H. Możemy również zobaczyć kod źródłowy podobnego programu ładującego w SDK:
https://github.com/openshwprojects/OpenLN882H/tree/master/project/bootcode/ramcode_dl
ramcode_ln882h.uvprojx może być użyty do kompilacji kodu RAM w Keil.
Główne polecenia obsługiwane przez kod RAM można zobaczyć w cmd_mode.c:
Kod: C / C++
Są to polecenia, które możemy wysłać przez UART, gdy kod RAM jest uruchomiony.
Rozważmy więc prosty proces, taki jak pełne wymazanie pamięci flash:
Kod: C#
Najpierw nawiązywane jest połączenie i ładowany jest kod RAM. Następnie wywoływane jest flash_erase_all, które wewnętrznie wykona prostą komendę ASCII:
Kod: C#
Po prostu wysyła polecenie i zużywa dane wyjściowe (echo polecenia i wyniki).
Tak więc, jeśli chcemy zobaczyć implementację ferase_all, powinniśmy udać się do wyżej wymienionej tabeli:
Kod: C / C++
która w tym przypadku wygląda następująco:
Kod: C / C++
Kod: C / C++
Kod: C / C++
Ta sama logika dotyczy innych operacji, takich jak adres MAC lub dostęp do GPIO:
Kod: C#
Teraz skupmy się na bardziej interesujących rzeczach. Po pierwsze, zapis do pamięci flash. W ten sposób OpenLN882H może być flashowany:
Kod: C#
Procedura po prostu zmienia szybkość transmisji i wysyła dane do wysłania przez wspomniany kod RAM, a następnie wysyła plik przez ten sam protokół YModem, który został użyty do wysłania samego kodu RAM.
Odbiór odbywa się w file_mode.c:
https://github.com/openshwprojects/OpenLN882H.../project/bootcode/ramcode_dl/main/file_mode.c
Odczyt z pamięci flash jest bardziej interesujący.
Flash dump był pierwotnie wykonywany w powolny, okrężny sposób:
Kod: C / C++
Flash był zrzucany jako tekst ASCII (3 znaki na bajt - dwie cyfry hex i spacja):
Kod: C / C++
Jest to bardzo powolne, ale na szczęście nasz współpracownik @insmod niedawno zmienił logikę zrzutu, aby używać między innymi surowego formatu binarnego:
https://github.com/NonPIayerCharacter/OpenLN8...mmit/fc62bd2392bcd022b57b5ead14b04084a2456bfe
Poniższy kod używa 16-bitowego CRC do sprawdzania błędów, co zostało już zaimplementowane w SDK.
Oto pasujący kod odczytu flash po stronie C#:
Kod: C#
Jak widać, nie ma już przetwarzania ciągów ASCII i wszystko odbywa się na surowych danych bajtowych. Ponadto sprawdzane jest również CRC, aby upewnić się, że otrzymane dane są poprawne.
Przy okazji, interesujące jest również to, jak zaimplementowano ustawianie szybkości transmisji - zamiast robić to za pomocą polecenia UART, zmodyfikowano sam kod pamięci RAM:
Kod: C#
Przesunięcia, w których przechowywane są ustawienia szybkości transmisji, zostały ustalone przez porównanie wielu kompilacji z różnymi ustawieniami szybkości transmisji.
Nasze proste narzędzie do flashowania LN882H dla Windows [/quote]
Flasher jest dostępny do pobrania tutaj:
https://github.com/openshwprojects/SharpLN882HTool
Jest już skompilowany dla Windows.
Pakiet zawiera przykładowe skrypty/polecenia:
- sample_dump_at_baud_460800.bat - przykładowy odczyt firmware (backup)
- sample_erase.bat - przykładowe kasowanie pamięci flash (tak naprawdę niepotrzebne)
- sample_write.bat - przykładowy zapis flash (binarny OpenLN882H, również dołączony)
- sample_terminal.bat - przykładowy tryb terminala
Więcej szczegółów można znaleźć w powiązanych plikach .bat.
Pamiętaj, aby umieścić LN882H w trybie bootloadera, jak pokazaliśmy w poprzednim przewodniku .
Podsumowanie .
W ten sposób udało nam się stworzyć ulepszone narzędzie C# do łatwego flashowania LN882H z binariami automatycznie budowanymi przez akcje Github. Można je pobrać tutaj:
https://github.com/openshwprojects/SharpLN882HTool
Wkrótce zrobimy kolejny krok i zintegrujemy te funkcje z naszym Easy Flasher , więc bądźcie czujni!
Specjalne podziękowania dla @insmod za optymalizację odczytu flash i @divadiow za testy!
Fajne? Ranking DIY Pomogłem? Kup mi kawę.