zFIFO - an AXI DMA driver for Zynq and ZynqMP

zFIFO を自分でビルドする: ソフトウェア編

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/ に置かれています。

その他 boot に必要なもの

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 を作る

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などを使って必要なアプリケーションを揃えることが可能です。


Front page   New Page list Search Recent changes   Help   RSS of recent changes