Eclypse Z7でUbuntu18.04を走らせる

Pocket

ZYNQを使ったシステム開発ではPS上でUbuntuを実行すると何かとはかどります。というわけで、Eclypse Z7上でUbuntu 18.04を走らせるためにu-bootとLinuxをビルドしました。手順は、ikwzmさんの https://github.com/ikwzm/FPGA-SoC-U-Boot-ZYBO-Z7 を参考に(ほぼそのままトレース)しています。

リソースなど一式は https://github.com/miyo/build-eclypsez7-linux にコミットしてます。

ベースのハードウェアデザインの用意

U-bootのビルド時にボードに合わせて設定したPSの初期化コードが必要なので、まずはハードウェアデザインを用意します。すでに生成したものをコミット済なので、以下は自分で用意する場合の手順です。

ボードファイルを https://github.com/Digilent/vivado-boards からダウンロードしてセットしておけばIPIでPSのインスタンスを生成して自動セットアップでOKです。ペリフェラルなどは何もつなぐ必要はありません。念の為にbitファイルを生成しておきます。

これで、

  • ./eclypsez7_base.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.c
  • ./eclypsez7_base.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.h

の2つのファイルを入手できます。

U-bootのビルド

https://gist.github.com/miyo/b36f38354a634d5801b4921423b1b120 にアップロードしたdiffを使ってビルドします

$ wget https://gist.githubusercontent.com/miyo/b36f38354a634d5801b4921423b1b120/raw/fbb97f5d2daf941e5d8a7a9a58bd1091196cdfb2/u-boot.diff
$ git clone git://git.denx.de/u-boot.git
$ cd u-boot
$ git checkout -b v2017.11 refs/tags/v2017.11
$ patch -p1 < ../u-boot.diff
$  make ARCH=arm zynq_eclypsez7_defconfig
$  make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all

出来上がった u-boot.img u-boot spl/boot.bin をSDカードのFATパーティションにコピーします。ここで、u-bootu-boot.elf という名前にリネームします。

Linuxのビルド

基本的な手順は https://github.com/fpga-design-contest/ad-refkit/blob/master/docs/sec3/index.md の通りです。dtsはEclypse Z-7用のものが必要です。

$ wget https://gist.githubusercontent.com/miyo/b36f38354a634d5801b4921423b1b120/raw/a93dc11bae4aeebfa00e96592de310b6cdd60a5f/linux-xlnx.diff
$ wget https://raw.githubusercontent.com/fpga-design-contest/ad-refkit/master/assets/patch/dot.config.patch
$ git clone https://github.com/Xilinx/linux-xlnx.git
$ cd linux-xlnx
$ git checkout -b linux-xlnx-v2019.1-eclypzez7 refs/tags/xilinx-v2019.1
$ patch -p1 < ../linux-xlnx.diff
$ git add arch/arm/boot/dts/zynq-eclypsez7.dts
$ git add --update
$ git commit -m "for Eclypse-Z7"
$ git tag -a xilinx-v2019.1-eclypsez7-3 -m "release xilinx-v2019.1-eclypsez7-3"
$ echo 3 > .version
$ make xilinx_zynq_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
$ patch -p0 < ../dot.config.patch
$ make -j32 deb-pkg ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- DTC_FLAGS=--symbols
$ make uImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000

これでLinuxカーネル uImage が手に入りました。

あとのセットアップ

UbuntuのユーザランドはQEMUを使って準備するのが楽です。具体的な手順は、https://github.com/fpga-design-contest/ad-refkit/blob/master/docs/sec4/index.md と同じ。

FATパーティションに置くu-bootはspl対応版なので、上記の u-boot.img u-boot.elf boot.binが必要なことに注意。

PLを使う

Device tree overlayの仕組みでPLの再構成ができます。

まず、Device tree overlay用のDTBを用意します。次のようなfpga.dtsから生成。

/dts-v1/;
/ {
    fragment@0 {
        target-path = "/fpga-full";
        __overlay__ {
            firmware-name = "fpga.bin";
        };
    };
};

dtbの作成は

$ dtc -I dts -O dtb -o fpga.dtb fpga.dts

でOK。

bitファイルは、 fpga-bit2bin.pyで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

でPLのコンフィギュレーションができる。

削除する場合は

$ rmdir /sys/kernel/config/device-tree/overlays/fpga

あとは

あとはなんでもできる、そんな気分になれます。RedPitayaもどきでも作ろうかな。Linux版なAPB-3もどきも楽しそうだな。