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 件のコメント:
コメントを投稿