見出し画像

de10-nano, SoCモジュールで遊ぶ [Linux Kernel編-01]

今回は、Linux Kernelの作成編です。
作成するKernelのバージョンは、v5.14となります。
なお、aptで取得しておく物は、u-boot編と兼用です。

■  Videoドライバの取得
 Video用ドライバを取得します。これは、FPGA編で追加したhdmiの回路のドライバになります。位置から作ると大変なので、近いソースコードを取得し改造するのが楽です。
 近いドライバは、https://github.com/altera-opensource/linux-socfpgaにあります。(tag: rel_socfpga-4.14.130-ltsi_21.10.01_pr) から、
"driver/video/fbdev/altvipfb.c" をダウンロードしてください。
(tagに注意!これより新しい所には存在しないようです)
うまく取り出せなかった場合、下記の方法でも取り出せます。

cd ~
wget https://raw.githubusercontent.com/altera-opensource/linux-socfpga/rel_socfpga-4.14.130-ltsi_21.10.01_pr/drivers/video/fbdev/altvipfb.c

■ Kernelコンパイル用のクロスツールの取得
 Kernelコンパイルに、クロスコンパイルをダウンロードしました。手順は以下のとおりです。

cd ~/.
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/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=~/gcc-linaro-7.5.0-2019.12-x86_64_arm-eabi/bin:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-eabi-

■ Kernelのソースコードの取得

cd ~/de10-nano
git clone https://github.com/altera-opensource/linux-socfpga -b socfpga-5.14
cd linux-socfpga

■ altvipfb.c用のDeviceTreeの作成
 Device Tree ファイルを追加します。具体的には近いファイル(socfpga_cyclone5_de0_nano_soc_FB.dts)のコピー&修正をします。

cd ~/de10-nano//linux-socfpga/arch/arm/boot/dts/
cp socfpga_cyclone5_de0_nano_soc.dts  socfpga_cyclone5_de0_nano_soc_FB.dts
vim socfpga_cyclone5_de0_nano_soc_FB.dts

テキストエディタで、"socfpga_cyclone5_de0_nano_soc_FB.dts"の最後に以下を追記します。

	----- ここから-----
&base_fpga_region {
        ranges =  <0x00000000 0xff200000 0x00200000>;

        alt_vip_vfr_hdmi: vip@0x100031000 {
        compatible = "ALTR,vip-frame-reader-14.0", "ALTR,vip-frame-reader-9.1";
        reg = <0x00031000 0x00000080>;
        max-width = <1024>;
        max-height = <768>;
        bits-per-color = <8>;
        colors-per-beat = <4>;
        beats-per-pixel = <1>;
        mem-word-width = <128>;
    };
};
	----- ここまで-----

■ socfpga.dtsiの修正を行います。(92行目あたり)

vim socfpga.dtsi

元) base_fpga_region {
改) base_fpga_region: boot_fpga_region {

■ Makefileの修正
  socfpga_cyclone_de0_nano_soc_FB.dtbを Makefile に1行を追加します。line 1060 付近に追加した例を記載します。

	----- ここから-----
dtb-$(CONFIG_ARCH_INTEL_SOCFPGA) += \
        socfpga_arria5_socdk.dtb \
        socfpga_arria10_socdk_nand.dtb \
        socfpga_arria10_socdk_qspi.dtb \
        socfpga_arria10_socdk_sdmmc.dtb \
        socfpga_cyclone5_chameleon96.dtb \
        socfpga_cyclone5_mcvevk.dtb \
        socfpga_cyclone5_socdk.dtb \
        socfpga_cyclone5_de0_nano_soc.dtb \
        socfpga_cyclone5_de0_nano_soc_FB.dtb \		←この行を追加
        socfpga_cyclone5_sockit.dtb \
        socfpga_cyclone5_socrates.dtb \
        socfpga_cyclone5_sodia.dtb \
        socfpga_cyclone5_vining_fpga.dtb \
        socfpga_vt.dtb
	----- ここまで-----

■ altvipfb.c用の修正(2か所)
 先ほどダウンロードした"altvipfb.c"を以下の Directoryにコピーします。

cp ~/altvipfb.c ~/de10-nano/linux-socfpga/drivers/video/fbdev/.

”altvipfb.c”を編集① line 220 の "dma_alloc_coherent()" の第一引数を "NULL" から "&pdev->dev" に変更します

元)	fbmem_virt = dma_alloc_coherent(NULL,
改)	fbmem_virt = dma_alloc_coherent(&pdev->dev,

”altvipfb.c”を編集② line 177 に以下を追加します。

	info->var.pixclock = 6734;
	info->var.left_margin = 148;
	info->var.right_margin = 88;
	info->var.upper_margin = 36;
	info->var.lower_margin = 4;
	info->var.hsync_len = 44;
	info->var.vsync_len = 5;

■ "altvipfb.c"」が Build されるように、Makefileを編集します。
~/de10-nano/linux-socfpga/drivers/video/fbdev/Makefileの
line 14 付近に下記を追加します。

obj-$(CONFIG_FB_ALTERA_VIP_FB) += altvipfb.o
altvipfb_drv-objs := altvipfb.o

■ "altvipfb.c"が有効になるように、
"~/de10-nano//linux-socfpga/drivers/video/fbdev/Kconfig"の 222行目付近 に以下を追加します。

config FB_ALTERA_VIP_FB
	tristate "Altera VIP Frame Buffer framebuffer support"
		depends on FB
		select FB_CFB_FILLRECT
		select FB_CFB_COPYAREA
		select FB_CFB_IMAGEBLIT
		help
		  This driver supports the Altera Video and Image Processing(VIP)
		  Frame Buffer. This core driver only supports Arria 10 HW and newer
		  families of FPGA

■ ~/de10-nano/linux-socfpga/arch/arm/configs/socfpga_defconfig (line 120付近)に以下を追加します。

CONFIG_FB_ALTERA_VIP_FB=y

■ カーネルのコンパイル
 Kernel , Device Tree の Build を行います。

cd ~/de10-nano/linux-socfpga/
make socfpga_defconfig
make -j 24 zImage dtbs modules
make modules_install INSTALL_MOD_PATH=modules_install
rm -rf modules_install/lib/modules/*/build
rm -rf modules_install/lib/modules/*/source

これでカーネルのコンパイルは終了。
次回は、動作確認です。

■ 参考先
ソフトウエア開発に関しては、下記のサイトを参考にさせて頂きました。
有難うございます。

Fun Multicores
https://blog.fun-multicores.tokyo/2020/12/de10-nano-terasic-reference-design.html

この記事が気に入ったらサポートをしてみませんか?