zFIFO - an AXI DMA driver for Zynq and ZynqMP
MicroSD カードの第1パーティションを vfat、第2パーティションを ext4 で初期化します。ブートローダ (boot.bin) その他カーネルの起動に関わるものは vfat パーティションに置きます。
コンパイルに使うツールチェインは Vitis 2019.2 に付属のものを使っています。Linux でやるのが確実と思いますが、必ずしも Ubuntu でなくても動くと思います。
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 に生成されます。
自前で用意した Linux カーネルを使う場合には、ドライバもビルドしていただく必要があります。 Subversion リポジトリが https://lut.eee.u-ryukyu.ac.jp/svn/zfifo/ にありますので、
$ svn co https://lut.eee.u-ryukyu.ac.jp/svn/zfifo/trunk/ zfifo $ cd zfifo $ make ARCH=arm64 KERNEL_SRC_DIR=/path/to/your/kernel-src-tree
のようにしてドライバをビルドします。Zynq-7000 の場合は ARCH=armで、KERNEL_SRC_DIR はお使いのLinuxカーネルをコンパイルしたソースツリーの場所を指定します。
ビルドが成功すると、
が生成されます。バイナリ配布版のカーネル用のドライバ・テストプログラムは ~zynq/ に置かれています。
SDカードの第1パーティションにはカーネルの他、以下のようなものを置かねばなりませんが、 バージョンが同じであれば、基本的にバイナリ配布のものから変更する必要はありません。
デバイスツリーは、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 は 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) の場合は、
このままだとアカウントが root しかありませんので、
$ adduser zynq
でアカウントを追加したのち (名前は zynq でなくてもかまいません)、
$ vi /etc/group
で、sudo グループに追加しておきましょう。chroot 環境を exit で抜けるまでは QEMU で仮想 ARM環境にいますので、ここでapt-getなどを使って必要なアプリケーションを揃えることが可能です。