Actualizaciones de firmware a prueba de balas

16

¿Qué tipo de técnicas se utilizan para permitir que un usuario de forma segura actualizar un dispositivo de venta de firmware de correos? Quiero hacer esto con un microcontrolador Cortex M3 / 4, pero creo que las técnicas para cualquier micro deberían hacerlo.

Preferiblemente con la menor cantidad de componentes adicionales, por supuesto.

Imbrondir
fuente

Respuestas:

16

Use un chip que tenga más del doble de la cantidad de memoria Flash que necesitará para su código. De esta forma, puede llevar el nuevo firmware a esta memoria sin dejar el antiguo en caso de que algo salga mal.

Después de descifrar y verificar las sumas de comprobación en el nuevo firmware un gestor de arranque puede copiarlo en su ubicación definitiva, en sustitución de la antigua. Si algo va mal durante esta parte, después de un duro restablecer el gestor de arranque debería ver que el nuevo firmware no es válido (mediante la ejecución de la suma de comprobación, una vez más) y vuelva a intentar la copia.

Esta es la forma más simple y más infalible que conozco. También requiere poco código en el gestor de arranque y no requiere la duplicación de cualquier funcionalidad entre el programa principal y el gestor de arranque (no se necesita ninguna lógica de la comunicación en el gestor de arranque).

jpc
fuente
10
Como usuario de electrónica, podría agregar que sería bueno tener un botón en algún lugar para mantener durante el arranque que arrancaría el firmware anterior, en caso de que el nuevo tenga una suma de verificación correcta pero el software en sí tenga un error.
Zan Lynx
44
El "problema" que veo con esta solución es que necesita algún tipo de tabla de reubicación o código completo de posición independiente. De lo contrario, su código no se ejecutará.
Nico Erfurth
2
@Masta: no comprende la parte donde se copia el firmware en su ubicación final (normal).
Kevin Vermeer
3
@jpc: utilizamos esta técnica con un chip Flash serie externo en algunas herramientas internas en el trabajo. No necesita tener un microcontrolador con más del doble de Flash si tiene espacio para una parte SOIC o QFN de 8 pines. Se pueden tener memorias Flash en serie de 1 MB por menos de un dólar, por lo que puede ser más barato seguir esta ruta que actualizar el microcontrolador en algunos casos.
Kevin Vermeer
@zan - Sí, nosotros también usamos esto. Una preocupación o beneficio es que el dispositivo se restablece a los valores predeterminados cuando vuelve a copiar el firmware anterior (no tenemos EEPROM en nuestro micro; almacenamos datos de configuración como la dirección MAC y la dirección IP en Flash autoescrito). Para nosotros, esto hace que sea más fácil encontrar un tablero cuando nos olvidamos de la dirección IP.
Kevin Vermeer
12

Utilizar un gestor de arranque y unos pocos KB de flash adicional.

El gestor de arranque realiza una actualización, enviando un comando especial a través de UART, USB, I2C u otro protocolo. Sólo el código principal se actualiza alguna vez - código de gestor de arranque no se toca, excepto a través de un programador externo (es decir JTAG / PICkit para las fotos, etc.)

Si la actualización falla (falta de energía eléctrica, alguien tropezó con un cable u otra razón), entonces el widget no funcionará, pero el gestor de arranque todavía estará allí por lo que la actualización se puede intentar de nuevo.

Se podría establecer un indicador en algún byte en algún lugar que impida que el código principal se ejecute incorrectamente porque no se ha actualizado completamente.

Thomas O
fuente
También puede forzar la ejecución del cargador de arranque si el arranque se debe a un encendido. Esto ayudaría si carga un firmware defectuoso que se bloquea inmediatamente. El gestor de arranque necesitaría un tiempo de espera para ejecutar la aplicación después de X segundos.
Robert
Es una buena idea si puede usar un protocolo simple (como una serie asíncrona, TTL o 485). Para los casos más complicados (tarjetas SD, GPRS, USB) no incluiría el código de soporte complejo en el gestor de arranque (no actualizable). Ethernet OTOH (UDP o TFTP sin formato) es lo suficientemente simple para esto.
jpc
3

Si su dispositivo es relativamente caro y puede pagar el costo (y sus clientes se preocupan por las actualizaciones), puede hacer esto ...

(en general, esta técnica requiere almacenamiento externo o uso desviado de jtag ..)

Tenga un programa micro fijo (como un pequeño PIC) que puede detener el sistema y reprogramarlo.

Como no puede cambiar el firmware del "procesador de actualización", nunca puede salir mal.

1) el usuario puede actualizar el dispositivo

2) si falla una actualización, siempre pueden volver a intentarlo. No puede ser ladrillo

3) incluso cuando su dispositivo de destino no es compatible con un cargador de arranque (solo quiere arrancar y ejecutar), aún puede hacer que haga lo que quiera.

funciona para FPGA, DSP y otros objetivos extraños.

Puede tener una interfaz de usuario realmente ordenada (incluso un PIC puede ejecutar un servidor web ...)

Tim Williscroft
fuente
2

Asegúrese de que su producto tenga algún tipo de interfaz serial simple , preferiblemente EIA232. Un conector no estándar está bien si no tiene espacio para un DB-9. Por ejemplo, un conector TRS es todo lo que necesita para TxD, RxD y tierra.

Cuando programe el dispositivo por primera vez, incluya un gestor de arranque . Esto debería ser lo más simple posible , porque tarde o temprano querrá actualizar el gestor de arranque si necesita nuevas funciones. (Probablemente ni siquiera puedas actualizarlo)

Luego el conector TRS. Use un conector con interruptor para poder detectar cuándo hay un conector presente. Simplemente salga del reinicio e inicie el gestor de arranque si el enchufe está presente; de ​​lo contrario, inicie la aplicación. De esa manera, el gestor de arranque y el programa de aplicación del usuario permanecen bien separados. (La comprobación es en realidad parte del gestor de arranque; la necesitaremos independientemente de la versión de la aplicación, de lo contrario no podremos ingresar al gestor de arranque).

stevenvh
fuente
¿Por qué querrías actualizar el gestor de arranque? ¿Cómo se aseguraría de que el proceso de actualización no bloquee el dispositivo? Si pudiera, ¿qué nuevas características serían tan atractivas que se arriesgaría a actualizarlas?
Kevin Vermeer
55
@Kevin - Creo que quiso decir que el gestor de arranque debería ser tan simple que nunca pensarás en "actualizarlo".
jpc
@jpc - Ah, tienes razón, lo malinterpretaste. Estamos de acuerdo!
Kevin Vermeer
1

¿Qué equipo tendrá disponible el 'mejorador'? ¿Una PC, una memoria USB, una tarjeta micro SD?

Una forma sería tener la aplicación en un elemento extraíble (memoria USB, tarjeta SD, etc.). El chip carga su aplicación desde el artículo. Su actualizador simplemente intercambia el elemento y se reinicia.

Los chips de microcontrolador ARM y Cortex que conozco (NXP, Atmel) tienen un cargador de arranque en serie incorporado, por lo que si su actualizador llega con una PC y un cable en serie (y ha dispuesto una interfaz de puerto COM), simplemente puede descargar su actualizar.

Wouter van Ooijen
fuente
Entonces, simplemente conectando los pines UART a un puerto, mientras está conectado a un puerto COM y una PC, ¿puede actualizar el firmware sin ningún código en el mcu? Buen consejo.
Imbrondir
Consulte la hoja de datos, sección 'gestor de arranque'. Para hacer esto realmente 'sin manos', necesitará una forma de 1. reiniciar el chip; 2. active el gestor de arranque (el chip comprueba un pin de ceratina). Esto se puede hacer mediante un puente y un interruptor (reinicio), pero una forma más conveniente (especialmente en su escritorio) es usar dos líneas de apretón de manos para hacer el truco 'no intervenir'. La mayoría de los programas de descarga de PC (por ejemplo, flashmagic, lpc21isp) pueden hacer la magia del apretón de manos por usted (si conecta las líneas del apretón de manos correctamente).
Wouter van Ooijen