みつきんのメモ

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

raspberrypi3 yoctoでLinuxカーネル5.0を試す(ラズパイカーネル編)

はじめに

RPiのカーネルこっちで管理されているが、まだ5.0-rc8なのでバニラカーネルを試すことにした。

もう-rc8が取れてたので、こっちも動かしてみる。

基本的な方針は前回と変わらずに下記のようにする。

  • meta-raspberrypiのカーネルとはバージョンが変わったのでbbappendではなくレシピを新設する。
  • meta-raspberrypi自体は汚したくないのでmeta-rpi-lk5を新規に作成する。

大体途中まではほぼ同じ手順になる。

環境構築

いつものやつ。

ソース取得

$ mkdir -p rpi-thud/layers
$ cd rpi-thud/layers
$ git clone git://git.yoctoproject.org/poky.git -b thud
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b thud
$ git clone git://git.openembedded.org/meta-openembedded -b thud

環境変数設定

$ cd ../
$ source layers/poky/oe-init-build-env build_lk5_rpi

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

レイヤ追加

$ bitbake-layers add-layer ../layers/meta-openembedded/meta-oe
$ bitbake-layers add-layer ../layers/meta-openembedded/meta-python
$ bitbake-layers add-layer ../layers/meta-openembedded/meta-multimedia
$ bitbake-layers add-layer ../layers/meta-openembedded/meta-networking
$ bitbake-layers add-layer ../layers/meta-raspberrypi

local.confの修正

MACHINEの行を修正する。

MACHINE = "raspberrypi3"
DL_DIR ?= "${TOPDIR}/../downloads"

# enable uart
ENABLE_UART = "1"

# systemd
DISTRO_FEATURES_append = " systemd pam"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = ""

meta-rpi-lk5_rの作成

meta-rpi-lk5_rを作成し、meta-raspberrypiからカーネルのレシピをlinux-raspberrypi_5.0.bbとしてコピーする。

レイヤ名はバニラカーネルと分けるために末尾に_rをつけたけどかなり適当なので、適宜好きな名前をつけて構わない。

$ bitbake-layers create-layer meta-rpi-lk5_r
$ mv ./meta-rpi-lk5_r ../layers/
$ mkdir -p ../layers/meta-rpi-lk5_r/recipes-kernel/linux
$ bitbake-layers add-layer ../layers/meta-rpi-lk5_r
$ cp ../layers/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_4.14.bb ../layers/meta-rpi-lk5_r/recipes-kernel/linux/linux-raspberrypi_5.0.bb

その後、SRC_URI をバニラカーネルに設定し、バージョンなども5.0向けに設定する。

LINUX_VERSION ?= "5.0.0"

SRCREV = "00794df915cda0a4603f0a22c802dbad9045c181"
SRC_URI = " \
    git://github.com/raspberrypi/linux.git;branch=rpi-5.0.y \
    "
require recipes-kernel/linux/linux-raspberrypi.inc

LIC_FILES_CHKSUM = "file://COPYING;md5=bbea815ee2795b2f4230826c0c6b8814"

レシピのカーネルバージョン

local.confで参照するカーネルのバージョンを明示的に設定する。

PREFERRED_VERSION_linux-raspberrypi = "5.0%"

これで5.0を参照しようとする。

incのパス

別のレイヤにあるincファイルを参照する場合は、レイヤのディレクトリをトップとした相対パスで指定する必要がある。 この場合ではmeta-rpi-lk5_rのレシピからmeta-raspberrypiにあるincファイルを参照したい。

bitbake実行時はレイヤのトップまでは解決されているので、recipes-kernel/linux/linux-raspberrypi.incのように指定する。

filesの参照パス

SRC_URI = "files://"で参照するパスは、実行時のFILESPATHによって解決される。

これはディレクトリ構成に影響されるところなので、レシピではなくlocal.confで対応する。

FILESPATH_append =  ":${TOPDIR}/../layers/meta-raspberrypi/recipes-kernel/linux/files"

カーネルのビルド

カーネルのリビルドは次のコマンドで行なう。

$ bitbake virtual/kernel 

DeviceTree overlaysがビルドできない問題

バニラカーネルだからだと思っていたarch/arm/boot/dts/overlays以下がコンパイルエラーで失敗する。

とりあえずlocal.confでビルド対象から除外して逃げる。

KERNEL_DEVICETREE_remove = " \
     overlays/at86rf233.dtbo \
     overlays/dwc2.dtbo \
     overlays/gpio-key.dtbo \
     overlays/hifiberry-amp.dtbo \
     overlays/hifiberry-dac.dtbo \
     overlays/hifiberry-dacplus.dtbo \
     overlays/hifiberry-digi.dtbo \
     overlays/i2c-rtc.dtbo \
     overlays/iqaudio-dac.dtbo \
     overlays/iqaudio-dacplus.dtbo \
     overlays/lirc-rpi.dtbo \
     overlays/pi3-disable-bt.dtbo \
     overlays/pi3-miniuart-bt.dtbo \
     overlays/pitft22.dtbo \
     overlays/pitft28-resistive.dtbo \
     overlays/pitft35-resistive.dtbo \
     overlays/pps-gpio.dtbo \
     overlays/rpi-ft5406.dtbo \
     overlays/rpi-poe.dtbo \
     overlays/vc4-kms-v3d.dtbo \
     overlays/w1-gpio-pullup.dtbo \
     overlays/w1-gpio.dtbo \
"

イメージの作成

今回はも小構成としてcore-image-minimalを作成する。

$ bitbake core-image-minimal

動作確認

無事に動いた。

Poky (Yocto Project Reference Distro) 2.6.1 raspberrypi3 ttyS0

raspberrypi3 login: root
root@raspberrypi3:~# uname -a
Linux raspberrypi3 5.0.0 #1 SMP Wed Mar 13 06:27:00 UTC 2019 armv7l GNU/Linux
root@raspberrypi3:~#

最終的なlocal.conf

自動生成されたlocal.confに次の内容を追加する。

MACHINE = "raspberrypi3"
DL_DIR ?= "${TOPDIR}/../downloads"

# enable uart
ENABLE_UART = "1"

# systemd
DISTRO_FEATURES_append = " systemd pam"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = ""

PREFERRED_VERSION_linux-raspberrypi = "5.0%"

FILESPATH_append =  ":${TOPDIR}/../layers/meta-raspberrypi/recipes-kernel/linux/files"

KERNEL_DEVICETREE_remove = " \
     overlays/at86rf233.dtbo \
     overlays/dwc2.dtbo \
     overlays/gpio-key.dtbo \
     overlays/hifiberry-amp.dtbo \
     overlays/hifiberry-dac.dtbo \
     overlays/hifiberry-dacplus.dtbo \
     overlays/hifiberry-digi.dtbo \
     overlays/i2c-rtc.dtbo \
     overlays/iqaudio-dac.dtbo \
     overlays/iqaudio-dacplus.dtbo \
     overlays/lirc-rpi.dtbo \
     overlays/pi3-disable-bt.dtbo \
     overlays/pi3-miniuart-bt.dtbo \
     overlays/pitft22.dtbo \
     overlays/pitft28-resistive.dtbo \
     overlays/pitft35-resistive.dtbo \
     overlays/pps-gpio.dtbo \
     overlays/rpi-ft5406.dtbo \
     overlays/rpi-poe.dtbo \
     overlays/vc4-kms-v3d.dtbo \
     overlays/w1-gpio-pullup.dtbo \
     overlays/w1-gpio.dtbo \
"

まとめ

ラズパイカーネルは、手動でパッチなどを当てなくてもビルドできるので、やはりこちらの方が簡単。

ただしこっちのカーネルでもoverlaysがビルドエラーを起こすので、それは調査する必要がある。