Wy skriuwe in OTA-bootloader foar ATmega128RFA1 (as diel fan it Smart Response XE-apparaat)

Wy skriuwe in OTA-bootloader foar ATmega128RFA1 (as diel fan it Smart Response XE-apparaat)

It begon allegear mei de auteur dy't in nijsgjirrich apparaat kocht op 'e sekundêre merk - Smart Response XE (koarte beskriuwing). It is bedoeld foar skoallen: elke learling yn 'e klasse krijt in apparaat dat fergelykber is mei in elektroanysk notebook of in oersetter út 'e jierren njoggentich, de learaar stelt in fraach en de learlingen typje de antwurden op 'e toetseboerden fan 'e apparaten, dy't ûntfongen binne fia in radio kanaal (802.15.4) nei in ûntfanger ferbûn mei de learaar syn PC.

Dizze apparaten waarden ferskate jierren lyn stopset, en wat skoallen kocht foar $ 100- $ 200 elk is no op eBay foar $ 10 of minder. De hardware dêr is tige geskikt foar geeky eksperiminten:

  • 60 toetseboerd
  • werjaan mei in resolúsje fan 384 × 136, 2 bits per piksel - fergelykber mei BC, CGA, mar 4 gjin kleuren, mar gradaasjes fan helderheid
  • mikrocontroller ATmega128RFA1 (128 kB flash ûnthâld, 4 kB ROM, 16 kB RAM, 802.15.4 transceiver)
  • eksterne (yn relaasje ta de mikrocontroller, net it hiele apparaat) 1 megabit (128 kilobyte) flash ûnthâld mei SPI ynterface
  • compartment foar 4 AAA eleminten.

Ut 'e namme fan' e mikrocontroller is it dúdlik dat it heart ta de AVR-famylje, wat betsjut dat it Arduino-kompatibele apparaat in mear dan triviale taak is ...

Fan it nijs ôf hackaday de skriuwer fûn út wat it is al dien hawwe (deselde keppeling fertelt jo wat jo moatte ferbine wêr), mei de kâns om spultsjes foar Arduboy út te fieren:


Mar de skriuwer is mear ynteressearre yn 'e kâns om net te spyljen op it apparaat, mar om te studearjen:

  • flash ûnthâld mei serial SPI ynterface
  • bootloaders foar AVR
  • standert 802.15.4

De skriuwer begûn mei skriuwen biblioteken (GPL v3), wêrmei jo inisjalisearje de werjefte, útfier tekst en rjochthoeken, en tagong ta SPI flash ûnthâld. Doe begon hy mei ideeën te kommen foar praktysk gebrûk fan it apparaat: in VT-100-kompatible pocketterminal, multiplayer-spultsjes. Nei't er trije apparaten werboud hie, besleat hy se "leare" om sketsen "oer de loft" te ûntfangen. Wat soe net allinne nijsgjirrich, mar ek hiel handich: it apparaat gefal is lestich te iepenjen eltse kear, en ûnder de batterij compartment cover binne allinnich gatten wêrmei jo te ferbinen in JTAG programmeur oan it bestjoer.

Wy skriuwe in OTA-bootloader foar ATmega128RFA1 (as diel fan it Smart Response XE-apparaat)

Dit is genôch om de Arduino-bootloader te uploaden, mar net de skets - de seriële poarte is dêr net ferbûn, dus jo kinne noch net dwaan sûnder de saak te iepenjen. Ek wurde de TX0- en RX0-rigels fan 'e earste seriële poarte kombineare mei de pollinglinen fan' e toetseboerdmatrix, nammentlik dejingen dy't de funksje-toetsen oan 'e kanten fan it display ûndersocht. Mar wat kinne jo dwaan - de auteur boude dit:

Wy skriuwe in OTA-bootloader foar ATmega128RFA1 (as diel fan it Smart Response XE-apparaat)

Hy brocht de JTAG-linen dêr, en no is it net nedich om it batterijfak te iepenjen. En om sketsen te uploaden, haw ik beide seriële poarten ferbûn oan deselde ferbining, ek in skeakel tafoege, want mei de batterijen ynstalleare is it fysyk ûnmooglik om it apparaat op in oare manier út te setten.

It duorre nochal wat tiid om te wurkjen mei in soldeerbout, in nutsmes en in lympistool. Yn 't algemien is it uploaden fan sketsen "oer de loft" folle handiger, dêr moatte wy driuwend wat foar útfine.

Arduino IDE brûkt it programma om sketsen te uploaden avrdude. It ynteraksje mei de mikrokontroller mei it protokol STK500, wêrtroch jo triemmen yn beide rjochtingen kinne oerdrage. It is min kompatibel mei kanalen wêr't fariabele fertragingen, ferfoarming en gegevensferlies mooglik binne. As der wat loskomt of ritselt yn it seriële kanaal, kinne jo gek wurde op syk nei de oarsaak. Sadree't de skriuwer lijen foar in heale dei oant hy besefte dat it probleem wie in minne kabel, en ek in grillige CP2102 ynterface converter. Sels in mikrocontroller mei in ynboude ynterface-omrekkener, bygelyks ATmega32u4, kin soms sa dwaan. Elke Arduino-brûker hat opmurken dat flaters by it uploaden fan sketsen net sa seldsum binne. Soms giet de opname goed, mar by in testlêzing wurdt in flater ûntdutsen. Dit betsjut net dat der in flater wie by it skriuwen - der wie in flater by it lêzen. Stel jo no foar dat by it wurkjen "oer de loft" itselde ding sil barre, mar folle faker.

Nei it besykjen fan ferskate manieren om dit probleem te oerwinnen, kaam de skriuwer mei it folgjende. It apparaat hat in 128 KB flash-ûnthâld mei in SPI-ynterface - wy ûntfange gegevens oer de triedden (ûnthâld dat de skriuwer al ien apparaat hat mei in ferbining oan 'e kant), brûke dit ûnthâld as buffer, en stjoere de gegevens oer de radio kanaal nei in oar apparaat. Hallo fan Cybiko.

Nei it skriuwen fan de koade om te wurkjen mei it radiokanaal, lykas it lettertype, waard de loader langer as 4 kilobytes. Dêrom moast de HFUSE-wearde feroare wurde fan 0xDA nei 0xD8. No kin de bootloader oant 8 kilobytes lang wêze, en it startadres is no 0x1E000. Dit wurdt wjerspegele yn 'e Makefile, mar moat ek rekken holden wurde by it ynfoljen bootloader fia avrdude.

De 802.15.4-transceiver yn 'e ATmega128RFA1 is oarspronklik ûntworpen om te operearjen mei it protokol Zigbee, wat frij yngewikkeld is, dus besleat de auteur gewoan pakketten oer te stjoeren. Dit wurdt ymplementearre yn hardware yn 'e ATmega128RFA1, dus in bytsje koade is fereaske. Ek, foar de ienfâld, besleat de auteur in fêst kanaal te brûken, wêrtroch jo it net sels mei de hân kinne selektearje. De 802.15.4 standert stipet 16 kanalen mei nûmers fan 11 oant 26. Se binne frij drok, guon oerlappe ek WiFi-kanalen (read binne ZigBee-kanalen, blau, grien en giel binne WiFi).

Wy skriuwe in OTA-bootloader foar ATmega128RFA1 (as diel fan it Smart Response XE-apparaat)

It die bliken dat de kanalen 15 en 26 it minst gefoelich binne foar ynterferinsje fan WiFi. De skriuwer keas de twadde dêrfan. Disclaimer: de oersetter wit net oft it tastien is om ZigBee op dizze manier te ferienfâldigjen. Miskien moatte wy wat mear programmearje en folslein útfiere?

Op it earste apparaat is it nedich om in finite-state-masine te ymplementearjen dy't gegevens ferstjoert fia it STK500-protokol. Foar it grutste part binne de berjochten dy't ferstjoerd en ûntfongen binne selsfoarsjennend, mar guon binne bûn oan dyjingen dy't earder troch it kanaal giene. Beskriuwing fan de dialooch wurdt jûn hjir.

In wichtige komponint fan dizze dialooch is de oerdracht fan pakketten dy't bedoeld binne om te skriuwen nei it flashûnthâld fan it bestimmingsapparaat. Foar ienfâldige mikrocontrollers fan 'e AVR-famylje is de sidegrutte 128 bytes, mar foar de ATmega128RFA1 is it 256. En foar it flashûnthâld dat ferbûn is fia it SPI-protokol, is it itselde. It programma yn it earste apparaat, by it opladen fan in skets, draacht it net fuortendaliks oer nei it twadde, mar skriuwt it nei dit ûnthâld. As de Arduino IDE de krektens fan 'e yngong kontrolearret, wurdt it stjoerd wat dêr skreaun is. No moatte wy de ûntfongen gegevens fia radiokanaal oerjaan nei it twadde apparaat. Tagelyk komt it oerskeakeljen fan ûntfangen nei ferstjoeren en werom frij faak foar. It STK500-protokol is ûnferskillich foar fertragingen, mar tolerearret gjin gegevensferlies (frjemd, mar it waard hjirboppe sein dat fertragingen ek gegevensferfier beynfloedzje). En ferliezen by draadloze oerdracht binne ûnûntkomber. De ATmega128RFA1 hat in ynboude hardware-ymplemintaasje fan werhelle oanfragen as der twifels binne oer de krektens fan 'e oerdracht, mar de auteur besleat itselde yn software sels te ymplementearjen. Hy ûntwikkele in protokol wêryn folle mear gegevens de iene kant streamt as de oare.

It is net perfekt, mar it wurket. De 256-byte side is ferdield yn fjouwer segminten, dy't elk oer de loft wurde oerbrocht as in pakket. In pakket kin maksimaal 125 bytes oan gegevens hâlde plus ien byte foar lingte en twa bytes foar CRC. Sa wurde der fragminten fan 64 bytes lang tegearre mei side- en segmintnûmers (fan 0 oant 3) pleatst. It ûntfangende apparaat hat in fariabele dy't it mooglik makket om te folgjen hoefolle segminten binne ûntfongen, en as alle fjouwer oankomme, krijt it stjoerende apparaat befêstiging dat de hiele side is ûntfongen. Gjin befêstiging (CRC kaam net oerien) - ferstjoere de hiele side opnij. De snelheid is noch grutter as by it útstjoeren fia kabel. Sjen:


Mar yn 't algemien soe it nedich wêze om in handige manier te leverjen om de kabel te ferbinen mei de apparaten foar it uploaden fan sketsen en dêrtroch. Bygelyks, pleatse binnen sa'n ynterface converter op 'e CP2102, lykas op' e foto, en lijm it oan 'e boerd, sadat it kin ferneare de krêft by it ferbinen en losmeitsje de Micro USB kabel.

Wy skriuwe in OTA-bootloader foar ATmega128RFA1 (as diel fan it Smart Response XE-apparaat)

It hat ek in 3,3-volt stabilisator (en hoe't jo it brûke yn in apparaat mei in 6-volt voeding - as it allinich deselde stabilisator hat, en jo kinne twa diodes tafoegje om automatysk te selektearjen hokker fan har it apparaat sil oanmeitsje) . Alle trije LED's moatte wurde unsoldered út de ynterface converter board, oars se sille boppedat lade de batterijen as se operearje, en ek bemuoie mei toetseboerd polling en wurkje mei flash ûnthâld mei in SPI ynterface.

It neistribjen fan in doel wie noch nijsgjirriger dan it berikken (en net nedich dat grapke oer de bus). De skriuwer learde in protte oer AVR-bootloaders, SPI-flash-ûnthâld, it STK500-protokol en de 802.15.4-standert.

Alle oare koade neist de hjirboppe beskreaune bibleteek is - hjir, En it is ek ûnder GPL v3. Auteur's Twitter - hjir.

Boarne: www.habr.com

Add a comment