Aggiornamenti del firmware a prova di proiettile


16

Che tipo di tecniche vengono utilizzate per consentire a un utente di aggiornare in sicurezza un firmware del dispositivo post vendita? Voglio farlo con un microcontrollore Cortex M3 / 4, ma credo che le tecniche per qualsiasi micro dovrebbero fare.

Preferibilmente con la minima quantità di componenti extra ovviamente.

Risposte:


16

Usa un chip che ha più del doppio della quantità di memoria Flash necessaria per il tuo codice. In questo modo è possibile ottenere il nuovo firmware in questa memoria lasciando comunque quello vecchio nel caso in cui qualcosa vada storto.

Dopo aver decrittografato e verificato i checksum sul nuovo firmware, un bootloader può copiarlo nella sua posizione finale, sostituendo quello precedente. Se qualcosa va storto durante questa parte, dopo un hard reset il bootloader dovrebbe vedere che il nuovo firmware non è valido (eseguendo nuovamente il checksum) e riprovare a copiare.

Questo è il modo più semplice e infallibile che conosco. Richiede inoltre poco codice nel bootloader e non richiede la duplicazione di alcuna funzionalità tra il programma principale e il bootloader (non è necessaria alcuna logica di comunicazione nel bootloader).


10
Come utente di elettronica, potrei aggiungere che sarebbe bello avere un pulsante da qualche parte da tenere premuto durante l'avvio che avvierebbe il vecchio firmware, nel caso in cui quello nuovo abbia un checksum corretto ma il software stesso abbia un bug.
Zan Lynx,

4
Il "problema" che vedo con questa soluzione è che hai bisogno di una sorta di tabella di trasferimento o di codice indipendente dalla posizione completa. Altrimenti il ​​tuo codice non verrà eseguito.
Nico Erfurth,

2
@Masta - Non stai capendo la parte in cui il firmware viene copiato nella sua posizione (normale) finale.
Kevin Vermeer,

3
@jpc - Utilizziamo questa tecnica con un chip Flash seriale esterno su alcuni strumenti interni al lavoro. Non è necessario disporre di un microcontrollore con più del doppio del Flash se si ha spazio per una parte SOIC o QFN a 8 pin. È possibile avere memorie Flash seriali da 1 MB per meno di un dollaro, quindi in alcuni casi potrebbe essere più economico percorrere questa strada che aggiornare il microcontrollore!
Kevin Vermeer,

@zan - Sì, usiamo anche questo. Una preoccupazione o un vantaggio è che il dispositivo viene ripristinato ai valori predefiniti quando si ricopia il vecchio firmware (non abbiamo EEPROM sul nostro micro; archiviamo i dati di configurazione come l'indirizzo MAC e l'indirizzo IP in Flash auto-scritto). Per noi, questo rende facile trovare una scheda quando dimentichiamo l'indirizzo IP.
Kevin Vermeer,

12

Usa un bootloader e qualche KB di flash extra.

Un aggiornamento viene eseguito dal bootloader, inviando alcuni comandi speciali su UART, USB, I2C o un altro protocollo. Viene aggiornato solo il codice principale: il codice del bootloader non viene mai toccato se non tramite un programmatore esterno (ad es. JTAG / PICkit per PIC ecc.)

Se l'aggiornamento non riesce (interruzione di corrente, qualcuno ha inciampato su un filo o un altro motivo), il widget non funzionerà, ma il bootloader sarà ancora lì, quindi l'aggiornamento può essere riprovato.

Un flag potrebbe essere impostato in qualche byte da qualche parte, il che impedisce l'esecuzione errata del codice principale perché non è stato completamente aggiornato.


È inoltre possibile forzare l'esecuzione del bootloader se l'avvio è dovuto all'accensione. Ciò sarebbe d'aiuto se si carica un firmware non valido che si blocca immediatamente. Il bootloader avrebbe bisogno di un timeout per eseguire l'applicazione dopo X secondi.
Robert,

È una buona idea se è possibile utilizzare un protocollo semplice (come un seriale asincrono, TTL o 485). Per i casi più coinvolti (schede SD, GPRS, USB) non includerei il codice di supporto complesso nel bootloader (non aggiornabile). Ethernet OTOH (UDP grezzo o TFTP) è abbastanza semplice per questo.
jpc,

3

Se il tuo dispositivo è relativamente costoso e puoi permetterti il ​​costo (e i tuoi clienti si preoccupano degli aggiornamenti) puoi farlo ...

(generalmente questa tecnica richiede una memoria esterna o un uso subdolo di jtag ..)

Avere un micro di programma fisso (come un piccolo PIC) che può arrestare il sistema e riprogrammarlo.

poiché non è possibile modificare il firmware del "processore di aggiornamento", non può mai andare storto.

1) l'utente può aggiornare il dispositivo

2) se un aggiornamento fallisce, possono sempre riprovare. Non può essere in muratura

3) anche quando il tuo dispositivo di destinazione non supporta un bootloader (vuole solo avviarsi ed eseguire) puoi comunque farlo fare quello che vuoi.

funziona per FPGA, DSP e altri obiettivi di oddball.

Può avere un'interfaccia utente davvero ordinata (anche un PIC può eseguire un web server ....)


2

Assicurati che il tuo prodotto abbia una sorta di semplice interfaccia seriale, preferibilmente EIA232. Un connettore non standard è OK se non si dispone dello spazio per un DB-9. Ad esempio , è sufficiente un connettore TRS per TxD, RxD e terra.

Quando si programma il dispositivo per la prima volta, includere un bootloader . Questo dovrebbe essere il più semplice possibile , perché prima o poi vorresti aggiornare il bootloader stesso se avesse bisogno di nuove funzionalità. (Probabilmente non puoi nemmeno aggiornarlo)

Quindi il connettore TRS. Utilizzare un jack con un interruttore in modo da poter rilevare quando è presente un connettore. Basta controllare appena resettato e avviare il bootloader se è presente il plug, altrimenti avviare l'applicazione. In questo modo il bootloader e il programma applicativo dell'utente rimangono ben separati. (Il controllo fa effettivamente parte del bootloader; ne avremo bisogno indipendentemente dalla versione dell'applicazione, altrimenti non saremo in grado di entrare nel bootloader!)


Perché mai vorresti aggiornare il bootloader? Come assicureresti che il processo di aggiornamento non blocchi il dispositivo? Se fosse possibile, quali nuove funzionalità sarebbero così avvincenti che rischieresti di aggiornare il bricking?
Kevin Vermeer,

5
@Kevin - Penso che intendesse dire che il bootloader dovrebbe essere così semplice da non pensare nemmeno di "aggiornarlo".
jpc,

@jpc - Ah, hai ragione, l'hai frainteso. Siamo d'accordo!
Kevin Vermeer,

1

Quale attrezzatura sarà disponibile per l'upgrade? Un PC, una chiavetta USB, una scheda micro SD?

Un modo sarebbe quello di avere l'applicazione in un elemento rimovibile (chiavetta USB, scheda SD, ecc.). Il chip carica la sua applicazione dall'elemento. L'upgrade scambia semplicemente l'elemento e si riavvia.

I chip di microcontrollore ARM e Cortex che conosco (NXP, Atmel) hanno tutti un bootloader seriale integrato, quindi se il tuo aggiornamento arriva con un PC e un cavo seriale (e hai predisposto un'interfaccia porta COM) può semplicemente scaricare il tuo aggiornare.


Quindi semplicemente collegando i pin UART a una porta, mentre si è collegati a una porta COM e un PC, è possibile eseguire il flashing del firmware senza alcun codice sull'MCU? Bel consiglio.
Imbrondir,

Controllare la scheda tecnica, sezione "bootloader". Per fare questo davvero "senza mani" avrai bisogno di un modo per 1. ripristinare il chip; 2. attiva il bootloader (il chip controlla un pin di ceratina). Questo può essere fatto da un jumper e da un interruttore (reset), ma un modo più conveniente (specialmente sulla tua scrivania) è usare due linee di handshake per fare il trucco "hands-off". La maggior parte dei programmi di download per PC (ad es. Flashmagic, lpc21isp) può fare la magia dell'handshaking per te (se i cavi dell'handshake sono collegati correttamente).
Wouter van Ooijen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.