MCUboot (1)
2024/07/08
評価ボードnRF5340 MDBT53-1Mモジュールピッチ変換基板が自分でビルドしたアプリを焼くと動かない件の調査である。
nRF Connect SDK(ncs)のブートローダであるsdk-mcubootはMCUbootがベースである。 Zephyrのブートローダmcubootがそうだからかもしれないが、まあそこはどうでもよかろう。
構成
MCUbootはライブラリとアプリという2パッケージ構成になっている。
boot/bootutil
がライブラリで、それ以外のboot/
にあるものはアプリのようだ。RIOTのディレクトリが無いがboot_serial
なのだろうか?
大半は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モジュールピッチ変換基板で起動せず止まったのはこの箇所。
- flash_area_openのエラー
- Open primary and secondary image areas for the duration of this call.
- Failed to open flash area ID
<fa_id>
(image<image_index>
slot<slot>
):<rc>
, cannot continue
ループする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
だろう。
が、ブレークポイントが設定できなくてよくわからんかった。