ZYBO系ボード用にDebianのイメージを作る
この記事では,U-bootとLinux kernelをZYBO系ボード用にコンパイルした後に,これらを用いたDebianのイメージを作る.(Xilinx公式のツールチェインは使わない.)
ビットストリームに合わせたDTBファイルの生成は,この記事では扱わない.
この情報を参考にしたことによる,いかなる損害も私は責任はとりません.
環境
バージョン | ||
---|---|---|
OS(Host) | Debian | bookworm |
EDA | Vivado | 2023.1 ML |
ボード | ZYBO, ZYBO-Z7 | (ZedBoardでもおそらく可能) |
U-Boot | https://github.com/Xilinx/u-boot-xlnx | xilinx-v2023.1 |
Linux kernel | https://github.com/Xilinx/linux-xlnx | xilinx-v2023.1 |
OS(Board) | Debian | bookworm |
Vivadoによる合成はWindowsでも行える.
環境構築
Debianにおいて,次のパッケージを導入する.
gcc-arm-linux-gnueabihf build-essentials git u-boot-tools uuid-dev libgnutls28-dev
Debootstrapに必要なパッケージは次の通り.
qemu-user-static debootstrap binfmt-support rsync
Bitstreamの用意
このように接続したデザインを用意する.
- プロジェクト生成の所では,ボードの種類をちゃんと設定する.(ボードが出てこない場合は,左下の「Refresh」ボタンを押す.)
- プロジェクト生成したら,左にある「Create Block Design」から,ブロックデザインを作成する.
- 上の画像のように,Processing Systemを追加,Blockの自動設定をした後に,CLKを接続する.
- Verilog Wrapperを生成する.Sourcesにあるdesignを右クリックし,「Create HDL Wrapper」を実行する.
- ビットストリームを生成する.
U-Boot
$ git clone https://github.com/Xilinx/u-boot-xlnx.git -b xilinx-v2023.1 ${u_boot_xilinx}
Gitでリポジトリをcloneする.
そして,make
する.
$ cd ${u_boot_xilinx}
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export DEVICE_TREE="zynq-zybo" # または "zynq-zybo-z7"
$ make xilinx_zynq_virt_defconfig
$ make
Linux kernel
$ git clone https://github.com/Xilinx/linux-xlnx.git -b xilinx-v2023.1
Gitリポジトリをクローンする.
次のコマンドでmake
する.
$ cd ${linux_xilinx}
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ make xilinx_zynq_defconfig
Debパッケージが必要な場合
$ make deb-pkg
Debパッケージが不要な場合
$ make zImage zynq-zybo.dtb zynq-zybo-z7.dtb
Debootstrap
よくやる方法で良い.
$ mkdir root_dir
$ sudo chown root root_dir
$ sudo debootstrap --arch=armhf --foreign bookworm root_dir
$ sudo cp /usr/bin/qemu-arm-static root_dir/usr/bin
$ sudo cp /etc/resolv.conf root_dir/etc/resolv.conf
$ sudo cp /etc/apt/sources.list root_dir/etc/apt/sources.list
$ sudo chroot root_dir
$ export LANG=C
$ /debootstrap/debootstrap --second-stage
$ # passwd/adduserしたり,apt installで必要なパッケージを導入したり…
$ exit
$ rm root_dir/usr/bin/qemu-arm-static
SDカードへの書き込み
パーティション
パーティションは次の通り.
- 1番目のパーティションはだいたい20MiB以上確保する.タイプはVFAT.U-BootやFirst Stage Boot Loader,ブートに必要なスクリプトやdtbファイル,ビットストリームを配置する.
- 2番目はDebootstrapで作ったイメージを格納する.SDカードの残りの領域を全て使えば良い.ext4でフォーマットで,
https://github.com/ikwzm/FPGA-SoC-Debian12/blob/main/doc/install/format-disk-zynq.md に従ってパーティションを作成すると良い.
U-BootやFirst Stage Boot Loaderやdtbファイル,ビットストリームの配置
先頭のパーティションをマウントし,次のファイルをルートにコピーする.
${linux_xilinx}/arch/arm/boot/zImage
-
${linux_xilinx}/arch/arm/boot/dts/zynq-zybo.dtb
または${linux_xilinx}/arch/arm/boot/dts/zynq-zybo-z7.dtb
- (
${linux_xilinx}/arch/arm/boot/dts/zynq-zybo.dts
または${linux_xilinx}/arch/arm/boot/dts/zynq-zybo-z7.dts
) ${u_boot_xilinx}/spl/boot.bin
${u_boot_xilinx}/u-boot.img
- Vivadoで生成したビットストリーム(design.bitにリネームする.)
1番パーティションにスクリプトを配置する
次に,U-Bootのスクリプトを記述する.
setenv fpgadata 0x2500000;
fatload mmc 0:1 $fpgadata design.bit;
fpga loadb 0 $fpgadata $filesize;
run mmc_boot;
fpga loadb
でFPGAにビットストリームが書き込まれる.ビットストリーム名はdesign.bit
にしてある.run mmc_boot
で後述するextlinux/extlinux.conf
を読み込みLinux kernelを実行する.run distro_boot
にするとSPIのフラッシュとかも見るかも.
これをu-boot.txt
として保存し,次のコマンドを実行する.
$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "ZYNQ" -d u-boot.txt boot.scr
できたboot.scr
を1番パーティションに配置する.(名前は必ずboot.scr
にしなければならない.)
次に,1番パーティションのextlinux/extlinux.conf
を記述する.具体的には次のように書く.
LABEL Linux Default
KERNEL ../zImage
FDT ../zynq-zybo.dtb
APPEND console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1
KERNELとFDTの行はパスが合っていれば良い.カーネルパラメータは既存のものを参考にした.https://wiki.archlinux.jp/index.php/Syslinux を見るとメニューを出すこともできる模様.
以上で,1番パーティションの準備は完了した.
2番パーティションへのファイルの配置
非常に簡単で,debootstrap
で作ったroot_dir
をすべてコピーするだけである.
$ cp -r root_dir/* ${2番パーティションのマウントポイント}
以上で,イメージが完成する.
Discussion