DE10-Nanoブート用のイメージの作成手順について
DE10-nanoで色々試す(遊ぶ)ためにLinuxカーネルやブートローダ、ディストリビューションのビルドを行ったのでその手順を備忘録としてまとめる
背景
今回、DE10-nanoで遊んでみようと思ったのはHDLを色々かいて勉強する際にFPGAで実際に動かしてみようと思ったのがきっかけ
Cyclone V SoCを選んだのは、SoC FPGAでデバイスドライバとかの足回りについても調べてみようかなと思ったのと、Cyclone Vなら数年前に少し触ったのが理由
(時間とお金があればZynq, Zynq MPとかにも挑戦したい)
参考文献
今回、カーネル等のビルドの手順を調べてみたところmacnicaのサイトにビルド手順がまとめられていたのでこれらを参考にした。
2.インテル® SoC FPGA 向け Linux ビルド方法 - 半導体事業 - マクニカ
ビルド手順
これから行うビルドの手順は以下の通り
2.u-bootのビルド
3.Angstromのビルド
4.SDカードへの書きこみ
AngstromのビルドでLinuxカーネルやu-bootも生成されるが今回はデバイスドライバのクロスコンパイルも考えているので別にビルドを行う
また、ビルドにかかる時間を短縮するためにAWSのt2.xlargeインスタンス(ubuntu16.04)でビルドを行った
1.Linuxカーネルのビルド
まずはビルドに使うコンパイラをダウンロードし、環境変数に登録する
参考にしたサイトではバージョン2015.06のコンパイラであったが、最新のものを試してみる
$ wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
$ tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
$ export PATH=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/:$PATH
$ export ARCH=arm
$ export CROSS_COMPILE=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
$ git clone https://github.com/altera-opensource/linux-socfpga
$ cd linux-socfpga
$ git checkout -t -b test origin/socfpga-4.14.130-ltsi
$ make socfpga_defconfig
$ make -j 24 zImage dtbs
linux-socfpga/arch/arm/boot/zImage
(圧縮イメージ)linux-socfpga/arch/arm/boot/dts/socfpga_cyclone5_socdk.dtb
(デバイスツリー)の2つのファイルを今回利用する
2.u-bootのビルド
u-bootのビルドでは別のコンパイラを使うのでダウンロードして、環境変数を設定しなおす。こちらでも最新のコンパイラを使ってみる
$ wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-eabi/gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi.tar.xz
$ tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi.tar.xz
$ export PATH=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi/bin:$PATH
$ export ARCH=arm
$ export CROSS_COMPILE=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi/bin/arm-eabi-
$ ~/workspace/opt/intelFPGA/19.1/embedded/embedded_command_shell.sh
$ cd DE10_NANO_SoC_GHRD
$ rm -rf software
$ mkdir -p software/bootloader
$ bsp-create-settings --type spl --bsp-dir software/bootloader --preloader-settings-dir "hps_isw_handoff/soc_system_hps_0" --settings software/bootloader/settings.bsp
$ cd software/bootloader
$ git clone https://github.com/altera-opensource/u-boot-socfpga
$ cd u-boot-socfpga
$ git checkout -t -b test origin/socfpga_v2019.04
$ ./arch/arm/mach-socfpga/qts-filter.sh cyclone5 ../../../ ../ ./board/altera/cyclone5-socdk/qts/
$ make socfpga_cyclone5_defconfig
$ make -j 24
これでu-bootがビルドされる。今回使うのはSPLとu-bootが一体化したu-boot-with-spl.sfpファイル
3.Angstromディストリビューションのビルド
今回はRocketboard.orgのリポジトリがあるAngstromのディストリビューションを使う
バージョンとしてはAngstom-v2019.06-warrior
をビルドしていく
とりあえずおまじないとして以下のコマンドを実行する
$ mkdir angstrom-build-v2019.06
$ cd angstrom-build-v2019.06
$ wget http://commondatastorage.googleapis.com/git-repo-downloads/repo
$ chmod 777 repo
$ ./repo init -u git://github.com/Angstrom-distribution/angstrom-manifest -b angstrom-v2019.06-warrior
$ wget http://releases.rocketboards.org/release/2019.10/src/altera.xml
$ mkdir -p .repo/local_manifests
$ mv altera.xml .repo/local_manifests/
$ ./repo sync
$
layers/meta-altera-refdes/conf/layer.conf
の12行目にあるLAYERSERIES_COMPAT_meta-altera-refdes = "zeus"
をコメントアウトするmeta-altera-refdes
の最新版はAngstrom-v2019.12-zeus
を指定しているのに対し、meta-altera
の最新版はAngstrom-v2019.06-warrior
用になっているのでこのままではビルドできない。meta-altera-refdes
のバージョン指定をコメントアウトすることでとりあえずビルドできるようになる(設定ファイルの変更内容を入れるのは冗長な気がするがこれもまとめとして入れておく)
$ MACHINE=cyclone5 . ./setup-environment
$ sed -i '/meta-altera/a \ \ ${TOPDIR}\/layers\/meta-altera-refdes \\' conf/bblayers.conf
$ sed -i '/meta-atmel/d' conf/bblayers.conf
$ sed -i '/meta-freescale/d' conf/bblayers.conf
$ echo "DISTRO_FEATURES_remove = \" wayland \"" >> conf/local.conf
$ echo "DISTRO_FEATURES_remove = \" alsa \"" >> conf/local.conf
$ export KERNEL_PROVIDER=linux-altera-ltsi
$ export KERNEL_TAG=refs/tags/ACDS19.3_REL_GSRD_PR
$ export KBRANCH=socfpga-4.14.130-ltsi
$ export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE KBRANCH KERNEL_TAG UBOOT_TAG KERNEL_PROVID
$ bitbake gsrd-console-image
deploy/glibc/images/cyclone5/gsrd-console-image-cyclone5.tar.gz
4.SDカードへの書きこみ
zImage
socfpga_cyclone5_socdk.dtb
u-boot-with-spb.sfp
gsrd-console-image-cyclone5.tar.gz
作成するのは
$ sudo fdisk /dev/sdb
コマンド (m でヘルプ): o
選択 (既定値 p): p
パーティション番号 (1-4, 既定値 1): 3
最初のセクタ (2048-124735487, 既定値 2048):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} : +16MB
コマンド (m でヘルプ): t
16 進数コード (L で利用可能なコードを一覧表示します): a2
コマンド (m でヘルプ): n
選択 (既定値 p): p
パーティション番号 (1,2,4, 既定値 1): 1
最初のセクタ (32768-124735487, 既定値 32768):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} : +128M
コマンド (m でヘルプ): t
16 進数コード (L で利用可能なコードを一覧表示します): b
コマンド (m でヘルプ): n
選択 (既定値 p): p
パーティション番号 (2,4, 既定値 2): 2
最初のセクタ (294912-124735487, 既定値 294912):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} :
コマンド (m でヘルプ): w
$ sudo mkdir /mnt/sdcard1
$ sudo mount /dev/sdb1 /mnt/sdcard1
$ sudo cp zImage /mnt/sdcard1/.
$ sudo cp socfpga_cyclone5_socdk.dtb /mnt/sdcard1/.
$ sudo sh -c "echo 'LABEL Linux Defaul' > /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo sh -c "echo ' KERNEL ../zImage' >> /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo sh -c "echo ' FDT ../socfpga_cyclone5_socdk.dtb' >> /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo sh -c "echo ' APPEND root=/dev/mmcblk0p2 rw rootwait earlyprintk console=ttyS0,115200n8' >> /mnt/sdcard1/extlinux/extlinux.conf"
$ sudo umount /mnt/sdcard1
gsrd-console-imae-cyclone5.tar.gz
を展開する
$ sudo mkfs.ext3 /dev/sdb2
$ sudo mkdir /mnt/sdcard2
$ sudo mount /dev/sdb2 /mnt/sdcard2
$ sudo tar xf gsrd-console-image-cyclone5.tar.gz -C /mnt/sdcard2/
$ sudo umount /mnt/sdcard2
u-boot-with-spl.sfp
を書きこむ$ sudo dd if=u-boot-with-spl.sfp of=/dev/sdb3