電気回路/zynq/Device Tree Overlay の履歴(No.2)
更新リブートしなくても Device Tree を変更できるらしい†
Device Tree Overlay という機能を使うと、 Linux をリブートしなくても Device Tree を変更できるらしいです。
http://qiita.com/ikwzm/items/ec514e955c16076327ce
さらに、FPGA のロードまで Linux の起動後に行うようにすれば、 Linux をリブートせずともロジックの書き換え&利用が可能になります???
PetaLinux で利用可能な Xilinx Linux Kernel 4.6.0 では、 menuconfig からチェックを付けるだけで Device Tree Overlay が使えるようになります。 電気回路/zynq/Petalinux のカスタマイズ#u43d03eb
ということで、試してみます。
情報†
dtc に -@ を付けて、unresolved reference を許可できる話など
https://www.raspberrypi.org/documentation/configuration/device-tree.md
configfs だけで使える?†
http://qiita.com/ikwzm/items/ec514e955c16076327ce
では configfs だけで使えればいいのに、といいつつ独自の dtbocfg を作って使っていたのですが、4.6.0-xilinx ではどうか、まず試してみました。
menuconfig の File System ---> Pseudo filesystems ---> {M} Userspace-driven configuration filesystem で configfs を有効にして、
LANG:console $ sudo insmod /lib/modules/4.6.0-xilinx/kernel/fs/configfs/configfs.ko $ sudo mkdir /config $ sudo mount -t configfs none /config $ ls /config $ sudo mkdir -p /config/device-tree/overlays/test mkdir: cannot create directory ‘/config/device-tree’: Operation not permitted
どうやらまだできないようです?
dtbocfg のビルド†
そこで、
http://qiita.com/ikwzm/items/ec514e955c16076327ce
の dtbocfg を使おうと思います。
ビルドにカーネルソースを必要とするので、PetaLinux のクロスコンパイル環境を 使ってビルドしました。
LANG:console
$ cd ~/z-turn
$ git clone https://github.com/ikwzm/dtbocfg.git
$ cd dtbocfg
$ ls
Makefile Readme.md dtbocfg.c dtbocfg.rb
$ cat Makefile
ARCH := arm
KERNEL_SRC_DIR ?= /lib/modules/$(shell uname -r)/build
ifeq ($(shell uname -m | sed -e s/arm.*/arm/),arm)
else
CROSS_COMPILE ?= arm-linux-gnueabihf-
endif
obj-m := dtbocfg.o
all:
make -C $(KERNEL_SRC_DIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules
clean:
make -C $(KERNEL_SRC_DIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) clean
$ petalinux-setup
$ arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (Linaro GCC 5.2-2015.11-2) 5.2.1 20151005
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ls ~/z-turn/zturn-v2016.4/kernel-source
COPYING Makefile block include modules.builtin sound
CREDITS Module.symvers certs init modules.order tools
Documentation README crypto ipc net usr
Kbuild REPORTING-BUGS drivers kernel samples virt
Kconfig System.map firmware lib scripts vmlinux
MAINTAINERS arch fs mm security vmlinux.o
$ make KERNEL_SRC_DIR=~/z-turn/zturn-v2016.4/kernel-source
make -C /home/osamu/z-turn/zturn-v2016.4/kernel-source ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- M=/home/osamu/z-turn/dtbocfg modules
make[1]: ディレクトリ '/home/osamu/z-turn/zturn-v2016.4/kernel-source' に入ります
CC [M] /home/osamu/z-turn/dtbocfg/dtbocfg.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/osamu/z-turn/dtbocfg/dtbocfg.mod.o
LD [M] /home/osamu/z-turn/dtbocfg/dtbocfg.ko
make[1]: ディレクトリ '/home/osamu/z-turn/zturn-v2016.4/kernel-source' から出ます
$ ls
Makefile Readme.md dtbocfg.ko dtbocfg.mod.o dtbocfg.rb
Module.symvers dtbocfg.c dtbocfg.mod.c dtbocfg.o modules.order
$ sudo cp dtbocfg.ko (path)
dtbocfg を組み込む†
電気回路/zynq/Petalinux のカスタマイズ#u43d03eb でビルドしたカーネルと、 PetaLinux で作られた標準の .dtb を使って z-turn ボードを起動し、dtbocfg.ko の読み込みを試しました。
LANG:console $ uname -a Linux xenial-zynq 4.6.0-xilinx #1 SMP PREEMPT Fri Feb 24 07:17:45 JST 2017 armv7l armv7l armv7l GNU/Linux $ ls dtbocfg.ko dtbocfg.ko $ sudo insmode dtbocfg.ko insmod: ERROR: could not insert module dtbocfg.ko: Unknown symbol in module $ # 肝心の symbol 名が表示されない??? $ sudo tail /var/log/kern.log Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol config_group_init (err 0) Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol configfs_register_group (err 0) Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol configfs_unregister_subsystem (err 0) Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol configfs_register_subsystem (err 0) Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol config_group_init_type_name (err 0) Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol config_item_init_type_name (err 0) Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol config_item_put (err 0) Mar 2 15:54:08 xenial-zynq kernel: dtbocfg: Unknown symbol configfs_unregister_group (err 0) $ sudo insmod /lib/modules/4.6.0-xilinx/kernel/fs/configfs/configfs.ko $ sudo insmode dtbocfg.ko $ sudo mount -t configfs none /config $ ls -d /config/device-tree/overlays /config/device-tree/overlays
うまくいった。
dtbo の準備†
電気回路/zynq/AXI4-LiteスレーブIPの動作テスト#ee317ba8 で試した accesstest IP に対する uio ブロックを設定します。
LANG:console
$ cat > accesstest-uio.dts
/dts-v1/;
/{
fragment@0 {
target-path = "/amba";
__overlay__ {
#address-cells = <0x1>;
#size-cells = <0x1>;
uio0@43c00000 {
compatible = "generic-uio";
reg = <0x43c00000 0x1000>;
interrupts = <0 57 0>;
interrupt-parent = <3>;
};
};
};
};
$ dtc -O dtb -o accesstest-uio.dtbo accesstest-uio.dts
$ ls
accesstest-uio.dtbo accesstest-uio.dts dtbocfg.ko
dtb の組み込み†
LANG:console $ sudo mkdir /config/device-tree/overlays/accesstest $ ls /config/device-tree/overlays/accesstest dtbo status $ sudo cp accesstest-uio.dtbo /config/device-tree/overlays/acesstest/dtbo $ sudo echo 1 > /config/device-tree/overlays/accesstest/status -bash: /config/device-tree/overlays/accesstest/status: Permission denied $ sudo bash -c "echo 1 > /config/device-tree/overlays/accesstest/status" $ ls /dev/uio* $
あれ?うまくいかない。