boot.binファイル、u-boot.imgファイルの生成

boot.binファイル、u-boot.imgファイルの生成手順について記載する。というか、参考サイト:No.1と同じことを行っている。

目次


前提条件

  • 使用するOSがUbuntu16.04 LTS であること。
  • 使用するvivadoのバージョンは、2018.2であること。

手順

この手順は、Xilinxリポジトリからu-bootソースファイルをダウンロードすることろから、boot.binファイル、u-boot.imgファイルの生成まで説明する。なお、uEnv.txtを使用するためにzynq-common.hを修正する。


Xilinxリポジトリからu-bootソースファイルのダウンロード

次コマンドを入力し、Xilinxリポジトリからu-bootのソースファイルをダウンロードする。
git clone https://github.com/Xilinx/u-boot-xlnx.git

ダウンロード完了後、u-boot-xlnxというディレクトリが生成されるので、そのディレクトリに移動する。
cd u-boot-xlnx

使用するvivadoのバージョンでブランチを切る。今回は2018.2なので、xilinx-v2018.2でチェックアウトし、xilinx-v2018.2_zyboというブランチを作成する
git checkout -b xilinx-v2018.2_zybo refs/tags/xilinx-v2018.2

zynq-common.hファイルの修正

次のコマンドを入力し、zynq-common.hファイルが格納されているディレクトリまで移動する。
cd ./include/configs

次のコマンドを入力し、zynq-common.hファイルを編集する。
gedit zynq-common.h
編集内容を次に示す。

  • 環境変数コマンドCONFIG_EXTRA_ENV_SETTINGSを変更し、uEnv.txtを使用できるようにする。
  • 起動方法コマンドCONFIG_BOOTCOMMANDを追加し、SDカードからLinuxを起動するようにする。
  • zImage でのブートができるようにするため、CONFIG_CMD_BOOTZコマンドを追加する。

編集箇所を次に示す。

- /* Default environment */
- #ifndef CONFIG_EXTRA_ENV_SETTINGS
- #define CONFIG_EXTRA_ENV_SETTINGS    \
-  "ethaddr=00:0a:35:00:01:22\0" \
-  "kernel_image=uImage\0"   \
-  "kernel_load_address=0x2080000\0" \
-  "ramdisk_image=uramdisk.image.gz\0"   \
-  "ramdisk_load_address=0x4000000\0"    \
-  "devicetree_image=devicetree.dtb\0"   \
-  "devicetree_load_address=0x2000000\0" \
-  "bitstream_image=system.bit.bin\0"    \
-  "boot_image=BOOT.bin\0"   \
-  "loadbit_addr=0x100000\0" \
-  "loadbootenv_addr=0x2000000\0" \
-  "kernel_size=0x500000\0"  \
-  "devicetree_size=0x20000\0"   \
-  "ramdisk_size=0x5E0000\0" \
-  "boot_size=0xF00000\0"    \
-  "fdt_high=0x20000000\0"   \
-  "initrd_high=0x20000000\0"    \
-  "bootenv=uEnv.txt\0" \
-  "loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}\0" \
-  "importbootenv=echo Importing environment from SD ...; " \
-      "env import -t ${loadbootenv_addr} $filesize\0" \
-  "sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt\0" \
-  "preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test; " \
-          "then if env run loadbootenv; " \
-              "then env run importbootenv; " \
-          "fi; " \
-      "fi; \0" \
-  "mmc_loadbit=echo Loading bitstream from SD/MMC/eMMC to RAM.. && " \
-      "mmcinfo && " \
-      "load mmc 0 ${loadbit_addr} ${bitstream_image} && " \
-      "fpga load 0 ${loadbit_addr} ${filesize}\0" \
-  "norboot=echo Copying Linux from NOR flash to RAM... && " \
-      "cp.b 0xE2100000 ${kernel_load_address} ${kernel_size} && " \
-      "cp.b 0xE2600000 ${devicetree_load_address} ${devicetree_size} && " \
-      "echo Copying ramdisk... && " \
-      "cp.b 0xE2620000 ${ramdisk_load_address} ${ramdisk_size} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "qspiboot=echo Copying Linux from QSPI flash to RAM... && " \
-      "sf probe 0 0 0 && " \
-      "sf read ${kernel_load_address} 0x100000 ${kernel_size} && " \
-      "sf read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
-      "echo Copying ramdisk... && " \
-      "sf read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "uenvboot=" \
-      "if run loadbootenv; then " \
-          "echo Loaded environment from ${bootenv}; " \
-          "run importbootenv; " \
-      "fi; " \
-      "if test -n $uenvcmd; then " \
-          "echo Running uenvcmd ...; " \
-          "run uenvcmd; " \
-      "fi\0" \
-  "sdboot=if mmcinfo; then " \
-          "run uenvboot; " \
-          "echo Copying Linux from SD to RAM... && " \
-          "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" \
-  "usbboot=if usb start; then " \
-          "run uenvboot; " \
-          "echo Copying Linux from USB to RAM... && " \
-          "load usb 0 ${kernel_load_address} ${kernel_image} && " \
-          "load usb 0 ${devicetree_load_address} ${devicetree_image} && " \
-          "load usb 0 ${ramdisk_load_address} ${ramdisk_image} && " \
-          "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
-      "fi\0" \
-  "nandboot=echo Copying Linux from NAND flash to RAM... && " \
-      "nand read ${kernel_load_address} 0x100000 ${kernel_size} && " \
-      "nand read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
-      "echo Copying ramdisk... && " \
-      "nand read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "jtagboot=echo TFTPing Linux to RAM... && " \
-      "tftpboot ${kernel_load_address} ${kernel_image} && " \
-      "tftpboot ${devicetree_load_address} ${devicetree_image} && " \
-      "tftpboot ${ramdisk_load_address} ${ramdisk_image} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_norboot=echo Copying Image from NOR flash to RAM... && " \
-      "cp.b 0xE2100000 0x100000 ${boot_size} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_nandboot=echo Copying Image from NAND flash to RAM... && " \
-      "nand read 0x100000 0x0 ${boot_size} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_qspiboot=echo Copying Image from QSPI flash to RAM... && " \
-      "sf probe 0 0 0 && " \
-      "sf read 0x100000 0x0 ${boot_size} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_sdboot=echo Copying Image from SD to RAM... && " \
-      "load mmc 0 0x100000 ${boot_image} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_jtagboot=echo TFTPing Image to RAM... && " \
-      "tftpboot 0x100000 ${boot_image} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-      DFU_ALT_INFO \
-      BOOTENV
- #endif

+ /* Default environment */
+ #ifndef CONFIG_EXTRA_ENV_SETTINGS
+ #define CONFIG_EXTRA_ENV_SETTINGS      \
+    "fit_image=fit.itb\0"       \
+    "load_addr=0x2000000\0"     \
+    "fit_size=0x800000\0"       \
+    "flash_off=0x100000\0"      \
+    "nor_flash_off=0xE2100000\0"    \
+    "fdt_high=0x20000000\0"     \
+    "initrd_high=0x20000000\0"  \
+    "norboot=echo Copying FIT from NOR flash to RAM... && " \
+        "cp.b ${nor_flash_off} ${load_addr} ${fit_size} && " \
+        "bootm ${load_addr}\0" \
+    "sdboot=echo Copying FIT from SD to RAM... && " \
+        "load mmc 0 ${load_addr} ${fit_image} && " \
+        "bootm ${load_addr}\0" \
+    "jtagboot=echo TFTPing FIT to RAM... && " \
+        "tftpboot ${load_addr} ${fit_image} && " \
+        "bootm ${load_addr}\0" \
+    "usbboot=if usb start; then " \
+            "echo Copying FIT from USB to RAM... && " \
+            "load usb 0 ${load_addr} ${fit_image} && " \
+            "bootm ${load_addr}\0" \
+        "fi\0" \
+    "bootenv=uEnv.txt\0" \
+    "loadbootenv=load mmc 0 ${load_addr} ${bootenv}\0" \
+    "importbootenv=echo Importing environment from mmc ...;" \
+            "env import -t $load_addr $filesize\0" \
+    "loadbootscript=load mmc 0 ${load_addr} boot.scr\0" \
+    "bootscript=echo Running bootscript from mmc ...;" \
+            "source ${load_addr}\0" \
+    DFU_ALT_INFO
+ #endif
+
+
+ #define CONFIG_BOOTCOMMAND \
+     "if mmc rescan; then " \
+         "echo SD/MMC found on device...;" \
+         "if run loadbootenv; then " \
+             "echo Loaded environment from ${bootenv};" \
+             "run importbootenv;" \
+         "fi;" \
+         "if test -n $uenvcmd; then " \
+             "echo Running uenvcmd ...;" \
+             "run uenvcmd;" \
+         "fi;" \
+         "if run loadbootscript; then " \
+             "run bootscript; " \
+         "fi; " \
+     "fi;" \
+
+
+
+ #define CONFIG_CMD_BOOTZ

boot.binファイル、u-boot.imgファイルの生成

次のコマンドを入力し、u-boot-xlnxのディレクトリまで移動する。
cd ../../

移動した後、ビルドを行う。

make ARCH=arm zynq_zybo_defconfig
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

ビルドが完了後、u-boot.imgがu-boot-xlnxのディレクトリ、boot.binがsplのディレクトリに生成される。

参考サイト

  1. zyboでXilinxリポジトリのu-bootとLinuxを動かす
    https://qiita.com/yoshiyasu1111/items/3cd78790c5e9df6beec1

  2. ZYBO用U-Bootを、ブート時にuEnv.txtを読むようにして、かつBOOT.binから起動できるようにする
    https://qiita.com/ikwzm/items/1734676d787e2693df47