防弹固件升级


16

什么样的技术可以使用户在售后安全升级设备固件?我想用Cortex M3 / 4微控制器来做到这一点,但是我想任何微技术都可以做到。

当然优选地具有最少量的额外组分。

Answers:


16

使用的芯片要比代码所需的闪存多两倍。这样,您可以将新固件保存到该内存中,同时仍然保留旧固件,以防万一发生任何问题。

在解密并验证新固件上的校验和后,引导加载程序可以将其复制到最终位置,从而替换旧的。如果在这部分中发生任何问题,则在进行硬重置后,引导加载程序应看到新固件无效(通过再次运行校验和),然后重试复制。

这是我所知道的最简单,最简单的方法。它在引导加载程序中也只需要很少的代码,并且不需要在主程序和引导加载程序之间复制任何功能(引导加载程序中不需要任何通信逻辑)。


10
作为电子产品的用户,我可能会补充说,在启动时在某个地方握住一个按钮会很不错,这样可以启动旧固件,以防新固件具有正确的校验和但软件本身存在错误的情况。
Zan Lynx

4
我在此解决方案中看到的“问题”是您需要某种重定位表或完整的位置无关代码。否则,您的代码将无法运行。
Nico Erfurth 2011年

2
@Masta-您不了解将固件复制到其最终(正常)位置的部分。
凯文·维米尔

3
@jpc-我们在一些内部工具上使用此技术和外部串行Flash芯片。如果您有足够的空间容纳8引脚SOIC或QFN部件,则不需要具有超过闪存两倍的微控制器。1MB串行闪存的价格可能不到一美元,因此在某些情况下采用这种方法可能比升级微控制器便宜!
Kevin Vermeer

@zan-是的,我们也使用它。一个问题或好处是,当您重新复制旧固件时,该设备会重置为默认设置(我们的微型机上没有EEPROM;我们将配置数据(如MAC地址和IP地址)存储在自写闪存中)。对于我们来说,这使我们在忘记IP地址时很容易找到一块板。
凯文·维米尔

12

使用引导加载程序和几KB的额外闪存。

引导程序通过UART,USB,I2C或其他协议发送一些特殊命令来执行升级。仅更新主代码-除非通过外部编程器(例如,用于PIC的JTAG / PICkit等),否则永远不会触及引导程序代码。

如果更新失败(电源故障,有人因电线绊倒或其他原因),则小部件将无法工作,但引导加载程序仍将存在,因此可以再次尝试升级。

可以在某处的某个字节中设置标志,以防止主代码未完全更新而导致其执行不正确。


如果引导是由于加电,您也可以强制引导加载程序运行。如果您加载了立即崩溃的错误固件,这将有所帮助。X秒钟后,引导加载程序将需要超时才能运行应用程序。
罗伯特

如果可以使用简单的协议(例如异步串行,TTL或485),则是一个好主意。对于更复杂的情况(SD卡,GPRS,USB),我不会在(不可升级的)引导程序中包含复杂的支持代码。以太网OTOH(原始UDP或TFTP)对此非常简单。
2011年

3

如果您的设备比较昂贵,并且您负担得起成本(并且您的客户关心升级),则可以执行此操作...

(通常,此技术需要外部存储或反复使用jtag。)

有一个固定的程序微型计算机(例如一点PIC),可以使系统停止运行并对其进行重新编程。

因为您不能更改“升级处理器”固件,所以它永远不会出错。

1)用户可以升级设备

2)如果升级失败,他们可以随时重试。它不能被砌

3)即使目标设备不支持引导加载程序(它只是想引导并运行),您仍然可以使其按自己的意愿进行操作。

适用于FPGA,DSP和其他奇数目标。

可以拥有真正整洁的用户界面(甚至PIC都可以运行Web服务器...。)


2

确保您的产品具有某种简单的串行接口,最好是EIA232。如果没有足够的空间容纳DB-9,则可以使用非标准的连接器。例如,TRS连接器是TxD,RxD和接地所需的全部。

首次对设备进行编程时,请包含bootloader。这应该尽可能简单,因为如果需要新功能,您迟早会希望升级引导加载程序本身。(您甚至可能无法升级)

然后是TRS连接器。使用带有开关的插孔,以便您可以检测到何时有连接器。只需检查一下是否复位即可,如果有插头,则启动引导程序,否则启动应用程序。这样,引导程序和用户应用程序将保持良好分离。(检查实际上是引导程序的一部分;无论应用程序的版本如何,我们都将需要它,否则我们将无法进入引导程序!)


为什么要升级引导加载程序?您如何确保升级过程不会阻塞设备?如果可能的话,哪些新功能会如此引人注目,以至于您冒升级的风险?
Kevin Vermeer

5
@Kevin-我认为他的意思是引导加载程序应该非常简单,以至于您甚至都不会考虑对其进行“升级”。
2011年

@jpc-啊,你是对的,误解了。我们同意!
凯文·维米尔

1

“升级器”将提供哪些设备?PC,U盘,微型SD卡?

一种方法是将应用程序放在可移动的物品(U盘,SD卡等)中。芯片从该项目加载其应用程序。您的升级程序只需交换项目并重新启动。

我所知道的ARM和Cortex微控制器芯片(NXP,Atmel)都具有内置的串行引导加载程序,因此,如果您的更新程序随PC和串行电缆一起提供(并且您已安排好COM端口接口),则只需下载您的更新。


因此,只需将UART引脚连接到端口,同时将其连接到COM端口和PC,就可以在没有任何代码的情况下刷新固件吗?不错的提示。
Imbrondir

检查数据表的“ bootloader”部分。为了真正做到这一点,您需要一种方法来重置芯片;2.激活引导加载程序(芯片检查牙质针)。这可以通过跳线和(重置)开关来完成,但是更方便的方法(尤其是在您的办公桌上)是使用两条握手线来完成“放手”技巧。大多数PC下载程序(例如flashmagic,lpc21isp)都可以为您做握手魔术(如果正确连接了握手线)。
Wouter van Ooijen 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.