zyboでXilinxリポジトリのu-bootとLinuxを動かす

# 概要

Xilinx社の管理しているリポジトリのu-bootとlinuxをzyboで動くようにしました。

# 環境

- ホストPC: lubuntu 18.04
- コンパイラ: arm-linux-gnueabihf-gcc 7.3.0


# u-boot

## ソースのダウンロード

u-boot公式のソースをgitでダウンロードしてくる。

```
$ git clone https://github.com/Xilinx/u-boot-xlnx.git
$ cd u-boot-xlnx
$ git checkout -b xilinx-v2018.2_zybo refs/tags/xilinx-v2018.2
```

## u-bootソースを修正

uEnv.txtを使うように./include/configs/zynq-common.hを修正します。
CONFIG_BOOTCOMMAND、CONFIG_EXTRA_ENV_SETTING、CONFIG_CMD_BOOTZの3つのマクロを修正します。[ここ](https://qiita.com/ikwzm/items/1734676d787e2693df47)を参考にしています。

```
$ cd xilinx-v2018.2_zybo
$ vi ./include/configs/zynq-common.h
#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;" \
    "run $modeboot"

/* 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_CMD_BOOTZ
```

## コンパイル
```
make ARCH=arm zynq_zybo_defconfig
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
```

ワークディレクトリ直下に**u-boot.img**が、splフォルダの中に**boot.bin**が生成されます。

# linux

## ソースのダウンロード

```
$ git clone https://github.com/Xilinx/linux-xlnx.git
$ cd linux-xlnx
$ git checkout -b xilinx-v2018.2_zybo refs/tags/xilinx-v2018.2
$ make ARCH=arm xilinx_zynq_defconfig
$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
```

./arch/arm/boot/に**zImage**と./arch/arm/boot/dtsに**zynq-zybo.dtb**が生成されます。

# uEnv.txt

u-bootの設定でuEnv.txtの内容でブートするように修正したので次のような**uEnv.txt**を用意します。

```
bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1
uenvcmd=fatload mmc 0 0x03000000 design.bit && fpga loadb 0 0x03000000 $filesize && fatload mmc 0 0x03000000 zImage && fatload mmc 0 0x02A00000 zynq-zybo.dtb && bootz 0x03000000 - 0x02A00000
```

# SDカードの用意

[ここ](https://qiita.com/yoshiyasu1111/items/e734eba7a842e3ba422d)を参考にして第2パーティションにubuntuのルートファイルシステムが存在して、sudoグループに所属しているユーザyoshiが存在するとします。

第1パーティションに今まで作成したファイルと、FPGAのコンフィグレーションデータdesign.bitをコピーします。コピーした後のSDカードの中身はこのようになっています。

```
$ ls /media/yoshi/ZYBO_BOOT/
boot.bin  design.bit  u-boot.img  uEnv.txt  zImage  zynq-zybo.dtb
```

# ZYBOの起動

SDカードをZYBOに挿して起動します。シリアル接続はscreenコマンドなどで接続します。zyboの電源を入れないと接続出来ないが、電源を入れてから接続するとメッセージが途中からしか出力されないので、接続できたら一旦ボタンスイッチPS-SRSTでリセットすると最初からメッセージが出力されます。

起動メッセージが出力された後ログインできるので、作成したユーザとパスワードでログインします。無事ログインでることが確認できました。

```
$ sudo screen /dev/ttyUSB1 115200

# 起動メッセージ省略

Ubuntu 18.04 LTS airi ttyPS0

airi login: yoshi                                                                 
Password: 
Last login: Sun Jan 28 16:36:02 UTC 2018 on ttyPS0
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.14.0-xilinx armv7l)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

yoshi@airi:~$ pwd
/home/yoshi
yoshi@airi:~$ uname -a
Linux airi 4.14.0-xilinx #4 SMP PREEMPT Mon Aug 13 07:13:30 JST 2018 armv7l armv7l armv7l GNU/Linux
```