電気回路/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*
$

あれ?うまくいかない。


Counter: 9609 (from 2010/06/03), today: 7, yesterday: 0