はじめに
MPFS-DISCO-KIT(Microchip PolarFire SoC FPGA Discovery Kit) で動作する Ubuntu 22.04 を構築する方法をいくつかの記事に分けて説明します。
- イントロ編
- HSS(Hart Software Services)編
- U-Boot 標準編
- U-Boot bootmenu 改造編
- Linux Kernel linux4microchip+fpga-2024.09 編(この記事)
- Linux Kernel mpfs-fpga-first 編
- Ubuntu 22.04 Root File System 編
- SD-Card 作成編
- SD-Card 起動編
上記の記事で構築した MPFS-DISCO-KIT 向け Ubuntu 22.04 Root File System、Linux Kernel、Boot Loader は次の URL にて公開しています。なお、これらはオフシャルなものではなく、筆者の魔改造がはいっています。ご使用の際はこの点にご留意してください。
- https://github.com/ikwzm/MPFS-FPGA-Ubuntu22.04
- https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6
- https://github.com/ikwzm/MPFS-DISCO-KIT-U-Boot
linux4microchip は Microchip Technology 社が提供する linux Kernel で、次の URL で公開されています。
その中でも、Microchip PolarFire SoC FPGA に対応した Linux Kernel は linux4microchip+fpga- で始まるタグがついています。この記事では、linux4microchip+fpga-2024.09 をビルドする方法を紹介します。
なお、この記事で紹介する Linux Kernel linux4microchip+fpga-2024.09 のビルド済みのファイルは以下の URL にあります。ビルドが面倒な方はどうぞ。
Linux Kernel の構築
必要な環境
- riscv64-unknown-linux-gnu-
Linux Kernel 構築環境の準備
まずビルド用のディレクトリを用意します。ここでは develop-linux4microchip+fpga-2024.09 とします。以降はこのディレクトリで行います。
shell$ mkdir develop-linux4microchip+fpga-2024.09
shell$ cd develop-linux4microchip+fpga-2024.09
ソースコードのダウンロード
https://github.com/linux4microchip/linux から linux4microchip+fpga-2024.09 をダウンロードします。
shell$ git clone --depth 1 --branch linux4microchip+fpga-2024.09 https://github.com/linux4microchip/linux linux4microchip+fpga-2024.09
構築の準備
環境変数を設定します。アーキテクチャ(ARCH)に riscv を指定します。ここでは、クロスコンパイルに使うツールチェーン(CROSS_COMPILE) に riscv64-unknown-linux-gnu- を指定します。この変数は構築する環境にあわせてください。その後、Microchip PolarFire SoC 用のコンフィギュレーション定義ファイルを使って構築の準備をします。
shell$ cd linux4microchip+fpga-2024.09
shell$ export ARCH=riscv
shell$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
shell$ make mpfs_defconfig
次のようなファイルを用意して .config にマージします。
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="earlycon=sbi root=/dev/mmcblk0p3 rootwait uio_pdrv_genirq.of_id=generic-uio"
shell$ ./scripts/kconfig/merge_config.sh .config ../mpfs_cmdline.cfg
Using .config as base
Merging ../mpfs_cmdline.cfg
Value of CONFIG_CMDLINE is redefined by fragment ../mpfs_cmdline.cfg:
Previous value: CONFIG_CMDLINE="earlycon uio_pdrv_genirq.of_id=generic-uio"
New value: CONFIG_CMDLINE="earlycon=sbi root=/dev/mmcblk0p3 rootwait uio_pdrv_genirq.of_id=generic-uio"
#
# configuration written to .config
#
Value requested for CONFIG_CMDLINE_BOOL not in final .config
Requested value: CONFIG_CMDLINE_BOOL=y
Actual value:
カーネルと Debian パッケージの構築
shell$ export DTC_FLAGS=--symbols
shell$ make deb-pkg
構築したカーネルのイメージとデバイスツリーを ビルド用のディレクトリにコピー
無事にカーネルのイメージ(arch/riscv/boot/Image.gz) と Microchip 用のデバイスツリー(arch/riscv/boot/dts/microchip/*) が出来たら、それを ビルド用のディレクトリにコピーします。その際、作ったカーネルのバージョン等をわかりやすくするため名前を変更しておきます。
shell$ cp arch/riscv/boot/Image.gz ../vmlinuz-linux4microchip+fpga-2024.09
shell$ install -d ../files
shell$ cp .config ../files/config-linux4microchip+fpga-2024.09
shell$ install -d ../devicetrees/linux4microchip+fpga-2024.09
shell$ cp arch/riscv/boot/dts/microchip/* ../devicetrees/linux4microchip+fpga-2024.09
fitImage のビルド
** 注意: fitImage は https://github.com/ikwzm/MPFS-FPGA-Linux-Kernel-6.6/tree/linux4microchip%2Bfpga-2024.09 には含まれていません。ここではあくまでも作りかただけを紹介しています。 **
カーネルのイメージとデバイスツリーを fitImage ビルド用のディレクトリにコピー
shell$ cd linux4microchip+fpga-2024.09
shell$ install -d ../fitImage.files
shell$ cp arch/riscv/boot/Image.gz ../fitImage.files
shell$ cp arch/riscv/boot/dts/microchip/mpfs-disco-kit.dtb ../fitImage.files
shell$ cd ../fitImage.files
fit.its
fitImage を作るために fit.its を用意します。
shell$ cat > fit.its << EOT
/dts-v1/;
/ {
description = "Kernel fitImage for linux4microchip+fpga-2024.09/mpfs-disco-kit";
#address-cells = <1>;
images {
kernel-1 {
description = "Linux Kernel";
data = /incbin/("Image.gz");
type = "kernel";
arch = "riscv";
os = "linux";
compression = "gzip";
load = <0x80200000>;
entry = <0x80200000>;
};
fdt-microchip_mpfs-disco-kit.dtb {
description = "Flattened Device Tree blob";
data = /incbin/("mpfs-disco-kit.dtb");
type = "flat_dt";
arch = "riscv";
compression = "none";
load = <0x8a000000>;
};
};
configurations {
default = "conf-microchip_mpfs-disco-kit.dtb";
conf-microchip_mpfs-disco-kit.dtb {
description = "1 Linux kernel, FDT blob";
kernel = "kernel-1";
fdt = "fdt-microchip_mpfs-disco-kit.dtb";
};
};
};
EOT
fitImage のビルド
u-boot-tools の mkimage を使って fitImage を作ります。
shell$ mkimage -f fit.its ../fitImage
FIT description: Kernel fitImage for linux4microchip+fpga-2024.09/mpfs-disco-kit
Created: Thu Dec 19 12:01:21 2024
Image 0 (kernel-1)
Description: Linux Kernel
Created: Thu Dec 19 12:01:21 2024
Type: Kernel Image
Compression: gzip compressed
Data Size: 5476497 Bytes = 5348.14 KiB = 5.22 MiB
Architecture: RISC-V
OS: Linux
Load Address: 0x80200000
Entry Point: 0x80200000
Image 1 (fdt-microchip_mpfs-disco-kit.dtb)
Description: Flattened Device Tree blob
Created: Thu Dec 19 12:01:21 2024
Type: Flat Device Tree
Compression: uncompressed
Data Size: 20028 Bytes = 19.56 KiB = 0.02 MiB
Architecture: RISC-V
Load Address: 0x8a000000
Default Configuration: 'conf-microchip_mpfs-disco-kit.dtb'
Configuration 0 (conf-microchip_mpfs-disco-kit.dtb)
Description: 1 Linux kernel, FDT blob
Kernel: kernel-1
FDT: fdt-microchip_mpfs-disco-kit.dtb