続き。ビルドは完了したので、実機で動かすためには何が必要なのかを調査してみる。
必要なのは、 * uImage * core-image-minimal-zedboard-zynq7.tar.gz * zedboard-zynq.dtb * BOOT.BIN
らしい。上の3つは、Yoctoのビルド時に生成されていた。
poky/build/tmp/deploy/images/zedboard-zynq7/
そして、BOOT.BINを作成する必要がある。これ、セミナーのときに聞いてはいたものの、具体的にどうやって作ればいいのかは良く分かっていなかった。 bifファイルというものを作り、ビルドする必要があるらしい。
- boot.bin
the_ROM_image: { [bootloader] FSBL.elf system.bit u-boot.elf }
さて、u-boot.elfは上記のYoctoのビルドディレクトリに生成されているとして、FSBL.elfとsystem.bitはどこから手に入れるかというと、既存のSDKのビルドディレクトリから複製させてもらう。 昔helloWorldのチュートリアルをやったのだった。いろいろ調べると、FSBL.elfを生成するSDKのプロジェクトを作るといいらしい。 という訳で以下のURLを参考に、GUIから作成しようとしたが、うまくいかなかった。具体的には以下のエラーが発生してビルドに失敗した。
5. Zynq SDKでFSBLを作る | yuki-sato.com
ググっても過去に同様の問題にあたった人がいない。ということは設定か何かを間違えているのか。
Xilinx のWikiに、てっとり早くFSBLを作る方法が書いてある。
>mkdir zynq_fsbl >cd zynq_fsbl >hsi ****** hsi v2014.4 (64-bit) **** SW Build 1071353 on Tue Nov 18 17:18:21 MST 2014 ** Copyright 1986-2014 Xilinx, Inc. All Rights Reserved. INFO: [Hsi 55-1698] elapsed time for repository loading 2 seconds
hsiというのはそういうツールらしい。具体的には何だか分からない。
必要なのは以下の2つのコマンドのみ。
hsi% open_hw_design c:/usr/vivado/hello_world/hello_world.sdk/zynq_design_1_wrapper.hdf hsi% generate_app -hw zynq_design_1_imp -os standalone -proc ps7_cortexa9_0 -app
ちなみに、zynq_design1_1_wrapper.hdf とかは、ZedBoardのチュートリアルをやったときに作ったものを借用した。 以下が全体の画面。
hsi% open_hw_design c:/usr/vivado/hello_world/hello_world.sdk/zynq_design_1_wrapper.hdf zynq_design_1_imp hsi% generate_app -hw zynq_design_1_imp -os standalone -proc ps7_cortexa9_0 -app zynq_fsbl -compile -sw fsbl -dir zynq_fsbl "Running Make include in ps7_cortexa9_0/libsrc/bram_v4_0/src" "Running Make include in ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_1/src" "Running Make include in ps7_cortexa9_0/libsrc/devcfg_v3_2/src" "Running Make include in ps7_cortexa9_0/libsrc/dmaps_v2_1/src" "Running Make include in ps7_cortexa9_0/libsrc/emacps_v2_2/src" "Running Make include in ps7_cortexa9_0/libsrc/gpio_v4_0/src" "Running Make include in ps7_cortexa9_0/libsrc/gpiops_v2_2/src" "Running Make include in ps7_cortexa9_0/libsrc/qspips_v3_1/src" "Running Make include in ps7_cortexa9_0/libsrc/scugic_v2_1/src" "Running Make include in ps7_cortexa9_0/libsrc/scutimer_v2_0/src" "Running Make include in ps7_cortexa9_0/libsrc/scuwdt_v2_0/src" "Running Make include in ps7_cortexa9_0/libsrc/sdps_v2_3/src" "Running Make include in ps7_cortexa9_0/libsrc/standalone_v4_2/src" "Running Make include in ps7_cortexa9_0/libsrc/ttcps_v2_0/src" "Running Make include in ps7_cortexa9_0/libsrc/uartps_v2_2/src" "Running Make include in ps7_cortexa9_0/libsrc/usbps_v2_2/src" "Running Make include in ps7_cortexa9_0/libsrc/xadcps_v2_1/src" "Running Make include in ps7_cortexa9_0/libsrc/xilffs_v2_2/src" "Running Make include in ps7_cortexa9_0/libsrc/xilrsa_v1_1/src" "Running Make libs in ps7_cortexa9_0/libsrc/bram_v4_0/src" "Compiling bram" arm-xilinx-eabi-ar: creating ../../../lib/libxil.a "Running Make libs in ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_1/src" "Compiling cpu_cortexa9" "Running Make libs in ps7_cortexa9_0/libsrc/devcfg_v3_2/src" "Compiling devcfg" "Running Make libs in ps7_cortexa9_0/libsrc/dmaps_v2_1/src" "Compiling dmaps" "Running Make libs in ps7_cortexa9_0/libsrc/emacps_v2_2/src" "Compiling emacps" "Running Make libs in ps7_cortexa9_0/libsrc/gpio_v4_0/src" "Compiling gpio" "Running Make libs in ps7_cortexa9_0/libsrc/gpiops_v2_2/src" "Compiling gpiops" "Running Make libs in ps7_cortexa9_0/libsrc/qspips_v3_1/src" "Compiling qspips" "Running Make libs in ps7_cortexa9_0/libsrc/scugic_v2_1/src" "Compiling scugic" "Running Make libs in ps7_cortexa9_0/libsrc/scutimer_v2_0/src" "Compiling scutimer" "Running Make libs in ps7_cortexa9_0/libsrc/scuwdt_v2_0/src" "Compiling scuwdt" "Running Make libs in ps7_cortexa9_0/libsrc/sdps_v2_3/src" "Compiling sdps" "Running Make libs in ps7_cortexa9_0/libsrc/standalone_v4_2/src" "Compiling standalone" "Running Make libs in ps7_cortexa9_0/libsrc/ttcps_v2_0/src" "Compiling ttcps" "Running Make libs in ps7_cortexa9_0/libsrc/uartps_v2_2/src" "Compiling uartps" "Running Make libs in ps7_cortexa9_0/libsrc/usbps_v2_2/src" "Compiling usbps" "Running Make libs in ps7_cortexa9_0/libsrc/xadcps_v2_1/src" "Compiling xadcps" "Running Make libs in ps7_cortexa9_0/libsrc/xilffs_v2_2/src" "Compiling XilFFs Library" "Creating archive libxilffs.a" "Running Make libs in ps7_cortexa9_0/libsrc/xilrsa_v1_1/src" 'Finished building libraries' arm-xilinx-eabi-gcc -c fsbl_hooks.c -o fsbl_hooks.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c image_mover.c -o image_mover.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c main.c -o main.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c md5.c -o md5.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c nand.c -o nand.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c nor.c -o nor.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c pcap.c -o pcap.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c ps7_init.c -o ps7_init.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c qspi.c -o qspi.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c rsa.c -o rsa.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c sd.c -o sd.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -c fsbl_handoff.S -o fsbl_handoff.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I. arm-xilinx-eabi-gcc -o executable.elf fsbl_hooks.o image_mover.o main.o md5. o nand.o nor.o pcap.o ps7_init.o qspi.o rsa.o sd.o fsbl_handoff.o -lrs a -Wl,--start-group,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxilffs,-lxil ,-lgcc,-lc,--end-group -Wl,--start-group,-lrsa,-lxil,-lgcc,-lc,--end-group -Wl, --gc-sections -Lzynq_fsbl_bsp/ps7_cortexa9_0/lib -L./ -Tlscript.ld hsi::generate_app: Time (s): cpu = 00:00:01 ; elapsed = 00:00:17 . Memory (MB): peak = 85.363 ; gain = 0.000
これを使ってみるとあっさりFSBL.elfを作ることができた。 そして、system.bitはHello Worldの時に作ったZynq_Design_1_wrapper.bitをそのまま利用した (リネームした)。
そして、bootgen を実行することで、BOOT.BINを作成することができた。SDカードにコピーしてダウンロードする。