最初に作成したブートイメージを試行して、ZedBoardで何故かブートできなかったので、いろいろ立ち戻って調査していたのだが、やはりZybo用のものを使うのは結構ハードルが高くて、Xilinxのオフィシャルパッケージを使うほうが楽なのかもしれないと思い出した。
まずはXilinxオフィシャルのLinux, U-Boot, devicetreeモデルを使って、ZedBoardを立ち上げるのをやり直してみることにした。 #ここまでくるとあまり記事のタイトルと関係なくなっているが。。。
使用するデザイン
これはこれまでのものと同じものを利用した。
U-Bootの作成
まずは必要パッケージをインストール。
sudo apt install libssl-dev device-tree-compiler
これまでのDigilentのものではなく、Xilinxのものを利用した。
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-boot
をu-boot.elf
に変更した。
BOOT.binの再作成
FPGAのブート用デザインBOOT.binを再作成した。このとき、新しく作成したu-boot.elfを指定してBOOT.binを作成した。
Linuxのビルド
これまでのDigilentのものではなく、Xilinxのものを利用した。
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のものを利用した。
git clone https://github.com/Xilinx/device-tree-xlnx.git git checkout xilinx-v2017.1
ここからはSDKでの作業になるようだ。以下のページを参考して、devicetreeを作成した。
ただし最後の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