みつきんのメモ

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

YoctoProject meta-debixをkirkstoneに対応する

はじめに

YoctoProject DEBIX Model Aを動かすで作成したmeta-debixはhardknottのみに対応しているがkirkstoneなどでも使用したい。

カーネルとu-bootはdebix提供のものに固定してkirkstoneに対応する。

そのためには下記のようなことを行う。

  • u-boot,kernelのレシピを分離
  • PREFERRED_PROVIDERを分離したレシピに向ける
  • PREFERRED_VERSIONを分離したレシピのものに設定

環境構築

作業ディレクト

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

ダウンロード

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

$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-kirkstone -m imx-5.15.71-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

これらはimx-yocto-bspの独特なお作法となる。

レイヤの作成

レイヤは前回作成したものをベースに作業する。

$ cp -ra ~/yocto/debix-hardknott/sources/meta-debix ~/yocto/debix-kirkstone/sources 

LAYERSERIES_COMPATの変更

kirkstoneでビルド可能なようにconf/layer.confLAYERSERIES_COMPATの値を変更する。

-LAYERSERIES_COMPAT_meta-debix = "hardknott"
+LAYERSERIES_COMPAT_meta-debix = "kirkstone"

u-boot

レシピの作成

u-boot-imx_2021.04.bbappendu-boot-debix_2021.04.bbにリネームする。

$ pushd ../sources/meta-debix/recipes-bsp/u-boot
$ mv u-boot-imx_2021.04.bbappend u-boot-debix_2021.04.bb
$ popd

下記の内容に変更する。

# Copyright (C) 2013-2016 Freescale Semiconductor
# Copyright 2018 (C) O.S. Systems Software LTDA.
# Copyright 2017-2021 NXP
# Copyright 2023 Yusuke Mitsuki <mickey.happygolucky@gmail.com>

require recipes-bsp/u-boot/u-boot.inc

DESCRIPTION = "i.MX U-Boot suppporting DEBIX Model A board."

LICENSE = "GPLv2+"
LIC_FILES_CHKSUM = "file://Licenses/gpl-2.0.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263"

PROVIDES = "virtual/bootloader u-boot"

UBOOT_SRC ?= "git://github.com/debix-tech/uboot.git;protocol=https"
SRCBRANCH = "lf_v2021.04"
SRC_URI = "${UBOOT_SRC};branch=${SRCBRANCH}"
SRCREV = "1a87b972fac74699482e2dce2023b66358d8c4f5"

LOCALVERSION = "-${SRCBRANCH}"

DEPENDS += "flex-native bison-native bc-native dtc-native"

S = "${WORKDIR}/git"
B = "${WORKDIR}/build"

inherit fsl-u-boot-localversion

BOOT_TOOLS = "imx-boot-tools"


do_deploy:append:debix-a() {
    # Deploy u-boot-nodtb.bin and fsl-imx8m*-XX.dtb for mkimage to generate boot binary
    if [ -n "${UBOOT_CONFIG}" ]
    then
        for config in ${UBOOT_MACHINE}; do
            i=$(expr $i + 1);
            for type in ${UBOOT_CONFIG}; do
                j=$(expr $j + 1);
                if [ $j -eq $i ]
                then
                    install -d ${DEPLOYDIR}/${BOOT_TOOLS}
                    install -m 0777 ${B}/${config}/arch/arm/dts/${UBOOT_DTB_NAME}  ${DEPLOYDIR}/${BOOT_TOOLS}
                    install -m 0777 ${B}/${config}/u-boot-nodtb.bin  ${DEPLOYDIR}/${BOOT_TOOLS}/u-boot-nodtb.bin-${MACHINE}-${type}
                fi
            done
            unset  j
        done
        unset  i
    fi
}

UBOOT_TAGGED_BINARY ?= "u-boot-tagged.${UBOOT_SUFFIX}"

deploy_tag() {
    # Append a tag to the bootloader image used in the SD card image
    cp ${UBOOT_BINARY} ${UBOOT_TAGGED_BINARY}
    ln -sf ${UBOOT_TAGGED_BINARY} ${UBOOT_BINARY}
    stat -L -cUUUBURNXXOEUZX7+A-XY5601QQWWZ%sEND ${UBOOT_BINARY} >> ${UBOOT_BINARY}
}

do_deploy:append:debix-a() {
    deploy_tag
}

PACKAGE_ARCH = "${MACHINE_ARCH}"
COMPATIBLE_MACHINE = "debix-a"

UBOOT_NAME:debix-a = "u-boot-${MACHINE}.bin-${UBOOT_CONFIG}"

meta-imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2021.04.bbをベースに下記の修正を行っている。

  1. u-boot-imx-common_${PV}.incの内容を直接取り込む
  2. UBOOT_SRC、SRCREVをdebixに向ける
  3. オーバーライドのシンタックスを新書式に対応
  4. mx8mなどのオーバーライドをdebix-aに変更

マシン定義の修正

conf/machine/debix-a.confにu-boot定義のオーバーライドを追加する。

IMX_DEFAULT_BOOTLOADER:debix-a = "u-boot-debix"
PREFERRED_PROVIDER_virtual/bootloader:debix-a = "u-boot-debix"

=演算子で値を束縛していても、オーバーライドすれば書き換え可能。 local.confなどでは書き換えさせたくないが、マシンごとに値を切り替えたい場合などは有効。

カーネル

レシピの作成

linux-imx_5.10.bbappendlinux-debix_5.10.bbにリネームする。

$ pushd ../sources/meta-debix/recipes-kernel/linux
$ linux-imx_5.10.bbappend linux-debix_5.10.bb
$ mv linux-imx linux-debix
$ popd

下記の内容に変更する。

# Copyright (C) 2013-2016 Freescale Semiconductor
# Copyright 2017-2022 NXP
# Copyright 2023 Yusuke Mitsuki <mickey.happygolucky@gmail.com>
# Released under the MIT license (see COPYING.MIT for the terms)
#
# SPDX-License-Identifier: MIT
#

SUMMARY = "Linux Kernel provided and supported by NXP"
DESCRIPTION = "Linux Kernel provided and supported by NXP with focus on \
i.MX Family Reference Boards. It includes support for many IPs such as GPU, VPU and IPU."

require recipes-kernel/linux/linux-imx.inc

LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"

DEPENDS += "lzop-native bc-native"

SRCBRANCH = "debix"
LOCALVERSION = "-lts-next"
KERNEL_SRC ?= "git://github.com/debix-tech/linux;protocol=https;branch=${SRCBRANCH}"
KBRANCH = "${SRCBRANCH}"
SRC_URI = "${KERNEL_SRC} \
  file://0001-linux-imx-fix-tar-option.patch"

SRCREV = "f924d76e63c153f58206425d31f88c5771caeb80"

# PV is defined in the base in linux-imx.inc file and uses the LINUX_VERSION definition
# required by kernel-yocto.bbclass.
#
# LINUX_VERSION define should match to the kernel version referenced by SRC_URI and
# should be updated once patchlevel is merged.
LINUX_VERSION = "5.10.72"

KERNEL_CONFIG_COMMAND = "oe_runmake_call -C ${S} CC="${KERNEL_CC}" O=${B} olddefconfig"

DEFAULT_PREFERENCE = "1"

DO_CONFIG_V7_COPY = "no"
DO_CONFIG_V7_COPY:debix-a = "no"

# Add setting for LF Mainline build
IMX_KERNEL_CONFIG_AARCH32 = "imx_v7_defconfig"
IMX_KERNEL_CONFIG_AARCH64 = "imx_v8_defconfig"
KBUILD_DEFCONFIG ?= ""
KBUILD_DEFCONFIG:debix-a= "${IMX_KERNEL_CONFIG_AARCH64}"

# Use a verbatim copy of the defconfig from the linux-imx repo.
# IMPORTANT: This task effectively disables kernel config fragments
# since the config fragments applied in do_kernel_configme are replaced.
addtask copy_defconfig after do_kernel_configme before do_kernel_localversion
do_copy_defconfig () {
    install -d ${B}
    if [ ${DO_CONFIG_V7_COPY} = "yes" ]; then
        # copy latest IMX_KERNEL_CONFIG_AARCH32 to use for mx6, mx6ul and mx7
        mkdir -p ${B}
        cp ${S}/arch/arm/configs/${IMX_KERNEL_CONFIG_AARCH32} ${B}/.config
    else
        # copy latest IMX_KERNEL_CONFIG_AARCH64 to use for mx8
        mkdir -p ${B}
        cp ${S}/arch/arm64/configs/${IMX_KERNEL_CONFIG_AARCH64} ${B}/.config
    fi
}

DELTA_KERNEL_DEFCONFIG ?= ""
#DELTA_KERNEL_DEFCONFIG:mx8-nxp-bsp = "imx.config"

do_merge_delta_config[dirs] = "${B}"
do_merge_delta_config[depends] += " \
    flex-native:do_populate_sysroot \
    bison-native:do_populate_sysroot \
"
do_merge_delta_config() {
    for deltacfg in ${DELTA_KERNEL_DEFCONFIG}; do
        if [ -f ${S}/arch/${ARCH}/configs/${deltacfg} ]; then
            ${KERNEL_CONFIG_COMMAND}
            oe_runmake_call -C ${S} CC="${KERNEL_CC}" O=${B} ${deltacfg}
        elif [ -f "${WORKDIR}/${deltacfg}" ]; then
            ${S}/scripts/kconfig/merge_config.sh -m .config ${WORKDIR}/${deltacfg}
        elif [ -f "${deltacfg}" ]; then
            ${S}/scripts/kconfig/merge_config.sh -m .config ${deltacfg}
        fi
    done
    cp .config ${WORKDIR}/defconfig
}
addtask merge_delta_config before do_kernel_localversion after do_copy_defconfig

do_kernel_configcheck[noexec] = "1"

KERNEL_VERSION_SANITY_SKIP="1"
COMPATIBLE_MACHINE = "debix-a"

meta-imx/meta-bsp/recipes-kernel/linux/linux-imx_5.15.bbをベースに下記の修正を行っている。

  1. KERNEL_SRCなどの変数をdebixに向ける
  2. mx8などのオーバーライドをdebix-aに変更

マシン定義の修正

conf/machine/debix-a.confにカーネル定義のオーバーライドを追加し、KERNEL_DEVICETREEの値を変更する。

diff --git a/conf/machine/debix-a.conf b/conf/machine/debix-a.conf
index b603365..6029e14 100644
--- a/conf/machine/debix-a.conf
+++ b/conf/machine/debix-a.conf
@@ -4,6 +4,8 @@ require conf/machine/imx8mp-lpddr4-evk.conf
 IMX_DEFAULT_BOOTLOADER:debix-a = "u-boot-debix"
 PREFERRED_PROVIDER_virtual/bootloader:debix-a = "u-boot-debix"
 
+PREFERRED_PROVIDER_virtual/kernel:debix-a = "linux-debix"
+
 KERNEL_DEVICETREE:remove:debix-a = " \
        freescale/imx8mp-evk-dsp.dtb \
        freescale/imx8mp-evk-ecspi-slave.dtb \
@@ -35,4 +37,11 @@ KERNEL_DEVICETREE:remove:debix-a = " \
        freescale/imx8mp-evk-sof-wm8960.dtb \
        freescale/imx8mp-evk-spdif-lb.dtb \
        freescale/imx8mp-evk-usdhc1-m2.dtb \
+       freescale/imx8mp-evk-dpdk.dtb \
+       freescale/imx8mp-evk-dual-os08a20.dtb \
+       freescale/imx8mp-evk-os08a20.dtb \
+       freescale/imx8mp-evk-os08a20-ov5640.dtb \
+       freescale/imx8mp-evk-revA3-8mic-revE.dtb \
+       freescale/imx8mp-evk-rpmsg-lpv.dtb \
+       freescale/imx8mp-evk-8mic-swpdm.dtb \
 "

ビルド

local.confの修正

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

MACHINE ?= "debix-a"
IMAGE_ISNTALL:append = " linux-debix-modules"

bitbake

core-image-minimalをビルドする。

$ bitbake core-image-minimal

動作確認

NXP i.MX Release Distro 5.15-kirkstone debix-a ttymxc1

debix-a login: root
Last login: Thu Apr 28 17:43:14 UTC 2022 on ttymxc1
root@debix-a:~# uname -a
Linux debix-a 5.10.72+g158599ad1 #1 SMP PREEMPT Tue Jan 10 10:28:10 UTC 2023 aarch64 GNU/Linux
root@debix-a:~# cat /etc/os-release
ID=fsl-imx-wayland
NAME="NXP i.MX Release Distro"
VERSION="5.15-kirkstone (kirkstone)"
VERSION_ID=5.15-kirkstone
PRETTY_NAME="NXP i.MX Release Distro 5.15-kirkstone (kirkstone)"
DISTRO_CODENAME="kirkstone"
root@debix-a:~#

OSのバージョンはkirkstoneで、カーネルバージョンは5.10.72+g158599ad1となっている。

まとめ

meta-debixを修正して、kirkstoneに対応した。

カーネルとu-bootはそれぞれパッケージ名を変更し、 imx-yocto-bspで提供しているカーネルやu-bootとは分離している。

バージョンを固定することでカーネルなどが古いままになってしまうため、ドライバがバイナリ提供されているGPUなどの一部機能はそのままでは使用できない。

ただ、このような移植は、YoctoProject非対応のカーネルやu-bootを対応するケースなどのちょうどよいトレーニングになると思う。