秋月電子のSoC基板でyocto-linuxを動かしてみました(その2 カスタムカーネル編)

ARM

前回はYocto Projectを利用して最低限の機能をもつLinuxカーネルをビルドして、秋月SoC基板で起動するところまで行いました。今回はカーネルをカスタマイズして必要なデバイスを使えるようにします。

aesoc-board2.jpg

このSoC基板にはWi-SUNのモジュールが搭載されています。Twitterでは以下のような情報がありました。

  • Wi-SUNはUART1(/dev/ttyS1)につながっている。
  • Wi-SUNを使うためにはGPIO53をHighにする必要がある。
  • GPIO66〜GPIO69は青色LEDが接続されている。(Lowで点灯)
  • カスタマイズが必要と思われるデバイスツリーの情報はビルド後に build/tmp/work-shared/beaglebone-yocto/kernel-source/arch/arm/boot/dts/am335x-bone-common.dtsi に置かれている。

現在のカーネルでは/dev/ttyS0しかありませんので、Wi-SUNと通信ができるように/dev/ttyS1のデバイスが使えるようにカスタマイズする必要があります。am335x-bone-common.dtsiを確認したところ、uart0の定義しかありません。ここにuart1を追加すれば/dev/ttyS1が使えるようになると思われます。またGPIO53は初期値をHighになるようにしておきたいところです。

ビルドの途中でファイルにパッチをあててからビルドを継続する必要がありますが、調べたところ以下のdegi-keyさんのページが参考になりそうでした。

この手順を参考にしながらカスタムレイヤーを作ってみます。開発環境は前回使用したYocto Project dunfell 3.1.23をそのまま使っています。

カスタムレイヤーを追加する

まずは環境設定をします。

$ cd ~/yocto/poky
$ source oe-init-build-env

次にカスタムレイヤーの雛形を作成します。カスタムレイヤーの名前はmeta-customとしました。

$ cd ~/yocto/poky
$ bitbake-layers create-layer meta-custom

これで、ディレクトリpokyの中にmeta-customというディレクトリができます。これがカスタムレイヤーの雛形になります。

次にcore-image-minimalのレシピをカスタムレイヤーにコピーします。

$ cd meta-custom
$ mkdir -p recipes-core/images
$ cp ../meta/recipes-core/images/core-image-minimal.bb recipes-core/images/custom-image.bb

このレシピはcore-image-minimal.bbは、bitbake core-image-minimal で実行されるものです。これをベースにcustomimageのレシピを作成します。エディタで内容を修正します。

$ vi recipes-core/images/custom-image.bb

修正後のcustom-image.bbは以下のようになります。今回はSUMMARYの行だけ少し手を入れ、他の行は変更していません。ROOTFSのサイズもここで変更できそうですね。

SUMMARY = "My custom Linux image for Akizuki AM3352 SoC board."

IMAGE_INSTALL = "packagegroup-core-boot ${CORE_IMAGE_EXTRA_INSTALL}"

IMAGE_LINGUAS = " "

LICENSE = "MIT"

inherit core-image

IMAGE_ROOTFS_SIZE ?= "8192"
IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", \
"systemd", " + 4096", "" ,d)}"

次にこのカスタムレイヤーを認識するようにbblayers.confを修正してパスを追加します。

$ cd ../build/
$ vi conf/bblayers.conf

修正後のbblayers.confは以下のようになります。”/home/ユーザ名/yocto/poky/meta-custom \”の行を追加しただけです。

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/home/ユーザ名/yocto/poky/meta \
/home/ユーザ名/yocto/poky/meta-poky \
/home/ユーザ名/yocto/poky/meta-yocto-bsp \
/home/ユーザ名/yocto/poky/meta-custom \
"

パッチファイルを作成する

SoCの固有情報が書かれているオリジナルのdtsiファイルをカスタマイズするためのパッチファイルを作成します。作業用にオリジナルのdtsiファイルをホームディレクトリにコピーします。

$ cd ~/yocto/poky/build/tmp/work-shared/beaglebone-yocto/kernel-source/arch/arm/boot/dts
$ cp am335x-bone-common.dtsi ~/am335x-bone-common.dtsi.orig

ホームディレクトリにコピーしたオリジナルファイルをさらにコピーして修正します。

$ cd 
$ cp am335x-bone-common.dtsi.orig am335x-bone-common.dtsi
$ vi am335x-bone-common.dtsi

修正したdtsiファイルは長くなるのでgithubにいれておきました。なお、すでにdtsファイルを作成されていたかたもいましたのでこちらの情報も参考にさせていただきました。

次にパッチファイルを作成します。

$ git diff --no-index am335x-bone-common.dtsi.orig am335x-bone-common.dtsi \
> 0001-add-uart1-dtsi.patch

作成したパッチファイルのファイル名の部分を修正します。

$ vi 0001-add-uart1-dtsi.patch

修正前

--- a/am335x-bone-common.dtsi.orig
+++ b/am335x-bone-common.dtsi

修正後

--- a/arch/arm/boot/dts/am335x-bone-common.dtsi
+++ b/arch/arm/boot/dts/am335x-bone-common.dtsi

作成したパッチファイルはgithubに置いておきました。

パッチを適用するレシピを作成する

先ほど作成したパッチファイルをレシピに組み込みます。

$ cd ~/yocto/poky/meta-custom
$ mkdir -p recipes-kernel/linux-yocto
$ cd recipes-kernel/linux-yocto
$ vi linux-yocto_%.bbappend

linux-yokuto_%.bbappendファイルには以下の内容を書き込みます。

FILESEXTRAPATHS_prepend := "${THISDIR}/linux-yocto:"
SRC_URI += "file://0001-add-uart1-dtsi.patch"

このlinux-yoctoのディレクトリに作成したパッチファイルをコピーします。

$ cp ~/0001-add-uart1-dtsi.patch ~/yocto/poky/meta-custom/recipes-kernel/linux/linux-yocto

これでレシピの準備ができました。

カスタムカーネルのビルド

カーネルをビルドします。新しく作成したcustom-imageのレシピを使います。

$ cd ~/yocto/poky/build/
$ bitbake custom-image

ビルドが成功すれば、~/yocto/poky/build/tmp/deploy/images/beaglebone-yocto/custom-image-beaglebone-yocto.wicが生成されます。このwicファイルをmicroSDへの書き込む方法は前回の秋月電子のSoC基板でyocto-linuxを動かしてみました(その1 環境構築編)の手順と同じです。

動作確認

/dev/ttyS1ができているかをdmesgで確認します。

aesoc-uart1-dmesg1.png

ttyS1の表示がありますので、パッチは問題なくあたっているようです。

また、以下のソースファイルも確認してみましたが、正常にパッチが行われていました。

~/yocto/poky/build/tmp/work-shared/beaglebone-yocto/kernel-source/arch/arm/boot/dts/am335x-bone-common.dtsi

GPIO53を操作してHighにして試してみます。

$ echo 53 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio53/direction
$ echo 1 > /sys/class/gpio/gpio53/value
$ microcom -s 115200 /dev/ttyS1

この状態で試したらWi-SUNからエコーバックが返ってきました。コマンドを入力したところ以下のような結果が返ってきました。

SKSREG S1
ESREG 100723FFFEA802B7
OK

ただしWi-SUNから全く反応がないこともあります。まだ何かカスタマイズが足りないのかもしれません。

ちなみに以下のようにコマンドを入力すると、青色LEDが光ります。

$ echo 66 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio66/direction
$ echo 0 > /sys/class/gpio/gpio66/value

aesoc-blue-led-on.jpg

LEDを消灯する場合はHighにすれば消えます。

$ echo 1 > /sys/class/gpio/gpio66/value

まとめ

Yoctoやdtsは初心者のためカスタマイズが不十分なところがあるかもしれません。Wi-SUNとも通信できたりできなかったりで不安定です。

今回作成したカスタムレイヤーはgithubに置いておきましたので、何かヒントがあればお知らせください。

次はsshdやnginxなど必要となりそうなアプリケーションを組み込んでみたいと思います。

タイトルとURLをコピーしました