ZYBO (Zynq) 初心者ガイド (8) Linux起動する

- [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)

この記事の内容を3分で見る ( https://youtu.be/ARlSAwkGriE )

# 環境
- 開発用PC: Windows 10 64-bit 
	- Vivado 2017.4 WebPACKライセンス
	- Xilinx SDK 2017.4  <- 今回は使わない
- 開発用PC (Linux): Ubuntu 16.04 本家 (日本語版じゃない) (on VirtualBox 5.2.4)
	- PetaLinux 2017.4
- ターゲットボード: ZYBO (Z7-20) 

Windows環境は[1回目](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b)を参照。

# Linux起動する
今までSDKでプロジェクトを作るとき、OS Platformにはstandaloneを指定していました。そのため、OSなしの環境(ベアメタル環境)となっていました。今回は、Linuxのイメージファイルを作って起動確認するところまでをやります。
(ちなみに、RTOSを使いたい場合は、SDKでOS Platformとしてfreertosを選ぶだけでOKです。Free RTOS用ライブラリを含むbspプロジェクトと、タスクが2個あるサンプルプロジェクトが作られます。)

## PetaLinuxツール
一般的に、オリジナルボードのLinuxシステムの構築には、Yocto Projectを使うようです。Zynqでは、XilinxからPetaLinuxというLinuxシステム開発キットが用意されているので、それを使います。
結局、PetaLinux内部で、Yoctoを使用しているようです。
紛らわしいのですが、PetaLinuxというのはあくまでツール名であって、Linuxの名称(Ubuntu等)ではありません。(SDKといい、HLx、HLSといい、Xilinxの付ける名前はセンスがないというか、紛らわしいのが多い。。。)

# PetaLinuxツールをインストールする
基本的には、ここ(https://github.com/Digilent/Petalinux-Zybo-Z7-20/blob/master/README.md )やここ (https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_2/ug1144-petalinux-tools-reference-guide.pdf )の手順通りに進めていけばOKです。

## 開発用ホストPCにLinux環境を入れる
開発PCがLinuxの場合は、そのまま使えます。Windowsの場合は、VirtualBox上でUbuntuをインストールしておきます。

## PetaLinuxツールのインストーラをダウンロードしておく
Xilinxのページから、PetaLinuxツールのインストーラ(petalinux-v2017.4-final-installer.run)をダウンロードしておきます (https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html )。
ダウンロード後、Ubuntu上の`~/work/temp`に配置しておきます。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/005d2315-0f37-ee5b-800b-e33a8d124e73.jpeg)

## 必要なライブラリ/ツールのインストール
下記コマンドで、必要なライブラリ/ツールをインストールします。

```sh
sudo apt-get install tofrodos gawk xvfb git libncurses5-dev tftpd zlib1g-dev zlib1g-dev:i386 libssl-dev flex bison chrpath socat autoconf libtool texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev screen pax
```

さらに、以下もインストールしておきます。ビルド時にエラーが発生したため、調べた結果、以下が必要らしい (一部冗長かもしれません。)
https://forums.xilinx.com/t5/Embedded-Linux/petalinux-build-ERROR-Failed-to-generate-Kconfig-syshw/td-p/812430
https://github.com/RobertBerger/meta-mainline/issues/8

```sh
sudo apt-get install rsync 
sudo apt-get install locales
sudo dpkg-reconfigure locales 
sudo locale-gen en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
sudo apt-get install libgtk2.0-0
```

## PetaLinuxツールをインストールする
`/opt/pkg/petalinux/`にインストールします。まず、ディレクトリ作成後、一般ユーザ(ここだと、`tak`さん)も使えるように権限を設定しておきます。その後、`~/work/temp`に配置しておいたインストーラを実行します。インストール完了後、統計データの送信設定をOFFにしておきます(任意)。

```sh
sudo mkdir -p /opt/pkg/petalinux
sudo chown tak /opt/pkg/
sudo chgrp tak /opt/pkg/
sudo chgrp tak /opt/pkg/petalinux/
sudo chown tak /opt/pkg/petalinux/

cd ~/work/temp
./petalinux-v2017.4-final-installer.run /opt/pkg/petalinux/

petalinux-util --webtalk off
```

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/15195404-d7ff-d5af-b66b-a6c49b1f756a.jpeg)

### ボードファイルのコピー (不要かも)
Zyboのボードファイルをコピーしておいた方がいいかもしれません。なくても大丈夫でしたが。Digilentから取得したボードファイルをここ(`/opt/pkg/petalinux/tools/hsm/data/boards/board_files/`)にコピーします。

# PetaLinuxツールでLinuxイメージを作る
## ハードウェア(hdf)の用意
Vivadoで、PSだけを配置したハードウェアを作って、hdfをエクスポートして(ビットストリーム込みで)、Ubuntu側にコピーしておきます。今回は、作業ディレクトリを、`~/work/peta`として、project_1.sdkのフォルダごとコピーしました。

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/a4057631-3953-1af3-b3ba-1641422cb69b.jpeg)
![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/583f4332-1f6c-c2d9-bd3f-2da124415732.jpeg)

## 環境設定
新規ターミナルで作業開始のたびに、下記コマンドで環境設定が必要です。PetaLinux専用環境なら、`~/.bashrc`に書いておいても良いと思います。(言語設定は一部冗長かもしれません。)

```sh
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
source /opt/pkg/petalinux/settings.sh
```

settings.shで、シェルがbashじゃない、tftpサーバが見つからない、といった警告が出ますが、無視してOKです。

## Linuxイメージを作る
`SimplePS`という名前のプロジェクトを作り(petalinux-create)、指定したハードウェア情報(hdf)に基づくカーネル設定(petalinux-config)をして、ビルドします(petalinux-build)。petalinux-configをしたときに、設定画面が出ますが、なにもせずにExitしてOKです。(`make menuconfig`と同じ)
Linuxシステムイメージのビルドが完了したら、ブートイメージ(BOOT.bin)を作ります(petalinux-package)

```sh
cd ~/work/peta
petalinux-create --type project --template zynq --name SimplePS
cd SimplePS/
petalinux-config --get-hw-description=../project_1.sdk
petalinux-build
petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/design_1_wrapper.bit --u-boot
```

## 成果物
最終的に必要となる成果物は、以下の2つです。

- images/linux/BOOT.bin
	- FSBL (First Stage Boot Loader)、ビットストリーム、U-Boot (Second Stage Boot Loader)
- images/linux/image.ub
	- Linuxシステムイメージ (カーネルなど)

# SDカードからLinux起動してみる
作成したBOOT.binとimage.ubを、SDカード(FAT32フォーマット)にコピーします。(以下コマンドは、SDカードがUbuntu上で/media/tak/BOOTにマウントされている場合。GUIでコピーしてもOK)

```sh
cp images/linux/BOOT.BIN /media/tak/BOOT/
cp images/linux/image.ub /media/tak/BOOT/
```


イメージをコピーしたSDカードを、ZYBOボードにさして、SDカード起動するようにジャンパ(JP5)を設定します。

TeraTermなどにシリアル接続して、電源ONすると、U-BootからLinuxが起動していることが分かると思います。

![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/cd60ae60-0398-f55c-facf-9d61ef18433c.jpeg)

ちなみに、ログインユーザ = `root`、パスワード = `root`です。

![07.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/e89ecdff-b5f1-f6b3-1184-f18d55d59da4.jpeg)

# ノート
## ノート: clean方法
ビルドに失敗した時は、以下でclean出来ます。やりすぎかもしれません。

```
petalinux-build -c clean
petalinux-build -x clean
petalinux-build -x distclean
petalinux-build -x mrproper
```

念のため、以下もやった方がいいみたいです。

```
Go to <petalinux_proj> directory and remove the below directories:
rm -rf components/plnx_workspace/
rm -rf build/cache build/tmp
```

https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2016-4-u-boot-doesn-t-compile/td-p/760308
https://forums.xilinx.com/t5/Embedded-Linux/petalinux-build-fails-on-device-tree-generation/td-p/762108

## ノート: BSPをパッケージ化する / BSPからプロジェクトを作りビルドする
配布用に、以下コマンドでパッケージ化(BSPファイル化)できます。

```sh
cd ~/work/peta/SimplePS/
petalinux-package --prebuilt --clean --fpga images/linux/design_1_wrapper.bit -a images/linux/image.ub:images/image.ub 
petalinux-build -x distclean
petalinux-build -x mrproper
petalinux-package --bsp --force -p ./ --output SimplePS.bsp
```

BSPファイルから再度プロジェクトを作ってビルドするときは、

```sh
petalinux-create -t project -s SimplePS.bsp
cd SimplePS/
petalinux-config --oldconfig
petalinux-build
```

ちなみに、petalinux-package --prebuiltをしてpre-builtディレクトリを作った後だと、JTAG起動や、QEMU起動ができるようになります。

```
petalinux-boot --qemu --prebuilt 3
```

## ノート: Digilent提供のBSP
Digilentから、ZYBO用のPetaLinux BSPが提供されています(https://github.com/Digilent/Petalinux-Zybo-Z7-20 )。しかし、これはPetaLinux 2017.2で作られています。それが理由か分かりませんが、僕の環境(2017.4)だと、petalinux-build中にエラーが出ました。

とはいえ、デバイスツリーの設定などは非常に参考になるので、手元にコピーしておくと後々便利だと思います。