MCUboot (4)
2024/07/14
評価ボードnRF5340 MDBT53-1Mモジュールピッチ変換基板が自分でビルドしたアプリを焼くと動かない件の調査である。
DevAcademy
DevAcademyにBootloader basicsがあったので眺めた。
実行コードが0x0000_0000からと書いてあるけど、ARM(not Cortex-M)はそうだったが Cortex-M は 0x0000_0000 が SP(スタックポインタレジスタ)の初期値で 0x0000_0004 がリセットベクタのはずである。 Cortex-M3はそうだったしCortex-M33にもそう書いてある。
念のため、今デバッグしているMDBT53のメモリを見た。
RAMは 0x2000_0000 から始まっているので、先頭4byteの 0x2005a258 はスタックメモリの開始アドレスだろう。
そして続く 0x0000_3f75 はリセットベクタである。Thumbなので LSB に 1 が立っているため実際のアドレスは 0x0000_3f74である。
ビルドした blinkyアプリの ./build_mdbt53/mcuboot/zephyr/zephyr_final.map
を検索するとこうなっていた。
起動直後に実行されるプログラムはreset.S
なのか。
.text._reset_section
0x0000000000003f74 0x60 zephyr/arch/arch/arm/core/cortex_m/libarch__arm__core__cortex_m.a(reset.S.obj)
0x0000000000003f74 __start
0x0000000000003f74 z_arm_reset
DevAcademyにはMCUbootもあった。
プロジェクトにCONFIG_BOOTLOADER_MCUBOOT=y
を設定するだけで有効になる、と書いてあるのでやり方は間違ってない。
Serial Recovery Mode
MCUbootにはSerial Recovery Modeというモードがある。 上に書いたボタンを押しながら起動するのがそれで、今回であればUSBを使っているのでDFU over USBなのかもしれない。
DevAcademyのMCUbootにはこうある。
This does not add any DFU functionality.
追加しただけではDFU機能は付いていないということは、nRF5340DKの定義ファイルにCONFIG_BOOTLOADER_MCUBOOT=y
を設定しただけでは DFU over USB が組み込まれずボタンを押したまま起動しても何も起こらないということだろうか。
それなら今の動作も納得できる。
そしてもう1つ知らなかったことが。
vscodeでMCUbootのKconfigを設定する場合は APPLICATIONS でmcuboot
を選択してから ACTIONS の nRF Kconfig GUI をクリックするそうだ。
チュートリアル(正確には Lesson)を進めると、UARTでのDFU、USBでのDFUなどができるようになっていく。 もしかするとnRF5340DKのボード定義がMCUboot未対応になっているのはチュートリアルをするためなのか?
inter_less8_exer2_solution
細かい過程はさておき、お手本がほしいので DevAcademy の Lesson 8、その中の DFU over USB を行っている Execise 2 をやってみる。
幸いなことにディレクトリに_solution
とついている方が正解というか結果になるようなので、inter_less8_exer2_solution
を試せば良かろう。
しかし動かない。。。 Debugがうまくできなかったのでattachしたらブートローダで止まっていた。
fih_panic_loop () at C:/ncs/v2.7.0/bootloader/mcuboot/boot/bootutil/src/fault_injection_hardening.c:68
68 __asm volatile ("b fih_panic_loop");
例の止まる現象ならよいのだが、ボタンを押して起動しても同じ。
prj.conf
のCONFIG_BOOTLOADER_MCUBOOT=y
より後ろをコメントアウトしても同じ。
CONFIG_BOOTLOADER_MCUBOOT=y
もコメントアウトしたら動いた。
child_image/
を削除すると動いたような感触。
今回はいろいろ当てが外れた実験であった。進まんなぁ。