DE10-Nano用にGHRDのための最新のDebianのイメージを作る
この記事では,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.sh
)Intel公式の説明では上記の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パッケージが不要な場合
zImage
とsocfpga_cyclone5_de10_nano.dtb
を生成する.
$ make zImage socfpga_cyclone5_de10_nano.dtb
DEBパッケージが必要な場合
zImage
とsocfpga_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