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-boot
は u-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もどきも楽しそうだな。