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のディレクトリに生成される。
参考サイト
zyboでXilinxリポジトリのu-bootとLinuxを動かす
https://qiita.com/yoshiyasu1111/items/3cd78790c5e9df6beec1ZYBO用U-Bootを、ブート時にuEnv.txtを読むようにして、かつBOOT.binから起動できるようにする
https://qiita.com/ikwzm/items/1734676d787e2693df47