初めてのYocto環境で作成したLinuxをZYBOで動かす

# 環境

- Lubuntu 18.04

# 参考資料

- [超苦労したFPGAの薄い本](https://aquaxis.booth.pm/items/1057564)

# 必要なパッケージのインストール

```bash
$ sudo apt install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping libsdl1.2-dev xterm
```

# レシピ集のダウンロード

## スクリプトの準備

```bash
#!/bin/bash

# version
VERSION=sumo

# download poky
git clone git://git.yoctoproject.org/poky.git -b $VERSION

# download additional recipie
mkdir -p sources
cd sources

git clone git://github.com/openembedded/meta-openembedded.git -b $VERSION
git clone git://git.linaro.org/openembedded/meta-linaro.git -b $VERSION
git clone git://github.com/meta-qt5/meta-qt5.git -b $VERSION
git clone git://github.com/xilinx/meta-xilinx -b $VERSION

cd ..
```

## スクリプトの実行

```bash
$ ./download_meta.sh
```

# ビルド環境の準備

```bash
$ cd poky
$ source ./oe-init-env ../build_zyboz7
```

## bblayers.conf

次のように修正します。

```vi
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/yoshi/FPGA/yocto/poky/meta \
  /home/yoshi/FPGA/yocto/poky/meta-poky \
  /home/yoshi/FPGA/yocto/poky/meta-yocto-bsp \
  "

BBLAYERS += " ${TOPDIR}/../sources/meta-openembedded/meta-oe "
BBLAYERS += " ${TOPDIR}/../sources/meta-xilinx/meta-xilinx-bsp "
BBLAYERS += " ${TOPDIR}/../sources/meta-xilinx/meta-xilinx-contrib "
```

## local.conf

- ターゲットとするマシンの設定

    ```
    MACHINE ??= "zybo-zynq7"
    ```

- ダウンロード先の設定

    ```
    DL_DIR ?= "${TOPDIR}/../downloads"
    ```

- デバッグ用の設定

    ```
    EXTRA_IMAGE_FEATURES ?= "debug-tweaks tools-sdk"
    ```

- パッケージの追加

    ```
    # Install Application
    IMAGE_INSTALL_append = " nano"
    IMAGE_INSTALL_append = " minicom"
    IMAGE_INSTALL_append = " lrzsz"
    IMAGE_INSTALL_append = " ethtool"
    IMAGE_INSTALL_append = " libdrm"
    IMAGE_INSTALL_append = " i2c-tools"

    # remove splash
    IMAGE_INSTALL_remove = " psplash"

    DISTRO_FEATURES_append = " x11"
    ```

# ビルド

```bash
$ bitbake core-image-minimal
```

```bash
$ ls tmp/deploy/images/zybo-zynq7/
boot.bin
boot.bin-zybo-zynq7
boot.bin-zybo-zynq7-2018.01-r0
core-image-minimal-zybo-zynq7-20181024121207.rootfs.cpio
core-image-minimal-zybo-zynq7-20181024121207.rootfs.cpio.gz.u-boot
core-image-minimal-zybo-zynq7-20181024121207.rootfs.manifest
core-image-minimal-zybo-zynq7-20181024121207.rootfs.tar.gz
core-image-minimal-zybo-zynq7-20181024121207.testdata.json
core-image-minimal-zybo-zynq7.cpio
core-image-minimal-zybo-zynq7.cpio.gz.u-boot
core-image-minimal-zybo-zynq7.manifest
core-image-minimal-zybo-zynq7.tar.gz
core-image-minimal-zybo-zynq7.testdata.json
modules--4.14-xilinx-v2018.1+git0+4ac76ffacb-r0-zybo-zynq7-20181024121207.tgz
modules-zybo-zynq7.tgz
u-boot-zybo-zynq7-2018.01-r0.elf
u-boot-zybo-zynq7-2018.01-r0.img
u-boot-zybo-zynq7.elf
u-boot-zybo-zynq7.img
u-boot.elf
u-boot.img
uEnv.txt
uImage
uImage--4.14-xilinx-v2018.1+git0+4ac76ffacb-r0-zybo-zynq7-20181024121207.bin
uImage--4.14-xilinx-v2018.1+git0+4ac76ffacb-r0-zynq-zybo-20181024121207.dtb
uImage-zybo-zynq7.bin
uImage-zynq-zybo.dtb
zynq-zybo.dtb
```

ここでビルドした生成物は旧ZYBO用でZYBO-Z7で使えるのはルートファイルシステムの

- core-image-minimal-zybo-zynq7.tar.gz

だけみたいです。u-bootやLinuxのイメージは以降で作成します。

# SDKの構築

SDKのビルド

```bash
$ bitbake core-image-minimal -c populate_sdk
```

生成物

```bash
$ ls ./tmp/deploy/sdk/
poky-glibc-x86_64-core-image-minimal-cortexa9hf-neon-toolchain-2.5.1.host.manifest
poky-glibc-x86_64-core-image-minimal-cortexa9hf-neon-toolchain-2.5.1.sh
poky-glibc-x86_64-core-image-minimal-cortexa9hf-neon-toolchain-2.5.1.target.manifest
poky-glibc-x86_64-core-image-minimal-cortexa9hf-neon-toolchain-2.5.1.testdata.json
```

インストール

```bash
$ sudo ./tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-cortexa9hf-neon-toolchain-2.5.1.sh 
Poky (Yocto Project Reference Distro) SDK installer version 2.5.1
=================================================================
Enter target directory for SDK (default: /opt/poky/2.5.1): /opt/poky/2.5.1_zybo-z7
The directory "/opt/poky/2.5.1_zybo-z7" already contains a SDK for this architecture.
If you continue, existing files will be overwritten! Proceed[y/N]? y
Extracting SDK.......................................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/poky/2.5.1_zybo-z7/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
```

# u-bootのダウンロード

xilinxがメンテナンスしているu-bootをダウンロードします。

```bash
$ git clone git://github.com/Xilinx/u-boot-xlnx
```

zybo用の初期設定をします。

```bash
$ cd ./u-boot-xlnx
$ make zynq_zybo_defconfig
```

ps7_init_gpl.c/hを適用します。vivadoで作成した.hdfファイルからps7_init_gpl.cとps7_init_gpl.hをu-bootにコピーします。

```bash
$ unzip zynq_wrapper.hdf
$ cp ps7_init* ./board/xilinx/zynq/zynq-zybo/
```

Device Treeの修正をします。旧ZYBO用に50MHzで設定されているので、33.3MHzに修正します。

```bash
&clkc {
//      ps-clk-frequency = <50000000>;
        ps-clk-frequency = <33333333>;
};
```

ビルドします。

```bash
$ make -j8
```

生成物のうち以下2つのファイルを以降で使用します。

- u-boot.img
- ./spl/boot.bin

# Linux Kernelのダウンロード

xilinxがメンテナンスしているLinux kernelをダウンロードします。

```bash
$ git clone git://github.com/Xilinx/linux-xlnx -b xilinx-v2018.2
```

zybo用の初期設定をします。

```bash
$ cd ./linux-xlnx
$ make xilinx_zynq_defconfig
```

Device Treeの修正をします。旧ZYBO用に50MHzで設定されているので、33.3MHzに修正します。メモリも512MBの設定から1GBへ変更します。

```bash
        memory@0 {
                device_type = "memory";
//              reg = <0x0 0x20000000>;
                reg = <0x0 0x40000000>;
        };

&clkc {
//      ps-clk-frequency = <50000000>;
        ps-clk-frequency = <33333333>;
};
```

ビルドします。

```bash
$ make -j8
```

生成物のうち以下2つのファイルを以降で使用します。

- ./arch/arm/boot/zImage
- ./arch/arm/boot/dts/zynq-zybo.dtb

# SDカードの準備

## パーティションの作成

パーティションの作成については下記の記事を参考にしてブート用のパーティションとルートファイルシステム用のパーティションの2つのパーティションを作成します。下記の記事ではUbuntuのルートファイルシステムを使用していますが、この記事では先程作成したルートファイルシステムを使用します。

- [SDカードにUbuntuのルートファイルシステムを作成する](https://qiita.com/yoshiyasu1111/items/e734eba7a842e3ba422d)

## ファイルのコピー

SDカードのデバイスsdb1が/media/yoshi/BOOTにsdb2が/media/yoshi/ROOTにマウントされているとして、次のようにファイルをコピーします。

ルートファイルシステムのコピー

```bash
$ cd /media/yoshi/ROOT
$ sudo tar xvf ~/build_zyboz7/tmp/deploy/images/zybo-zynq7/core-image-minimal-zybo-zynq7.tar.gz
```

ブートファイルのコピー

```bash
$ cd /media/yoshi/BOOT
$ sudo cp ~/u-boot-xlnx/u-boot.img ~/u-boot-xlnx/spl/boot.bin ./
$ sudo cp ~/linux-xlnx/arch/arm/boot/zImage ~/linux-xlnx/arch/arm/boot/dts/zynq-zybo.dtb ./
$ sudo cp ~/design.bit ./
$ vi ~/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
$ sudo cp ~/uEnv.txt ./
```

SDカードのBOOTパーティションの中身は以下のような状態になります。

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

# ZYBOの起動

SDカードをZYBOに挿してシリアルで接続すると起動メッセージが見えてログインもできました。

```

Poky (Yocto Project Reference Distro) 2.5.1 zybo-zynq7 /dev/ttyPS0

zybo-zynq7 login: root
root@zybo-zynq7:~# ps
  PID TTY          TIME CMD
  863 ttyPS0   00:00:00 sh
  867 ttyPS0   00:00:00 ps
```