みつきんのメモ

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

DEBIX Model Aを動かす

はじめに

DEBIX Model Aを購入した。

対応OSにYocto-L5.10.72_2.2.0とあるので買ってみたのだが、ビルド手順が見つからない。

カーネルとu-bootはgithubにある。

u-bootのREADMEに下記の表記が。

これは既存のimx-yocto-bspのレシピを直接編集して、無理やり動くようにするやり方。

カーネルについては独自にビルドして一度イメージを書き込んだストレージ(ここではSDカード)をマウントして、 内容を書き換えるという手順になっている。

できればwicイメージを書き込んだSDカードを後からどうにかするのではなく、 wicイメージをどうにかして、ちゃんと動く環境を作りたい。

ピンヘッダ

デバッグシリアル用のUARTは40ピンのピンヘッダに引き出されているが、このピンヘッダは2mmピッチなので注意が必要(ラズパイなどは2.54mm)。 筆者は2mmピッチから線を引き出せるジャンパワイヤを使用している。

公開されている手順

DebixのGitHubリポジトリに記載されている手順を簡単にまとめると下記のようになる。

  • レシピを直接修正してu-bootをビルドする
  • YoctoProjectとは別のツールチェーンでカーネルをビルドする

Debix用のOSを書き込んだSDカードをマウントして下記を実施する。

  • カーネルを差し替える
  • バイスツリーを差し替える
  • ストレージ上のルートFSにモジュールをインストールする

今回実施する手順

最終的にはu-bootとカーネルが差し替わったwicイメージを作成する。

u-boot

u-bootに関してはひとまず公式の手順を踏襲し、予めwicイメージに含まれるようにする。

カーネル

カーネルは下記の方針で作業する。

環境構築

作業ディレクト

$ mkdir -p ~/yocto/debix-hardknott
$ cd ~/yocto/debix-hardknott

ダウンロード

repoツールで環境をダウンロードする。

$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-hardknott -m imx-5.10.72-2.2.0.xml
$ repo sync

初期セットアップ

imx-yocto-bsp特有の初期セットアップ

$ DISTRO=fsl-imx-wayland MACHINE=imx8mp-lpddr4-evk source imx-setup-release.sh -b build

EULAが表示されるので最後まで読んでyを入力する。

2回目以降

別の端末を開いて、すでに作成されてビルドディレクトリを使用する場合は下記を実行する。

$ source setup-environment build

local.confの修正

conf/local.confに下記を追加する。

IMAGE_FSTYPES_append = " wic"

ここまででbitbakeによってイメージを作成するための環境は作成できた。

Debix向けのイメージの作成

u-bootの修正

u-bootのREADMEに従って、sources/meta-imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2021.04.bbを改ざんする。

UBOOT_SRC ?= "git://github.com/debix-tech/uboot.git;protocol=https"
SRCREV = "1a87b972fac74699482e2dce2023b66358d8c4f5"

ビルド

まず一度イメージをビルドしてみる。

$ bitbake core-image-minimal

カーネルの修正

ツールチェーンのビルド

カーネルをビルドするためにツールチェーンをビルドする。

$ bitbake meta-toolchain

ツールチェーンのインストール

別の端末で下記を実行。

$ cd ~/yocto/debix-hardknott/build/tmp/deploy/sdk/
$ ./fsl-imx-wayland-glibc-x86_64-meta-toolchain-cortexa53-crypto-imx8mp-lpddr4-evk-toolchain-5.10-hardknott.sh

カーネルビルド

ソースの取得

$ cd ~/yocto/debix-hardknott
$ git clone --depth=1 https://github.com/debix-tech/linux
$ cd linux

ビルド

SDKカーネルをビルドする。

$ source /opt/fsl-imx-wayland/5.10-hardknott/environment-setup-cortexa53-crypto-poky-linux
$ make imx_v8_defconfig
$ make -j 32

モジュールのインストール

カーネルをビルドした端末で下記のコマンドを実行する。

$ make INSTALL_MOD_PATH=../build/tmp/work/imx8mp_lpddr4_evk-poky-linux/core-image-minimal/1.0-r0/rootfs INSTALL_MOD_STRIP=1 modules_install
$ sudo chown -R root:root ../build/tmp/work/imx8mp_lpddr4_evk-poky-linux/core-image-minimal/1.0-r0/rootfs/lib/modules/5.10.72

bitbakeを実行した端末で下記のコマンドを実行する。

$ bitbake core-image-minimal -c do_image_wic -f
$ bitbake core-image-minimal -f

カーネルdtbの差し替え

bitbakeを実行した端末で下記のコマンドを実行し、生成済みのwicイメージのカーネルdtbを差し替える。

$ wic cp ../linux/arch/arm64/boot/Image ./tmp/deploy/images/imx8mp-lpddr4-evk/core-image-minimal-imx8mp-lpddr4-evk.wic:1
$ wic cp ../linux/arch/arm64/boot/dts/freescale/imx8mp-evk.dtb ./tmp/deploy/images/imx8mp-lpddr4-evk/core-image-minimal-imx8mp-lpddr4-evk.wic:1

wic cpは直接wicイメージのファイルを差し替えられて便利だが、ファイルが追加されるような変更をするとイメージが壊れることがあるので注意が必要。

差し替えを確認

bitbakeを実行した端末で下記のコマンドを実行し、カーネル

$ wic ls ./tmp/deploy/images/imx8mp-lpddr4-evk/core-image-minimal-imx8mp-lpddr4-evk.wic:1
Volume in drive : is boot       
 Volume Serial Number is BA80-4C7C
Directory for ::/

IMAGE         31474176 2023-01-29   8:47  Image
... (snip) ...

wicイメージ上のカーネルモジュールを確認する。 Imageとimx8mp-evk.dtbだけ他と日付が異なっていればOK。

$ wic ls ./tmp/deploy/images/imx8mp-lpddr4-evk/core-image-minimal-imx8mp-lpddr4-evk.wic:2/lib/modules
debugfs 1.45.5 (07-Jan-2020)
    616   40755 (2)      0      0    1024 11-Feb-2023 10:42 .
    548   40755 (2)      0      0    3072  9-Mar-2018 21:34 ..
    617   40775 (2)      0      0    1024 11-Feb-2023 10:42 5.10.72
   1487   40755 (2)      0      0    1024  9-Mar-2018 21:34 5.10.72-lts-5.10.y+ga68e31b63f86

5.10.72があればOK。

動作確認

修正したcore-image-minimal-imx8mp-lpddr4-evk.wicをマイクロSDに書き込んで動作確認する。

起動した。差し替えたカーネルではUSBのキーボードなどのペリフェラルもきちんと動いているようだ。

まとめ

i.MX8M Plus搭載のボードが2万円弱で手に入るのは嬉しい。 DEBIX Model Aで遊ぶのは楽しそうだ。

YoctoProject対応をうたっていて、実際にイメージも配布されているが、どうやらbitbakeしたイメージにいろいろ手を加えたものを配布しているようだ。

今回はwicコマンドなどを駆使して、無理やりイメージを作成した。 近いうちにbitbake一発でイメージを吐き出せるようにしたい。