みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

Giant BoardをYoctoに対応する

はじめに

Giant BoardをDebian GNU/Linux 9 (stretch)で動かす動かしたGiant BoardをYoctoProjectに対応する。

ここでは新規ボード向けにYoctoProjectのレイヤを作る最小限の手順を紹介する。

新規ボードのレイヤを作る

YoctoProjectが未対応のボードに対応するためにはBSPレイヤを作成する。BSPレイヤを作成する場合次のものが必要となる。

今回はmeta-giantboardというレイヤを作成する。

作成の方針

meta-atmel

SAMA5向けのブートストラップなどはmeta-atmelで定義されている。

https://github.com/linux4sam/meta-atmelをベースにGiant Board向けの対応を作成する。

今回はmeta-atmelに取り込んでもらう目的ではないため独自にmeta-giantboardを作成する。この時meta-atmelのレシピの作り方などは参考にさせてもらう。

Giant Board対応の変更

at91bootstrap、u-bootおよびLinuxカーネルへのGiand Board対応の変更についてはgiantboard-toolsから取り込む。

下記のコマンドで一通りのビルドを実行しているものとする。

$ cd
$ git clone https://github.com/Groboards/giantboard-tools.git
$ cd giantboard-tools
$ chmod +x build_menu.sh
$ ./build_menu.sh

作業環境の作成

ベース環境の構築

Dunfell(3.1)をベースに環境を作る。

$ mkdir -p ~/gb-dunfell/layers && cd ~/gb-dunfell/layers
$ git clone git://git.yoctoproject.org/poky.git -b dunfell
$ cd ../

環境変数設定

$ source layers/poky/oe-init-build-env build

自動的にビルドディレクトリに移動される。 これで、bitbake関連のツールが使用可能になる。

meta-giantboardの作成

$ bitbake-layers create-layer meta-giantboard -p 9
$ rm -rf ./meta-giantboard/recipes-example
$ mv ./meta-giantboard/ ../layers/

ビルド対象へ追加

$ bitbake-layers add-layer ../layers/meta-giantboard

Giant BoardのHW情報

CPU

# cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 1 (v7l)
BogoMIPS        : 326.86
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc05
CPU revision    : 1

Hardware        : Atmel SAMA5
Revision        : 0000
Serial          : 0000000000000000

メモリ

# free -h
              total        used        free      shared  buff/cache   available
Mem:           117M         14M         70M        960K         33M         97M
Swap:            0B          0B          0B

マシン定義の作成

$ cd ../layers/meta-giantboard
$ mkdir -p conf/machine

conf/machine/giantboard.confを以下の内容で作成する。

#@TYPE: Machine
#@Name: Groboards Giant Board
#@DESCRIPTION: A single-board computer in the Adafruit Feather form factor.

# Atmel SAMA5 defaults
require conf/machine/include/soc-family.inc
require conf/machine/include/tune-cortexa5.inc

# Atmel SAMA5D2 defaults
SOC_FAMILY ?= "sama5:sama5d2"
DEFAULTTUNE ?= "cortexa5thf-neon-vfpv4"

# Machine Features
MACHINE_FEATURES ?= "apm vfat ext2 serial usbhost usbgadget"

# Virtual package definitions
PREFERRED_PROVIDER_virtual/kernel_sama5 ?= "linux-giantboard"
PREFERRED_PROVIDER_virtual/bootloader_sama5 ?= "u-boot-at91"
PREFERRED_PROVIDER_u-boot_sama5 ?= "u-boot-at91"

PREFERRED_PROVIDER_jpeg ?= "jpeg"
PREFERRED_PROVIDER_jpeg-native ?= "jpeg-native"

# Default settings for serial console
SERIAL_CONSOLES ?= "115200;ttyS0"

# Kernel informations
PREFERRED_VERSION_linux ?= "5.4%"
KERNEL_DEVICETREE ?= " \
                at91-sama5d27_giantboard.dtb \
        "

# Settings for wic image
do_image_wic[depends] += "at91bootstrap:do_deploy u-boot-at91:do_deploy"
IMAGE_FSTYPES += " tar.gz wic.bz2 wic.bmap"
WKS_FILE ?= "sdimage-bootpart.wks"
WIC_CREATE_EXTRA_ARGS ?= "--no-fstab-update"

# File definitions that BOOT partation contains.
IMAGE_BOOT_FILES ?= "BOOT.BIN \
           u-boot.bin \
           uEnv.txt \
           ${KERNEL_DEVICETREE} \
           ${KERNEL_IMAGETYPE} \
"

基本的にconfで定義する変数は再定義できる余地を残しておくために?=??=で定義しておく。この時点で=で強い束縛をしてしまうとlocal.confで再定義できないなど非常に不便になるので注意。

絶対に再定義させないという強い意志 ががない場合は=の使用はおすすめしない。 もしどうしても再定義させたくない場合はコメントなどで再定義できない理由を記載しておくと良い。

以下内容を解説する。

SoC定義

SoCの定義関連。これによってクロスコンパイル時のターゲットや最適化オプションなどが決定される。

# Atmel SAMA5 defaults
require conf/machine/include/soc-family.inc
require conf/machine/include/tune-cortexa5.inc

# Atmel SAMA5D2 defaults
SOC_FAMILY ?= "sama5:sama5d2"
DEFAULTTUNE ?= "cortexa5thf-neon-vfpv4"

Machine Features

ハードウェアが持っている機能について設定する。USBやWiFiなどの有無など。 ビルド全体に関わるコンパイルフラグに影響する。

# Machine Features
MACHINE_FEATURES ?= "apm vfat ext2 serial usbhost usbgadget"

バーチャル関連の定義

virtual/kenrelvirtual/bootloaderなどの仮想ターゲットと実体を紐付けるための定義。

# Virtual package definitions
PREFERRED_PROVIDER_virtual/kernel_sama5 ?= "linux-giantboard"
PREFERRED_PROVIDER_virtual/bootloader_sama5 ?= "u-boot-at91"
PREFERRED_PROVIDER_u-boot_sama5 ?= "u-boot-at91"

PREFERRED_PROVIDER_jpeg ?= "jpeg"
PREFERRED_PROVIDER_jpeg-native ?= "jpeg-native"

このおかげで下記のようにビルドを実行できる。

$ bitbake virtual/kernel

最後のjpeg関連についてはデフォルトでJPEG関連のライブラリをjpegパッケージにするかjpeg-turboパッケージにするかという目的で使用される。

シリアル定義

シリアルコンソールのポートや設定のデフォルトを定義する。

# Default settings for serial console
SERIAL_CONSOLES ?= "115200;ttyS0"

ARMではシリアルポートがttyAMA0だったりする場合があるのでそういう差異を吸収している。

カーネル設定

ターゲット向けにカーネルをビルドする際に必要な情報の定義。 デフォルトで使用するカーネルのバージョンや、defconfig、デバイスツリーを設定している。

# Kernel informations
PREFERRED_VERSION_linux ?= "5.4%"
KERNEL_DEVICETREE ?= " \
                at91-sama5d27_giantboard.dtb \
        "

wicイメージ関連の設定

YoctoではWicというイメージ生成機能を使用できる。

ここではWicイメージを生成するために必要な情報を定義している。

Wicはパーティション情報を含んでおり、SDカードなどのストレージにddやbmaptoolなどで直接OSイメージを流し込むことができる。

# Settings for wic image
do_image_wic[depends] += "at91bootstrap:do_deploy"
IMAGE_FSTYPES += " tar.gz wic.bz2 wic.bmap"
WKS_FILE ?= "sdimage-bootpart.wks"
WIC_CREATE_EXTRA_ARGS ?= "--no-fstab-update"

BOOTパーティションの設定

BOOTパーティションに含めるファイルの定義。

# File definitions that BOOT partation contains.
IMAGE_BOOT_FILES ?= "BOOT.BIN \
           u-boot.bin \
           uEnv.txt \
           ${KERNEL_DEVICETREE} \
           ${KERNEL_IMAGETYPE} \
"

ここでBOOTパーティションに含めるファイルを設定する。

ブートローダのレシピ

SAMA5D2でLinuxブートするためには、次のソフトウェアが必要になる。

ブートローダのレシピはrecipes-bspに配置する。

$ mkdir recipes-bsp
$ mkdir recipes-bsp/at91bootstrap recipes-bsp/u-boot

at91bootstrap

giantboard-toolsを確認すると、使用しているバージョンは下記の通り。

commit 5a89d0a2314761d51b2c750592273a0edd3addf8 (HEAD -> tmp, tag: v3.8.13)
Author: Eugen Hristev <eugen.hristev@microchip.com>
Date:   Wed Jul 10 13:42:17 2019 +0300

    Makefile: prepare 3.8.13
    
    Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>

これにdefconfigの定義を追加してビルドしている。

recipes-bsp/at91bootstrap/at91bootstrap_3.8.13.bbを下記の内容で作成する。

SUMMARY = "Initial bootstrap for AT91 ARM MPUs"
DESCRIPTION = " \
        at91bootstrap is the second-level bootloader for Atmel AT91  \
        SoCs. It provides a set of algorithms to manage the hardware \
        initialization and to download the main application (or a    \
        third-level bootloader) from specified boot media to         \
        main memory and start it.                                    \
          "
AUTHOR = "Atmel Corporation"
HOMEPAGE = "http://www.at91.com/linux4sam/bin/view/Linux4SAM/AT91Bootstrap"
BUGTRACKER = "https://github.com/linux4sam/at91bootstrap/issues"
SECTION = "bootloaders"
LICENSE = "ATMEL"
LIC_FILES_CHKSUM = "file://main.c;endline=27;md5=a2a70db58191379e2550cbed95449fbd"

COMPATIBLE_MACHINE = '(giantboard)'

SRC_URI = "git://github.com/linux4sam/at91bootstrap.git;protocol=https \
    file://sama5d27_giantboard_sd1_uboot_defconfig \
"

PV = "3.8.13+git${SRCPV}"
SRCREV = "5a89d0a2314761d51b2c750592273a0edd3addf8"

S = "${WORKDIR}/git"

inherit deploy
DEPENDS += "bc-native"

EXTRA_OEMAKE = 'CROSS_COMPILE=${TARGET_PREFIX} CC="${TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS}"'

do_unpack_append() {
    bb.build.exec_func('do_copy_defconfig', d)
}

do_copy_defconfig() {
    cp ${WORKDIR}/sama5d27_giantboard_sd1_uboot_defconfig ${S}/board/sama5d27_som1_ek
}

do_configure() {
    oe_runmake distclean
    oe_runmake sama5d27_giantboard_sd1_uboot_defconfig
}

do_compile() {
    oe_runmake
}

do_deploy () {
    install -d ${DEPLOYDIR}
    install ${S}/binaries/boot.bin ${DEPLOYDIR}/BOOT.BIN
}
addtask deploy before do_build after do_compile

結構細かい小技が効いているので解説していく。

ヘッダ部

レシピの概要やこのレシピでパッケージングするOSSの情報について記述する。

SUMMARY = "Initial bootstrap for AT91 ARM MPUs"
DESCRIPTION = " \
        at91bootstrap is the second-level bootloader for Atmel AT91  \
        SoCs. It provides a set of algorithms to manage the hardware \
        initialization and to download the main application (or a    \
        third-level bootloader) from specified boot media to         \
        main memory and start it.                                    \
          "
AUTHOR = "Atmel Corporation"
HOMEPAGE = "http://www.at91.com/linux4sam/bin/view/Linux4SAM/AT91Bootstrap"
BUGTRACKER = "https://github.com/linux4sam/at91bootstrap/issues"
SECTION = "bootloaders"
LICENSE = "ATMEL"
LIC_FILES_CHKSUM = "file://main.c;endline=27;md5=a2a70db58191379e2550cbed95449fbd"

COMPATIBLE_MACHINE = '(giantboard)'

COMPATIBLE_MACHINEを指定することで、MACHINEにgiantboard以外を設定されている時にat91bootstrapのレシピが選択された場合エラーにすることができる。 ブートローダのような明らかに他のボードでは動かないようなものなこのようにしておくとミスが発見しやすくなる。

ライセンスについて

ヘッダ部のうちライセンスの記述はLICENSELIC_FILES_CHKSUM

LICENSE = "ATMEL"
LIC_FILES_CHKSUM = "file://main.c;endline=27;md5=a2a70db58191379e2550cbed95449fbd"

at91bootstrapはAt91bootstrap-licenseというライセンスで配布されている。

LIC_FILES_CHKSUMはレシピ作成時とライセンスが変わっていないかをチェックできる。この例ではmain.cの先頭からendline=27で指定した行までがライセンス記述だという指定。この部分に対してmd5でハッシュを取っている。つまり、この部分の文言に変更があった場合md5の値が変わるためライセンス定義の変更を検出することができる。

ATMELの独自ライセンスであるため、レシピだけライセンス情報を記述するだけでは下記のような警告が表示される。

WARNING: at91bootstrap-3.8.13+gitAUTOINC+5a89d0a231-r0 do_populate_lic: at91bootstrap: No generic license file exists for: ATMEL in any provider

これはLICENSEにbitbakeが管理しているライセンスにないものを指定された場合に出される。この警告によってケアされていないライセンスが混入していないか確認を促すことができる。

この警告を黙らせるためには、layers.confで下記のように設定し、ここで指定したディレクトリにライセンスの内容を記述したファイルを配置しておく。つまりもともとYocto ProjectやOpenEmbeddedで管理していないようなライセンスを取り扱う場合、レイヤの提供者がきちんと管理している必要があるということになる。

# License
LICENSE_PATH += "${LAYERDIR}/licenses"

meta-giantboard直下にlicensesディレクトリを作成する。

$ mkdir licenses

ここではlicenses/ATMELとして下記の内容でファイルを作成している。

----------------------------------------------------------------------------
        ATMEL Microcontroller Software Support
----------------------------------------------------------------------------
Copyright (c) 2006, Atmel Corporation

All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice,
this list of conditions and the disclaimer below.

Atmel's name may not be used to endorse or promote products derived from
this software without specific prior written permission.

DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

ソースファイル関連

パッケージングされるソフトウェアのソースコードの有りか及びパッチファイルや追加のコンフィグファイルをSRC_URLで指定する。PVはパッケージバージョンの指定、SRCREVでどのコミットを使用するかを指定する。

Sはbitbakeがビルド時に参照する変数でソースコード(Source)を配置したディレクトリを指定する。ちなみにビルドディレクトリを指定するB(Build)、生成物を配置するD(Destination)という変数もあり、これらはレシピのデバッグ時にはよく参照することになる。

SRC_URI = "git://github.com/linux4sam/at91bootstrap.git;protocol=https \
    file://sama5d27_giantboard_sd1_uboot_defconfig \
"

PV = "3.8.13+git${SRCPV}"
SRCREV = "5a89d0a2314761d51b2c750592273a0edd3addf8"

S = "${WORKDIR}/git"

依存関係関連

inheritはビルドシステムがbbclassとして提供する便利な関数をレシピ内で使用するために記述する。ここではブートパーティションにファイルを配置するために使用するdeployを使用する。

DEPENDSはこのレシピをビルドするときに依存するレシピを指定する。

inherit deploy
DEPENDS += "bc-native"

環境設定関連

EXTRA_OEMAKEmakeコマンド実行時に渡すパラメータを指定する。ここではクロスコンパイルに必要な設定を行っている。

EXTRA_OEMAKE = 'CROSS_COMPILE=${TARGET_PREFIX} CC="${TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS}"'

タスク

実際のビルド処理を実行するにはタスクを定義していく。

基本的には下記のような流れで実行されていく。実際にはライセンスチェックやサニティチェックなど他にも細々とタスクがある。

  1. do_fetch(ソースのダウンロード)
  2. do_unpack(ダウンロードしたソースファイルの展開)
  3. do_configure(ビルド設定/configureスクリプトの実行など)
  4. do_compile(ビルド実行)
  5. do_install(ローカル環境へのインストール/make installなど)
  6. do_package(パッケージ作成/rpm,debなど)

各タスクにはその直前や直後に処理を追加する_prepend_appendをいう関数を定義することができる。 また、タスク自体も自由にに追加や削除ができる。

do_unpack

at91bootstrapをgiantboard向けにビルドするためにはdefconfigを追加する必要がある。このdefconfigはboard/sama5d27_som_ekに配置されている必要があるため、do_unpackタスクの処理を拡張して、ファイルをコピーする。

ただ、do_unpackpython関数として実装されているためshell関数としてdo_unpack_appendを追加すると構文エラーになってしまう。そのためpythonからbb.build.exec_funcでshell関数を呼び出すという方法を取っている。

do_unpack_append() {
    bb.build.exec_func('do_copy_defconfig', d)
}

do_copy_defconfig() {
    cp ${WORKDIR}/sama5d27_giantboard_sd1_uboot_defconfig ${S}/board/sama5d27_som1_ek
}

do_configure

makeコマンドを直接実行指定も良いが、oe_runmake関数を使用すると必要な変数やパラメータなどをあらかじめ設定してmakeコマンドを呼び出してくれるのでこちらを使用するほうが安全。

do_configure() {
    oe_runmake distclean
    oe_runmake sama5d27_giantboard_sd1_uboot_defconfig
}

do_compile

-j $(nproc)のような並列化の指定などもやってくれる。

do_compile() {
    oe_runmake
}

do_deploy

ブートローダはブートパーティションに配置する必要があるので、do_deployタスクを作成しaddtaskで追加している。 do_deployに必要なDEPLOYDIRなどの定義を使用するためにあらかじめinherit deployでbbclassを継承している。

do_deploy () {
    install -d ${DEPLOYDIR}
    install ${S}/binaries/boot.bin ${DEPLOYDIR}/BOOT.BIN
}
addtask deploy before do_build after do_compile

defconfig

SRC_URIで指定したsama5d27_giantboard_sd1_uboot_defconfigはgiantboard-toolsから取り込む。

$ mkdir -p recipes-bsp/at91bootstrap/files
$ cp ~/giantboard-tools/patches/at91bootstrap/sama5d27_giantboard_sd1_uboot_defconfig recipes-bsp/at91bootstrap/files

u-boot

u-bootは下記のコミットにGiant Board対応のための修正を加えている。

commit 003ba1b96b7ee1bffb81b31d62346d676b4afddc (HEAD -> master, origin/master, origin/HEAD)
Author: Christopher Alessandro <calessandro0827@gmail.com>
Date:   Tue Jul 14 14:23:19 2020 -0700

    Add command to force refresh ca-ceritificates to resolve SSL check errors.

レシピをrecipes-bsp/u-boot/u-boot-at91_2019.07.bbとして下記の内容で作成する。

DESCRIPTION = "U-Boot - the Universal Boot Loader"
HOMEPAGE = "http://www.denx.de/wiki/U-Boot/WebHome"
SECTION = "bootloaders"
PROVIDES = "u-boot virtual/bootloader"

inherit deploy

LICENSE = "GPLv2+"
LIC_FILES_CHKSUM = "file://README;beginline=1;endline=22;md5=9915e8cb100eb5dbb366010a0f10296c"

SRCREV = "e5aee22e4be75e75a854ab64503fc80598bc2004"

PV = "v2019.07-at91+git${SRCPV}"

DEPENDS += "bison-native flex-native"

COMPATIBLE_MACHINE = '(giantboard)'

UBRANCH = "master"

SRC_URI = "git://github.com/u-boot/u-boot;protocol=https;branch=${UBRANCH} \
       file://giantboard-fixes.patch \
       file://sama5d27_giantboard_mmc_defconfig \
       file://at91-sama5d27_giantboard.dts \
"

S = "${WORKDIR}/git"

PACKAGE_ARCH = "${MACHINE_ARCH}"

EXTRA_OEMAKE = 'CROSS_COMPILE=${TARGET_PREFIX} CC="${TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS}" HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}"'

do_unpack_append() {
    bb.build.exec_func('do_copy_defconfig', d)
}

do_copy_defconfig() {
    cp ${WORKDIR}/sama5d27_giantboard_mmc_defconfig ${S}/configs
    cp ${WORKDIR}/at91-sama5d27_giantboard.dts ${S}/arch/arm/dts/
}

do_configure() {
    oe_runmake distclean
    oe_runmake sama5d27_giantboard_mmc_defconfig
}

do_compile() {
    oe_runmake
}

do_deploy () {
    install -d ${DEPLOYDIR}
    install ${S}/u-boot.bin ${DEPLOYDIR}/u-boot.bin
    cat << 'EOF' > ${DEPLOYDIR}/uEnv.txt
# Main Device Tree
fdtfile=/at91-sama5d27_giantboard.dtb
optargs=atmel.pm_modes=standby,ulp1 giantboard.disable_charging=1   
EOF
}
addtask deploy before do_build after do_compile

レシピの構造はat91bootstrapと大きな違いはないので、個別の解説は省略する。

1つだけ特筆するとすれば、do_deployではuEnv.txtを生成している。

変更点

u-bootのGiant Board向けのファイルは下記の通り。

  • giantboard-fixes.patch
  • sama5d27_giantboard_mmc_defconfig
  • at91-sama5d27_giantboard.dts

これらのファイルもgiantboard-toolsから取り込む。

$ mkdir -p recipes-bsp/u-boot/files
$ cp ~/giantboard-tools/patches/u-boot/giantboard-fixes.patch recipes-bsp/u-boot/files
$ cp ~/giantboard-tools/patches/u-boot/sama5d27_giantboard_mmc_defconfig recipes-bsp/u-boot/files
$ cp ~/giantboard-tools/patches/u-boot/at91-sama5d27_giantboard.dts recipes-bsp/u-boot/files

カーネルのレシピ

recipes-kernel/linuxlinux-giantboard_5.4.bbを作成する。

$ mkdir -p recipes-kernel/linux

カーネルは下記のコミットにGiant Boardサポートの修正を追加している。

commit 219d54332a09e8d8741c1e1982f5eae56099de85 (tag: v5.4)
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Sun Nov 24 16:32:01 2019 -0800

    Linux 5.4

recipes-kernel/linux/linux-giantboard_5.4.bbを下記の内容で作成する。

SECTION = "kernel"
DESCRIPTION = "Linux kernel for Microchip ARM SoCs (aka AT91)"
SUMMARY = "Linux kernel for Microchip ARM SoCs (aka AT91)"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=bbea815ee2795b2f4230826c0c6b8814"

inherit kernel

FILESEXTRAPATHS_prepend := "${THISDIR}/${P}:"

SRCREV = "219d54332a09e8d8741c1e1982f5eae56099de85"

PV = "5.4+git${SRCPV}"

S = "${WORKDIR}/git"

KBRANCH = "master"
SRC_URI = "git://github.com/torvalds/linux.git;protocol=git;branch=${KBRANCH} \
       file://giantboard.patch \
       file://defconfig \
"

KERNEL_MODULE_AUTOLOAD += "atmel_usba_udc g_serial"
COMPATIBLE_MACHINE = "(giantboard)"

カーネルのレシピは少々特殊だが、基本的に必要な機能は実装済みであるのでinherit kernelカーネルのbbclassを継承すればよい。

変更点

カーネルの変更点は大まかに下記のようになっている。

  • at91-sama5d27_giantboard.dts
  • giantboard_defconfig
  • wilc1000ドライバの追加

今回はkernel.bbclassしか継承していないため、git diffで作成したパッチを適用できる。

$ cd ~/giantboard-tools/output/build/linux
$ git add .
$ git diff --cached > ~/giantboard.patch
$ cd ~/gb-dunfell/layers/meta-giantboard/recipes-kernel/linux/
$ mkdir files
$ mv ~/giantboard.patch ./files
$ cp ~/giantboard-tools/patches/kernel/giantboard_defconfig files/defconfig

.cfgフラグメントなどyoctoのカーネルレシピの機能を使用したい場合はkernel-yocto.bbclassを継承する必要がある。この場合パッチのチェックなども強化されるため、kernel-yoctoの作法に則ってレシピやパッチを作成する必要がある。 今回の様にカジュアルに変更を取り込むような場合は、kernel-yocto.bbclassを継承しないという方法も取ることができる。

ビルド

buildディレクトリに移動して、conf/local.confに下記の内容を追加する。

MACHINE = "giantboard"

bitbakeを実行する。

$ bitbake core-image-minimal

シリアルケーブルでボードとPCを接続しminicomを開いた状態で起動する。

Poky (Yocto Project Reference Distro) 3.1.4 giantboard /dev/ttyS0

giantboard login: root
root@giantboard:~# uname -a
Linux giantboard 5.4.0 #1 Mon Nov 25 00:32:01 UTC 2019 armv7l GNU/Linux

Linuxのログインまで行けた。。

まとめ

Yocto環境で新しいボードに対応する例を示した。

これができるようになると、Yoctoでの遊び方の幅が広がる。