无线升级ARM


9

我们将创建一个带有GSM调制解调器的ARM板。
我们希望能够通过无线方式升级ARM固件。

有没有好的,可靠的开源解决方案?
如果没有,是否有带有此功能的付费OS?


2
ARM非常通用:嵌入了ARM体系结构的制造商很多,其中一些制造商可能提供了该功能。
clabacchio

1
一个有关您计划使用的ARM芯片/系列的更具体的信息将非常有用。许多(如果不是全部)Cortex-M微控制器支持从用户代码写入闪存。存在示例开源实现,例如Maple bootloader leaflabs.com/docs/bootloader.html,我想我已经看到了某些四轴飞行器支持的无线电链路上的固件升级。
索恩2012年

我们目前尚未选择ARM设备;)
2012年

7
固件升级的最大问题是,一旦固件出现问题,如何迫使芯片进入更新模式。当您可以访问该芯片时,可以将其重置并强制将引导加载引脚设为高电平,但是您将如何通过无线方式进行操作呢?我能想到的唯一可靠的解决方案是拥有第二个芯片(不可更新)来处理基本通信,并且可以更新主芯片。解决了这个问题之后,实际的引导加载可以像使用(例如)内置在芯片中的引导加载程序一样简单(例如,LPC uC我都知道有一个串行引导加载程序)。
Wouter van Ooijen

2
@Hernan这将使微妙的故障模式成为可能,例如一个芯片(以某种方式运行错误的代码)使另一个芯片处于复位状态。唯一真正可靠的解决方案是将功能简单地保存在一个芯片中,以至于您无需对其进行更新。
Wouter van Ooijen

Answers:


9

我不知道任何预制的解决方案,但是我将描述我如何在一个项目中解决它。这并非完全“牢不可破”,但我不知道它无法完成数千次升级。对于此应用程序,非常低的故障率仍然比必须获得设备访问权要便宜。

主应用程序在其常规通信协议中添加了三种附加的数据包类型,其中包括错误检测和位于顶部的重试策略。

  1. 开始固件更新命令清除外部SPI闪存中的保留存储区。如果本机使用备用电池供电,或者使用外部电源供电但电池电量低于25%,则返回错误。

  2. 写块命令接受偏移地址和以小块形式写入外部闪存的数据。更高级别的协议负责错误检测和重传。写入每个块后,将在确认命令之前对其进行回读和验证。

  3. 完成固件更新命令包括所接收固件应具有的长度以及整个映像的CRC32,以进行进一步验证。如果与外部闪存的内容匹配并且电源状况仍然可以,则长度相同,并且将CRC32连同“魔数”一起传输到EEPROM区域,以指示固件更新正在等待中。

  4. 在主应用程序中执行硬循环以强制看门狗重启。

  5. 引导加载程序(位于ARM闪存的写保护区域中)会在EEPROM中看到幻数,并再次验证映像的CRC32。如果一切正常,它将图像从外部Flash传输到ARM Flash的主程序区域。

  6. 暂挂的升级信息已从EEPROM中清除,并且硬循环强制重新启动。这次,引导程序将正常启动主应用程序。

虽然我从未见过更新阶段使用此方法在部署之前无法测试新固件版本至关重要。如果新版本无法连接到GSM网络并不能接受将来的更新命令,则将需要现场固件更新。


1

您正在运行Linux,RTOS还是裸机?如果使用Debian,可以快照当前文件系统,通过“ apt-get”进行升级,然后根据更改是否起作用保留或回滚更改。


我们有Linux和裸机,具体取决于应用程序;-)
hotips 2014年

1
如果您拥有Linux,则可以利用其中的许多基础架构。我在当前项目中处理更新的方式是为自定义应用程序创建.deb文件,然后使用apt-get update来更新系统。我也在尝试btrfs。该文件系统使您可以拍摄快照。因此,我的计划是对所需目录进行快照,尝试进行更新,如果不起作用,请还原快照。如果您使用的是裸机,则可能需要采用通常的双存储方法,一个映像用于最新的工作代码,另一映像用于新下载的代码。
fred basset 2014年
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.