2020年11月2日月曜日

meta-ultra96v2を作って、yoctoでビルドしてみた

Xilinxのyocto環境をultra96v2対応させてみた話。
QEMU使ってEmulation可能にしている。
petalinuxのインストールはしなくても良いが、xsctはダウンロードする必要がある。
サイズは1GBくらい。

ビルド方法はこちら

作成したものはここ

全部まとめたrepoはここ

QEMU動作は確認したけど、実機確認はまだやっていない。

準備

Readmeに記載の通りrepoを使用するだけ。

curl -k https://storage.googleapis.com/git-repo-downloads/repo > repo
chmod a+x repo
sudo mv repo /usr/local/bin/
XILINX_SOURCES=/path/to/xilinx/sources
mkdir -p $XILINX_SOURCES
cd $XILINX_SOURCES
repo init -u https://github.com/Xilinx/yocto-manifests -b rel-v2019.2
repo sync

レイヤーの追加

下記コマンドで追加可能

source setupsdk
bitbake-layers create-layer ../sources/meta-ultra96v2
bitbake-layers add-layer ../sources/meta-ultra96v2

meta-ultra96v2をgit cloneした場合はadd-layerだけで良い。

machine設定

meta-ultra96v2/conf/machine/ultra96v2-zynqmp.confを作成する。 内容はmeta-xilinx/meta-xilinx-bsp/conf/machine/zcu102-zynqmp.confを真似て作成する。 -zynqmpってくっつけるとincludeしているファイルがうまいこと設定してくれそうな気がしている。

やったのはMACHINE_FEATURESは"usbgadget wifi bluetooth"を追加、 MACHINE名をultra96v2に変更、qemu向けの設定をultra96v2に合わせる程度の変更を行っている。 QEMU使用したときにLinux上でsd0がなぜか認識されないのはまったく追ってないので間に合せでsd0とsd1に同じイメージを認識させている。 バージョン進めばそのうち期待通りになることを期待。(ちゃんと設定しないといけないのかもしれないけど)

menuconfig

MACHINE=ultra96v2-zynqmp bitbake u-boot-xlnx -c menuconfig
MACHINE=ultra96v2-zynqmp bitbake u-boot-xlnx -c diffconfig

fragmentファイルが出力されるので、recipes-bsp/u-boot/files配下に保存し、 recipes-bsp/u-boot/u-boot-xlnx_%.bbappendでSRC_URI+=しておく。
今回は不要と思われるが、場合によってはdo_configureでinstallを行って反映させる。
kernelも同じように設定変更可能と見られる。

local.conf

devicetreeなどをxsaファイルから生成してもらうために下記の記述を追加。 QEMU実行時に通信させるためにはGEM3を活かしておく必要がある。 (USB-Etherやwifiはエミュレートできないようなので)

# Add system HDF/DSA
HDF_EXT_ultra96v2-zynqmp = "xsa"
HDF_BASE_ultra96v2-zynqmp = "file://"
HDF_PATH_ultra96v2-zynqmp = "path/to/<yourdesign.xsa>"

qemu-devicetree

エミュレータ実行時に使用するdevicetreeはこちら。 この中からマッチするものを使用するか、自身の環境に合うようにパッチを当てるかをする。 SD0が認識しないのはpmuの設定じゃないかとも疑っているけど、とりあえず動くから放置。 recipes-devtool/qemu-devicetrees_%.bbappendでパッチが当てられる。

qemu tap

Host PCとQEMUで通信させるためにbridgeを準備する。 qemuとbridge、tapの使い方あんまりよく分かっていないからもっとスマートな方法あるかも。 忘れないようにhostと通信させることができた設定を置いておく。

bridge作成スクリプト prepare_qemu_com.sh

sudo brctl addbr br0
sudo ip addr add 10.0.2.2/16 dev br0
sudo ip link set br0 up
sudo ip tuntap add user <username> mode tap
sudo dnsmasq --interface=br0 --bind-interfaces --dhcp-range=10.0.2.4,10.0.2.254
sudo route add -net 224.0.0.0/4 dev br0

build/local.confに以下を追加。TAP使用設定。

QB_TAP_OPT_forcevariable = "-netdev tap,id=net0,ifname=tap0"

tap生成スクリプト
/etc/qemu-ifup

echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
sudo /sbin/ip link set $1 up promisc on
echo "Adding $1 to br0..."
sudo /sbin/brctl addif br0 $1

sleep 3

exit 0

tap削除スクリプト
/etc/qemu-ifdown

echo "Executing /etc/qemu-ifdown"
echo "Removing $1 to br0..."
sudo /sbin/ip link set $1 down
sudo /sbin/brctl delif br0 $1
echo "Shutting down $1..."
sudo /sbin/ip link delete dev $1

exit 0

ビルド

MACHINE=ultra96v2-zynqmp bitbake petalinux-image-minimal

QEMU実行

MACHINE=ultra96v2-zynqmp runqemu

終了はCtrl-a,x

参考ページ

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/59605045/Adding+an+HDF+to+a+Xilinx+Yocto+Layer

https://qiita.com/basaro_k/items/066edec6139bcb9d53e5

https://qiita.com/propella/items/959c040b84a6d978f1cd

QEMU実行ログ

runqemu - INFO - Running MACHINE=ultra96v2-zynqmp bitbake -e...
runqemu - INFO - Continuing with the following parameters:

KERNEL: []
DTB: [/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/system.dtb]
MACHINE: [ultra96v2-zynqmp]
FSTYPE: [wic.qemu-sd]
ROOTFS: [/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2-zynqmp-20201102051140.rootfs.wic.qemu-sd]
CONFFILE: [/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2-zynqmp-20201102051140.qemuboot.conf]

runqemu - INFO - Using preconfigured tap device tap0
runqemu - INFO - If this is not intended, touch /tmp/qemu-tap-locks/tap0.skip to make runqemu skip tap0.
runqemu - INFO - Network configuration: 192.168.7.2::192.168.7.1:255.255.255.0
runqemu - INFO - Running /home/akira/work/xilinx-yocto/build/tmp/work/x86_64-linux/qemu-xilinx-helper-native/1.0-r1/recipe-sysroot-native/usr/bin//qemu-xilinx/qemu-system-aarch64-multiarch -net nic -net nic -net nic -net nic,netdev=net0,macaddr=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0 -drive if=sd,index=0,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2-zynqmp-20201102051140.rootfs.wic.qemu-sd,format=raw  -drive if=sd,index=1,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2-zynqmp-20201102051140.rootfs.wic.qemu-sd,format=raw -nographic -serial /dev/null -serial mon:stdio -serial /dev/null -serial /dev/null -dtb /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/system.dtb -hw-dtb /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/qemu-hw-devicetrees/multiarch/ultra96-arm.dtb -global xlnx,zynqmp-boot.cpu-num=0 -global xlnx,zynqmp-boot.use-pmufw=true -device loader,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/arm-trusted-firmware.elf,cpu-num=0 -device loader,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/u-boot.elf  -boot mode=3 -pmu-args ' -M microblaze-fdt -display none -hw-dtb /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/qemu-hw-devicetrees/multiarch/zynqmp-pmu.dtb -kernel /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/pmu-rom.elf -device loader,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/pmu-firmware-ultra96v2-zynqmp.elf -device loader,addr=0xfd1a0074,data=0x1011003,data-len=4 -device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4 '  -machine arm-generic-fdt  -m 4096


PMU instance cmd: /home/akira/work/xilinx-yocto/build/tmp/work/x86_64-linux/qemu-xilinx-helper-native/1.0-r1/recipe-sysroot-native/usr/bin/qemu-xilinx/qemu-system-microblazeel -M microblaze-fdt -display none -hw-dtb /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/qemu-hw-devicetrees/multiarch/zynqmp-pmu.dtb -kernel /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/pmu-rom.elf -device loader,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/pmu-firmware-ultra96v2-zynqmp.elf -device loader,addr=0xfd1a0074,data=0x1011003,data-len=4 -device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4 -machine-path /tmp/tmpp9r1d34f

APU instance cmd: /home/akira/work/xilinx-yocto/build/tmp/work/x86_64-linux/qemu-xilinx-helper-native/1.0-r1/recipe-sysroot-native/usr/bin/qemu-xilinx/qemu-system-aarch64 -net nic -net nic -net nic -net nic,netdev=net0,macaddr=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0 -drive if=sd,index=0,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2-zynqmp-20201102051140.rootfs.wic.qemu-sd,format=raw -drive if=sd,index=1,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2-zynqmp-20201102051140.rootfs.wic.qemu-sd,format=raw -nographic -serial /dev/null -serial mon:stdio -serial /dev/null -serial /dev/null -dtb /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/system.dtb -hw-dtb /home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/qemu-hw-devicetrees/multiarch/ultra96-arm.dtb -global xlnx,zynqmp-boot.cpu-num=0 -global xlnx,zynqmp-boot.use-pmufw=true -device loader,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/arm-trusted-firmware.elf,cpu-num=0 -device loader,file=/home/akira/work/xilinx-yocto/build/tmp/deploy/images/ultra96v2-zynqmp/u-boot.elf -boot mode=3 -machine arm-generic-fdt -m 4096 -machine-path /tmp/tmpp9r1d34f

Executing /etc/qemu-ifup
Bringing up tap0 for bridged mode...
Adding tap0 to br0...
NOTICE:  ATF running on XCZUUNKN/QEMU v4/RTL0.0 at 0xfffea000
NOTICE:  BL31: Secure code at 0x60000000
NOTICE:  BL31: Non secure code at 0x10080000
NOTICE:  BL31: v2.0(release):xilinx-v2019.2
NOTICE:  BL31: Built : 16:36:49, Oct 30 2020
PMUFW:  v1.1


U-Boot 2019.01 (Nov 01 2020 - 09:46:41 +0000)

Model: Avnet Ultra96 Rev1
Board: Xilinx ZynqMP
DRAM:  2 GiB
EL Level:   EL2
Chip ID:    unknown
MMC:   mmc@ff160000: 0, mmc@ff170000: 1
In:    serial@ff010000
Out:   serial@ff010000
Err:   serial@ff010000
Bootmode: SD_MODE
Reset reason:
Net:   ZYNQ GEM: ff0e0000, phyaddr ffffffff, interface gmii

Warning: ethernet@ff0e0000 (eth0) using random MAC address - 06:12:f1:50:6f:f1
eth0: ethernet@ff0e0000
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
263 bytes read in 6 ms (42 KiB/s)
## Executing script at 20000000
53697 bytes read in 22 ms (2.3 MiB/s)
18293248 bytes read in 2540 ms (6.9 MiB/s)
## Flattened Device Tree blob at 04000000
   Booting using the fdt blob at 0x4000000
   Loading Device Tree to 000000000ffef000, end 000000000ffff1c0 ... OK

Starting kernel ...

INIT: version 2.88 booting
Starting udev
Configuring packages on first boot....
 (This may take several minutes. Please do not power off the machine.)
Running postinst /etc/rpm-postinsts/100-kernel-image-image-4.19.0-xilinx-v2019.2...
Running postinst /etc/rpm-postinsts/101-sysvinit-inittab...
update-rc.d: /etc/init.d/run-postinsts exists during rc.d purge (continuing)
 Removing any system startup links for run-postinsts ...
  /etc/rcS.d/S99run-postinsts
INIT: Entering runlevel: 5
Configuring network interfaces... udhcpc: started, v1.29.2
udhcpc: sending discover
udhcpc: sending discover
udhcpc: sending discover
udhcpc: sending select for 10.0.2.49
udhcpc: lease of 10.0.2.49 obtained, lease time 3600
/etc/udhcpc.d/50default: Adding DNS 10.0.2.2
done.
Starting haveged: haveged: listening socket at 3
haveged: haveged starting up


Starting Dropbear SSH server: Generating 2048 bit rsa key, this may take a while...
haveged: haveged: ver: 1.9.4; arch: generic; vend: ; build: (gcc 8.2.0 CTV); collect: 128K

haveged: haveged: cpu: (VC); data: 16K (D V); inst: 16K (D V); idx: 11/40; sz: 15528/64688

haveged: haveged: tot tests(BA8): A:1/1 B:1/1 continuous tests(B):  last entropy estimate 7.99866

haveged: haveged: fills: 0, generated: 0

Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCMdVJ5VKRXuQp29ljnv2aLA6egiu3WjLaJDBqpznm2tK+HYoWZ9UfAAQtjjxGFNb8eKf6ea68eht010J29f4P3yEbnQmWDAul19GDz34WwAKZW/yOTzn3I4ZhYyFPMi7lcPfb1s6JPbcZauUMjLatK+OYgV99VzGt3T3ZOJ9W80fDFothrO6EerqrMI6tGVkTmfWAkEYdtMT8lvMkqSS/zE+jbPewKK3yCWCBrPpMVIl2M2XHtzRZTaZ95vXP4Y3fvfd+t6QSKQG3jWlVsmazc1YOt8X0EiL2o/kiLmbTmNypxIe1MmdYRtGewog2YLWZdr5+CNBW3CdOUhnz3zG6F root@ultra96v2-zynqmp
Fingerprint: sha1!! 96:a0:e2:1b:bc:48:97:a8:96:1e:72:f2:04:f0:7d:25:3f:f0:e7:9b
dropbear.
Starting internet superserver: inetd.
Starting syslogd/klogd: done
Starting tcf-agent: OK

root@ultra96v2-zynqmp:~# ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2): 56 data bytes
64 bytes from 10.0.2.2: seq=0 ttl=64 time=5.415 ms
64 bytes from 10.0.2.2: seq=1 ttl=64 time=1.795 ms
64 bytes from 10.0.2.2: seq=2 ttl=64 time=5.913 ms
64 bytes from 10.0.2.2: seq=3 ttl=64 time=1.440 ms
64 bytes from 10.0.2.2: seq=4 ttl=64 time=1.672 ms
^C
--- 10.0.2.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 1.440/3.247/5.913 ms
root@ultra96v2-zynqmp:~# poweroff

The system is going down for system halt NOW!(ttyPS0) (Mon Nov  2 08:05:33 20
INIT: Switching to runlevel: 0
INIT: Sending processes the TERM signal
Stopping haveged:

Stopping Dropbear SSH server: stopped /usr/sbin/dropbear (pid 2069)
dropbear.
Stopping internet superserver: inetd.
Stopping syslogd/klogd: stopped syslogd (pid 2080)
stopped klogd (pid 2083)
done
Stopping tcf-agent: OK
Deconfiguring network interfaces... ifdown: interface eth0 not configured
done.
Sending all processes the TERM signal...
logout
Sending all processes the KILL signal...
Unmounting remote filesystems...
Deactivating swap...
Unmounting local filesystems...
[  196.685507] reboot: Power down
QEMU: Terminated
Executing /etc/qemu-ifdown
Removing tap0 to br0...
Shutting down tap0...
runqemu - INFO - Cleaning up

0 件のコメント:

コメントを投稿