🪨

ZYBO系ボード用にDebianのイメージを作る

2023/08/13に公開

この記事では,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の用意

このように接続したデザインを用意する.

  1. プロジェクト生成の所では,ボードの種類をちゃんと設定する.(ボードが出てこない場合は,左下の「Refresh」ボタンを押す.)
  2. プロジェクト生成したら,左にある「Create Block Design」から,ブロックデザインを作成する.
  3. 上の画像のように,Processing Systemを追加,Blockの自動設定をした後に,CLKを接続する.
  4. Verilog Wrapperを生成する.Sourcesにあるdesignを右クリックし,「Create HDL Wrapper」を実行する.
  5. ビットストリームを生成する.

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