Bootloader dla zestawu FREEboard – wprowadzenie

W artykule przedstawiamy szczegółowy opis konfiguracji bibliotek tworzących opisany w artykule bootloader dla płytki FREEboard. Konfiguracja umożliwia zoptymalizowanie cech i parametrów bootloadera do wymogów aplikacji. Osoby zainteresowane korzystaniem z podstawowej możliwości bootloadera – programowania pamięci Flash mikrokontrolera – nie muszą poznawać tajników jego konfiguracji i kompilacji programu wynikowego, zachęcamy ich przeczytania artykułu poświęconego korzystaniu z bootloadera KBOOT dla zestawu FREEboard.

KINETIS Bootloader jest narzędziem programowym, przechowywanym w pamięci Flash mikrokontrolera z rodziny KINETIS firmy Freescale, wykorzystywanym do aktualizacji oprogramowania aplikacji, znajdującego się zazwyczaj w tej samej pamięci, przy pomocy jednego z dostępnych połączeń szeregowych (UART, I2C, SPI, USB…). Narzędzie umożliwia szybkie i łatwe programowanie układu w trakcie pełnego cyklu życiowego urządzenia, poczynając od fazy projektowej, poprzez fazę produkcji i kończąc na etapie pracy urządzenia w środowisku docelowym.

Z oficjalnej strony internetowej producenta Freescale można pobrać pakiet zawierający kody źródłowe omawianego bootloadera, który jest w wysokim stopniu konfigurowalny za sprawą przemyślanej struktury projektu – rysunek 1. Dodatkowo oprócz dokumentacji są tam również zawarte aplikacje dla systemów komputerowych, ułatwiające pracę z bootloaderem (narzędzia wiersza poleceń oraz aplikacje graficzne).

 

Rys. 1. Struktura bootloadera dla mikrokontrolerów KINETIS, udostępnionego przez firmę Freescale

 

Co aktualnie oferuje Freescale?

W chwili przygotowania artykułu (grudzień 2014) KINETIS Bootloader w wersji 1.1.0 obsługuje mikrokontrolery z serii K22F, K64F oraz KL25Z (przy odrobinie pracy można samemu przygotować obsługę innego mikrokontrolera rodziny KINETIS). Z zadeklarowanych przez producenta charakterystyk bootloadera warto wymienić najważniejsze:

  • łatwa implementacja w dowolnym mikrokontrolerze z rodziny KINETIS,
  • możliwość komunikacji z hostem poprzez magistrale UART, USB HID, I2C oraz SPI, a także potencjalnie realizowalna komunikacja z wykorzystaniem magistrali CAN,
  • uniwersalny protokół bootloadera, niezależny od aktualnie wykorzystywanej magistrali,
  • opcje zabezpieczenia pamięci Flash,
  • detekcja aktywnej magistrali (aktywnego peryferium),
  • narzędzia ułatwiające pracę hosta z bootloaderem,
  • kody źródłowe udostępniane zgodnie z licencją BSD Open Source.

 

Organizacja przestrzeni w pamięci i działanie bootloadera

W pamięci Flash mikrokontrolera z zaimplementowanym narzędziem KINETIS Bootloader można wyróżnić dwa główne obszary (rysunek 1):

  • obszar bootloadera – znajduje się pod adresem 0x0 i zawiera tablicę wektorów bootloadera wraz z jego kodem. Domyślnie dla układów serii KL25Z pod obszar bootloadera zarezerwowanych jest 32 kB pamięci Flash (można to zmienić w projekcie bootloadera).  
  • obszar aplikacji użytkownika – rozpoczyna się od adresu zdefiniowanego w stałej BL_APP_VECTOR_TABLE_ADDRESS (domyślnie dla układów KL25Z jest to adres 0x8000). Oprócz tablicy wektorów aplikacji użytkownika oraz właściwego oprogramowania w obszarze tym występuje jeszcze sekcja konfiguracji bootloadera (Bootloader Configuration Area, BCA) przesunięta o adres 0x3C0 względem początku danego obszaru (rysunek 2).

 

Rys. 2. Organizacja przestrzeni w pamięci Flash mikrokontrolera z funkcją KINETIS Bootloader [1]

 

Podczas inicjalizacji bootloadera czytane jest pierwsze 4-bajtowe pole sekcji BCA i w sytuacji, gdy jest w nim zawarty ciąg 'kcfg’ to automatycznie odczytywane są pozostałe pola tej sekcji. Po zebraniu wszystkich danych z sekcji BCA bootloader skonfiguruje sygnały zegarowe oraz wszystkie peryferia, które mają być aktywnie wykorzystywane w czasie jego działania. Natomiast w trakcie pracy bootloadera sprawdzana jest zawartość dwóch 32-bitowych pól: stackPointer (pod adresem BL_APP_VECTOR_TABLE_ADDRESS) przechowujące wskaźnik na stos aplikacji oraz entryPoint (pod adresem BL_APP_VECTOR_TABLE_ADDRESS+4) przechowujące adres startu aplikacji. Jeżeli w tych polach jest zapisana wartość 0xFF to bootloader kontynuuje swoje działanie w trybie poleceń. W pozostałych przypadkach zakończy on swoją pracę po czasie określonym w [ms] w 16-bitowym polu peripheralDetectionTimeoutMs sekcji BCA i kontrolę nad układem przejmie aplikacja użytkownika. Takie rozwiązanie pozwala na skomunikowanie się z bootloaderem w czasie od podania zasilania dla układu do uruchomienia docelowej aplikacji.

 

Rys. 3. Tablica wektorów w obszarze aplikacji użytkownika wraz z sekcją BCA [1]

 

Konfiguracja bootloadera

Pakiet Freescale KINETIS Bootloader Package dostępny na stronie [2] zawiera przykładowy projekt, przygotowany w środowisku IAR Embedded Workbench, w którym występują pliki konfiguracyjne dotyczące zarówno pracy i funkcjonalności bootloadera jak również wykorzystywanych przez niego zasobów sprzętowych dostępnych w konkretnym układzie (pliki te są umieszczone w podkatalogu targets/<seria_mikrokontrolera>/src):

  • bootloader_config.h – makra konfiguracyjne wykorzystywane przy kompilacji projektu,
  • clock_config_x.c – funkcje konfigurujące sygnały zegarowe,
  • hardware_init_x.c – funkcje konfigurujące wyprowadzenia i najważniejsze elementy systemu, operujące bezpośrednio na rejestrach mikrokontrolera,
  • memory_map_x.c – mapa pamięci mikrokontrolera, czyli sposób przydziału przestrzeni adresowej poszczególnym składowym mikrokontrolera (pamięć Flash, pamięć SRAM, itd.),
  • peripherals_x.c – tablica deskryptorów układów peryferyjnych.

Makra konfiguracyjne umożliwiają w prosty sposób dostrojenie funkcjonalności bootloadera:

  • BL_DEFAULT_PERIPHERAL_DETECT_TIMEOUT określa maksymalny domyślny czas w [ms] detekcji aktywnego układu peryferyjnego (czyli wymieniającego dane z otoczeniem),
  • BL_ENABLE_CRC_CHECK włącza (1) sprawdzanie sumy kontrolnej (aktualnie nie jest używane z powodu braku zaimplementowanej funkcji sprawdzającej),
  • BL_FEATURE_READ_MEMORY aktywuje (1) obsługę komend odczytu pamięci Flash układu,
  • BL_FLASH_VERIFY_DISABLE wyłącza (1) weryfikację operacji kasowania i zapisu pamięci Flash układu,
  • BL_HAS_MASS_ERASE powinno być ustawione na wartość (1) w sytuacji, gdy polecenie ERSALLU jest obsługiwane przez wewnętrzny kontroler pamięci Flash (tylko w niektórych nowych układach),
  • BL_MIN_PROFILE wybiera maksymalną (0) lub minimalną (1) konfigurację bootloadera, przy czym w tym drugim przypadku obsługiwana jest tylko część pełnego zbioru komend,
  • BL_UART_AUTOBAUD_IRQ wymusza (1) wykorzystanie przerwań od zmiany stanu linii do celów autodetekcji prędkości transmisji na magistrali UART zamiast mechanizmu odpytywania (0).

O autorze