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 elektroničkoj bilježnici ili prevoditelju iz devedesetih, profesor postavi pitanje, a učenici na tipkovnici uređaja ukucaju odgovore koji se primaju putem radio kanal (802.15.4) na prijemnik spojen na učiteljevo računalo.

Ti su uređaji ukinuti prije nekoliko godina, a ono što su škole kupovale po cijeni od 100 do 200 USD sada se pojavljuje na eBayu za 10 USD ili manje. Tamošnji hardver vrlo je prikladan za štreberske eksperimente:

  • Tipkovnica sa 60 tipki
  • zaslon rezolucije 384×136, 2 bita po pikselu - slično BC, CGA, ali 4 ne boje, već gradacije svjetline
  • mikrokontroler ATmega128RFA1 (128 kB flash memorije, 4 kB ROM, 16 kB RAM, 802.15.4 primopredajnik)
  • vanjska (u odnosu na mikrokontroler, ne cijeli uređaj) 1 megabit (128 kilobajta) flash memorija sa SPI sučeljem
  • pretinac za 4 AAA elementa.

Iz naziva mikrokontrolera jasno je da pripada AVR obitelji, što znači da je učiniti uređaj kompatibilnim s Arduinom više nego trivijalan zadatak...

Od vijesti nadalje Hackaday autor je otkrio što je to već učinili (isti link vam govori što spojiti gdje), imajući priliku pokretati igre za Arduboy:


Ali autora više zanima mogućnost ne igranja na uređaju, već proučavanja:

  • flash memorija sa serijskim SPI sučeljem
  • bootloaderi za AVR
  • standard 802.15.4

Autor je započeo pisanjem knjižnice (GPL v3), koji vam omogućuje da pokrenete zaslon, ispišete tekst i pravokutnike i pristupite SPI flash memoriji. Zatim je počeo smišljati ideje za praktičnu upotrebu uređaja: džepni terminal kompatibilan s VT-100, igrice za više igrača. Nakon što je obnovio tri uređaja, odlučio ih je "naučiti" primati skice "preko zraka". Ono što bi bilo ne samo zanimljivo, već i vrlo zgodno: kućište uređaja je teško otvoriti svaki put, a ispod poklopca odjeljka za baterije postoje samo rupe koje vam omogućuju spajanje JTAG programatora na ploču.

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

Ovo je dovoljno za učitavanje Arduino bootloadera, ali ne i skice - serijski port nije tamo spojen, tako da i dalje ne možete bez otvaranja kućišta. Također, linije TX0 i RX0 prvog serijskog priključka kombinirane su s linijama za prozivanje matrice tipkovnice, naime one koje prozivaju funkcijske tipke na stranama zaslona. Ali što 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 otvarati odjeljak za baterije. A da bi se skice mogle uploadati, spojio sam oba serijska porta na isti konektor, dodavši i prekidač, jer sa postavljenim baterijama fizički je nemoguće isključiti uređaj na bilo koji drugi način.

Trebalo je dosta vremena za rad s lemilom, pomoćnim nožem i pištoljem za ljepilo. Općenito, prijenos skica "bežično" mnogo je praktičniji; hitno moramo izmisliti nešto za to.

Arduino IDE koristi program za učitavanje skica avrdude. Interakcija je s mikrokontrolerom pomoću protokola STK500, koji vam omogućuje prijenos datoteka u oba smjera. Slabo je kompatibilan s kanalima gdje su moguća promjenjiva kašnjenja, izobličenje i gubitak podataka. Ako se nešto otkači 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 loš kabel, kao i hiroviti pretvarač sučelja CP2102. Čak i mikrokontroler s ugrađenim pretvaračem sučelja, na primjer, ATmega32u4, ponekad može djelovati ovako. Svaki korisnik Arduina primijetio je da greške prilikom učitavanja skica nisu tako rijetke. Ponekad snimanje ide dobro, ali se tijekom probnog čitanja otkrije greška. To ne znači da je došlo do pogreške tijekom pisanja - došlo je do pogreške tijekom čitanja. Sada zamislite da će se ista stvar dogoditi, ali puno češće, kada radite "preko zraka".

Nakon što je pokušao na različite načine prevladati ovaj problem, autor je došao do sljedećeg. Uređaj ima flash memoriju od 128 KB sa SPI sučeljem - podatke primamo putem žica (sjetite se da autor već ima jedan uređaj s konektorom sa strane), koristimo ovu memoriju kao međuspremnik i šaljemo podatke putem radija. kanala na drugi uređaj. Pozdrav iz Cybiko.

Nakon pisanja koda za rad s radio kanalom, kao i fontom, loader je postao duži od 4 kilobajta. Stoga je vrijednost HFUSE morala biti promijenjena s 0xDA na 0xD8. Sada bootloader može biti dug do 8 kilobajta, a početna adresa je sada 0x1E000. To se odražava u Makefileu, ali također treba uzeti u obzir prilikom ispunjavanja bootloader preko avrdude.

802.15.4 primopredajnik u ATmega128RFA1 izvorno je dizajniran za rad pomoću protokola ZigBee, što je dosta komplicirano, pa je autor umjesto toga odlučio samo slati pakete. Ovo je ugrađeno u hardver u ATmega128RFA1, tako da je potrebno malo koda. Također, radi jednostavnosti, autor je odlučio koristiti fiksni kanal, ne dopuštajući vam da ga odaberete čak ni ručno. Standard 802.15.4 podržava 16 kanala s brojevima od 11 do 26. Dosta su natrpani, neki se i preklapaju WiFi kanali (crveni su ZigBee kanali, plavi, zeleni i žuti su WiFi).

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

Pokazalo se da su kanali 15 i 26 najmanje osjetljivi na smetnje WiFi-a, a autor je odabrao drugi od njih. Disclaimer: prevoditelj ne zna je li dopušteno pojednostaviti ZigBee na ovaj način. Možda bismo trebali malo više programirati i implementirati ga u potpunosti?

Na prvom uređaju potrebno je implementirati konačni automat koji prenosi podatke putem STK500 protokola. Većinom su poruke koje se odašilju i primaju same sebi dovoljne, no neke su vezane uz one koje su ranije prošle kanalom. Daje se opis dijaloga здесь.

Važna komponenta ovog dijaloga je prijenos paketa namijenjenih upisivanju u flash memoriju odredišnog uređaja. Za jednostavne mikrokontrolere obitelji AVR, veličina stranice je 128 bajtova, ali za ATmega128RFA1 je 256. I za flash memoriju koja je povezana preko SPI protokola, ista je. Program u prvom uređaju, prilikom učitavanja skice, ne prenosi je odmah na drugi, već je zapisuje u ovu memoriju. Kada Arduino IDE provjeri ispravnost unosa, šalje ono što je tamo napisano. Sada trebamo prenijeti primljene podatke putem radio kanala na drugi uređaj. U isto vrijeme, prebacivanje s primanja na odašiljanje i natrag događa se prilično često. Protokol STK500 je ravnodušan prema kašnjenjima, ali ne tolerira gubitak podataka (čudno, ali gore je rečeno da kašnjenja također utječu na prijenos podataka). A gubici tijekom bežičnog prijenosa su neizbježni. ATmega128RFA1 ima ugrađenu hardversku implementaciju ponovljenih zahtjeva kada postoje sumnje u ispravnost prijenosa, no autor je odlučio sam implementirati isto softverski. Razvio je protokol u kojem puno više podataka teče u jednom smjeru nego u drugom.

Nije savršeno, ali djeluje. Stranica od 256 bajta podijeljena je u četiri segmenta, od kojih se svaki prenosi putem zraka kao paket. Paket može sadržavati do 125 bajtova podataka plus jedan bajt za duljinu i dva bajta za CRC. Dakle, fragmenti dugi 64 bajta zajedno s brojevima stranica i segmenata (od 0 do 3) smješteni su tamo. Uređaj koji prima ima varijablu koja mu omogućuje praćenje 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) - ponovno pošalji cijelu stranicu. Brzina je još veća nego kod prijenosa putem kabela. Vidjeti:


Ali općenito, bilo bi potrebno osigurati prikladan 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 pri spajanju i odspajanju Micro USB kabela.

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

Ima i stabilizator od 3,3 volta (i kako ga koristiti u uređaju sa napajanjem od 6 volti - 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 od ploče pretvarača sučelja, inače će dodatno opteretiti baterije kada rade na njima, a također će ometati prozivanje tipkovnice i rad s flash memorijom sa SPI sučeljem.

Težnja za ciljem pokazala se još zanimljivijom od njegovog ostvarenja (i ne treba onaj vic o autobusu). Autor je naučio puno o AVR bootloaderima, SPI flash memoriji, STK500 protokolu i 802.15.4 standardu.

Sav drugi kod uz gore opisanu biblioteku je − здесь, a također je pod GPL v3. Autorov Twitter - здесь.

Izvor: www.habr.com

Dodajte komentar