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

## はじめに

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

 * [Introduction](https://qiita.com/ikwzm/items/5ae07792143d8018bfea)
 * [Boot Loader](https://qiita.com/ikwzm/items/9c78e83298906447fe5d)
   - [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(この記事)__
 * [Linux Kernel](https://qiita.com/ikwzm/items/02af5ac78a558c910e84)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/be06b07e26cbf05fec2b)

この記事では、ZynqMP の Boot Loader である BOOT.BIN の構築に関して説明します。

## 必要な環境

 * Vivado 2018.2
 * Vivado SDK 2018.2

## 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
```

## BOOT.BIN を構成するファイル

ZynqMP の Boot Loader は、起動ストレージにある BOOT.BIN です。BOOT.BIN を構築するには以下のファイルが必要です。

 * target/Ultra96/
   - build-v2018.2/
     + boot.bif             (Boot Image Format file)
     + zynqmp_fsbl.elf      (FSBL)
     + zynqmp_pmufw.elf     (PMUFW)
     + bl31.elf             (ARM Trusted Firmware Boot Loader state 3-1)
     + u-boot.elf           (U-Boot)
     + design_1_wrapper.bit (PL-Bitstream)

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

## BOOT.BIN を作るための設定ファイル

BOOT.BIN を作るために、次のような boot.bif ファイルを用意しています。

```bif:target/Ultra96/build-v2018.2/boot.bif
the_ROM_image:
{
        [fsbl_config] a53_x64
        [bootloader]                                              zynqmp_fsbl.elf
        [pmufw_image]                                             zynqmp_pmufw.elf
        [destination_device=pl]                                   design_1_wrapper.bit
        [destination_cpu=a53-0, exception_level=el-3, trustzone]  bl31.elf
        [destination_cpu=a53-0, exception_level=el-2]             u-boot.elf
}
```

## BOOT.BIN の構築

Vivado に含まれている bootgen コマンドを使って BOOT.BIN を作ります。```-arch zynqmp```でアーキテクチャを、```-image boot.bif``` で前節で説明した boot.bif を指定します。

```console
shell$ cd target/Ultra96/build-v2018.2
shell$ bootgen -arch zynqmp -image boot.bif -w -o ../boot/boot.bin
```

上のコマンドを実行することにより、target/Ultra96/boot/boot.bin が生成されます。

## 補足

UltraZed の場合は PL-Bitstream を boot.bin に含みませんでした。そのため boot.bin のファイルサイズも 1MByte 程度で済みました(下記参照)。

  * [「UltraZed 向け Debian GNU/Linux (v2018.2版) の構築(BOOT.BIN編)」@Qiita] (https://qiita.com/ikwzm/items/d0482bf8bfc7912ff746)


しかし Ultra96 では PL-Bitstream を boot.bin に含むことにしました。そのため boot.bin のファイルサイズが 6MByte 程度と大きくなってしまいました。
これは Linux が起動した際に Bluetooth が使えるようにするためです。Ultra96 では Bluetooth を使うために PS の UART0 の CTS と RTS を PL 側の I/O ピンに接続する必要があります。Linux を起動した際に Bluetooth が使えるためには PL 側ではすでに CTS と RTS が接続された状態でなければなりません。そのため Sample Design の PL-Bitstream を boot.bin に含めて FSBL で PL をプログラムするようにしています。

注意: 2018年10月28日現在、Bluetooth と GPIO の動作確認が済んでいません。U-Boot と Linux が起動出来ることだけ確認しています。ご了承ください。