Pišemo OTA bootloader za ATmega128RFA1 (kao dio Smart Response XE uređaja)

Pišemo OTA bootloader za ATmega128RFA1 (kao dio Smart Response XE uređaja)

Sve je počelo tako što je autor kupio zanimljiv uređaj na sekundarnom tržištu - Smart Response XE (Kratki opis). Namijenjen je školama: svaki učenik u razredu dobije uređaj sličan elektronskoj bilježnici ili prevodiocu iz devedesetih, nastavnik postavlja pitanje, a učenici na tastaturi uređaja ukucavaju odgovore koji se primaju putem radio kanal (802.15.4) na prijemnik povezan sa računarom nastavnika.

Ovi uređaji su ukinuti prije nekoliko godina, a ono što su škole kupile po cijeni od 100-200 dolara sada se pojavljuje na eBayu za 10 dolara ili manje. Tamošnji hardver je vrlo pogodan za štreberske eksperimente:

  • Tastatura sa 60 tastera
  • ekran rezolucije 384×136, 2 bita po pikselu - sličan BC, CGA, ali 4 ne boje, već gradacije svjetline
  • mikrokontroler ATmega128RFA1 (128 kB fleš memorija, 4 kB ROM, 16 kB RAM, 802.15.4 primopredajnik)
  • eksterna (u odnosu na mikrokontroler, ne ceo uređaj) 1 megabit (128 kilobajta) fleš memorija sa SPI interfejsom
  • pretinac za 4 AAA elementa.

Iz naziva mikrokontrolera jasno je da pripada AVR porodici, što znači da je Arduino kompatibilan zadatak više nego trivijalan...

Od vesti pa nadalje Hackaday autor je saznao šta je to već uradili (isti link vam govori šta da povežete gde), imate priliku da pokrenete igrice za Arduboy:


Ali autora više zanima mogućnost da se ne igra na uređaju, već da uči:

  • fleš memorija sa serijskim SPI interfejsom
  • bootloaders za AVR
  • standard 802.15.4

Autor je počeo pisanjem biblioteke (GPL v3), koji vam omogućava da inicijalizirate ekran, ispišete tekst i pravokutnike i pristupite SPI fleš memoriji. Tada je počeo smišljati ideje za praktičnu upotrebu uređaja: džepni terminal kompatibilan s VT-100, igre za više igrača. Nakon što je obnovio tri uređaja, odlučio je da ih "nauči" da primaju skice "preko zraka". Ono što bi bilo ne samo zanimljivo, već i vrlo zgodno: kućište uređaja se svaki put teško otvara, a ispod poklopca pregrade za baterije nalaze se samo rupe koje vam omogućavaju da povežete JTAG programator na ploču.

Pišemo OTA bootloader za ATmega128RFA1 (kao dio Smart Response XE uređaja)

Ovo je dovoljno da učitate Arduino bootloader, ali ne i skicu - serijski port tamo nije povezan, tako da još uvijek ne možete bez otvaranja kućišta. Takođe, linije TX0 i RX0 prvog serijskog porta su kombinovane sa linijama za pozivanje matrice tastature, odnosno onima koje prozivaju funkcijske tastere na bočnim stranama ekrana. Ali šta možete - autor je napravio ovo:

Pišemo OTA bootloader za ATmega128RFA1 (kao dio Smart Response XE uređaja)

Tamo je donio JTAG linije i sada nema potrebe za otvaranjem odjeljka za baterije. A da bi se skice mogle učitati, spojio sam oba serijska porta na isti konektor, dodajući i prekidač, jer je sa ugrađenim baterijama fizički nemoguće isključiti uređaj na bilo koji drugi način.

Bilo je potrebno dosta vremena za rad s lemilom, nožem i pištoljem za ljepilo. Općenito, postavljanje skica "preko zraka" je mnogo praktičnije; hitno moramo izmisliti nešto za ovo.

Arduino IDE koristi program za postavljanje skica avrdude. Interagira sa mikrokontrolerom koristeći protokol STK500, koji vam omogućava prijenos datoteka u oba smjera. Slabo je kompatibilan sa kanalima gdje su moguća varijabilna kašnjenja, izobličenja i gubitak podataka. Ako se nešto olabavi ili zašušti u serijskom kanalu, možete poludjeti tražeći uzrok. Jednom je autor patio pola dana dok nije shvatio da je problem u lošem kablu, kao i u hirovitom pretvaraču interfejsa CP2102. Čak i mikrokontroler sa ugrađenim pretvaračem interfejsa, na primer, ATmega32u4, ponekad može da deluje ovako. Svaki korisnik Arduina primijetio je da greške prilikom postavljanja skica nisu tako rijetke. Ponekad snimanje ide dobro, ali se tokom probnog čitanja otkrije greška. To ne znači da je došlo do greške tokom pisanja - došlo je do greške tokom čitanja. Zamislite sada da će se ista stvar desiti kada radite „preko zraka“, ali mnogo češće.

Nakon što je pokušao na različite načine da prevaziđe ovaj problem, autor je došao do sledećeg. Uređaj ima fleš memoriju od 128 KB sa SPI interfejsom - podatke primamo preko žica (ne zaboravite da autor već ima jedan uređaj sa konektorom sa strane), koristimo ovu memoriju kao bafer i šaljemo podatke preko radija kanal na drugi uređaj. Pozdrav iz Cybika.

Nakon pisanja koda za rad sa radio kanalom, kao i fonta, loader je postao duži od 4 kilobajta. Stoga je HFUSE vrijednost morala biti promijenjena iz 0xDA u 0xD8. Sada bootloader može biti dugačak do 8 kilobajta, a početna adresa je sada 0x1E000. Ovo se odražava u Makefile-u, ali ga takođe treba uzeti u obzir prilikom popunjavanja bootloader preko avrdude.

802.15.4 primopredajnik u ATmega128RFA1 originalno je dizajniran za rad koristeći protokol Zigbee, što je prilično komplikovano, pa je autor odlučio da umesto toga samo prenosi pakete. Ovo je implementirano u hardveru ATmega128RFA1, tako da je potrebno malo koda. Također, radi jednostavnosti, autor je odlučio koristiti fiksni kanal, ne dozvoljavajući vam da ga odaberete čak ni ručno. Standard 802.15.4 podržava 16 kanala sa brojevima od 11 do 26. Prilično su pretrpani, neki se preklapaju i sa WiFi kanalima (crveni su ZigBee kanali, plavi, zeleni i žuti WiFi).

Pišemo OTA bootloader za ATmega128RFA1 (kao dio Smart Response XE uređaja)

Pokazalo se da su kanali 15 i 26 najmanje podložni smetnjama od WiFi-a. Autor je odabrao drugi od njih. Disclaimer: prevodilac ne zna da li je dozvoljeno pojednostaviti ZigBee na ovaj način. Možda bismo trebali malo više programirati i implementirati ga u potpunosti?

Na prvom uređaju je potrebno implementirati konačni stroj koji prenosi podatke putem STK500 protokola. Uglavnom, poruke koje se prenose i primaju su samodovoljne, ali neke su vezane za one koje su ranije prošle kroz kanal. Dat je opis dijaloga ovdje.

Važna komponenta ovog dijaloga je prijenos paketa namijenjenih za upis u fleš memoriju odredišnog uređaja. Za jednostavne mikrokontrolere AVR familije, veličina stranice je 128 bajtova, ali za ATmega128RFA1 je 256. I za fleš memoriju koja je povezana preko SPI protokola je ista. Program u prvom uređaju, prilikom učitavanja skice, ne prenosi je odmah na drugi, već je upisuje u ovu memoriju. Kada Arduino IDE provjeri ispravnost unosa, šalje se ono što je tamo napisano. Sada trebamo prenijeti primljene podatke preko radio kanala na drugi uređaj. Istovremeno, prelazak sa prijema na odašiljanje i nazad se dešava prilično često. STK500 protokol je indiferentan prema kašnjenjima, ali ne toleriše gubitak podataka (čudno, ali je gore rečeno da kašnjenja utiču i na prenos podataka). A gubici tokom bežičnog prijenosa su neizbježni. ATmega128RFA1 ima ugrađenu hardversku implementaciju ponovljenih zahtjeva kada postoje sumnje u ispravnost prijenosa, ali je autor sam odlučio da isto implementira u softver. Razvio je protokol u kojem mnogo više podataka teče na jedan način nego na drugi.

Nije savršeno, ali radi. Stranica od 256 bajta podijeljena je na četiri segmenta, od kojih se svaki prenosi putem zraka kao paket. Paket može sadržavati do 125 bajtova podataka plus jedan bajt za dužinu i dva bajta za CRC. Dakle, fragmenti dužine 64 bajta zajedno sa brojevima stranica i segmenata (od 0 do 3) se tamo postavljaju. Prijemni uređaj ima varijablu koja mu omogućava da prati koliko je segmenata primljeno, a kada sva četiri stignu, uređaj koji šalje prima potvrdu da je cijela stranica primljena. Nema potvrde (CRC se ne podudara) - ponovo pošaljite cijelu stranicu. Brzina je čak i veća nego kod prijenosa putem kabla. vidi:


Ali općenito, bilo bi potrebno osigurati zgodan način povezivanja kabela s uređajima za učitavanje skica i kroz njega. Na primjer, stavite unutar takvog pretvarača sučelja na CP2102, kao na fotografiji, i zalijepite ga na ploču tako da može izdržati silu prilikom spajanja i odspajanja Micro USB kabela.

Pišemo OTA bootloader za ATmega128RFA1 (kao dio Smart Response XE uređaja)

Ima i 3,3-voltni stabilizator (i kako ga koristiti u uređaju sa 6-voltnim napajanjem - samo da ima isti stabilizator, a možete dodati dvije diode da automatski odaberete koja će od njih napajati uređaj) . Sve tri LED diode moraju biti odlemljene sa konvertorske ploče interfejsa, inače će dodatno napuniti baterije prilikom rada na njima, a i ometati prozivanje tastature i rad sa fleš memorijom sa SPI interfejsom.

Ispostavilo se da je postizanje cilja još zanimljivije od postizanja (i ne treba mi ta šala o autobusu). Autor je naučio mnogo o AVR bootloaderima, SPI fleš memoriji, STK500 protokolu i standardu 802.15.4.

Sav drugi kod osim gore opisane biblioteke je − ovdje, a također je pod GPL v3. Autorov Twitter - ovdje.

izvor: www.habr.com

Dodajte komentar