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):

  1. 断开摄像头的连接。

  2. BOOT 引脚和 RST 引脚之间连接一根跳线。

  3. 重新连接。此时摄像头会枚举为 ST 系统 DFU 设备(0483:df11),与损坏的固件无关。

  4. 仅重新刷写引导加载程序——使用 OpenMV IDE 的 Load Custom Firmware 加载 bootloader.bin,或者:

    dfu-util -w -d ,0483:df11 -a 0 -s 0x08000000 -D bootloader.bin
    
  5. 移除跳线并重新连接。

  6. 正常刷写固件(参见 刷写固件)。

14.1.1.5.2. OpenMV Cam N6(BOOT--VCC 跳线)

  1. 断开摄像头的连接。

  2. BOOT 引脚和 VCC 引脚之间连接一根跳线。

  3. 重新连接。此时摄像头会枚举为 ST 系统 DFU 设备(0483:df11),与损坏的引导加载程序无关。

  4. 使用 STM32CubeProgrammer(包含在 OpenMV SDK 中)重新刷写,并使用随 bootloader.bin 一同提供的闪存布局描述符——它会重写第一阶段引导加载程序、外部闪存加载器以及引导加载程序:

    STM32_Programmer_CLI -c port=USB1 -d OPENMV_N6/FlashLayout.tsv
    
  5. 移除跳线并重新连接。

  6. 正常刷写固件(参见 刷写固件)。

14.1.1.5.3. OpenMV Cam RT1062

重建 RT1062 安全引导加载程序需要用跳线让芯片进入 ROM 串行下载(SDP)模式,部署一个 RAM 闪存加载器,然后重写闪存配置块、SBL 和固件。手动操作序列如下:

  1. 断开摄像头的连接,在 SBL 引脚和 3.3V 引脚之间接上跳线,然后重新连接。芯片会以 SDP ROM 模式枚举(0x1FC9:0x0135)。

  2. 部署并启动 RAM 闪存加载器:

    sdphost -u 0x1FC9,0x0135 -- write-file 0x20001C00 sdphost_flash_loader.bin
    sdphost -u 0x1FC9,0x0135 -- jump-address 0x20001C00
    
  3. 此时摄像头会以闪存加载器的身份响应(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
    
  4. 写入固件并设置启动源熔丝,使芯片从外部闪存启动新的 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
    
  5. 移除跳线并对摄像头重新上电。

警告

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.cfgglobal-cfg.db——这两个文件在首次连接时由 maintenance 创建:

工具

用途

maintenance

查询安全隔离区(Secure Enclave)(maintenance -opt sesbanner 会读取其版本)并将设备置于恢复模式。

updateSystemPackage

当安全隔离区系统包早于固件所需的版本时,对其进行更新。

app-gen-toc

生成目录(TOC)映像(用于仅写入应用程序)。

app-write-mram

将映像写入 MRAM——即恢复引导加载程序的步骤。

操作步骤:

  1. 使用 maintenance 连接到 AE3;它会提示输入串行端口和设备类型,并为其他工具创建 isp_config_data.cfgglobal-cfg.db

  2. 如果安全隔离区系统包已过期,updateSystemPackage 会对其进行更新;出现提示时对设备重新上电。

  3. app-write-mram -i "bootloader.bin 0x80000000 firmware_pad.toc 0x8057E000" 会将引导加载程序和 TOC 写入 MRAM。

  4. AE3 会重新枚举为 37C5:96E3 DFU 设备。运行 OpenMV AE3:dfu-util 中正常的四映像刷写流程来加载应用程序。

  5. 对摄像头重新上电,并将恢复开关重新关闭。

备注

OpenMV IDE 处理的远不止这条理想路径——损坏的安全隔离区固件、损坏的引导加载程序以及其他故障状态都各自需要专门的恢复步骤,而且整个过程中很多环节都可能出错。如果上述手动步骤无法让摄像头恢复正常,请使用 OpenMV IDE 来恢复它。