Ultra96V2 Debian環境構築メモ

# はじめに

[Ultra96V2ボード](https://www.avnet.com/wps/portal/japan/products/product-highlights/ultra96/)の環境構築をした際の備忘録です。
思い出しながら後から修正している部分もあるのでおかしいところがあったらご指摘頂ければ幸いです。


## ボードの情報

回路図、BSP、ドキュメントなどは下記から入手できます。

  - http://zedboard.org/product/ultra96-v2-development-board
  - https://www.element14.com/community/community/designcenter/zedboardcommunity/ultra96?ICID=zedboardCMTY-side-navigation&


# ikwzm 氏の Debianイメージ

## イメージ本体

  - https://qiita.com/ikwzm/items/92221c5ea6abbd5e991c

  VirtualBoxとかでSDカードのパーティーション切るときは安定しない場合はUSBカードリーダーを2.0ポートにさすと無難な模様です(遅いですが)。

SD Association 公式の [SDフォーマッタ](https://www.sdcard.org/jp/downloads/formatter/)使うと
パーティーションは先頭に4Mほど空領域ができるようです(クラスタとFlashのブロックの境界がそろいパフォーマンスが出るようです)。

VirtualBoxのUbuntuを使っていますが USBのSDカードリーダーを「デバイス」→「USB」で選ぶと、UbuntuからSDカードが見えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/97e7c217-ebdf-d179-2d2d-c5a8e556ed7a.png)

私は Ubuntu から gparted を使ってGUIでパーティーション設定をしています。

gparted 右上のところでSDカードのマウントされているディスクを選んでください(この図では /dev/sdc でした)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/16325ac4-1961-f9aa-eda7-275338d36987.png)

今回は FAT16 領域を "ULTRA96"、 ext4 領域を "rootfs" でラベルを付けています。
Ubuntuの場合、後のこの名前で /media/<username> の下に自動でマウントされるようなのでそのままやっています。

あとは手順通り


```
git clone -b v2019.2.1 https://github.com/ikwzm/ZynqMP-FPGA-Linux
cd ZynqMP-FPGA-Linux
git lfs pull
```

でイメージ取得して

```
sudo cp target/Ultra96-V2/boot/*  /media/$USER/ULTRA96
sudo tar xzvf debian10-rootfs-vanilla.tgz -C /media/$USER/rootfs
sync

sudo mkdir /media/$USER/rootfs/home/fpga/debian
sudo cp linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb   /media/$USER/rootfs/home/fpga/debian
sudo cp linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb /media/$USER/rootfs/home/fpga/debian
sudo cp fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb       /media/$USER/rootfs/home/fpga/debian
sudo cp udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb       /media/$USER/rootfs/home/fpga/debian
sudo cp u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb     /media/$USER/rootfs/home/fpga/debian
sync

```

ファイルをコピーした後 sync しておくことをお勧めします。

```
sudo mkdir /media/$USER/rootfs/mnt/boot
sudo nano /media/$USER/rootfs/etc/fstab
```

として

```
/dev/mmcblk0p1  /mnt/boot   auto    defaults    0   0
```

を追加します。

UART (JTAGカードなど) もしくは、DisplayPort があれば、コンソール使えるようなので、後半の設定はUltra96上でやった方が楽かもしれません。
ちなみに私は DisplayPortは [AMC-MDPHD](https://www.amazon.co.jp/gp/product/B06XG2PNJN/) を使っています。

## JTAG用の修正
  v2019.2版では最初から設定されているので不要ですが、v2019.1版では uEnv.txt に cpuidle.off=1 を追加すると良いようです。以下情報元です。

  - http://nahitafu.cocolog-nifty.com/nahitafu/2018/10/ultrascalejtagl.html
  - https://qiita.com/ikwzm/items/e5e906309a5974615d40


## ネットワークの設定

[こちら](https://qiita.com/ikwzm/items/92221c5ea6abbd5e991c)を参考に設定すれば WiFi も繋がるようです(私は諸事情からもっぱらUSB-LANで有線接続しています)。


# Ultra96V2で debian 起動

Ultra96V2 に準備したSDカードを取り付け起動します。
ユーザーは fpga (パスワードもfpga)で login して、説明通り

## 時刻合わせ

この段階で WiFi が繋がっていれば自動で時刻合わせされるのですが、そうでない場合はここで一度手動で時刻を設定しないと、この後のパッケージのインストールで躓くことがあるようです。

```
sudo date -s "06/13 16:05 2021"
```

のような感じで時刻の設定が可能です(中の日付は書き換えてください)。


## パッケージインストール



```
cd /home/fpga/debian
sudo dpkg -i linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb
sudo dpkg -i linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb
sudo dpkg -i fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb
sudo dpkg -i udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb
sudo dpkg -i u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb
```
としておきます。

## ホスト名設定

他にも Zybo など複数のボードを持っている人は hostname が同じだと紛らわしいので名前変更しています。

今回は

```
sudo nano /etc/hostname
```

として debian-fpga を debian-ultra96 に変更しました。

変更して再起動すると sudo するたびに「sudo: unable to resolve host」と出たので
https://qiita.com/ogomr/items/89e19829eb8cc08fcebb
にならって

```
sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
```

としております。


## ユーザー作成

fpga というユーザー名のままでもいいのですが、github を使う場合などもあるので自分の名前でユーザーも作ります。

```
sudo adduser <username>
```

sudo権限もつけておきます

```
sudo gpasswd -a username sudo
```


## Samba設定

Windowsからの利用が楽なように Samba の設定をします。

```
sudo pdbedit -a <username>
sudo nano /etc/samba/smb.conf
sudo systemctl restart smbd nmbd
```

smb.conf は [homes] セクションで

```
read only = no
```

にしておけばフルアクセスできます。

さらに [global] のセクションに

```
unix extensions = no
wide links = yes
```

を足すと、シンボリックリンクの先もアクセスできるようです。


## ssh と X-Windowポート転送
TeraTermの「設定」->「SSHポート転送」で「リモートのXアプリケーションをXサーバーに表示する」をONにして、「設定」->「設定の保存」。TeraTerm再起動して、sshで接続します。
Windows側には[Xming](https://ja.osdn.net/projects/sfnet_xming/)などを入れておきましょう。

```
sudo apt update
sudo apt upgrade

sudo apt install -y xauth
sudo apt install -y x11-apps
```

sshd_config は X11Forwarding yes とすればよいはずです。当初 xauth を入れ忘れていて嵌りました。ご注意ください。

```
xclock &
xeyes &
```

として動作確認します。

Zynq の場合各種の制御に sudo コマンドを付けてプログラムを実行することも多いと思います。

 .profile に

```
export XAUTHORITY=$HOME/.Xauthority
```
を追加しておけば sudo でも X が使えるようになるようです。

## Python設定
やりかけですが
```
sudo pip3 install jupyter
sudo pip3 install matplotlib
```

などpipでいろいろインストール可能です。
jupyter もきちんと設定すればPCから接続可能です。


## OpenCV

今回は OpenCV3 を入れています。

私が以前使ったスクリプトを [ここ](https://github.com/ryuz/local_data/blob/master/setting/build_opencv3.sh) に置いておきます。

適当なディレクトリに build_opencv3.sh を置いて

```
sudo apt-get install -y cmake libeigen3-dev  
sudo apt-get install -y libgtk-3-dev qt5-default freeglut3-dev libvtk6-qt-dev  
sudo apt-get install -y libtbb-dev  
sudo apt-get install -y libjpeg-dev libpng++-dev libtiff-dev libopenexr-dev  libwebp-dev  
sudo apt-get install -y libhdf5-dev  
sudo apt-get install -y wget unzip  

sudo ./build_opencv3.sh
```

OpenCV の imshow 関数で Xに画像表示したら
「Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files」というエラーが出たこといがあったのですが

```
sudo apt install at-spi2-core
```

としたら直ると書いてあったのでやってみたところ直りました。


## USBカメラ

```
 sudo apt install usbutils
```

C270を接続して試したところ  lsusb では「Logitech, Inc. Webcam C270」と出てきました。

```
sudo apt install fswebcam
sudo fswebcam test.jpg
```

で、画像は test.jpg に取り込めました。

sudo を不要にするには

```
sudo usermod -a -G video username
sudo chmod a+rw /dev/video0
```

で行けそうです。


# bootgen

PLを使うアプリで必要となるので bootgenも入れておきます。

```
git clone https://github.com/Xilinx/bootgen
cd bootgen/
make
sudo cp bootgen /usr/local/bin/
```

# シャットダウン
シャットダウンする場合は

```
sudo shutdown -h now
```

もしくは

```
sudo poweroff
```

とすると 2019.2版から電源が落ちるようになっている模様です(素晴らしいです)。
(haltコマンドだと電源切れない？)


# おしらせ

2020/10/30 にて Qrunch がサービス終了したので移転してきた記事となります。
一時退避場所：https://github.com/ryuz/qrunch_blog