U liniji u odnosu na van linije
U Energetika-VDS firmware se flešuje na našoj liniji preko namenskih programatorskih fixture-a. Kada test plan kupca podrazumeva funkcionalni test, jedinica sa već učitanim firmware-om ide u partnersku test kuću. AOI se radi u kući na svakoj ploči; FCT se uzima od partnera.
Neki proizvođači spajaju flešovanje i funkcionalni test u isti fixture, pa se ploča postavi jednom, prvo se programira, zatim testira. To funkcioniše kada su oba koraka u istoj zgradi. Kod nas su flešovanje i FCT fizički razdvojeni: flešovanje radimo u liniji, a partnerska test kuća pokreće funkcionalnu sekvencu nad upravo programiranim firmware-om.
Kod proizvoda kod kojih funkcionalni test nije u opsegu, flešovana ploča se isporučuje nakon AOI-a, bez dodatnog testnog prolaza.
Programatorski interfejsi
Interfejs prema čipu razlikuje se po familiji čipa:
- SWD: ARM Cortex-M, mali broj pinova, brz
- JTAG: stariji ARM, FPGA, takođe debug za mnoge čipove
- UART: programiranje preko bootloader-a, sporije ali bez dodatnih pinova
- USB-DFU: čipovi sa USB-om, ploča se tokom programiranja ponaša kao USB uređaj
- I2C, SPI: ređi, koriste se za neke EEPROM-e i secure element-e
Većina produkcionih flešovanja koristi SWD za ARM Cortex-M uređaje i JTAG za starije ili komponente sa većim brojem pinova.
Programiranje sa više image-a
Povezani uređaj obično ima više firmware image-a:
- Bootloader: mali, potpisan, posle proizvodnje nepromenljiv
- Aplikacija: glavni firmware, podržava OTA ažuriranje
- Fajl sistem: konfiguracija, web resursi, skladište sertifikata
- Manufacturing particija: kalibracija po jedinici, identitet, fabrički podaci
Programiranje u proizvodnji upisuje svaki image redom, u odgovarajuću particiju, sa odgovarajućim potpisom ako je potrebno.
Lanci potpisanog bootloader-a
Potpisani bootloader proverava potpis aplikacije pre nego što je pokrene. Sam bootloader potpisan je secure boot mehanizmom čipa (hash zapisan u eFuse-u, verifikacija u ROM-u).
Rezultat: napadač ne može da zameni aplikaciju proizvoljnim kodom, jer će bootloader odbiti da je pokrene. Napadač ne može da zameni bootloader, jer će čip odbiti da pokrene nepotpisani bootloader.
Na strani proizvodnje, to znači:
- Ključ za potpisivanje bootloader-a se generiše i čuva u HSM-u
- Ključ za potpisivanje aplikacije se generiše i čuva u HSM-u
- Proizvodna linija pristupa potpisivanju preko API-ja, privatni ključ joj nikada nije u rukama
- eFuse se pregoreva i zaključava potpis bootloader-a
Tolerancija na gubitak napajanja
Programatorske sekvence moraju da tolerišu gubitak napajanja usred flešovanja. Uobičajeni obrazac: prvo se upisuje bootloader na fiksnu lokaciju, aplikacija u zasebnu regiju, a flag "valid" se postavlja u NVS tek nakon verifikacije. Ako napajanje padne usred upisa, bootloader vidi da fali valid flag i vraća se na poznat-dobri firmware (ili odbija da krene, zavisno od politike).
Verifikacija
Nakon upisa, pročita se flešovani image i izračuna njegov hash. Uporedi se sa očekivanim hash-om. Ako se razlikuju, jedinica se označava kao otkaz pri flešovanju i šalje na doradu.
Ovim se hvata redak slučaj kada je sam upis uspeo, ali je čip upisao smeće.
Beleženje po jedinici
Nakon uspešnog flešovanja, beleže se:
- Verzija firmware-a
- Hash firmware-a
- Referenca na ključ za potpisivanje
- Vremenska oznaka programiranja
- Serijski broj po jedinici
Ovi podaci ostaju u bazi sledljivosti u proizvodnji. Kupac kasnije može da postavi upit: "koji firmware je isporučen na serijskom broju XXX i kojim ključem je potpisan".