U liniji nasuprot izvan linije
U Energetika-VDS, flashanje firmvera odvija se na našoj liniji kroz namjenske programirajuće fiksture. Kad kupčev plan testiranja zahtijeva funkcionalni test, jedinica prelazi u partnersku ispitnu kuću s već učitanim firmverom. AOI se izvodi interno na svakoj pločici; FCT se eksternalizira.
Neki proizvođači spajaju flashanje s istom fiksturom kao i funkcionalni test, pa se pločica postavi jednom, a programiranje teče prvo, zatim test. To funkcionira kad oba koraka žive u istoj zgradi. U našoj postavci, flashanje i FCT fizički su odvojeni: flashanje izvodimo u liniji, a partnerska ispitna kuća izvodi funkcionalni slijed prema upravo programiranom firmveru.
Za proizvode bez funkcionalnog testa u opsegu, flashana pločica se isporučuje nakon AOI-a bez dodatnog testnog koraka.
Sučelja za programiranje
Sučelje prema čipu varira po obitelji čipova:
- SWD: ARM Cortex-M, mali broj pinova, brzo
- JTAG: stariji ARM, FPGA, također debug za mnoge čipove
- UART: programiranje temeljeno na bootloaderu, sporije ali bez potrebe za dodatnim pinovima
- USB-DFU: USB-sposobni čipovi, pločica djeluje kao USB uređaj tijekom programiranja
- I2C, SPI: rjeđe, koristi se za neke EEPROM-e i sigurnosne elemente
Većina proizvodnih flashanja koristi SWD za ARM Cortex-M uređaje i JTAG za starije ili komponente s većim brojem pinova.
Višeslično programiranje
Povezani uređaj obično ima više od jedne slike firmvera:
- Bootloader: mali, potpisan, nepromjenjiv nakon proizvodnje
- Aplikacija: glavni firmver, OTA-ažuriv
- Datotečni sustav: konfiguracija, web sredstva, pohrana certifikata
- Proizvodna particija: kalibracija po jedinici, identitet, tvornički podaci
Proizvodno programiranje upisuje svaku sliku redoslijedom, u ispravnu particiju, s ispravnim potpisivanjem ako je primjenjivo.
Lanci potpisanog bootloadera
Potpisani bootloader provjerava potpis aplikacije prije nego što je pokrene. Sam bootloader potpisan je sigurnosnim mehanizmom za pokretanje čipa (hash pohranjen u eFuse, verifikacija temeljena na ROM-u).
Rezultat: napadač ne može zamijeniti aplikaciju proizvoljnim kodom, jer će bootloader odbiti pokretanje. Napadač ne može zamijeniti bootloader, jer će čip odbiti pokretanje nepotpisanog bootloadera.
Na proizvodnoj strani, to znači:
- Ključ za potpisivanje bootloadera generiran i pohranjen u HSM
- Ključ za potpisivanje aplikacije generiran i pohranjen u HSM
- Proizvodna linija pristupa potpisivanju kroz API, nikad ne drži privatni ključ
- eFuse spaljen kako bi se potpis bootloadera zaključao na mjestu
Tolerancija gubitka napajanja
Programirajući slijedovi moraju tolerirati gubitak napajanja usred flashanja. Uobičajen obrazac: prvo upisati bootloader na fiksnu lokaciju, upisati aplikaciju u zasebno područje, postaviti zastavu "valid" u NVS tek nakon verifikacije. Ako napajanje padne usred upisa, bootloader vidi nedostatak zastave valid i vraća se na poznato dobar firmver (ili odbija pokretanje, ovisno o pravilima).
Verifikacija
Nakon upisa, ponovno pročitajte flashanu sliku i izračunajte njezin hash. Usporedite s očekivanim hashom. Ako se razlikuje, označite jedinicu kao pad flashanja i usmjerite na doradu.
Ovo hvata rijedak slučaj gdje je sam upis uspio, ali je čip upisao nečitke podatke.
Bilježenje po jedinici
Nakon uspješnog flashanja, zabilježite:
- Verziju firmvera
- Hash firmvera
- Referencu ključa za potpisivanje
- Vremensku oznaku programiranja
- Serijski broj po jedinici
Ovi podaci žive u proizvodnoj bazi sljedivosti. Kupac može kasnije upitati: "koji je firmver isporučen na serijskom broju XXX, potpisan kojim ključem".