Ultra96 向け Debian GNU/Linux (v2018.2版) の構築(Boot Loader編)

## はじめに

Ultra96 に Debian GNU/Linux (v2018.2版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * [Introduction](https://qiita.com/ikwzm/items/5ae07792143d8018bfea)
 * __Boot Loader (この記事)__
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/0489b02962c6f0455783)
   - [FSBL   (First Stage Boot Loader)](https://qiita.com/ikwzm/items/fe9d6abda60660fc2f87)
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/00024adf956696dd51c6)
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/3c0d735cd3a605d269f3)
   - [U-Boot](https://qiita.com/ikwzm/items/11853d8cfdaf373beaef)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/af4420edd262e14feef9)
 * [Linux Kernel](https://qiita.com/ikwzm/items/02af5ac78a558c910e84)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/be06b07e26cbf05fec2b)

この記事では、ZynqMP の Boot Loader について説明をします。

## Boot Loader を構成するファイル

ZynqMP の Boot Loader は、起動ストレージにある BOOT.BIN です。BOOT.BIN は次のもので構成されています。

 * FSBL   (First Stage Boot Loader)
 * PMUFW  (Platform Manager Unit Firmware)
 * BL31   (ARM Trusted Firmware Boot Loader state 3-1)
 * U-Boot
 * PL-Bitstream (option)

それぞれのファイルの構築は構築方法を別記事として投稿しているのでそちらを参照してください。

## ZynqMP のブートシーケンス

ZynqMP の ブートシーケンスは次の手順で進みます。詳しいことは参考資料[「ZynqMPのブートとパワーマネージメント」](https://www.slideshare.net/ssuser479fa3/zynq-mp-58490589)を参照してください。これは[「ZynqMP 勉強会」](https://connpass.com/event/26064/)で @Vengineer さんが発表した資料で、ZynqMP のブートシーケンスが詳しく説明されています。

### ・ステージ0 (内部ROM)

ZynqMP のステージ0ブートローダーは内部ROMにあります。ステージ0ブートローダーは PMU(Platform Management Unit)が実行します。PMU はシステム全体のリソースのパワーアップ、リセットの制御および監視を担当します。PMU はこのため専用のプロセッサで、実態は MicroBlaze という Xilinx が開発したプロセッサのようです。ステージ0ブートローダーは、ストレージにある BOOT.BIN に含まれるステージ1ブートローダー(FSBL) を内部RAMをロードして Coretex-A53 を起動します。

### ・ステージ1 (FSBL - First Stage Boot Loader)

ステージ1ブートローダー(FSBL) は内部RAMにロードされます。ステージ1ブートローダー(FSBL)は Coretex-A53 が実行します。ステージ1ブートローダー(FSBL) は次の処理を行います。

 * PS(Processing System) の初期設定
 * BOOT.BIN に含まれる Bitstream を PL(Programmable Logic) へコンフィギュレーション
 * BOOT.BIN に含まれるステージ2ブートローダー(BL31)を内部RAMにロード
 * BOOT.BIN に含まれるステージ3ブートローダー(U-Boot)を SDRAM にロード
 * BOOT.BIN に含まれるPMUFW(Platform Manager Unit Firmware)を PMU の RAM にロード
 * ステージ2ブートローダー(BL31)に制御を移す

### ・ステージ2 (BL31 - ARM Trusted Firmware Boot Loader Stage 3-1)

ステージ2ブートローダー(BL31) は内部RAMにロードされます。BL31 は ARM が提供している ATF(ARM Trusted Firmware) の EL3 Runtime Firmware です。ATF に関しては次の URL を参照してください。

 * [https://github.com/ARM-software/arm-trusted-firmware](https://github.com/ARM-software/arm-trusted-firmware)

ステージ2ブートローダー(BL31)は Coretex-A53 が実行します。ステージ2ブートローダー(BL31)は自分自身を初期化してステージ3ブートローダー(U-Boot)に制御を移した後でも RAM に常駐して各種サービスを提供します。

### ・ステージ3 (U-Boot)

ステージ3ブートローダー(U-Boot)はファイルシステムを使えたり、スクリプトや環境変数などが使えるので、その設定にしたがって、Linux のカーネルイメージ、Device Tree、場合によってはルートファイルシステムを SDRAMに ロードします。その後、Linuxカーネルイメージに制御を移します。

## Boot Loader 構築環境の準備

次の URL から git clone でリポジトリをダウンロードして v2018.2.1 をチェックアウトします。

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)

```console
shell$ git clone git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git checkout v2018.2.1
```

## 参考

 * [「ZynqMPのブートとパワーマネージメント」 @Vengineer ZynqMP勉強会資料(2016/2/20)](https://www.slideshare.net/ssuser479fa3/zynq-mp-58490589)
 * [「Zynq UltraScale+ MPSoC Technical Reference Manual, UG1085(v1.7) December 22,2017」](https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf)
 * [「Zynq UltraScale+ MPSoC Software Developer Guide, UG1137(v5.0) November 15,2017)」](https://www.xilinx.com/support/documentation/user_guides/ug1137-zynq-ultrascale-mpsoc-swdev.pdf)
 * [https://github.com/ARM-software/arm-trusted-firmware](https://github.com/ARM-software/arm-trusted-firmware)