ISP przy użyciu USB w mikrokontrolerach LPC1300

Zapisywanie pliku (programowanie Flash)

W systemie Windows, prawie każda standardowa sekwencja zapisu zadziała prawidłowo, jako że Windowsowa wersja systemu plików FAT alokuje bloki kolejno, zaczynając od pierwszego wolnego bloku na dysku ISP. W Linuksach, aby mieć pewność kolejności bloków, można pisać bezpośrednio na urządzenie, używając polecenia dd (w /dev). Technika ta nie jest jednak zalecana, gdyż wymaga posiadania przez użytkownika praw administratora. Drugim sposobem jest otwarcie istniejącego pliku firmware.bin i nadpisanie jego zawartości. Jeśli plik zostanie otwarty bez obcięcia, nowe dane zostaną zapisane w takiej samej kolejności, jak w starym pliku, który został stworzony przez firmware obsługujący ISP i na pewno działa prawidłowo. (Należy pamiętać, że metadane pliku są tworzone z kodu zapisanego w pamięci ROM i nie są zapisywane we Flashu.) Nadpisywanie można zrealizować za pomocą dd, z parametrami conv=nocreat,notrunc. Przy pisaniu w języku C, można używać funkcji open(path, O_RDWR) lub fopen(path, „r+”). W systemie Windows nie jest wymagane nadpisywanie istniejącego pliku, więc można użyć dowolnego schematu zapisu pliku, nie ważne czy nadpisuje się czy usuwa istniejący plik, istotne tylko, aby było miejsce na nowe dane. W przykładowym programie dla systemu Windows, używamy funkcji System.IO.File.WriteAllBytes(filePath, firmwareData) języka C#, która przed zapisem dokonuje przycięcia (truncate operation).

Demontaż dysku

Większość systemów operacyjnych zakończy (z krótkim opóźnieniem) operację zapisu bez problemów, ale wymuszenie odłączenia/odmontowania urządzenia jest dobrym krokiem zamykającym, który daje pewność, że zapis został zakończony i pozwala zakomunikować użytkownikowi, że może fizycznie odłączyć programowane urządzenie. Aby wymontowanie przebiegło poprawnie, wszystkie otwarte pliki, włącznie z firmware.bin, muszą zostać zamknięte. W Linuxach, można użyć standardowej, posixowej komendy unmount. Zwykle, wykonanie jej na zamontowanym automatycznie urządzeniu USB nie wymaga uprawnień administratora. Na Macach, jako że montowanie jest obsługiwane automatycznie przez Disk Arbiter, najlepszym sposobem jest użycie wywołania systemowego DADiskUnmount. W Windowsie, większość użytkowników jest przyzwyczajona do usuwania urządzeń USB samemu (za pomocą ikonki pojawiającej się obok zegarka na pasku zadań), ale można w tym celu użyć też funkcji CM_Request_Device_Eject z SetupAPI, która zrobi to za nich. W przykładowym programie aktualizującym dla systemu Windows, wymontowywanie nie odbywa się automatycznie, ale po zapisie wyświetlane jest okienko dialogowe przypominające użytkownikowi o usunięciu urządzenia.

Rys. 2. Algorytm automatycznej aktualizacji pamięci <em>Flash </em>(po stronie komputera-hosta)” src=”/wp-content/uploads/artykuly/ISP_przy_uzyciu_USB_w_mikrokontrolerach_LPC1300/rys02.do_artykulow.png”></a></p>
<p style=Rys. 2. Algorytm automatycznej aktualizacji pamięci Flash (po stronie komputera-hosta)

 

Automatyzacja wprowadzania urządzenia w tryb USB ISP

W poprzednim rozdziale wyjaśniony został proces aktualizacji firmware’u urządzenia zapisanego w pamięci Flash urządzenia pracującego już w trybie In-System Programming przez USB. Mikrokontrolery NXP LPC1300 wchodzą w ten tryb domyślnie, jeśli firmware użytkownika nie jest zaprogramowany oraz mogą zostać wprowadzone w ten tryb przez podanie stanu niskiego na jedną z nóżek (w rodzinie LPC134X – PIO0.1) i reset zasilania. Czasami jednak, niepożądane jest wymaganie od użytkownika, aby naciskał przycisk w czasie podłączania urządzenia, żeby wprowadzić je w stan ISP w czasie aktualizacji firmware’u. W takich przypadkach, oprogramowanie można napisać tak, by pozwalało na programowe wejście w tryb ISP.

Realizuje się to z użyciem znajdującego się we wbudowanej pamięci ROM układów LPC1300 In-Application Programming API. Po aktualizacji firmware’u, użytkownik musi zrestartować zasilanie urządzenia, aby nowe oprogramowanie zaczęło działać lub sam firmware może skonfigurować timer watchdoga, aby zrestartował układ po wgraniu nowego programu. Widoczny poniżej schemat blokowy pokazuje zautomatyzowany proces programowania ISP po stronie urządzenia docelowego. Dostępny jest także przykład programu, nazwany „autoisp”, demonstrujący opisywaną technikę.

Rys. 3. Algorytm automatycznej aktualizacji pamięci <em>Flash </em>(po stronie urządzenia docelowego)” src=”/wp-content/uploads/artykuly/ISP_przy_uzyciu_USB_w_mikrokontrolerach_LPC1300/rys03.do_artykulow.png”></a></p>
<p style=Rys. 3. Algorytm automatycznej aktualizacji pamięci Flash (po stronie urządzenia docelowego)

 

Przykładowe programy

Aby przyspieszyć i ułatwić tworzenie przyjaznego użytkownikowi narzędzia do aktualizacji firmware’u, firma NXP opublikowała trzy implementacje przykładowych programów realizujących to zadanie przy użyciu ISP, udostępniając także kody źródłowe. Dostępna jest aplikacja w języku C#, działająca pod Windowsem XP, Vista i Windows 7, oparta na Windows Forms, napisana przy użyciu Microsoft Visual Studio C# Express 2010. Dla platformy Mac istnieje aplikacja konsolowa (command-line), napisana w Apple Xcode, pracująca na systemie OS-X 10.5 i wyższych. Dla systemów linuksowych jest z kolei dostępny skrypt bash, przetestowany na Ubuntu 10.04, który może pracować także na innych Linuksach, które mają ten sam system plików udev oraz stosowne narzędzia.

Wszystkie te programy zostały opublikowane na otwartej, nieobwarowanej żadnymi ograniczeniami licencji, z wyłączeniem narzędzia dla systemu Windows, które wykorzystuje bibliotekę klas urządzeń USB projektu iTuner. Jest ona rozpowszechniana na otwartej (open-source) licencji, która wymaga ujawniania kodu źródłowego projektów pochodnych.
Załącznikiem do tej noty aplikacyjnej jest też program implementujący zabezpieczenia Code Read Protection. Został on napisany w LPCXpresso IDE, a jego działanie sprowadza się do migania diodą LED na płytce LPCXpresso lub zliczania na wyświetlaczu siedmiosegmentowym płytki Embedded Artists. Program został skompilowany w dziewięciu różnych wersjach, dając możliwość przeprogramowywania urządzenia w różne tryby CRP i migania/zliczania z różną częstotliwością na potrzeby testów.

Załączony został też, wspomniany wcześniej, program „autoisp”, demonstrujący jak programowo wprowadzić układ w tryb ISP. Program miga diodą LED przez 10 sekund, po czym wchodzi w tryb ISP. Jeśli układ jest podłączony do komputera, miganiu powinno towarzyszyć wyliczanie, a następnie firmware zostaje wgrany do pamięci Flash. W czasie, gdy LPC1343 jest w trybie ISP, timer watchdoga pracuje, a gdy zliczy do końca, układ zostaje zresetowany i uruchamia się z nowym oprogramowaniem.

Ostatnim załączonym programem jest mała aplikacja konsolowa nazwana „padto”. Służy ona do uzupełniania plików binarnych zawierających nowy firmware, będących wynikiem działania narzędzi programistycznych, ciągiem bajtów 0xFF, do rozmiaru pamięci Flash używanego mikrokontrolera LPC. Jest to użyteczne, bo pomaga aplikacji aktualizującej działającej na komputerze-hoście upewnić się, że firmware został napisany dla konkretnego procesora LPC134x, podłączonego do USB.

Do pobrania

O autorze