14.1.1.5. 恢复引导加载程序¶
正常的固件刷写永远不会触及引导加载程序,因此中断的固件更新几乎总是可以恢复的:从 刷写固件 重新运行相同的刷写命令(dfu-util -w 会等待设备),或在摄像头仍处于引导加载程序状态时重新运行 Load Custom Firmware。本页介绍较为罕见的情况:引导加载程序本身已损坏,且摄像头在复位后不再枚举为 DFU 设备。
引导加载程序位于与固件和文件系统不同的独立闪存区域中,并且每一台 OpenMV 品牌的摄像头都有一条返回的硬件路径,因此摄像头很难被彻底变成无法恢复的状态。Arduino 开发板是唯一的例外——它们的引导加载程序是固定的,用户无法恢复。
OpenMV IDE 会自动执行所有这些恢复流程,并在过程中逐步引导你完成硬件操作步骤(跳线、开关、按钮)。下面各节记录了它针对每个摄像头系列所执行的操作,以便你想自行运行恢复时参考。
14.1.1.5.1. STM32 摄像头(BOOT--RST 跳线)¶
对于 STM32 OpenMV 摄像头(M4、M7、H7、H7 Plus、Pure Thermal):
断开摄像头的连接。
在 BOOT 引脚和 RST 引脚之间连接一根跳线。
重新连接。此时摄像头会枚举为 ST 系统 DFU 设备(
0483:df11),与损坏的固件无关。仅重新刷写引导加载程序——使用 OpenMV IDE 的 Load Custom Firmware 加载
bootloader.bin,或者:dfu-util -w -d ,0483:df11 -a 0 -s 0x08000000 -D bootloader.bin移除跳线并重新连接。
正常刷写固件(参见 刷写固件)。
14.1.1.5.2. OpenMV Cam N6(BOOT--VCC 跳线)¶
断开摄像头的连接。
在 BOOT 引脚和 VCC 引脚之间连接一根跳线。
重新连接。此时摄像头会枚举为 ST 系统 DFU 设备(
0483:df11),与损坏的引导加载程序无关。使用 STM32CubeProgrammer(包含在 OpenMV SDK 中)重新刷写,并使用随
bootloader.bin一同提供的闪存布局描述符——它会重写第一阶段引导加载程序、外部闪存加载器以及引导加载程序:STM32_Programmer_CLI -c port=USB1 -d OPENMV_N6/FlashLayout.tsv移除跳线并重新连接。
正常刷写固件(参见 刷写固件)。
14.1.1.5.3. OpenMV Cam RT1062¶
重建 RT1062 安全引导加载程序需要用跳线让芯片进入 ROM 串行下载(SDP)模式,部署一个 RAM 闪存加载器,然后重写闪存配置块、SBL 和固件。手动操作序列如下:
断开摄像头的连接,在 SBL 引脚和 3.3V 引脚之间接上跳线,然后重新连接。芯片会以 SDP ROM 模式枚举(
0x1FC9:0x0135)。部署并启动 RAM 闪存加载器:
sdphost -u 0x1FC9,0x0135 -- write-file 0x20001C00 sdphost_flash_loader.bin sdphost -u 0x1FC9,0x0135 -- jump-address 0x20001C00
此时摄像头会以闪存加载器的身份响应(
0x15A2:0x0073)。配置外部闪存,写入闪存配置块,然后写入 SBL:blhost -u 0x15A2,0x0073 -- fill-memory 0x2000 4 0xC0000008 word blhost -u 0x15A2,0x0073 -- configure-memory 9 0x2000 blhost -u 0x15A2,0x0073 -t 120000 -- flash-erase-region 0x60000000 0x1000 blhost -u 0x15A2,0x0073 -- fill-memory 0x2000 4 0xF000000F word blhost -u 0x15A2,0x0073 -- configure-memory 9 0x2000 blhost -u 0x15A2,0x0073 -t 120000 -- flash-erase-region 0x60001000 <sbl_size> blhost -u 0x15A2,0x0073 -- write-memory 0x60001000 blhost_flash_loader.bin
写入固件并设置启动源熔丝,使芯片从外部闪存启动新的 SBL:
blhost -u 0x15A2,0x0073 -t 120000 -- flash-erase-region 0x60040000 <firmware_size> blhost -u 0x15A2,0x0073 -- write-memory 0x60040000 firmware.bin blhost -u 0x15A2,0x0073 -- efuse-program-once 0x06 00000010 blhost -u 0x15A2,0x0073 -- reset
移除跳线并对摄像头重新上电。
警告
efuse-program-once 0x06 00000010 是一次不可逆的一次性熔丝写入,它会将设备设置为从外部闪存启动。这也是为什么应当让 OpenMV IDE 来执行 RT1062 引导加载程序恢复,而不要手动运行该序列的另一个原因。
14.1.1.5.4. OpenMV AE3¶
AE3 的安全引导加载程序无法通过 USB DFU 恢复。它需要使用 Alif Semiconductor 的 SE Tools(随 OpenMV IDE 捆绑提供)通过串行 ISP 连接重写到芯片的 MRAM 中。这是一个交互式的、仅用于恢复的流程——并非常规刷写方法——而且手动操作容易出错;在本页的所有内容中,这是最应当交给 OpenMV IDE 处理的一项。
连接。 SE Tools 通过 AE3 调试适配器的串行 ISP 端口与 AE3 通信——即一个 FTDI 0403:6015 或 CH340 1A86:55D3 接口,并配合一个 J-Link。恢复要求将设备置于恢复模式:启用板载恢复开关。
SE Tools。 OpenMV IDE 捆绑了这些 Alif 可执行文件。它们共用两个配置文件——isp_config_data.cfg 和 global-cfg.db——这两个文件在首次连接时由 maintenance 创建:
工具 |
用途 |
|---|---|
|
查询安全隔离区(Secure Enclave)( |
|
当安全隔离区系统包早于固件所需的版本时,对其进行更新。 |
|
生成目录(TOC)映像(用于仅写入应用程序)。 |
|
将映像写入 MRAM——即恢复引导加载程序的步骤。 |
操作步骤:
使用
maintenance连接到 AE3;它会提示输入串行端口和设备类型,并为其他工具创建isp_config_data.cfg和global-cfg.db。如果安全隔离区系统包已过期,
updateSystemPackage会对其进行更新;出现提示时对设备重新上电。app-write-mram -i "bootloader.bin 0x80000000 firmware_pad.toc 0x8057E000"会将引导加载程序和 TOC 写入 MRAM。AE3 会重新枚举为
37C5:96E3DFU 设备。运行 OpenMV AE3:dfu-util 中正常的四映像刷写流程来加载应用程序。对摄像头重新上电,并将恢复开关重新关闭。
备注
OpenMV IDE 处理的远不止这条理想路径——损坏的安全隔离区固件、损坏的引导加载程序以及其他故障状态都各自需要专门的恢复步骤,而且整个过程中很多环节都可能出错。如果上述手动步骤无法让摄像头恢复正常,请使用 OpenMV IDE 来恢复它。