はじめに
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.conf
のLAYERSERIES_COMPAT
の値を変更する。
-LAYERSERIES_COMPAT_meta-debix = "hardknott" +LAYERSERIES_COMPAT_meta-debix = "kirkstone"
u-boot
レシピの作成
u-boot-imx_2021.04.bbappend
をu-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
をベースに下記の修正を行っている。
- u-boot-imx-common_${PV}.incの内容を直接取り込む
- UBOOT_SRC、SRCREVをdebixに向ける
- オーバーライドのシンタックスを新書式に対応
- 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.bbappend
をlinux-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
をベースに下記の修正を行っている。
- KERNEL_SRCなどの変数をdebixに向ける
- 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を対応するケースなどのちょうどよいトレーニングになると思う。