FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #6)

最初に作成したブートイメージを試行して、ZedBoardで何故かブートできなかったので、いろいろ立ち戻って調査していたのだが、やはりZybo用のものを使うのは結構ハードルが高くて、Xilinxのオフィシャルパッケージを使うほうが楽なのかもしれないと思い出した。

まずはXilinxオフィシャルのLinux, U-Boot, devicetreeモデルを使って、ZedBoardを立ち上げるのをやり直してみることにした。 #ここまでくるとあまり記事のタイトルと関係なくなっているが。。。

使用するデザイン

これはこれまでのものと同じものを利用した。

github.com

U-Bootの作成

まずは必要パッケージをインストール。

sudo apt install libssl-dev device-tree-compiler

これまでのDigilentのものではなく、Xilinxのものを利用した。

github.com

zynq-common.hに以下のような変更を加える。

diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h
index 204b1ba..5081901 100644
--- a/include/configs/zynq-common.h
+++ b/include/configs/zynq-common.h
@@ -199,6 +199,10 @@
 #define CONFIG_PREBOOT

 /* Default environment */
+#ifdef CONFIG_EXTRA_ENV_SETTINGS
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#endif
+
 #ifndef CONFIG_EXTRA_ENV_SETTINGS
 #define CONFIG_EXTRA_ENV_SETTINGS      \
        "ethaddr=00:0a:35:00:01:22\0"   \
@@ -256,12 +260,11 @@
                "fi\0" \
        "sdboot=if mmcinfo; then " \
                        "run uenvboot; " \
-                       "echo Copying Linux from SD to RAM... && " \
+                       "echo Copying Linux from SD to RAM... RFS in ext4 && " \
                        "load mmc 0 ${kernel_load_address} ${kernel_image} && " \
                        "load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
-                       "load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \
-                       "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
-               "fi\0" \
+            "bootm ${kernel_load_address} - ${devicetree_load_address}; " \
+       "fi\0"                                                                                                                          \
        "usbboot=if usb start; then " \
                        "run uenvboot; " \
                        "echo Copying Linux from USB to RAM... && " \

以下の要領でビルドする。

export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
git clone https://github.com/Xilinx/u-boot-xlnx.git
cd u-boot-xlnx
git checkout xilinx-v2017.1
make zynq_zed_defconfig
make

これでu-bootが作成されるので、ファイル名u-bootu-boot.elfに変更した。

BOOT.binの再作成

FPGAのブート用デザインBOOT.binを再作成した。このとき、新しく作成したu-boot.elfを指定してBOOT.binを作成した。

f:id:msyksphinz:20170527140633p:plain

Linuxのビルド

これまでのDigilentのものではなく、Xilinxのものを利用した。

github.com

git clone https://github.com/Xilinx/linux-xlnx.git
cd linux-xlnx
git checkout xilinx-v2017.1
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
make distclean
make ARCH=arm xilinx_zynq_defconfig && make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage

これでuImageが作成される。

devicetreeの作成

こちらも、Xilinxのものを利用した。

github.com

git clone https://github.com/Xilinx/device-tree-xlnx.git
git checkout xilinx-v2017.1

ここからはSDKでの作業になるようだ。以下のページを参考して、devicetreeを作成した。

qiita.com

ただし最後のdevicetree.dtbの作成は以下のように少しコマンドと入力ファイルを変更した。

cd path/to/sdk/device_tree_bsp_0
path/to/linux-xlnx/scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb system-top.dts

まずは、これらから作成した、

  • BOOT.bin
  • devicetree.dtb
  • uImage

をSDカードの最初のパーティションにコピーした。

sudo mount /dev/sdb2 /mnt/ZED_BOOT
sudo cp ./zedboard_hdl_201701/projects/adv7511/zed/adv7511_zed.sdk/std_FSBL/bootimage/BOOT.bin /mnt/ZED_BOOT
sudo cp ./zedboard_hdl_201701/projects/adv7511/zed/adv7511_zed.sdk/device_tree_bsp_0/devicetree.dtb /mnt/ZED_BOOT
sudo cp ./linux-xlnx/arch/arm/boot/uImage /mnt/ZED_BOOT

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com