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

Front page   Edit Diff History Attach Copy Rename Reload   New Page list Search Recent changes   Help   RSS of recent changes