はじめに
お年玉でSTM32MP157F-DK2を購入した。
この製品、Cortext-A7とM4ヘテロ構成のSoCでスペック的にはあまり強くなさそうなんだけど、 BSPをみると、なんだかコア間の連携のための仕組みが作り込まれててちょっとおもしろそう。 値段も15000〜16000程度なので、液晶パネル付きでこれなら楽しめるだろうと。
STMicroelectronicsはmeta-st-stm32mpを提供してくれているため、 YoctoProjectでLinuxを作成することができる。
kirkstoneブランチに対応しているので、とりあえず起動確認をしてみる。
環境構築
作業環境
$ mkdir -p ~/yocto/stm32mp15-kirkstone $ cd ~/yocto/stm32mp15-kirkstone
pokyの取得
$ git clone -b kirkstone git://git.yoctoproject.org/poky.git
環境変数の設定
$ source poky/oe-init-build-env
meta-openembeddedの取得
meta-st-stm32mpはmeta-openembeddedの一部のレイヤに依存するため、先に取得しておく。
$ bitbake-layers layerindex-fetch meta-python
meta-st-stm32mpの取得
gitコマンドで取得する。
$ pushd ../poky $ git clone https://github.com/STMicroelectronics/meta-st-stm32mp.git -b kirkstone $ popd $ bitbake-layers add-layer ../poky/meta-st-stm32mp
local.conf
MACHINEを設定する。STM32MP157F-DK2
はstm32mp1
で行けるらしい。
MACHINE ?= "stm32mp1"
ビルド
まずは最小構成を作成して起動確認する。
$ bitbake core-image-minimal
書き込み
build/tmp/deploy/images/stm32mp1
を確認するとwicイメージが生成されていない。
どうやら、build/tmp/deploy/images/stm32mp1/scripts/create_sdcard_from_flashlayout.sh
を使用して、バラバラにできたファイルシステムのイメージを1つのイメージファイルにまとめるらしい。
そのレイアウト情報はbuild/tmp/deploy/images/stm32mp1/flashlayout_core-image-minimal
以下に配置されている、*.tsvファイルらしい。
試しに1つ見てみる。
#Opt Id Name Type IP Offset Binary - 0x01 fsbl-boot Binary none 0x0 arm-trusted-firmware/tf-a-stm32mp157f-dk2-usb.stm32 - 0x03 fip-boot FIP none 0x0 fip/fip-stm32mp157f-dk2-optee.bin P 0x04 fsbl1 Binary mmc0 0x00004400 arm-trusted-firmware/tf-a-stm32mp157f-dk2-sdcard.stm32 P 0x05 fsbl2 Binary mmc0 0x00044400 arm-trusted-firmware/tf-a-stm32mp157f-dk2-sdcard.stm32 P 0x06 metadata1 Binary mmc0 0x00084400 arm-trusted-firmware/metadata.bin P 0x07 metadata2 Binary mmc0 0x000C4400 arm-trusted-firmware/metadata.bin P 0x08 fip-a FIP mmc0 0x00104400 fip/fip-stm32mp157f-dk2-optee.bin PED 0x09 fip-b FIP mmc0 0x00504400 none PED 0x0A u-boot-env Binary mmc0 0x00904400 none P 0x10 bootfs System mmc0 0x00984400 st-image-bootfs-poky-stm32mp1.ext4 P 0x11 vendorfs FileSystem mmc0 0x04984400 st-image-vendorfs-poky-stm32mp1.ext4 P 0x12 rootfs FileSystem mmc0 0x05984400 core-image-minimal-stm32mp1.ext4
はっきり言ってダサい。wksファイルと何が違うのだろうか。
最初からwicイメージ吐けばいいだろう。こんなものは使用しない。
wicイメージ
IMAGE_FSTYPES
IMAGE_FSTYPESを確認する。
$ bitbake core-image-minimal -e | grep '^IMAGE_FSTYPES=' IMAGE_FSTYPES=" tar.xz ext4 stmultiubi"
wicイメージは出力していない。
wicを出力する
local.confに下記の内容を追加して、wicイメージを吐くようにする。
IMAGE_FSTYPES:append = " wic.bz2 wic.bmap" WKS_FILE = "sdcard-stm32mp157f-dk2-optee-1GB.wks.in"
bitbakeすると下記の様になる。
| wic.filemap.Error: cannot open image file '/home/mickey/yocto/stm32mp15-kirkstone/build/tmp/deploy/images/stm32mp1/st-image-bootfs-poky-stm32mp1.ext4': [Errno 2] No such file or directory: '/home/mickey/yocto/stm32mp15-kirkstone/build/tmp/deploy/images/stm32mp1/st-image-bootfs-poky-stm32mp1.ext4' | WARNING: exit code 1 from a shell command. ERROR: Task (/home/mickey/yocto/stm32mp15-kirkstone/poky/meta-st-stm32mp/recipes-st/images/st-image-userfs.bb:do_image_wic) failed with exit code '1'
エラーの原因を調査
まずは、st-image-userfs.bbのdo_image_wicタスクでエラーになる。 これしつこくbitbakeを繰り返すと、下記の3つのレシピのdo_image_wicでエラーになることがわかる。
- st-image-userfs.bb
- st-image-bootfs.bb
- st-image-vendorfs.bb
この原因は、wksを見てみるとなんとなくわかる。
... (snip) ... # Bootfs part bootfs --source rawcopy --sourceparams="file=st-image-bootfs-${DISTRO}-${MACHINE}.ext4" --ondisk mmcblk --fstype=ext4 --label bootfs --active --fixed-size 64M # Rootfs part / --source rootfs --ondisk mmcblk --fstype=ext4 --label rootfs --fixed-size 783M --uuid e91c4e10-16e6-4c0e-bd0e-77becf4a3582 # Userfs part usrfs --source rawcopy --sourceparams="file=st-image-userfs-${DISTRO}-${MACHINE}.ext4" --ondisk mmcblk --fstype=ext4 --label userfs --fixed-size 128M ... (snip) ...
sourceparamsでst-image-XXXfsのext4を要求している。
st-image-XXXfsのwicを吐き出すためにはその他のst-image-YYYfsのext4がほしいので。。。となる。 つまり、st-image-userfsのdo_image_ext4のためにこのレシピが処理されるんだけど、そのついでにdo_image_wicも実行しようとするので、 今度はst-image-XXXfs.ext4が見つからない!とエラーになる。
でもst-image-*.bbのレシピの処理結果としてはext4がほしいのであって、これらでdo_image_wicは実行される必要はない。
ワークアラウンド
まず、ワークアラウンド用のレイヤを作成
$ bitbake-layers create-layre meta-work $ bitbake-layers add-layer ./meta-work
下記のレシピにbbappendを追加
- st-image-userfs.bb
- st-image-bootfs.bb
- st-image-vendorfs.bb
$ recipetool newappend ./meta-work st-image-userfs -e $ recipetool newappend ./meta-work st-image-userfs -e $ recipetool newappend ./meta-work st-image-userfs -e
それぞれのbbappendに下記を追加。
do_image_wic[noexec] = "1"
最終的にはこんな感じになる。
./meta-work/ ├── COPYING.MIT ├── README ├── conf │ └── layer.conf ├── recipes-example │ └── example │ └── example_0.1.bb └── recipes-st └── images ├── st-image-bootfs.bbappend ├── st-image-userfs.bbappend └── st-image-vendorfs.bbappend
これで、st-image-*のレシピでdo_image_wicは実行されなくなる。
ビルド確認
これでビルドが通るか試す。
$ bitbake core-image-minimal
wicがちゃんとできているか確認
$ pushd ./tmp/deploy/images/stm32mp1/ $ ls -l | grep 'wic' -rw-r--r-- 2 mickey mickey 5485 1月 7 18:28 core-image-minimal-stm32mp1-20230107083645.rootfs.wic.bmap -rw-r--r-- 2 mickey mickey 12637934 1月 7 18:28 core-image-minimal-stm32mp1-20230107083645.rootfs.wic.bz2 -rw-r--r-- 2 mickey mickey 5928 1月 7 20:38 core-image-minimal-stm32mp1-20230107113713.rootfs.wic.bmap -rw-r--r-- 2 mickey mickey 12641796 1月 7 20:38 core-image-minimal-stm32mp1-20230107113713.rootfs.wic.bz2 lrwxrwxrwx 2 mickey mickey 58 1月 7 20:38 core-image-minimal-stm32mp1.wic.bmap -> core-image-minimal-stm32mp1-20230107113713.rootfs.wic.bmap lrwxrwxrwx 2 mickey mickey 57 1月 7 20:38 core-image-minimal-stm32mp1.wic.bz2 -> core-image-minimal-stm32mp1-20230107113713.rootfs.wic.bz2
このwicイメージでSDカードを作成して起動確認する。
動作確認
ボードの準備
- 箱から出す
- マイクロSDを挿す
- ST-LINK(CN11)にUSB-Micro-BでPCに挿す
- /dev/ttyACM0でminicomを実行する
- PWR IN(CN6)にUSB-Cで電源を挿す
ログイン
minicomでログイン画面を確認する。
Poky (Yocto Project Reference Distro) 4.0.6 stm32mp1 /dev/ttySTM0 stm32mp1 login: root root@stm32mp1:~#
Gotcha!!
おまけ
今回のワークアラウンドは毎回やるのが面倒くさいのと、明らかに実装のバグにみえるのでプルリクエストを出した。 46番としてPR出したら「お前誰よ?」って即クローズされた。CLAの登録をして再度PR提出。
実は、先程bbappendを作成した3つのレシピはすべてst-image-partitions.inc
をインクルードしているので、こいつにdo_image_wic[noexec]を追加してやるだけのパッチとしてPRを作成した。
まとめ
- Linuxが動くSTM32のボード(STM32MP157F-DK2)を買った
- meta-st-stm32mpがあるのでYoctoProjectでも使用可能
- wicが吐けない
- ワークアラウンドで乗り切った
- 実機でcore-image-minimalが動いた
- ついでだからプルリクエスト作成した
引き続き、このボードで遊んでみたい。