QGroundControl v4.4.3 源码解读

为什么必须进入 Bootloader 模式才能进行固件烧写?

Bootloader 的核心逻辑

QGroundControl 中的 Bootloader 主要处理与飞控板 Bootloader 部分的通信和固件烧写。核心逻辑主要包含在 src/VehicleSetup/PX4FirmwareUpgradeThread.cc​和 src/VehicleSetup/Bootloader.cc​文件中。

主要逻辑步骤如下:

  1. 检测设备:通过串口连接搜索可用的 Bootloader 设备
  2. 识别设备:获取设备的板卡 ID、Bootloader 版本等信息
  3. 擦除 Flash:准备写入新固件前先擦除 Flash 存储器
  4. 烧写固件:分块传输固件数据并验证
  5. 验证固件:完成烧写后进行校验
  6. 重启设备:烧写完成后重启到正常运行模式

Bootloader 通过一系列特定的命令与飞控板的 Bootloader 进行通信,例如 PROTO_GET_DEVICE​获取设备信息,PROTO_CHIP_ERASE​擦除芯片等。

Bootloader 烧写机制

QGroundControl 的固件烧写机制基于 PX4 Bootloader 协议,主要步骤如下:

  1. 建立连接:QGC 尝试与设备的 Bootloader 建立通信,使用特定的波特率(通常是 115200)

  2. 同步过程:发送同步字节(0x21),等待设备返回同步应答(0x12),确认设备处于 Bootloader 模式

  3. 获取设备信息:发送 GET_DEVICE​命令,获取芯片 ID、Bootloader 版本、Flash 大小等

  4. 擦除操作:发送 CHIP_ERASE​命令,等待设备擦除完成

  5. 写入固件

    • 将固件分成多个数据块(通常 256 字节每块)
    • 对每个块,发送 PROTO_PROGRAM​命令和目标地址
    • 发送数据块内容
    • 等待设备确认写入成功
  6. 验证固件

    • 发送 PROTO_READ_MULTI​命令读取已写入的数据
    • 与源固件数据比对,确保一致性
  7. 重启设备:发送 PROTO_BOOT​命令,使设备重启到正常运行模式

Bootloader.cc​中,这些操作通过低级函数如 sendCommand​、write​和 read​等实现与设备的通信。

为什么必须进入 Bootloader 模式

必须进入 Bootloader 模式进行固件烧写有以下几个关键原因:

  1. 系统隔离:Bootloader 与主应用程序是隔离的。当系统运行在主应用程序(PX4 固件)模式下,固件会锁定对 Flash 存储器的写入权限,以防止运行时意外修改导致系统崩溃。
  2. 底层硬件访问:Bootloader 拥有直接访问芯片 Flash 存储器的权限,而主应用程序会受到操作系统和安全机制的限制。
  3. 原子性操作:固件更新需要是一个原子操作,任何中断都可能导致固件损坏。Bootloader 专门设计用于执行这种关键操作,具有更简单的执行环境和错误恢复机制。
  4. 防止固件损坏:如果在主应用程序运行时尝试更新固件,可能导致系统崩溃和固件损坏,使设备无法启动。进入 Bootloader 模式提供了一个"安全模式",即使主固件损坏,也能进行恢复。
  5. 硬件初始化:Bootloader 会执行必要的硬件初始化,为固件烧写做准备,包括配置 Flash 存储器访问、禁用看门狗等。

QGroundControl 通过多种方式将设备切换到 Bootloader 模式:

  • 通过串口发送特定命令(例如 Pixhawk 可以通过 MAVLink 命令进入 Bootloader)
  • 通过 DTR/RTS 信号触发设备复位并进入 Bootloader
  • 指导用户手动操作(例如按住特定按钮的同时上电)

这种设计确保了固件更新的安全性和可靠性,即使在更新过程中出现问题,也能通过 Bootloader 进行恢复。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...