Orion:ブートローダー(Main 基板)¶
Orion(4輪オムニホイール)の Main 基板(STM32G474)は、User Flash の先頭に基板専用のアプリケーションブートローダー(Bootloader/)を置き、通常アプリを A/B の 2 スロットで持つ。CM4 からの UART 更新、PENDING と CONFIRM、起動に失敗したときのロールバックを担当する。以下はOrionの更新ツールとMainが共有するイメージ配置・起動状態・更新中の安全動作の契約である。更新手順の全体は MCU ファームウェア更新、機種別の入口は STM 概要 を参照。
STM32 の System Memory bootloader、BOOT0 による ROM boot、ハードウェアのバンクスワップ(BFB2)は使わない。
Flash 配置¶
値は Bootloader/Inc/boot_config.h にまとめてあり、通常アプリのリンカ設定と metadata 生成スクリプトも同じ値を使う。
| 領域 | アドレス | サイズ | 用途 |
|---|---|---|---|
| Bootloader | 0x08000000〜0x08007FFF |
32 KB | 更新中の安全動作、起動判定、UART 更新 |
| Slot A | 0x08008000〜0x0803FFFF |
224 KB | 通常アプリ |
| Slot B | 0x08040000〜0x08077FFF |
224 KB | 通常アプリ |
| Metadata | 0x08078000〜0x0807FFFF |
32 KB | Slot A metadata(先頭)、Slot B metadata(+0x800)、control record(+0x1000) |
- 更新イメージは書込み先スロットのアドレスにリンクする。
- アプリ先頭の
+0x400には.fw_version(FWVRmagic と build ID)を置く(MCU ファームウェア更新)。
metadata と control record¶
- metadata(スロットごと):magic
OFW1、format version、record size、slot、image base、image size、image CRC32C、generation、state、record CRC32C。state はEMPTY/RECEIVING/VERIFIED/PENDING/CONFIRMED/INVALID。 - control record:magic、format version、generation、優先スロット(
preferred_slot)、起動試行回数(boot_attempts)、record CRC32C。
起動と確定の契約¶
イメージとmetadataを検証してから有効なスロットを起動する。PENDINGを起動するたびに試行回数を記録し、3回確定できなかった場合は、もう一方の有効なCONFIRMEDスロットへ戻す。起動できるスロットがなければ通常制御を開始せず停止する。
検証・スロット選択・CPU状態の引継ぎ・安全IOの実装はMainブートローダー実装で管理する。
UART 更新(OFW1)¶
通常アプリは CM4 から FWUP の更新要求を受けると、現在の稼働スロットと要求を bootloader に引き渡して再起動する。更新には CM4 との UART 通信 を使い、**稼働していないほうのスロット**へ書き込む。
- フレーム:magic
OFW1、version、type、sequence、length のヘッダ(12 バイト、CRC16 付き)と payload。応答には CRC32C を付ける。 - メッセージ:
INFO(両スロットの状態)、BEGIN(対象スロットとイメージサイズを指定し、metadata と必要なページを消去)、CHUNK(offset と chunk CRC32C 付き、最大 896 バイト。offset は連続していなければならない)、FINALIZE(ベクタと全体 CRC32C を検証し、PENDING の metadata を書いて control record の優先スロットを書込み先にする)、REBOOT。 - 再起動後、PENDING のスロットが起動する。CM4 は新しいアプリが動いていることを確認してから
FWUPの CONFIRM 要求を送り、CONFIRMED にする。
CM4 側のツールは cm4/firmware/main_ab_updater.py。
更新中の安全動作¶
- bootloader では通常の走行制御を開始しない。
- 更新開始から通常アプリへの切り替えまで、ブザーを停止状態に保つ。Main 自身の更新中だけでなく、CAN ノードの更新を中継している間も同じである。
- SWD によるデバッグ接続を維持する。
- 起動するスロットの検証中と、起動できるスロットがないときは 起動と確定の契約 に従って LED で状態を示す。
開発・導入手順¶
ビルド、初回導入、ST-Linkによる復旧・書込み、WRPの運用はMain側の導入手順を参照する。CM4からの更新はMCU更新の給電順序と更新契約に従う。