cargador de arranque FPGA y CPLD [cerrado]

0

Desde el mundo de las MCU, creo cargadores de arranque para que los clientes puedan actualizar el firmware. Específicamente, estoy hablando de un cargador de arranque USB para reducir los muchos medios diferentes.

¿Cómo se hace esto con los FPGA y CPLD? Preferiría una solución que sea segura. Así que la imagen enviada se encripta u oculta de alguna manera. Pero me gustaría aquí las soluciones que no son tan bien.

Para FPGA:

Dado que el firmware se almacena en una memoria flash externa, ¿la imagen FPGA simplemente escribe en su flash externo y luego se reinicia? Pero, ¿qué sucede si el nuevo archivo está dañado o la conexión se elimina durante la actualización? ¿Hay una manera de hacer una copia de seguridad predeterminada? En las MCU, el cargador de arranque nunca se sobrescribe, por lo que la aplicación puede fallar en cualquier momento y el cargador de arranque seguirá funcionando.

¿Hay una parte separada de memoria no volátil dedicada que no se reconfigure en el encendido en la que puede cargar un cargador de arranque?

Para CPLD:

Dado que la imagen se almacena internamente, ¿tienen alguna forma de configurarse? ¿Cómo se haría un cargador de arranque para un CPLD?

Otros pensamientos:

Tal vez pueda colocar un chip FTDI de algún tipo con GPIO que pueda controlar desde una aplicación de PC a través de USB. De esta manera, ¿puedes golpear una SPI para cargar una nueva imagen en el flash externo? ¿Alguien hace eso? De esa manera, la imagen FPGA puede estar dañada o faltante y aún podrá cargar una nueva imagen.

Tenga en cuenta que supongo que el FPGA o CPLD está solo en una placa. Lo que significa que no hay una MCU en la placa para hacer todo esto.

Cualquier información sobre cómo la industria logra esta tarea sería genial.

    
pregunta guitardenver

1 respuesta

1

Hay un par de opciones aquí. Una es usar una parte como un FT2232 donde un puerto se configura como un puerto serie y el otro se configura como una interfaz JTAG, luego use openocd para volver a escribir el flash de configuración FPGA o la configuración interna de CPLD. He hecho esto antes, y funciona extremadamente bien. También puede poner el lado del 'puerto serie' en modo FIFO y obtener una interfaz mucho más rápida (muchos Mbps) que parece un puerto serie desde el lado del software. Esta podría ser la única forma de hacer esto para un CPLD, ya que probablemente no haya suficientes recursos lógicos en el CPLD para implementar algo "en banda", suponiendo que incluso tiene capacidad de autoprogramación.

En cuanto a las actualizaciones "en banda" en un FPGA, básicamente tiene la idea correcta: reescribir el flash y reiniciar. Los fabricantes por lo general admiten algún tipo de técnica alternativa de "archivo de bits de oro" para habilitar el respaldo a una buena configuración conocida si la actualización falla. Puede ser posible hacerlo de forma automática, manualmente a través de algún tipo de puente o interruptor de recuperación, o bajo el control del software desde un pin GPIO en un chip FTDI o similar.

En cuanto al cifrado / ofuscación, a menos que el flash de configuración sea interno a la parte o la imagen se pueda almacenar de forma cifrada en un flash externo, no estoy seguro de que haya un punto de ofuscación como un flash externo sin cifrar se puede leer simplemente con un programador EEPROM externo o un dispositivo similar. Para los dispositivos que admiten la carga de configuraciones encriptadas, habrá alguna forma de cargar una clave de encriptación a través de JTAG o similar que luego se almacenará permanentemente o en SRAM respaldada por batería dentro del FPGA. Luego, el FPGA descifra el flujo de bits con AES o similar durante el inicio. En este caso, no debería haber necesidad de implementar ninguna ofuscación o cifrado por encima de esto.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas