みつきんのメモ

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

秋月の「アレ」をYoctoProjectで遊ぶ(Linux起動まで)

はじめに

秋月の「アレ」をYoctoProjectで遊ぶ(u-boot起動まで)の続き。

u-boot起動まで行くがLinuxカーネルが起動しない。

Linuxカーネルのレシピ

コケる原因

野生のプロがすでに原因を突き止めてた。

パッチの作成

せっかくマシン定義も分離したので、カーネルのデバイスツリーも分離してしまう。

次の内容で/tmp/0001-dts-Add-devicetree-for-am3352-aki.patchを作成する。

From 23531bab2524a625f00d3aba6a3f3f14700a7a30 Mon Sep 17 00:00:00 2001
From: Yusuke Mitsuki <mickey.happygolucky@gmail.com>
Date: Thu, 23 Mar 2023 02:47:07 +0900
Subject: [PATCH] dts: Add devicetree for am3352-aki

Signed-off-by: Yusuke Mitsuki <mickey.happygolucky@gmail.com>
---
 arch/arm/boot/dts/Makefile       | 3 ++-
 arch/arm/boot/dts/am3352-aki.dts | 7 +++++++
 2 files changed, 9 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/boot/dts/am3352-aki.dts

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 27ca1ca6e827..03c0454077a1 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -872,7 +872,8 @@ dtb-$(CONFIG_SOC_AM33XX) += \
    am335x-sbc-t335.dtb \
    am335x-sl50.dtb \
    am335x-wega-rdk.dtb \
-  am335x-osd3358-sm-red.dtb
+   am335x-osd3358-sm-red.dtb \
+   am3352-aki.dtb
 dtb-$(CONFIG_ARCH_OMAP4) += \
    omap4-droid-bionic-xt875.dtb \
    omap4-droid4-xt894.dtb \
diff --git a/arch/arm/boot/dts/am3352-aki.dts b/arch/arm/boot/dts/am3352-aki.dts
new file mode 100644
index 000000000000..47b7ff75b8cf
--- /dev/null
+++ b/arch/arm/boot/dts/am3352-aki.dts
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include "am335x-boneblack.dts"
+
+&pruss_tm {
+   status = "disabled";
+};
-- 
2.34.1

このパッチでは次のことを行っている。

  1. am3352-aki.dtsを作成
  2. am3352-aki.dtsをカーネルのビルド対象に組み込む
  3. pruss_tmノードを無効化する

カーネルレシピ

次のコマンドを実行してカーネルのレシピを作成する。

$ recipetool appendsrcfile ./meta-am3352-aki virtual/kernel /tmp/0001-dts-Add-devicetree-for-am3352-aki.patch

起動確認

local.confの修正

追加したam3352-aki.dtbがイメージに含まれるようにlocal.confに次の行を追加する。

KERNEL_DEVICETREE:am3352-aki = "am3352-aki.dtb"

extlinux.confの修正

この状態でcore-image-minimalを作成しSDカードにイメージを書き込む。しかしそのままでは起動しない。 u-bootが今回新たに作成したam3352-aki.dtbを使用するようになっていないためである。

am3352-aki.dtbを使用するためには、SDカードをLinuxマシンに接続し、ブートパーティションに存在するextlinux.confを書き換える必要がある。

エディタでextlinux.confを開く。

$ vim /media/${USER}/boot/extlinux/extlinux.conf

次のように修正する。

+++ extlinux.conf  2023-03-25 11:43:40.000000000 +0900
@@ -1,5 +1,5 @@
 default Yocto
 label Yocto
    kernel /zImage
-   fdtdir /
+   fdt /am3352-aki.dtb
 append root=PARTUUID=b8ee76af-02 rootwait console=ttyS0,115200

ログイン画面まで進んだ。

Poky (Yocto Project Reference Distro) 4.0.8 am3352-aki /dev/ttyS0

am3352-aki login: root
root@am3352-aki:~#

マシン定義の修正

このままでは、作成したイメージを毎回手作業で修正しなければLinuxが起動できない。

そこで、マシン定義を修正し、extlinux.confでam3352-aki.dtbを参照されるようにする。

meta-am3352-aki/conf/machine/am3352-aki.confに次の内容を追加する。

KERNEL_DEVICETREE:am3352-aki ?= "am3352-aki.dtb"

UBOOT_EXTLINUX:am3352-aki ?= "1"
UBOOT_EXTLINUX_FDT:am3352-aki ?= "../am3352-aki.dtb"
UBOOT_EXTLINUX_ROOT:am3352-aki  ?= "root=PARTUUID=${uuid}"
UBOOT_EXTLINUX_BOOT_FILES:am3352-aki  ?= " \
    extlinux.conf;extlinux/extlinux.conf \
    ${KERNEL_IMAGETYPE} \
    ${KERNEL_DEVICETREE} \
"
IMAGE_BOOT_FILES:am3352-aki ?= "${SPL_BINARY} u-boot.${UBOOT_SUFFIX} ${UBOOT_EXTLINUX_BOOT_FILES}"

これでbitbake一発でLinuxまで起動できるイメージを作成することができるようになる。

まとめ

Linuxが起動できるようになったのでここで区切る。

  • カーネル本体への修正は今の所不要
  • バイスツリーをam3352-aki向けに分離
  • 野生のプロすごい
  • extlinux.confはbitbakeから作成・修正が可能
  • ルートFS含めて一発でビルドできる環境が整った