🪨

DE10-Nano用にGHRDのための最新のDebianのイメージを作る

2023/02/15に公開

この記事では,U-bootとLinux kernelをDE10-Nano用にコンパイルした後に,これらを用いたDebianのイメージを作る.
ビットストリームはDE10-Nano付録ディスク(ホームページからも入手できる)のDemonstrationsにあるGHRDを用いる.GHRDのプロジェクトをQuartus 22.1 Lite Editionで合成したものを動かす.LEDなどがFPGAから操作できるようになる.(HDMI出力はない)

備忘録的なものなので,再現できない,詳しく教えて欲しいなどあればコメントください.
DE1やDE0-SoC,SocKitでもほぼ変わらないと思う.

この情報を参考にしたことによるいかなる損害も私は責任はとりません.

環境

バージョン
OS(Host) Debian bullseye
EDA Quartus 22.1 Lite
ボード DE10-Nano
U-Boot altera-opensource/u-boot-socfpga socfpga_v2022.7
Linux kernel altera-opensource/linux-socfpga socfpga-5.15.80-lts
OS(Board) Debian bullseye

Quartusによる合成はWindowsでも行える.つまり,わざわざLinux環境にQuartusやEDSを導入しなくても良い.

環境構築

Debianにおいて,次のパッケージを導入すれば良い.

gcc-arm-linux-gnueabihf build-essentials git u-boot-tools flex bison

Debootstrap向け

qemu-user-static debootstrap binfmt-support rsync

GHRDのプロジェクトの合成

DE10_NANO_SoC_GHRD.qpfをQuartusで開き,最新バージョンに変換する.少し変換に失敗するものの,採番を0にすれば良い.Platform DesignerでqsysファイルからVerilogファイルを生成した後に合成する.

同梱されているsoc_system.dtsはコンパイルエラーになるので,修正する.
具体的には,axl345のunit-addressがコンパイルエラーになるので,@0x53@53にする.たぶん正しいのは0xffc04053?

U-Boot

$ git clone https://github.com/altera-opensource/u-boot-socfpga

Gitでリポジトリをcloneする.
Platform Designerで生成したHPSの情報からいくつかのヘッダファイルに変換し,それを含めてU-Bootをコンパイルする必要がある.そのコマンドが次の通り.${u_boot_socfpga}はU-Bootのリポジトリのディレクトリ,${ghrd_project}は先ほど合成したプロジェクトのディレクトリである.実行にはPython 2が必要である.

$ python2 ${u_boot_socfpga}/arch/arm/mach-socfpga/cv_bsp_generator/cv_bsp_generator.py \
     -i ${ghrd_project}/hps_isw_handoff/soc_system_hps_0/ \
     -o ${u_boot_socfpga}/board/altera/cyclone5-socdk/qts/

シェルスクリプト版もあるっぽい?(${u_boot_socfpga}/arch/arm/mach-socfpga/qts-filter.shIntel公式の説明では上記のPython2を使っていた.

u-boot.scrを自動的に実行するようにしたいので,${u_boot_socfpga}/configs/socfpga_de10_nano_defconfigに次の行を付け足す.(make menuconfigでやるべき)

CONFIG_USE_BOOTCOMMAND=y
CONFIG_BOOTCOMMAND="run fatscript"

そしていよいよmakeする.

$ cd ${u_boot_socfpga}
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ make socfpga_de10_nano_defconfig
$ make

Linux kernel

$ git clone https://github.com/altera-opensource/linux-socfpga

Gitリポジトリをクローンする.
プロジェクトに同梱されているsoc_system.dts${linux_socfpga}/arch/arm/boot/dts/socfpga_cyclone5_de10_nano.dtsにコピーする.(${linux_socfpga}はlinux-socfpgaのリポジトリ)

makeの前に,環境変数を設定しておく.

$ cd ${linux_socfpga}
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-

DEBパッケージが不要な場合

zImagesocfpga_cyclone5_de10_nano.dtbを生成する.

$ make zImage socfpga_cyclone5_de10_nano.dtb

DEBパッケージが必要な場合

zImagesocfpga_cyclone5_de10_nano.dtbだけでなく,debファイルも生成する.

$ make deb-pkg socfpga_cyclone5_de10_nano.dtb

Debootstrap

よくやる方法で良い.

$ mkdir root_dir
$ sudo chown root root_dir
$ sudo debootstrap --arch=armhf --foreign bullseye root_dir
$ sudo cp /usr/bin/qemu-arm-static root_dir/usr/bin
$ 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カードへの書き込み

パーティション

パーティションは次の通り.

  • 先頭のパーティションは3番にして,1MiB以上確保する.パーティションのタイプは0xA2.U-Bootが書き込まれる.
  • 次に10MiB以上のパーティションでブートに必要なスクリプトやdtbファイル,ビットストリームを配置する.FATでフォーマットし,タイプはVFATで番号は1番.
  • 最後はDebootstrapで作ったイメージを格納する.SDカードの残りの領域を全て使えば良い.ext4でフォーマットで,番号は2番.

https://github.com/ikwzm/FPGA-SoC-Linux/blob/master/doc/install/format-disk-de0-nano-soc.md に従ってパーティションを作成すると良い.

U-Bootの書き込み

ddでU-Bootの実行ファイルをパーティション3番(先頭)に書き込む./dev/mmcblk0はSDカードのブロックデバイスである.

$ sudo dd if=${u_boot_socfpga}/u-boot-with-spl.sfp of=/dev/mmcblk0p3 bs=64k

1番パーティションへのファイルの配置

1番パーティションをマウントし,次のファイルをルートにコピーする.

  • ${linux_socfpga}/arch/arm/boot/zImage
  • ${ghrd_project}/output_files/soc_system.rbf
  • ${linux_socfpga}/arch/arm/boot/dts/socfpga_cyclone5_de10_nano.dtb
  • (${linux_socfpga}/arch/arm/boot/dts/socfpga_cyclone5_de10_nano.dts)

1番パーティションにスクリプトを配置する

次に,U-Bootのスクリプトを記述する.

setenv fpgadata 0x2500000;
fatload mmc 0:1 $fpgadata soc_system.rbf;
fpga load 0 $fpgadata $filesize;
bridge enable;
run mmc_boot;

fpga loadでFPGAにビットストリームが書き込まれる.bridge enableはHPSとFPGAのブリッジを有効化する.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 "DE10-Nano" -d u-boot.txt u-boot.scr

できたu-boot.scrを1番パーティションに配置する.(名前は必ずu-boot.scrにしなければならない.)

次に,1番パーティションのextlinux/extlinux.confを記述する.具体的には次のように書く.

LABEL Linux Default
    KERNEL ../zImage
    FDT    ../socfpga_cyclone5_de10_nano.dtb
    APPEND root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8

KERNELとFDTの行はパスが合っていれば良い.カーネルパラメータは既存のものを参考にした.https://wiki.archlinux.jp/index.php/Syslinux を見るとメニューを出すこともできる模様.

以上で,1番パーティションの準備は完了した.

2番パーティションへのファイルの配置

非常に簡単で,debootstrapで作ったroot_dirをすべてコピーするだけである.

$ cp -r root_dir/* ${2番パーティションのマウントポイント}

以上で,イメージが完成したはずである.

参考文献

Discussion