Atualizações de firmware à prova de balas

16

Que tipo de técnicas são usadas para permitir que um usuário atualize com segurança um pós-venda de firmware do dispositivo? Eu quero fazer isso com um microcontrolador Cortex M3 / 4, mas acho que as técnicas para qualquer micro devem fazer.

De preferência com a menor quantidade de componentes extras, é claro.

Imbrondir
fonte

Respostas:

16

Use um chip com mais do dobro da quantidade de memória Flash necessária para o seu código. Dessa forma, você pode obter o novo firmware nessa memória enquanto ainda deixa o antigo, caso algo dê errado.

Depois de descriptografar e verificar as somas de verificação no novo firmware, um carregador de inicialização pode copiá-lo para o local final, substituindo o antigo. Se algo der errado durante esta parte, após uma reinicialização forçada, o carregador de inicialização deve verificar que o novo firmware não é válido (executando a soma de verificação novamente) e tente novamente a cópia.

Esta é a maneira mais simples e infalível que eu conheço. Ele também requer pouco código no carregador de inicialização e não requer duplicação de nenhuma funcionalidade entre o programa principal e o carregador de inicialização (você não precisa de nenhuma lógica de comunicação no carregador de inicialização).

jpc
fonte
10
Como usuário de eletrônicos, devo acrescentar que seria bom ter um botão em algum lugar para segurar durante a inicialização que inicializaria o firmware antigo, caso o novo tenha uma soma de verificação correta, mas o próprio software tenha um bug.
Zan Lynx
4
O "problema" que vejo com esta solução é que você precisa de algum tipo de tabela de realocação ou código completo de posição independente. Caso contrário, seu código não será executado.
Nico Erfurth
2
@ Masta - Você não está entendendo a parte em que o firmware é copiado para o local final (normal).
Kevin Vermeer
3
@jpc - Utilizamos esta técnica com um chip Flash serial externo em algumas ferramentas internas do trabalho. Você não precisa ter um microcontrolador com mais que o dobro do Flash se tiver espaço para uma peça SOIC ou QFN de 8 pinos. Memórias Flash seriais de 1 MB podem ser adquiridas por menos de um dólar; portanto, pode ser mais barato seguir esse caminho do que atualizar o microcontrolador em alguns casos!
Kevin Vermeer
@zan - Sim, nós usamos isso também. Uma preocupação ou benefício é que o dispositivo é redefinido para os padrões quando você copia novamente o firmware antigo (não temos EEPROM em nosso micro; armazenamos dados de configuração como o endereço MAC e o endereço IP no Flash auto-escrito). Para nós, isso facilita encontrar uma placa quando esquecemos o endereço IP.
Kevin Vermeer
12

Use um gerenciador de inicialização e alguns KB de flash extra.

Uma atualização é realizada pelo carregador de inicialização, enviando algum comando especial sobre UART, USB, I2C ou outro protocolo. Somente o código principal é sempre atualizado - o código do carregador de inicialização nunca é tocado, exceto por meio de um programador externo (por exemplo, JTAG / PICkit for PICs etc.)

Se a atualização falhar (falta de energia, alguém tropeçar em um fio ou outro motivo), o widget não funcionará, mas o carregador de inicialização ainda estará lá para que a atualização possa ser tentada novamente.

Um sinalizador pode ser definido em algum byte em algum lugar, o que impede que o código principal seja executado incorretamente porque não foi totalmente atualizado.

Thomas O
fonte
Você também pode forçar o gerenciador de inicialização a executar se a inicialização ocorrer devido a uma inicialização. Isso ajudaria se você carregasse um firmware ruim que falha imediatamente. O carregador de inicialização precisaria de um tempo limite para executar o aplicativo após X segundos.
Robert
É uma boa idéia se você pode usar um protocolo simples (como um serial assíncrono, TTL ou 485). Para casos mais envolvidos (cartões SD, GPRS, USB), não incluiria o código de suporte complexo no carregador de inicialização (não atualizável). O Ethernet OTOH (UDP ou TFTP bruto) é bastante simples para isso.
precisa saber é
3

Se o seu dispositivo for comparativamente caro e você puder arcar com o custo (e os clientes se importam com atualizações), você pode fazer isso ...

(geralmente essa técnica requer armazenamento externo ou uso desonesto de jtag ..)

Tenha um micro de programa fixo (como um pequeno PIC) que pode interromper o sistema e reprogramá-lo.

porque você não pode alterar o firmware do "processador de atualização", ele nunca pode dar errado.

1) o usuário pode atualizar o dispositivo

2) se uma atualização falhar, eles sempre poderão tentar novamente. Não pode ser emparedado

3) mesmo quando o dispositivo de destino não suporta um gerenciador de inicialização (ele só deseja inicializar e executar), você ainda pode fazer o que deseja.

funciona para FPGA, DSP e outros alvos ímpares.

Pode ter uma interface de usuário realmente elegante (mesmo um PIC pode executar um servidor da Web ...)

Tim Williscroft
fonte
2

Verifique se o seu produto possui algum tipo de interface serial simples , de preferência EIA232. Um conector não padrão é bom se você não tiver espaço para um DB-9. Por exemplo, um conector TRS é tudo o que você precisa para TxD, RxD e terra.

Ao programar o dispositivo pela primeira vez, inclua um gerenciador de inicialização . Isso deve ser o mais simples possível , porque mais cedo ou mais tarde você desejaria atualizar o próprio gerenciador de inicialização, se fosse necessário novos recursos. (Você provavelmente nem pode atualizá-lo)

Em seguida, o conector TRS. Use uma tomada com um interruptor para poder detectar quando há um conector presente. Basta verificar imediatamente após a reinicialização e iniciar o gerenciador de inicialização se o plug estiver presente; caso contrário, inicie o aplicativo. Dessa forma, o gerenciador de inicialização e o programa de aplicativo do usuário permanecem bem separados. (A verificação é realmente parte do carregador de inicialização; precisamos dela independentemente da versão do aplicativo, caso contrário, não poderemos entrar no carregador de inicialização!)

stevenvh
fonte
Por que você gostaria de atualizar o gerenciador de inicialização? Como você garantiria que o processo de atualização não impedisse o dispositivo? Se pudesse, quais novos recursos seriam tão atraentes que você arriscaria a atualização em blocos?
Kevin Vermeer
5
@ Kevin - Eu acho que ele quis dizer que o gerenciador de inicialização deve ser tão simples que você nunca vai pensar em "atualizá-lo".
Jpc
@ jpc - Ah, você está certo, interpretou mal isso. Estamos de acordo!
Kevin Vermeer
1

Que equipamento o 'modernizador' terá disponível? Um PC, um pendrive, um cartão micro SD?

Uma maneira seria ter o aplicativo em um item removível (pendrive, cartão SD, etc.). O chip carrega sua aplicação do item. Seu atualizador simplesmente troca o item e reinicia.

Os chips de microcontrolador ARM e Cortex que conheço (NXP, Atmel) possuem um carregador de inicialização serial embutido; portanto, se o seu atualizador chegar com um PC e um cabo serial (e você tiver organizado uma interface de porta COM), ele poderá simplesmente fazer o download do seu atualizar.

Wouter van Ooijen
fonte
Então, simplesmente conectando os pinos UART a uma porta, enquanto estiver conectado a uma porta COM e a um PC, você pode atualizar o firmware sem nenhum código no mcu? Boa dica.
Imbrondir
Verifique a folha de dados, seção 'bootloader'. Para fazer isso realmente 'mãos livres', você precisará de uma maneira de 1. redefinir o chip; 2. ative o gerenciador de inicialização (o chip verifica um pino cerâmico). Isso pode ser feito com um jumper e uma chave (redefinir), mas uma maneira mais conveniente (especialmente em sua mesa) é usar duas linhas de aperto de mão para executar o truque. A maioria dos programas de download de PC (por exemplo, flashmagic, lpc21isp) pode fazer a mágica do aperto de mão para você (se você conectar as linhas do aperto de mão corretamente).
Wouter van Ooijen