#author("2020-06-04T12:59:58+00:00","default:osana","osana") #author("2025-02-03T07:33:32+00:00","default:osana","osana") [[zFIFO - an AXI DMA driver for Zynq and ZynqMP]] * zFIFO を自分でビルドする: ソフトウェア編 [#b6b04f93] MicroSD カードの第1パーティションを vfat、第2パーティションを ext4 で初期化します。ブートローダ (boot.bin) その他カーネルの起動に関わるものは vfat パーティションに置きます。 コンパイルに使うツールチェインは Vitis 2019.2 に付属のものを使っています。Linux でやるのが確実と思いますが、必ずしも Ubuntu でなくても動くと思います。 ** カーネルをビルドする [#ie0ae711] Linux カーネルは Xilinx のものを使うのが簡単です。ZYBO (および Z7-20) なら以下のようにしてビルドします。 $ git clone https://github.com/Xilinx/linux-xlnx.git $ cd linux-xlnx $ git checkout xilinx-v2019.2.01 $ export CROSS_COMPILE=arm-linux-gnueabihf- $ make ARCH=arm xilinx_zynq_defconfig $ make ARCH=arm menuconfig 特になにか設定は必要ありませんが、必要なUSBデバイスなどのドライバを含める場合はここで設定します。 $ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage -j4 Ultra96 (および v2) であれば: $ git clone https://github.com/Xilinx/linux-xlnx.git $ cd linux-xlnx $ git checkout xilinx-v2019.2.01 としてカーネルソースをチェックアウトしたあと、Ultra96v2 ならば無線 LAN (WILC3000) のドライバを組み込みます。ikwzm さんの記事 (https://qiita.com/ikwzm/items/2b50d1228282ebf150dd) に手順が掲載されています。 作業が終わったら (あるいは WILC3000 のドライバを使わない場合) 引き続きビルドを行います。 $ export CROSS_COMPILE=aarch64-linux-gnu- $ make ARCH=arm64 xilinx_zynqmp_defconfig $ make ARCH=arm64 menuconfig 特になにか設定しなくても最低限起動はします。 Ultra96v2 で、上記の WILC3000 の設定をした場合は、WILC SDIO を enable してください。 そのほか、USB Ethernet などがあると便利です。 $ make ARCH=arm64 -j4 以上でビルドが終わりです。ZYBO (Zynq-7000) のカーネルは arch/arm/boot/uImage に、Ultra96 (ZynqMP) のカーネルは arch/arm64/boot/Image に生成されます。 ** ドライバをビルドする [#p641db54] 自前で用意した Linux カーネルを使う場合には、ドライバもビルドしていただく必要があります。 Subversion リポジトリが https://lut.eee.u-ryukyu.ac.jp/svn/zfifo/ にありますので、 $ svn co https://lut.eee.u-ryukyu.ac.jp/svn/zfifo/trunk/ zfifo $ git clone https://github.com/debugordie/zFIFO.git $ cd zfifo $ make ARCH=arm64 KERNEL_SRC_DIR=/path/to/your/kernel-src-tree のようにしてドライバをビルドします。Zynq-7000 の場合は ARCH=armで、KERNEL_SRC_DIR はお使いのLinuxカーネルをコンパイルしたソースツリーの場所を指定します。 ビルドが成功すると、 - zfifo.ko: ドライバ本体 - libzfifo-test: DMA loopback 用のテストプログラム が生成されます。バイナリ配布版のカーネル用のドライバ・テストプログラムは ~zynq/ に置かれています。 ** その他 boot に必要なもの [#p5cb4a96] SDカードの第1パーティションにはカーネルの他、以下のようなものを置かねばなりませんが、 バージョンが同じであれば、基本的にバイナリ配布のものから変更する必要はありません。 - boot.bin: FSBL + u-boot - uenv.txt: u-boot の設定ファイル - devicetree.dtb: デバイスツリー - pl.bit: PL (FPGA) のビットストリーム PL のビットストリームは、ご自身のアプリケーションが実装されているものと差し替えるのもよいでしょう。 デバイスツリーは、Vivado のデザインをもとにして Vitis などで生成すると、AXI DMA コアには vdma (Video DMA)などのドライバが attach して、zfifo ドライバは初期化に失敗します。これは、自動生成されたデバイスツリーの axi_dma_0 のところには compatible = "xlnx,axi-dma-7.1", "xlnx,axi-dma-1.00.a"; のように書かれているためです。このサイトで配布されているデバイスツリーのソースでは、最後に &axi_dma_0 { compatible = "zfifo"; }; と書いて、vdma ドライバが attach しないようにしています。 ** Root filesystem を作る [#pefaf719] Root filesystem は Ubuntu 18.04 で作成しています。Micro SD カードを /dev/sdb2 とすると、 $ sudo mkfs -t ext4 /dev/sdb2 $ sudo mount /dev/sdb2 /mnt $ sudo debootstrap --foreign --arch arm64 bionic /mnt http://ports.ubuntu.com/ $ sudo cp /usr/bin/qemu-aarch64-static /mnt/usr/bin $ sudo chroot /mnt $ ./debootstrap/debootstrap --second-stage $ passwd $ su のような手順で Root filesystem を作ることができます。ZYBO (armhf) の場合は、 - debootstrap で --arch arm64 を --arch armhf に - /usr/bin/qemu-aarch64-static を /usr/bin/qemu-arm-static に それぞれ読み替えてください。 このままだとアカウントが root しかありませんので、 $ adduser zynq でアカウントを追加したのち (名前は zynq でなくてもかまいません)、 $ vi /etc/group で、sudo グループに追加しておきましょう。chroot 環境を exit で抜けるまでは QEMU で仮想 ARM環境にいますので、ここでapt-getなどを使って必要なアプリケーションを揃えることが可能です。