みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

YoctoProject STM32MP157F-DK2を試す

はじめに

お年玉で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-DK2stm32mp1で行けるらしい。

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カードを作成して起動確認する。

動作確認

ボードの準備

  1. 箱から出す
  2. マイクロSDを挿す
  3. ST-LINK(CN11)にUSB-Micro-BでPCに挿す
  4. /dev/ttyACM0でminicomを実行する
  5. 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が動いた
  • ついでだからプルリクエスト作成した

引き続き、このボードで遊んでみたい。