Píšeme OTA bootloader pre ATmega128RFA1 (ako súčasť zariadenia Smart Response XE)

Píšeme OTA bootloader pre ATmega128RFA1 (ako súčasť zariadenia Smart Response XE)

Všetko to začalo tým, že si autor kúpil zaujímavé zariadenie na sekundárnom trhu – Smart Response XE (Stručný opis). Je určený pre školy: každý žiak v triede dostane zariadenie podobné elektronickému zošitu alebo prekladaču z deväťdesiatych rokov, učiteľ položí otázku a žiaci na klávesnici zariadení vyťukajú odpovede, ktoré sa dostávajú cez rádiový kanál (802.15.4) do prijímača pripojeného k počítaču učiteľa.

Tieto zariadenia boli prerušené pred niekoľkými rokmi a to, čo školy kúpili za 100 až 200 dolárov, sa teraz objavuje na eBay za 10 dolárov alebo menej. Hardvér je veľmi vhodný pre geekské experimenty:

  • 60 klávesová klávesnica
  • displej s rozlíšením 384×136, 2 bity na pixel - podobne ako BC, CGA, ale 4 nie farby, ale gradácie jasu
  • mikrokontrolér ATmega128RFA1 (128 kB flash pamäť, 4 kB ROM, 16 kB RAM, 802.15.4 transceiver)
  • externá (vo vzťahu k mikrokontroléru, nie k celému zariadeniu) 1 megabit (128 kilobajtov) flash pamäť s rozhraním SPI
  • priehradka na 4 AAA prvky.

Už z názvu mikrokontroléra je jasné, že patrí do rodiny AVR, čo znamená, že urobiť zariadenie kompatibilné s Arduino je viac ako triviálna úloha...

Od správ ďalej Hackaday autor zistil, čo to je už urobili (rovnaký odkaz vám povie, čo sa kam pripojiť), pričom máte možnosť spustiť hry pre Arduboy:


Autora však viac zaujíma možnosť nehrať sa na zariadení, ale študovať:

  • flash pamäť so sériovým SPI rozhraním
  • bootloadery pre AVR
  • štandard 802.15.4

Autor začal písaním knižnica (GPL v3), ktorá umožňuje inicializovať displej, výstup textu a obdĺžnikov a prístup k SPI flash pamäti. Potom začal prichádzať s nápadmi na praktické využitie zariadenia: vreckový terminál kompatibilný s VT-100, hry pre viacerých hráčov. Po prestavaní troch zariadení sa rozhodol „naučiť“ ich prijímať náčrty „vzduchom“. Čo by bolo nielen zaujímavé, ale aj veľmi pohodlné: puzdro zariadenia sa zakaždým ťažko otvára a pod krytom priestoru pre batérie sú iba otvory, ktoré umožňujú pripojiť programátor JTAG k doske.

Píšeme OTA bootloader pre ATmega128RFA1 (ako súčasť zariadenia Smart Response XE)

To stačí na nahranie zavádzača Arduino, ale nie náčrtu - sériový port tam nie je pripojený, takže bez otvorenia puzdra sa stále nezaobídete. Tiež linky TX0 a RX0 prvého sériového portu sú kombinované s pollingovými linkami matice klávesnice, a to tými, ktoré vyvolávajú dopyt po funkčných klávesoch po stranách displeja. Ale čo sa dá robiť - autor postavil toto:

Píšeme OTA bootloader pre ATmega128RFA1 (ako súčasť zariadenia Smart Response XE)

Priniesol tam linky JTAG a teraz netreba otvárať priehradku na batérie. A aby sa dali nahrať náčrty, pripojil som oba sériové porty na rovnaký konektor aj s prepínačom, pretože s nainštalovanými batériami je fyzicky nemožné zariadenie iným spôsobom vypnúť.

Práca s spájkovačkou, nožom a lepiacou pištoľou trvala pomerne dlho. Vo všeobecnosti je nahrávanie náčrtov „vzduchom“ oveľa pohodlnejšie, naliehavo musíme niečo vymyslieť.

Arduino IDE používa program na nahrávanie náčrtov AVRDude. Interaguje s mikrokontrolérom pomocou protokolu STK500, ktorý umožňuje prenášať súbory oboma smermi. Je zle kompatibilný s kanálmi, kde sú možné premenlivé oneskorenia, skreslenie a strata dát. Ak sa v sériovom kanáli niečo uvoľní alebo zašuští, môžete sa zblázniť pri hľadaní príčiny. Raz autor trpel pol dňa, kým si uvedomil, že problémom je zlý kábel, ako aj rozmarný prevodník rozhrania CP2102. Dokonca aj mikrokontrolér so vstavaným prevodníkom rozhrania, napríklad ATmega32u4, sa môže niekedy správať takto. Každý používateľ Arduina si všimol, že chyby pri nahrávaní náčrtov nie sú také zriedkavé. Niekedy záznam prebehne dobre, ale počas testovacieho čítania sa zistí chyba. Neznamená to, že pri zápise došlo k chybe – pri čítaní došlo k zlyhaniu. Teraz si predstavte, že pri práci „vzduchom“ sa stane to isté, ale oveľa častejšie.

Po vyskúšaní rôznych spôsobov, ako tento problém prekonať, autor prišiel s nasledujúcim. Zariadenie má 128 KB flash pamäť s rozhraním SPI - dáta prijímame cez káble (nezabudnite, že autor už má jedno zariadenie s konektorom na boku), túto pamäť používame ako vyrovnávaciu pamäť a dáta posielame cez rádio kanál do iného zariadenia. Pozdrav od Cybiko.

Po napísaní kódu na prácu s rádiovým kanálom, ako aj s písmom, bol nakladač dlhší ako 4 kilobajty. Preto sa hodnota HFUSE musela zmeniť z 0xDA na 0xD8. Teraz môže mať bootloader dĺžku až 8 kilobajtov a počiatočná adresa je teraz 0x1E000. To sa odráža v Makefile, ale malo by sa to zohľadniť aj pri vypĺňaní bootloader cez avrdude.

Transceiver 802.15.4 v ATmega128RFA1 je pôvodne navrhnutý tak, aby fungoval pomocou protokolu ZigBee, čo je dosť komplikované, takže sa autor rozhodol namiesto toho iba prenášať pakety. Toto je implementované v hardvéri v ATmega128RFA1, takže je potrebný malý kód. Pre jednoduchosť sa autor rozhodol použiť pevný kanál, ktorý vám neumožňuje vybrať ho ani manuálne. Štandard 802.15.4 podporuje 16 kanálov s číslami od 11 do 26. Sú dosť preplnené, niektoré sa aj prekrývajú WiFi kanály (červené sú kanály ZigBee, modré, zelené a žlté sú WiFi).

Píšeme OTA bootloader pre ATmega128RFA1 (ako súčasť zariadenia Smart Response XE)

Ukázalo sa, že najmenej náchylné na rušenie z WiFi sú kanály 15 a 26. Autor si vybral druhý z nich. Upozornenie: prekladateľ nevie, či je dovolené zjednodušiť ZigBee týmto spôsobom. Možno by sme mali urobiť trochu viac programovania a implementovať ho úplne?

Na prvom zariadení je potrebné implementovať konečný automat, ktorý prenáša dáta cez protokol STK500. Z väčšej časti sú prenášané a prijímané správy sebestačné, ale niektoré sú viazané na tie, ktoré prešli kanálom skôr. Uvádza sa popis dialógu tu.

Dôležitou súčasťou tohto dialógu je prenos paketov určených na zápis do flash pamäte cieľového zariadenia. Pre jednoduché mikrokontroléry rodiny AVR je veľkosť stránky 128 bajtov, no pre ATmega128RFA1 je to 256. A pre flash pamäť, ktorá je pripojená cez protokol SPI, je to rovnaké. Program v prvom zariadení pri nahrávaní náčrtu ho hneď neprenesie do druhého, ale zapíše ho do tejto pamäte. Keď Arduino IDE skontroluje správnosť zadania, odošle sa, čo tam bolo napísané. Teraz musíme preniesť prijaté dáta cez rádiový kanál do druhého zariadenia. Zároveň pomerne často dochádza k prepínaniu z prijímania na vysielanie a späť. Protokol STK500 je ľahostajný k oneskoreniam, ale netoleruje stratu údajov (čudné, ale vyššie bolo povedané, že oneskorenia ovplyvňujú aj prenos údajov). A straty počas bezdrôtového prenosu sú nevyhnutné. ATmega128RFA1 má zabudovanú hardvérovú implementáciu opakovaných požiadaviek pri pochybnostiach o správnosti prenosu, no autor sa rozhodol to isté softvérovo implementovať. Vyvinul protokol, v ktorom tečie oveľa viac údajov jedným smerom ako druhým.

Nie je to dokonalé, ale funguje to. 256-bajtová stránka je rozdelená na štyri segmenty, z ktorých každý sa prenáša vzduchom ako paket. Paket môže obsahovať až 125 bajtov dát plus jeden bajt pre dĺžku a dva bajty pre CRC. Takže tam sú umiestnené fragmenty dlhé 64 bajtov spolu s číslami stránok a segmentov (od 0 do 3). Prijímacie zariadenie má premennú, ktorá mu umožňuje sledovať, koľko segmentov bolo prijatých, a keď prídu všetky štyri, odosielacie zariadenie dostane potvrdenie, že bola prijatá celá stránka. Žiadne potvrdenie (CRC sa nezhoduje) - znova odošlite celú stránku. Rýchlosť je ešte väčšia ako pri prenose cez kábel. Pozri:


Vo všeobecnosti by však bolo potrebné poskytnúť pohodlný spôsob pripojenia kábla k zariadeniam na nahrávanie náčrtov a cez neho. Napríklad umiestnite do vnútra takéhoto prevodníka rozhrania na CP2102, ako je to na fotografii, a prilepte ho k doske tak, aby odolal sile pri pripájaní a odpájaní kábla Micro USB.

Píšeme OTA bootloader pre ATmega128RFA1 (ako súčasť zariadenia Smart Response XE)

Má tiež 3,3-voltový stabilizátor (a ako ho použiť v zariadení so 6-voltovým napájaním - ak má iba rovnaký stabilizátor a môžete pridať dve diódy, aby ste automaticky vybrali, ktorá z nich bude napájať zariadenie) . Všetky tri LED diódy musia byť odspájkované z dosky prevodníka rozhrania, inak budú pri prevádzke na nich dodatočne zaťažovať batérie a prekážať aj pri dotazovaní klávesnice a práci s flash pamäťou s rozhraním SPI.

Sledovanie cieľa sa ukázalo byť ešte zaujímavejšie ako jeho dosiahnutie (a nepotrebujete ten vtip o autobuse). Autor sa veľa naučil o bootloaderoch AVR, flash pamäti SPI, protokole STK500 a štandarde 802.15.4.

Všetok ďalší kód okrem knižnice opísanej vyššie je − tua je tiež pod GPL v3. Autorov Twitter - tu.

Zdroj: hab.com

Pridať komentár