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 でクリーンできます。
コメント