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のメモリを見た。

image

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.confCONFIG_BOOTLOADER_MCUBOOT=yより後ろをコメントアウトしても同じ。 CONFIG_BOOTLOADER_MCUBOOT=yもコメントアウトしたら動いた。 child_image/を削除すると動いたような感触。

今回はいろいろ当てが外れた実験であった。進まんなぁ。