ZYBO (Zynq) 初心者ガイド (7) Boot Imageを作る

- [1回目: 開発環境の準備](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b)
- [2回目: Hello Worldプロジェクト](https://qiita.com/take-iwiw/items/24a8a94741fdbb80f62a)
- [3回目: PSのGPIOでLチカ](https://qiita.com/take-iwiw/items/39d2ed00fa88a1204fce)
- [4回目: PLのAXI GPIOでPSからLチカ](https://qiita.com/take-iwiw/items/a3b935a4e4dbd41593e1)
- [5回目: PLだけでLチカ](https://qiita.com/take-iwiw/items/efcdfca1866b9941fd2a)
- [6回目: 自作IPでLチカ](https://qiita.com/take-iwiw/items/b0f2ce7b4653bc6f32b9)
- __[7回目: ブートイメージを作る](https://qiita.com/take-iwiw/items/ece0cdf83e6e1908fad8) <--- 今回の内容__
- [8回目: Linux起動する](https://qiita.com/take-iwiw/items/6e6915f7318689818368)
- [9回目: Linuxカーネルを少しカスタマイズする](https://qiita.com/take-iwiw/items/6f2644d16cbfdb021d07)
- [10回目: LinuxのRootFSをカスタマイズする / PythonでHello World](https://qiita.com/take-iwiw/items/94a90047978664159681)
- [11回目: LinuxユーザアプリケーションでLチカ](https://qiita.com/take-iwiw/items/5e4ab9a106acfda2c866)
- [12回目: LinuxカーネルモジュールでLチカ](https://qiita.com/take-iwiw/items/e7efc48d92d7b979efdc)
- [13回目: LAN(Ethernet 0)を使う](https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8)
- [14回目: Linuxユーザアプリをデバッグする / RootFSに取り込む](https://qiita.com/take-iwiw/items/8134ca7098622219b177)
- [15回目: Linux起動時にアプリケーションを自動実行させる](https://qiita.com/take-iwiw/items/50065df6cdd1ba8bcbd6)
- [16回目: Linuxから自作IPをUIOで制御する](https://qiita.com/take-iwiw/items/da91ce4dc2a8a8df3c0a)
- [17回目: Linuxで自作IPのデバイスドライバを作る](https://qiita.com/take-iwiw/items/05eb1204cb51ce0a5c03)
- [18回目: IoT化してスマホからLチカ](https://qiita.com/take-iwiw/items/e9311292c5078d785699)

この記事の内容を2分で見る ( https://www.youtube.com/watch?v=tiS0v1DPRL0 )

# 環境
- 開発用PC: Windows 10 64-bit 
	- Vivado 2017.4 WebPACKライセンス
	- Xilinx SDK 2017.4
- ターゲットボード: ZYBO (Z7-20) 

Windows環境は[1回目](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b)を参照。
使用するハードウェア(hdf)は[6回目](https://qiita.com/take-iwiw/items/b0f2ce7b4653bc6f32b9)を参照。

# Boot Imageを作る
これまで、バイナリファイルの書き込みはJTAGで行っていました。そのため、電源をOFF/ONするたびに書き込みが必要でした。今回は、ブートイメージを作成して、それを使ってSDカード/QSPIから起動するということをやります。 
使用するプロジェクトは何でもいいのですが、前回のプロジェクトを使います。これは、PL単体だと全LEDがONになる。PSから制御するとLEDがチカチカするというものです。

## Zynq起動の流れ
Boot Image作成に必要なファイルを理解するために、起動シーケンスについて簡単に説明します。詳細はZynqやZyboのリファレンスマニュアルに記載されています。

Zynqの起動は以下の3つのステージに分かれています。設定によって色々と変わりますが、典型例は以下の通りです。

- Stage 0 (内蔵BootROMの起動コードが働く)
	- 内蔵BootROMの起動コードがCPU0で動く。これが、FSBL (First Stage Boot Loader)を読み込み、制御を移譲する。FSBLをどこから読むかはジャンパーで決まる。
- Stage 1 (FSBLが働く)
	- FSBLがPS周辺回路(DDRなど)をコンフィギュレーションする
	- もしもビットストリームファイルがあれば、PLのコンフィギュレーションをする
	- もしもユーザーアプリケーションがあれば、ロードする
- Stage 2 
	- ユーザプログラムを実行する。 (もしもLinuxの場合は、U-BootなどのSecond Stage Boot Loaderが呼ばれる)

## Boot Imageの構成
作成するブートイメージは、BOOT.binという1つのバイナリファイルです。この中に、以下のデータを格納します。

- FSBLバイナリ (これから作る)
- PL用のビットストリーム (Vivadoで作成済み)
- PS用のユーザアプリケーションバイナリ (SDKで作成済み)

# BOOT.binを作る
## FSBLバイナリを作る
前回のプロジェクトの続きとして考えます。SDK上に、blinkというLEDチカチカ用のプロジェクトと、blink_bspプロジェクトが既にあります。ここに、FSBL用のプロジェクトを追加します。

- Xilinx SDKのメニューバー -> File -> New -> Application Projectで新しいプロジェクトを作る
	- プロジェクト名は適当に、「fsbl」とする (何でもいい)
	- テンプレートとして、「Zynq FSBL」を選んでFinish
- fsblプロジェクトをビルドして、fsbl/Debug/fsbl.elfを作っておく

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/d63c93f4-58cb-95ac-47e4-663627938a29.jpeg)
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/dd536f92-5278-a554-e746-b2451b5918ad.jpeg)

## BOOT.binを作る
- Project Explorerで、搭載したいユーザアプリケーションプロジェクト(今回はblink)を選んでおく
- メニューバー -> Xilinx -> Create Boot Image
- BOOT.binに含めるバイナリを追加する。前述したように、以下のバイナリを含める。順番もこの通りにする必要がある。
	- FSBLバイナリ (さっき作った、fsbl.elf)
	- PL用のビットストリーム (Vivadoが出力した、design_1_wrapper.bit)
	- PS用のユーザアプリケーションバイナリ (SDKで作った、blink.elf)
- Create Imageをクリックすると、blink\bootimage\BOOT.binが作られる

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/0be415cd-b280-3b4a-5624-6a456bb5fe0e.jpeg)

# SDカードから起動する
- FAT32でフォーマットしたSDカードにBOOT.binをコピー
- JP5のジャンパピンで「SD」を選ぶ
- 電源を入れなおすと、SDカード内のBOOT.binで起動する

# QSPIから起動する
- 念のため、JP5のジャンパピンで「JTAG」を選んで電源OFF/ONしておく
- メニューバー -> Xilinx -> Program Flash
- Image Fileに、blink\bootimage\BOOT.binを指定
- FSBL Fileに、fsbl\Debug\fsbl.elfを指定
- Programをクリック

_(ここで、なぜfsbl.elfの指定が必要なのかが不明。バイナリ自体はBOOT.binに含まれているはずなのに。。。アドレス情報とかが必要なのかな?)_

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/08636162-8fb4-cf3d-4e8e-bf3c0e3cbd6e.jpeg)

QSPIへの書き込み完了後、JP5のジャンパピンを「QSPI」にして、電源を入れなおすと、QSPI内のBOOT.binで起動する

# おまけ: PLだけのプロジェクトの場合
PSで動くユーザアプリケーションがない場合(ZynqをFPGAとして使う場合)、必要なのはFSBLとビットストリームファイルだけになります。fsblプロジェクトを選んだ状態で、Create Boot ImageすればOKです。