Diary/2020-12-2
Ubuntu/ZCU111の続き
https://www.wasamon.net/miyo/index.cgi?page=Diary%2F2020%2D12%2D1 の続き
- U-bootで自動的に起動するようにする
uEnv.txtじゃなくてboot.scrを使う.手で入力してたコマンドを boot.script に保存.
fatload mmc 0 0x10000000 Image fatload mmc 0 0x02a00000 zynqmp-zcu111-revA.dtb setenv bootargs earlycon clk_ignore_unused consoleblank=0 root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait booti 0x10000000 - 0x02a00000
で,
$ ${WORK}/u-boot-xlnx/tools/mkimage -A arm64 -O linux -T script -C none -a 0 -e 0 -n "boot.scr" -d boot.script boot.scr
として boot.scr を作る.これを BOOT.binとか置いたパーティションにコピー.
- PLの再コンフィギュレーション
これは,ZYNQでやってたときと同じ.
fpga.dtsを用意して
/dts-v1/; / { fragment@0 { target-path = "/fpga-full"; __overlay__ { firmware-name = "fpga.bin"; }; }; };
dtcでdtsからdtbを作成
dtc -I dts -O dtb -o fpga.dtb fpga.dts
fpga-bit2bin.pyでbitファイルからbinファイルを作って,
/lib/firmware/fpga.bin に配置して
mkdir -p /sys/kernel/config/device-tree/overlays/fpga cp fpga.dtb /sys/kernel/config/device-tree/overlays/fpga/dtbo
- RFdcアプリの実装のためにライブラリの準備
実機で作業してしまう
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/84378586/Building+RFDC+application+from+git+sources+for+ZCU111 ベースにしつつ,実機なのでちょっと違う
libsysfs-devやcmakeやらが必要らしいのでaptでインストール
sudo apt install libsysfs-dev cmake
一式を取得.ホームディレクトリの下で作業する.
cd ~/ git clone https://github.com/Xilinx/embeddedsw cd embeddedsw git checkout xilinx-v2019.1
libmetalのビルド
cd ThirdParty/sw_services/libmetal/src/libmetal mkdir build_libm; cd build_libm cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/platforms/zynqmp-linux.cmake make -k sudo make install/fast
test関連のソースのビルドでエラーがでるので,ごにょごにょとスキップ.
cd ~/embeddedsw/XilinxProcessorIPLib/drivers/rfdc/src/ make -f Makefile.Linux
- RFdcのサンプルを動かしてみる,が.
user@zcu111:~/embeddedsw/XilinxProcessorIPLib/drivers/rfdc/examples$ ./rfdc-read-write RFdc Read and Write Example Test metal_sys_init success: sysfs_get_mnt_path success: fopen /dev/urandom success: metal_init_page_sizes try: metal_linux_bus_init metal_linux_bus_init metal_linux_probe_bus try: sysfs_open_bus: platform success: sysfs_open_bus: platform try: metal_linux_probe_driver metal_linux_probe_driver try: sysfs_open_driver platform uio_pdrv_genirq result: sysfs_open_driver (nil) metal_linux_probe_driver try: sysfs_open_driver platform uio_dmem_genirq result: sysfs_open_driver (nil) error: metal_linux_probe_driver metal_linux_probe_bus try: sysfs_open_bus: pci success: sysfs_open_bus: pci try: metal_linux_probe_driver metal_linux_probe_driver try: sysfs_open_driver pci vfio-pci result: sysfs_open_driver (nil) metal_linux_probe_driver try: sysfs_open_driver pci uio_pci_generic result: sysfs_open_driver (nil) error: metal_linux_probe_driver ERROR: Failed to run metal initialization Read and Write Example Test failed user@zcu111:~/embeddedsw/XilinxProcessorIPLib/drivers/rfdc/examples$
って感じでmetal_initで失敗.
ちなみにTRDで実行してみると
root@xilinx-zcu111-2020_2:/media/sd-mmcblk0p2/home/user/embeddedsw/XilinxProcessorIPLib/drivers/rfdc/examples# ./rfdc-read-write RFdc Read and Write Example Test metal: info: Registered shmem provider linux_shm. metal: info: Registered shmem provider ion.reserved. metal: info: Registered shmem provider ion.ion_system_contig_heap. metal: info: Registered shmem provider ion.ion_system_heap. metal: info: metal_linux_dev_open: checking driver vfio-platform,b0040000.usp_rf_data_converter,uio_pdrv_genirq metal: info: metal_linux_dev_open: checking driver uio_pdrv_genirq,b0040000.usp_rf_data_converter,uio_pdrv_genirq metal: info: metal_linux_dev_open: driver uio_pdrv_genirq bound to b0040000.usp_rf_data_converter metal: warning: reading attribute /sys/devices/platform/amba/b0040000.usp_rf_data_converter/uio/uio5/maps/map1/offset yields result -22 metal: info: metal_linux_dev_open: checking driver vfio-platform,b0040000.usp_rf_data_converter,(null) metal: warning: reading attribute /sys/devices/platform/amba/b0040000.usp_rf_data_converter/uio/uio5/maps/map1/offset yields result -22 Segmentation fault root@xilinx-zcu111-2020_2:/media/sd-mmcblk0p2/home/user/embeddedsw/XilinxProcessorIPLib/drivers/rfdc/examples#
とか
ためしにTRDでsys以下をfindしてみると
root@xilinx-zcu111-2020_2:/sys# find . -name \*uio\* -print ./class/uio ./class/uio/uio1 ./class/uio/uio4 ./class/uio/uio2 ./class/uio/uio0 ./class/uio/uio3 ./devices/platform/amba/fd0b0000.perf-monitor/uio ./devices/platform/amba/fd0b0000.perf-monitor/uio/uio1 ./devices/platform/amba/fd490000.perf-monitor/uio ./devices/platform/amba/fd490000.perf-monitor/uio/uio2 ./devices/platform/amba/ffa00000.perf-monitor/uio ./devices/platform/amba/ffa00000.perf-monitor/uio/uio0 ./devices/platform/amba/b0010000.axi_perf_mon/uio ./devices/platform/amba/b0010000.axi_perf_mon/uio/uio4 ./devices/platform/amba/ffa10000.perf-monitor/uio ./devices/platform/amba/ffa10000.perf-monitor/uio/uio3 ./bus/platform/drivers/uio_pdrv_genirq ./bus/platform/drivers/uio_dmem_genirq ./module/uio_xilinx_ai_engine root@xilinx-zcu111-2020_2:/sys# find . -name \*pci\* -print ./kernel/debug/clk/pcie_ref_mux ./kernel/debug/clk/pcie_ref_div1 ./kernel/debug/clk/pcie_ref ./class/pci_bus ./bus/platform/drivers/xilinx-pcie ./bus/platform/drivers/xilinx-xdma-pcie ./bus/platform/drivers/nwl-pcie ./bus/pci ./bus/pci/drivers/ps_pcie_dma ./firmware/devicetree/base/amba/pcie@fd0e0000 ./firmware/devicetree/base/__symbols__/pcie ./firmware/devicetree/base/__symbols__/pcie_intc ./module/edac_core/parameters/edac_pci_panic_on_pe ./module/edac_core/parameters/check_pci_errors
で,自分でセットアップした方は,
root@zcu111:/sys# find . -name \*uio\* -print ./class/uio ./class/uio/uio1 ./class/uio/uio2 ./class/uio/uio0 ./class/uio/uio3 ./devices/platform/amba/fd0b0000.perf-monitor/uio ./devices/platform/amba/fd0b0000.perf-monitor/uio/uio1 ./devices/platform/amba/fd490000.perf-monitor/uio ./devices/platform/amba/fd490000.perf-monitor/uio/uio2 ./devices/platform/amba/ffa00000.perf-monitor/uio ./devices/platform/amba/ffa00000.perf-monitor/uio/uio0 ./devices/platform/amba/ffa10000.perf-monitor/uio ./devices/platform/amba/ffa10000.perf-monitor/uio/uio3 root@zcu111:/sys# find . -name \*pci\* -print ./kernel/debug/clk/pcie_ref_mux ./kernel/debug/clk/pcie_ref_div1 ./kernel/debug/clk/pcie_ref ./class/pci_bus ./bus/platform/drivers/nwl-pcie ./bus/pci ./firmware/devicetree/base/amba/pcie@fd0e0000 ./module/edac_core/parameters/edac_pci_panic_on_pe ./module/edac_core/parameters/check_pci_errors root@zcu111:/sys#
たしかに,uio_pdrv_genirqやuio_dmem_genirqがいない.
Linuxの.configをみると,
CONFIG_UIO_PDRV_GENIRQ=m CONFIG_DMEM_GENIRQ=m
だったので,
CONFIG_UIO_PDRV_GENIRQ=y CONFIG_DMEM_GENIRQ=y
にしてビルド。
/sys/bus/platform/drivers/uio_pdrv_genirq /sys/bus/platform/drivers/uio_dmem_genirq
がはえた.というわけで再実行.
user@zcu111:~/embeddedsw/XilinxProcessorIPLib/drivers/rfdc/examples$ ./rfdc-read-write RFdc Read and Write Example Test metal_sys_init success: sysfs_get_mnt_path success: fopen /dev/urandom success: metal_init_page_sizes try: metal_linux_bus_init metal_linux_bus_init metal_linux_probe_bus try: sysfs_open_bus: platform success: sysfs_open_bus: platform try: metal_linux_probe_driver metal_linux_probe_driver try: sysfs_open_driver platform uio_pdrv_genirq result: sysfs_open_driver 0x55bb715e20 metal_linux_probe_driver try: sysfs_open_driver platform uio_dmem_genirq result: sysfs_open_driver 0x55bb715fc0 success: metal_linux_probe_driver try: metal_linux_register_bus metal_linux_probe_bus try: sysfs_open_bus: pci success: sysfs_open_bus: pci try: metal_linux_probe_driver metal_linux_probe_driver try: sysfs_open_driver pci vfio-pci [sudo] password for user: result: sysfs_open_driver (nil) metal_linux_probe_driver try: sysfs_open_driver pci uio_pci_generic result: sysfs_open_driver (nil) error: metal_linux_probe_driver success: metal_linux_bus_init success: open /proc/self/pagemap success: metal_linux_irq_init metal: info: Registered shmem provider linux_shm. metal: error: metal_ion_shm_provider_init: failed to open ion dev file. success: metal_linux_init_shmem metal: warning: metal_linux_irq_handling: Failed to set scheduler: Unknown error -1. metal: error: Invalid device id 0Read and Write Example Test failed user@zcu111:~/embeddedsw/XilinxProcessorIPLib/drivers/rfdc/examples$
とりあえず,metal_initは通ったよう.
Invalid device id 0Read and Write Example Test failed
は,DACやADCのエントリがないから仕方ない気がする(次の仕事だと思う).
ちょっとlibmetalを分かってからじゃないと次すすめないな.