Kuloodporne aktualizacje oprogramowania

16

Jakie techniki są używane, aby umożliwić użytkownikowi bezpieczne uaktualnienie oprogramowania sprzętowego po sprzedaży? Chcę to zrobić za pomocą mikrokontrolera Cortex M3 / 4, ale wydaje mi się, że należy zastosować techniki dla każdego mikroprocesora.

Najlepiej oczywiście z najmniejszą ilością dodatkowych składników.

Imbrondir
źródło

Odpowiedzi:

16

Użyj układu, który ma ponad dwukrotnie więcej pamięci Flash, niż potrzebujesz do kodu. W ten sposób możesz przenieść nowe oprogramowanie do tej pamięci, jednocześnie pozostawiając stare, na wypadek, gdyby coś poszło nie tak.

Po odszyfrowaniu i zweryfikowaniu sum kontrolnych nowego oprogramowania układ ładujący może skopiować go do swojej ostatecznej lokalizacji, zastępując stary. Jeśli coś pójdzie nie tak podczas tej części, po twardym resecie program ładujący powinien sprawdzić, czy nowe oprogramowanie układowe nie jest prawidłowe (uruchamiając ponownie sumę kontrolną) i ponowić kopiowanie.

To najprostszy i najbardziej niezawodny sposób, jaki znam. Wymaga również niewielkiego kodu w programie ładującym i nie wymaga duplikowania żadnej funkcji między programem głównym a programem ładującym (nie potrzebujesz żadnej logiki komunikacyjnej w programie ładującym).

jpc
źródło
10
Jako użytkownik elektroniki mógłbym dodać, że fajnie byłoby mieć gdzieś przycisk do przytrzymania podczas uruchamiania, który uruchamiałby stare oprogramowanie, na wypadek gdyby nowa miała prawidłową sumę kontrolną, ale samo oprogramowanie ma błąd.
Zan Lynx,
4
„Problem”, jaki widzę w tym rozwiązaniu, polega na tym, że potrzebujesz pewnego rodzaju tabeli relokacji lub pełnego kodu niezależnego od pozycji. W przeciwnym razie kod nie będzie działać.
Nico Erfurth,
2
@Masta - Nie rozumiesz części, w której oprogramowanie układowe jest kopiowane do ostatecznej (normalnej) lokalizacji.
Kevin Vermeer
3
@jpc - Używamy tej techniki z zewnętrznym szeregowym układem Flash w niektórych wewnętrznych narzędziach w pracy. Nie musisz mieć mikrokontrolera z ponad dwukrotnie większą pamięcią flash, jeśli masz miejsce na 8-pinową część SOIC lub QFN. 1 MB pamięci szeregowej Flash można mieć za mniej niż dolara, więc może być tańsze pójście tą drogą niż modernizacja mikrokontrolera w niektórych przypadkach!
Kevin Vermeer
@zan - Tak, my też tego używamy. Jedną z obaw lub korzyści jest to, że urządzenie resetuje się do wartości domyślnych po ponownym skopiowaniu starego oprogramowania (nie mamy pamięci EEPROM na naszym mikro; przechowujemy dane konfiguracyjne, takie jak adres MAC i adres IP we własnej pamięci Flash). Dla nas ułatwia to znalezienie tablicy, gdy zapomnimy adresu IP.
Kevin Vermeer
12

Użyj bootloadera i kilku KB dodatkowej pamięci flash.

Aktualizacja jest wykonywana przez program ładujący, wysyłając specjalne polecenie przez UART, USB, I2C lub inny protokół. Tylko główny kod jest zawsze aktualizowany - kod bootloadera nigdy nie jest dotykany inaczej niż przez zewnętrzny programator (tj. JTAG / PICkit dla PIC itp.)

Jeśli aktualizacja się nie powiedzie (awaria zasilania, ktoś potknie się o przewód lub inny powód), widżet nie będzie działał, ale bootloader nadal tam będzie, więc można ponowić próbę aktualizacji.

Flaga może być ustawiona gdzieś w bajcie, co zapobiega nieprawidłowemu działaniu głównego kodu, ponieważ nie został w pełni zaktualizowany.

Thomas O
źródło
Możesz także wymusić uruchomienie programu ładującego, jeśli rozruch jest spowodowany uruchomieniem. Pomoże to, jeśli załadujesz złe oprogramowanie układowe, które natychmiast ulega awarii. Program ładujący potrzebuje limitu czasu na uruchomienie aplikacji po X sekundach.
Robert,
Dobrym pomysłem jest użycie prostego protokołu (takiego jak szereg asynchroniczny, TTL lub 485). W przypadku bardziej zaangażowanych przypadków (karty SD, GPRS, USB) nie dołączałbym złożonego kodu pomocniczego do programu ładującego (bez możliwości aktualizacji). Ethernet OTOH (raw UDP lub TFTP) jest do tego wystarczająco prosty.
jpc,
3

Jeśli Twoje urządzenie jest stosunkowo drogie i możesz sobie pozwolić na koszty (a klienci dbają o aktualizacje), możesz to zrobić ...

(generalnie ta technika wymaga zewnętrznego przechowywania lub przebiegłego użycia jtag ..)

Mają stały program mikro (jak mały PIC), który może zatrzymać system i przeprogramować go.

ponieważ nie można zmienić oprogramowania „procesora aktualizacji”, nigdy nie może się nie udać.

1) użytkownik może zaktualizować urządzenie

2) jeśli aktualizacja się nie powiedzie, zawsze mogą spróbować ponownie. Nie można go zamurować

3) nawet jeśli urządzenie docelowe nie obsługuje modułu ładującego (chce tylko uruchomić i uruchomić), możesz zrobić to, co chcesz.

działa dla FPGA, DSP i innych nieparzystych celów.

Może mieć naprawdę fajny interfejs użytkownika (nawet PIC może uruchomić serwer WWW ....)

Tim Williscroft
źródło
2

Upewnij się, że twój produkt ma jakiś prosty interfejs szeregowy, najlepiej EIA232. Niestandardowe złącze jest OK, jeśli nie masz miejsca na DB-9. Na przykład złącze TRS jest wszystkim, czego potrzebujesz do TxD, RxD i uziemienia.

Podczas programowania urządzenia po raz pierwszy, dołącz bootloader . Powinno to być tak proste, jak to możliwe , ponieważ wcześniej czy później będziesz chciał uaktualnić sam program ładujący, jeśli będzie potrzebował nowych funkcji. (Prawdopodobnie nie możesz go nawet uaktualnić)

Następnie złącze TRS. Użyj wtyczki z przełącznikiem, aby można było wykryć obecność złącza. Po prostu sprawdź zaraz po zresetowaniu i uruchom bootloader, jeśli wtyczka jest obecna, w przeciwnym razie uruchom aplikację. W ten sposób bootloader i aplikacja użytkownika pozostają dobrze oddzielone. (Sprawdzenie jest w rzeczywistości częścią bootloadera; będziemy go potrzebować niezależnie od wersji aplikacji, w przeciwnym razie nie będziemy mogli wejść do bootloadera!)

stevenvh
źródło
Dlaczego miałbyś kiedykolwiek chcieć zaktualizować bootloader? W jaki sposób upewnisz się, że proces aktualizacji nie zniszczy urządzenia? Jeśli tak, jakie nowe funkcje byłyby tak atrakcyjne, że zaryzykowałbyś rozbudowę?
Kevin Vermeer
5
@Kevin - Myślę, że miał na myśli, że bootloader powinien być tak prosty, że nigdy nie pomyślisz o jego „uaktualnieniu”.
jpc,
@jpc - Ach, masz rację, źle to zinterpretowałem. Jesteśmy zgodni!
Kevin Vermeer
1

Jakie wyposażenie będzie dostępne „ulepszenie”? Komputer, pamięć USB, karta micro SD?

Jednym ze sposobów byłoby umieszczenie aplikacji w wyjmowanym elemencie (pamięć USB, karta SD itp.). Chip ładuje swoją aplikację z przedmiotu. Twój ulepszenie po prostu zamienia przedmiot i uruchamia się ponownie.

Znane mi układy mikrokontrolera ARM i Cortex (NXP, Atmel) mają wbudowany program ładujący szeregowy, więc jeśli twój program aktualizacyjny przyjedzie z komputerem i kablem szeregowym (i masz skonfigurowany interfejs portu COM), może po prostu pobrać twój aktualizacja.

Wouter van Ooijen
źródło
Więc po prostu podłączając piny UART do portu, gdy jesteś podłączony do portu COM i komputera, możesz sflashować oprogramowanie układowe bez żadnego kodu na MCU? Dobra wskazówka.
Imbrondir,
Sprawdź arkusz danych, sekcja „bootloader”. Aby to zrobić naprawdę bez użycia rąk, będziesz potrzebował sposobu na 1. zresetowanie układu; 2. aktywuj bootloader (chip sprawdza pin ceratyny). Można to zrobić za pomocą zworki i przełącznika (resetowania), ale wygodniejszym sposobem (szczególnie na biurku) jest użycie dwóch linii uścisku dłoni w celu wykonania sztuczki „bezdotykowej”. Większość programów do pobierania z komputera (np. Flashmagic, lpc21isp) potrafi wykonać magię uzgadniania za Ciebie (jeśli poprawnie podłączysz linie uzgadniania).
Wouter van Ooijen