[Linux] kernel の make で devicetree をビルド

devicetree のビルドは dtc (devicetree compiler) を使えばできるのですが、kernel ビルドでは cpp を掛けるため C-directive (#include とか) を含んだ記述も扱えます。しかし通常 kernel ビルドだとツリー内に登録して make dtbs で一括ビルドすることになるため、ツリー外で devicetree を作成したいときに困ってしまいます。

ここではツリー外で kernel module を作るのと同様に、ツリー外で kernel ビルドの仕組みを使って devicetree を作ります。

既存 devicetree の参照

kernel にある既存の devicetree を include する場合はパスが問題になります。一から記述する場合は特に問題にはならないのですが、大抵既存の devicetree 記述を参照したい場合がほとんどなので、解決しておく必要があります。

dtc へは DTC_FLAGS に "-i" オプションでパスを渡すことができるので、/include/ で記述すれば既存 devicetree を参照できます。しかし、cpp へは現状パスを渡す手段がないため、#include 記述で既存 devicetree を参照することができません。しかしながら内部では DTC_INCLUDE で固定パスが記述されているため、そこからのパスを書けば通すことができます。

kernel 5.4 の Makefile では以下のように定義されています。
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/scripts/Makefile.lib?h=v5.4.12#n190

DTC_INCLUDE    := $(srctree)/scripts/dtc/include-prefixes

ここにパスが追加できればいいのですが、この固定パスからの相対パスを記述すればひとまず解決します。

devicetree の記述例

以下は #include で参照を含んだ devicetree の記述例(hoge_ext.dts)です。元の hoge.dts を継承した上で serial1 を有効にしています。

/dts-v1/;
#include "../../../arch/arm/boot/dts/hoge.dts"

&serial1 {
        status = "okay";
};

ツリー外ビルドの makefile

ツリー外の makefile は kernel module と同じように記述します。kernel module は "obj-m" ですが、devicetree は "dtb-y" で指定します。

dtb-y += hoge_ext.dtb
always += $(dtb-y)

KDIR := <kernel build path>
MFLAGS := M=$(CURDIR) -C $(KDIR)
modules clean:
        make $(MFLAGS) $@

KDIR は kernel をビルドしたときの先頭パスを指定します。kernel をビルドするのに必要な ARCH や CROSS_COMPILE を定義しておく必要があります。

make modules でビルドすれば hoge_ext.dtb が生成され、make clean でクリーンできます。


コメント

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