電気回路/zynq/Device Tree Overlay の変更点
更新- 追加された行はこの色です。
- 削除された行はこの色です。
- 電気回路/zynq/Device Tree Overlay へ行く。
- 電気回路/zynq/Device Tree Overlay の差分を削除
[[公開メモ]]
#contents
* リブートしなくても Device Tree を変更できるらしい [#f4a6ef00]
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]]
ということで、試してみます。
* 情報 [#vff0dbb9]
dtc に -@ を付けて、unresolved reference を許可できる話など~
https://www.raspberrypi.org/documentation/configuration/device-tree.md ~
ん? "dtc: invalid option -- '@'" となる???(Version: DTC 1.4.0)~
* configfs だけで使える? [#wa82a16c]
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 modprobe configfs
$ mount | grep configfs
configfs on /sys/kernel/config type configfs (rw,relatime)
$ ls /sys/kernel/config
/sys/kernel/config
$ sudo mkdir -p /sys/kernel/config/device-tree/overlays/test
mkdir: cannot create directory ‘/sys/kernel/config/device-tree’: Operation not permitted
どうやらまだできないようです?
* dtbocfg のビルド [#e7739276]
そこで、
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 を組み込む [#h7d3cdd8]
[[電気回路/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 insmod 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 modprobe configfs
$ sudo insmod dtbocfg.ko
$ ls -d /sys/kernel/config/device-tree/overlays
/sys/kernel/config/device-tree/overlays
うまくいった。
* dtbo の準備 [#eed5a9a6]
[[電気回路/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>;
accesstest@43c00000 {
compatible = "generic-uio";
reg = <0x43c00000 0x1000>;
interrupts = <0 57 0>;
interrupt-parent = <3>;
};
};
};
};
^D
$ dtc -O dtb -o accesstest-uio.dtbo accesstest-uio.dts
$ ls
accesstest-uio.dtbo accesstest-uio.dts dtbocfg.ko
* dtb の組み込み [#w4c2fbb9]
LANG:console
$ sudo mkdir /sys/kernel/config/device-tree/overlays/accesstest
$ ls /sys/kernel/config/device-tree/overlays/accesstest
dtbo status
$ sudo cp accesstest-uio.dtbo /sys/kernel/config/device-tree/overlays/acesstest/dtbo
$ sudo echo 1 > /sys/kernel/config/device-tree/overlays/accesstest/status
-bash: /sys/kernel/config/device-tree/overlays/accesstest/status: Permission denied
$ sudo bash -c "echo 1 > /sys/kernel/config/device-tree/overlays/accesstest/status"
$ ls /dev/uio*
ls: cannot access '/dev/uio*': No such file or directory
$
あれ?うまくいかない。
* まずは普通に組み込めるかテスト [#ia616ad7]
LANG:console
$ dtc -I dtb -O dts -o devicetree.dts /boot/devicetree.dtb
$ jed devicetree.dts
amba {
compatible = "simple-bus";
#address-cells = <0x1>;
#size-cells = <0x1>;
interrupt-parent = <0x3>;
ranges;
+ accesstest@43c00000 {
+ compatible = "generic-uio", "uio", "uio_pdrv";
+ reg = <0x43c00000 0x1000>;
+ interrupts = < 0 57 0 >;
+ interrupt-parent = <0x3>;
+ };
$ sudo dtc -O dtb -o /boot/devicetree.dtb devicetree.dts
$ sudo reboot
...
Login: osamu
Password: ************
$ ls /dev/uio*
ls: cannot access '/dev/uio*': No such file or directory
$ grep uio /lib/modules/4.6.0-xilinx/modules.builtin
kernel/drivers/uio/uio.ko
kernel/drivers/uio/uio_pdrv_genirq.ko
kernel/drivers/uio/uio_xilinx_apm.ko
$ ls -ld /sys/class/uio/
drwxr-xr-x 2 root root 0 3月 2 16:50 /sys/class/uio/
こっちの問題か orz
カーネルドライバは入っているし、/sys には uio クラスが登録されているけれど、
/dev/uio* が見つからない。
https://forum.digilentinc.com/topic/2719-how-to-register-my-device-as-uio-on-petalinux/#comment-9553
> bootargs に uio_pdrv_genirq.of_id=generic-uio を追加しないとね
なんだって?
LANG:console
$ sudo jed /boot/uEnv.txt
- bootargs=console=ttyPS1,115200 root=/dev/mmcblk0p2 noinitrd rw earlyprintk rootfstype=ext4 devtmpfs.mount=0
+ bootargs=console=ttyPS1,115200 root=/dev/mmcblk0p2 noinitrd rw earlyprintk rootfstype=ext4 devtmpfs.mount=0 uio_pdrv_genirq.of_id=generic-uio
$ sudo reboot
...
Login: osamu
Password: *********
$ ls /dev/uio*
/dev/uio0
うまく行ったけど・・・これは何のおまじないなんだぜ?
ググってみると、Linux Kernel 全体との整合性のために
最近の kernel では uio モジュールで compatible が使えなくなったため、
その対応がこれなんだとか?~
結局、何を言っているのかわからない。
https://forums.xilinx.com/t5/Embedded-Linux/generic-UIO-broken/td-p/564259 ~
https://github.com/Xilinx/linux-xlnx/commit/7ebd62dbc727ef343b07c01c852a15fc4d9cc9e5 ~
overlay を試すため、一旦 /boot/devicetree.dtb を元に戻す。
LANG:console
$ jed devicetree.dts
amba {
compatible = "simple-bus";
#address-cells = <0x1>;
#size-cells = <0x1>;
interrupt-parent = <0x3>;
ranges;
- accesstest@43c00000 {
- compatible = "generic-uio", "uio", "uio_pdrv";
- reg = <0x43c00000 0x1000>;
- interrupts = < 0 57 0 >;
- interrupt-parent = <0x3>;
- };
$ sudo dtc -O dtb -o /boot/devicetree.dtb devicetree.dts
$ sudo reboot
Login: osamu
Password: *********
$ ls /dev/uio*
ls: cannot access '/dev/uio*': No such file or directory
* うまくいった [#q4ed734b]
LANG:console
$ sudo modprobe configfs
$ sudo insmod dtbocfg.ko
$ sudo mkdir /sys/kernel/config/device-tree/overlays/accesstest
$ sudo dtc -O dtb -o /sys/kernel/config/device-tree/overlays/accesstest/dtbo accesstest-uio.dts
$ sudo bash -c "echo 1 > /sys/kernel/config/device-tree/overlays/accesstest/status"
$ ls /dev/uio*
/dev/uio0
$ sudo bash -c "echo 0 > /sys/kernel/config/device-tree/overlays/accesstest/status"
$ ls /dev/uio*
ls: cannot access '/dev/uio*': No such file or directory
おお、自由自在!
* dtbocfg.rb を使う [#l12bda56]
LANG:console
$ jed dtbocfg.rb
- CONFIG_OF_OVERLAY_PATH = "/config/device-tree/overlays/"
+ CONFIG_PATH = "/sys/kernel/config/"
+ CONFIG_OF_OVERLAY_PATH = "/sys/kernel/config/device-tree/overlays/"
+ DTBOCFG_KO_PATH = File.join(File.expand_path(File.dirname(__FILE__)), 'dtbocfg.ko')
...
def initialize(device_name)
+ insmod unless File.exists? CONFIG_OF_OVERLAY_PATH
+
@device_name = device_name
@device_tree_overlay_path = CONFIG_OF_OVERLAY_PATH + device_name
@debug = false
end
+ def insmod
+ system "modprobe configfs" unless File.exists? CONFIG_PATH
+ system "insmod #{DTBOCFG_KO_PATH}" unless File.exists? CONFIG_OF_OVERLAY_PATH
+ end
+
def create
$ ruby
-bash: ruby: command not found
$ sudo apt install ruby
$ sudo ruby dtbocfg.rb --install accesstest --dts accesstest-uio.dts
$ ls /dev/uio*
/dev/uio0
$ sudo ruby dtbocfg.rb --stop accesstest
$ ls /dev/uio0
ls: cannot access '/dev/uio0': No such file or directory
$ sudo cp dtbocfg.rb /usr/local/bin
$ sudo cp dtbocfg.ko /usr/local/bin
$ alias dtbocfg="sudo ruby /usr/local/bin/dtbocfg.rb"
$ dtbocfg --start accesstest
$ ls /dev/uio0
/dev/uio0
$ cat >> ~/.bashrc
alias dtbocfg="sudo ruby /usr/local/bin/dtbocfg.rb"
^D
$
コマンド一発で直接 dts を読み込めて、とても便利
* カーネルに含めてしまいたい? [#xaa1ba5a]
modprobe や insmode をしたくなければカーネルに含めてしまえば良い
modprobe や insmod をしたくなければカーネルに含めてしまえば良い
configfs の modprobe が必要になるのは、
カーネル設定でモジュールを選ぶ際に {M} としていたため。~
これを {*} にすれば、modprobe configfs は必要なくなります。
同様に dtbocfg をカーネルモジュールとするには、、、~
http://manual.atmark-techno.com/dist/atmark-dist_developers_guide_ja-1.0.7/ch11 ~
のようにすればいいみたい?
Makefile が黒魔術だ。
後で調べる。
* コメント・質問 [#ta227d68]
#article_kcaptcha
Counter: 11653 (from 2010/06/03),
today: 1,
yesterday: 3