MCUboot (1)

2024/07/08

評価ボードnRF5340 MDBT53-1Mモジュールピッチ変換基板が自分でビルドしたアプリを焼くと動かない件の調査である。

nRF Connect SDK(ncs)のブートローダであるsdk-mcubootMCUbootがベースである。 Zephyrのブートローダmcubootがそうだからかもしれないが、まあそこはどうでもよかろう。

構成

design

MCUbootはライブラリとアプリという2パッケージ構成になっている。
boot/bootutilがライブラリで、それ以外のboot/にあるものはアプリのようだ。RIOTのディレクトリが無いがboot_serialなのだろうか?

image

大半はbootutilがやって、最後にmain処理を呼び出したりするところがアプリと呼ぶ部分で行うようになっている。

Image formatに書かれているマクロ定義はboot/bootutil/include/bootutil/image.hにあった。 特にいうことはない。

FLASH_AREA_IMAGE_PRIMARYなどのflash mapに関する定義はアプリに属するようでOSごとに違う定義になっていた。 sysflash.hのような名前がついているが、OSで違う名前になっていたりする。 たとえばZephyrはboot/zephyr/include/sysflash/sysflash.hだ。

デザインの章は説明が長いので、ここら辺で一度止めよう。

HALTしていた箇所

評価ボードnRF5340 MDBT53-1Mモジュールピッチ変換基板で起動せず止まったのはこの箇所。

ループするBOOT_NUM_SLOTSは2。 image_indexは0。slotは0だろう。mix表示にする方法が分からずどのレジスタを見ればよいのかわからんのだ(関数ごと逆アセンブルした表示はできる)。 同様にfa_idも不明。stateは構造体。
うーん。。。よくわからない。

flash_area_open()

元はといえばflash_area_open()がエラーを返しているのだからflash_area_open()を確認するのがよいとは思う。 Zephyr以外のOSはそれぞれint flash_area_open()を実装しているのだがZephyrはそれっぽいのが見つからない。
docs/PORT.mdに出てくるのでカスタマイズがいるような関数、自分で実装しなさいということなんだろう。

mapファイルなどからたどり着いたのが、sdk-mcubootではなくsdk-zephyrのsubsys/storage/flash_map/flash_map.c。 戻り値が-19なので-ENOENTだろう。 が、ブレークポイントが設定できなくてよくわからんかった。