Píšeme OTA bootloader pro ATmega128RFA1 (jako součást zařízení Smart Response XE)

Píšeme OTA bootloader pro ATmega128RFA1 (jako součást zařízení Smart Response XE)

Vše začalo tím, že si autor koupil na sekundárním trhu zajímavé zařízení – Smart Response XE (Stručný popis). Je určeno pro školy: každý žák ve třídě dostane zařízení podobné elektronickému sešitu nebo překladači z devadesátých let, učitel položí otázku a žáci vyťukají na klávesnici zařízení odpovědi, které přijímají přes rádiového kanálu (802.15.4) do přijímače připojeného k počítači učitele.

Tato zařízení byla ukončena před několika lety a to, co školy nakoupily za 100 až 200 USD, se nyní objevuje na eBay za 10 USD nebo méně. Hardware je velmi vhodný pro geeky experimenty:

  • 60 klávesová klávesnice
  • displej s rozlišením 384×136, 2 bity na pixel - podobně jako BC, CGA, ale 4 ne barvy, ale gradace jasu
  • mikrokontrolér ATmega128RFA1 (128 kB flash paměť, 4 kB ROM, 16 kB RAM, 802.15.4 transceiver)
  • externí (ve vztahu k mikrokontroléru, ne k celému zařízení) 1 megabit (128 kilobajtů) flash paměť s rozhraním SPI
  • přihrádka na 4 AAA prvky.

Již z názvu mikrokontroléru je zřejmé, že patří do rodiny AVR, což znamená, že udělat zařízení kompatibilní s Arduino je více než triviální úkol...

Od zpráv dál Hackaday autor zjistil, co to je již udělali (stejný odkaz vám řekne, co se kam připojit), s možností spouštět hry pro Arduboy:


Autora ale více zajímá možnost na zařízení nehrát, ale studovat:

  • flash paměť se sériovým rozhraním SPI
  • bootloadery pro AVR
  • standard 802.15.4

Autor začal psaním knihovna (GPL v3), která umožňuje inicializovat displej, výstup textu a obdélníků a přístup k SPI flash paměti. Poté začal přicházet s nápady na praktické využití zařízení: kapesní terminál kompatibilní s VT-100, hry pro více hráčů. Poté, co přestavěl tři zařízení, rozhodl se je „naučit“ přijímat náčrty „vzduchem“. Co by bylo nejen zajímavé, ale také velmi pohodlné: pouzdro zařízení se pokaždé obtížně otevírá a pod krytem prostoru pro baterie jsou pouze otvory, které umožňují připojit programátor JTAG k desce.

Píšeme OTA bootloader pro ATmega128RFA1 (jako součást zařízení Smart Response XE)

To stačí k nahrání bootloaderu Arduino, ale ne skici - sériový port tam není připojen, takže se bez otevření pouzdra stále neobejdete. Také linky TX0 a RX0 prvního sériového portu jsou kombinovány s pollingovými linkami matice klávesnice, konkrétně těmi, které se dotazují na funkční klávesy po stranách displeje. Ale co se dá dělat - autor postavil toto:

Píšeme OTA bootloader pro ATmega128RFA1 (jako součást zařízení Smart Response XE)

Přivedl tam linky JTAG a teď není potřeba otevírat přihrádku na baterie. A aby se daly nahrát náčrtky, připojil jsem oba sériové porty na stejný konektor a přidal jsem i přepínač, protože s nainstalovanými bateriemi je fyzicky nemožné zařízení vypnout jiným způsobem.

Práce s páječkou, užitkovým nožem a lepicí pistolí zabrala poměrně dlouho. Obecně platí, že nahrávání náčrtů „vzduchem“ je mnohem pohodlnější, musíme pro to naléhavě něco vymyslet.

Arduino IDE používá program k nahrávání náčrtů avrdudu. Interaguje s mikrokontrolérem pomocí protokolu STK500, který umožňuje přenášet soubory oběma směry. Je špatně kompatibilní s kanály, kde jsou možné proměnné zpoždění, zkreslení a ztráta dat. Pokud se něco uvolní nebo zašustí v sériovém kanálu, můžete se zbláznit při hledání příčiny. Jednou autor půl dne trpěl, než zjistil, že problémem je špatný kabel a také rozmarný převodník rozhraní CP2102. I mikrokontrolér s vestavěným převodníkem rozhraní, například ATmega32u4, se může někdy chovat takto. Každý uživatel Arduina si všiml, že chyby při nahrávání náčrtů nejsou tak vzácné. Někdy záznam proběhne dobře, ale během testovacího čtení je zjištěna chyba. Neznamená to, že došlo k chybě při zápisu – došlo k poruše při čtení. Nyní si představte, že při práci „vzduchem“ se bude dít totéž, ale mnohem častěji.

Poté, co autor vyzkoušel různé způsoby, jak tento problém překonat, přišel s následujícím. Zařízení má 128 KB flash paměť s rozhraním SPI - data přijímáme po drátech (nezapomeňte, že autor již má jedno zařízení s konektorem na straně), tuto paměť používáme jako vyrovnávací paměť a data posíláme rádiem kanál do jiného zařízení. Zdravím z Cybiko.

Po napsání kódu pro práci s rádiovým kanálem a fontem byl loader delší než 4 kilobajty. Proto musela být hodnota HFUSE změněna z 0xDA na 0xD8. Nyní může mít bootloader až 8 kilobajtů a počáteční adresa je nyní 0x1E000. To se odráží v Makefile, ale mělo by to být také zohledněno při vyplňování zavaděč přes avrdude.

Transceiver 802.15.4 v ATmega128RFA1 je původně navržen pro provoz pomocí protokolu ZigBee, což je poměrně komplikované, takže se autor rozhodl místo toho pouze přenášet pakety. To je implementováno v hardwaru v ATmega128RFA1, takže je potřeba jen málo kódu. Pro jednoduchost se autor také rozhodl použít pevný kanál, který vám nedovolí vybrat ani ručně. Standard 802.15.4 podporuje 16 kanálů s čísly od 11 do 26. Jsou poměrně přeplněné, některé se také překrývají WiFi kanály (červená jsou kanály ZigBee, modrá, zelená a žlutá jsou WiFi).

Píšeme OTA bootloader pro ATmega128RFA1 (jako součást zařízení Smart Response XE)

Ukázalo se, že nejméně náchylné na rušení WiFi jsou kanály 15 a 26. Autor zvolil druhý z nich. Upozornění: překladatel neví, zda je povoleno zjednodušit ZigBee tímto způsobem. Možná bychom měli udělat trochu více programování a implementovat to úplně?

Na prvním zařízení je nutné implementovat konečný automat, který přenáší data protokolem STK500. Z velké části jsou přenášené a přijímané zprávy soběstačné, ale některé jsou svázány s těmi, které prošly kanálem dříve. Je uveden popis dialogu zde.

Důležitou součástí tohoto dialogu je přenos paketů určených k zápisu do flash paměti cílového zařízení. U jednoduchých mikrokontrolérů rodiny AVR je velikost stránky 128 bajtů, ale u ATmega128RFA1 je to 256. A u flash paměti, která je připojena přes protokol SPI, je to stejné. Program v prvním zařízení při nahrání skici ji hned nepřenese do druhého, ale zapíše ji do této paměti. Když Arduino IDE zkontroluje správnost zadání, odešle se, co tam bylo napsáno. Nyní potřebujeme přenést přijatá data rádiovým kanálem do druhého zařízení. K přepínání z příjmu na vysílání a zpět přitom dochází poměrně často. Protokol STK500 je lhostejný ke zpožděním, ale netoleruje ztrátu dat (zvláštní, ale výše bylo řečeno, že zpoždění ovlivňuje i přenos dat). A ztráty při bezdrátovém přenosu jsou nevyhnutelné. ATmega128RFA1 má vestavěnou hardwarovou implementaci opakovaných požadavků při pochybnostech o správnosti přenosu, ale autor se rozhodl to samé implementovat softwarově. Vyvinul protokol, ve kterém proudí mnohem více dat jedním směrem než druhým.

Není to dokonalé, ale funguje to. 256bajtová stránka je rozdělena do čtyř segmentů, z nichž každý je přenášen vzduchem jako paket. Paket může obsahovat až 125 bajtů dat plus jeden bajt pro délku a dva bajty pro CRC. Jsou tam tedy umístěny fragmenty dlouhé 64 bajtů spolu s čísly stránek a segmentů (od 0 do 3). Přijímací zařízení má proměnnou, která mu umožňuje sledovat, kolik segmentů bylo přijato, a když dorazí všechny čtyři, odesílající zařízení obdrží potvrzení, že byla přijata celá stránka. Žádné potvrzení (CRC se neshodovalo) – znovu odeslat celou stránku. Rychlost je ještě větší než při přenosu přes kabel. Vidět:


Obecně by ale bylo nutné zajistit pohodlný způsob připojení kabelu k zařízením pro nahrávání náčrtů a přes něj. Například umístěte dovnitř takový převodník rozhraní na CP2102, jako na fotografii, a přilepte jej k desce tak, aby vydržel sílu při připojování a odpojování Micro USB kabelu.

Píšeme OTA bootloader pro ATmega128RFA1 (jako součást zařízení Smart Response XE)

Má také 3,3V stabilizátor (a jak jej použít v zařízení s 6V napájením - pokud má pouze stejný stabilizátor a můžete přidat dvě diody, abyste automaticky vybrali, která z nich bude zařízení napájet) . Všechny tři LED musí být odpájeny z desky převodníku rozhraní, jinak budou při provozu na nich navíc zatěžovat baterie a také překážet při dotazování klávesnice a práci s flash pamětí s rozhraním SPI.

Sledování cíle se ukázalo být ještě zajímavější než jeho dosažení (a nepotřebujete ten vtip o autobusu). Autor se hodně dozvěděl o bootloaderech AVR, SPI flash paměti, protokolu STK500 a standardu 802.15.4.

Veškerý další kód kromě výše popsané knihovny je − zdea je také pod licencí GPL v3. Twitter autora - zde.

Zdroj: www.habr.com

Přidat komentář