RZBOARD V2L


幾つかの方法でRZBoard上に開発環境を構築できます．　　
1. Avnetの用意したOSイメージを使う方法
1. Yoctoを使って自前でLinuxイメージをビルドする方法
1. 他のボードのやりかたを真似してやってみる方法（未検証）
1. スタンドアロンビルドする方法（未検証）
  
# 方法1：Avnetによって用意されたOSイメージを使う
ボードベンダがOSイメージを用意しています．これを使えば，Linuxを起動し，サンプルプログラムを簡単に試せます．  

構築方法に関する資料のバージョン違いなどで，幾つかドキュメントがありますが，次のものが最も正確で詳しく書いてありそうです．  
https://www.avnet.com/wps/wcm/connect/onesite/9fe02bc9-8335-4da2-924a-1bdde941e534/RzBoard-Linux-Yocto-UserManual-v2.1.pdf?MOD=AJPERES&CACHEID=ROOTWORKSPACE.Z18_NA5A1I41L0ICD0ABNDMDDG0000-9fe02bc9-8335-4da2-924a-1bdde941e534-ogmf6kR
<br>
<a href="https://avtinc.sharepoint.com/teams/ET-Downloads/Shared%20Documents/Forms/AllItems.aspx?id=%2Fteams%2FET%2DDownloads%2FShared%20Documents%2Fprojects%2FRenesas%20RzBoard%20V2L%2Fsoftware%5Fimage%5Ffiles%2FRZBoard%5Fdashboard%5FeMMC%2Ezip&parent=%2Fteams%2FET%2DDownloads%2FShared%20Documents%2Fprojects%2FRenesas%20RzBoard%20V2L%2Fsoftware%5Fimage%5Ffiles&p=true&ga=1">OS imageはここ(2022-12-17)</a><br>
  
## 簡単にプログラミング環境を構築する

RZBoard上に開発環境を構築するためにスクリプトが用意されています．  
これを使って，RZBoardに搭載されたeMMCにOSイメージを書き込むことができます．  
以降で，構築作業の流れを説明します．  
  
### ブートローダの書き込み
`flash_bootloader.bat` を使ってブートローダをRZBoardに搭載されたeMMCに書き込みます．  
  
RZBoardには複数のブートモードがあります．例えば，QSPIからのブートとeMMCからのブートです．  
システムをQSPIから起動させたい場合，QSPIにブートローダを書き込む必要があります．
eMMCから起動させたい場合，eMMCに書き込む必要があります．  
いずれの場合も，ブートローダ書き込みの流れは同じです．  
 
必要なファイルは次の通りです．
- ~~` flashwriter_rzboard.mot `~~
- ` Flash_Writer_SCIF_rzboard.mot `
- ` bl2_bp-rzboard.srec `
- ` fip-rzboard.srec`

（自分でYoctoビルドした場合，これらは ` /yocto_rzboard/build/tmp/deploy/images/rzboard/ ` に生成されています．
）
   
<a href="https://github.com/Avnet/rzboard-program-tools">`flash_bootloader.bat`</a>を使ってブートローダをQSPIフラッシュメモリもしくはeMMCに書き込む手順は次の通りです．


#### 1：ブートローダのイメージの保存
イメージをAvnetのウェブサイトから取得し，`flash_bootloader.bat`と同じ階層にある`images`フォルダに保存します．  
（zipを解凍すると最初からそこにあるので，通常は何もしなくても良い）

#### 2.デバッグ用シリアルポートをPCに接続  
RZBoardとPCとを接続します（TXD，RXD，GND）．  
RZBoard上の `J19` の1ピン（Boot2）に5Vを入力します．  40ピンコネクタの2番ピンから持ってくるとよいです．  
RZBoard上のDIPスイッチの `SW1` を次の通りに設定します．  
- DBGEN：OFF  
- BOOT1：ON  
  ![avn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/2850b1f9-466b-f394-12be-899d996fdfa1.png)
![ftdi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/0d74ed74-cf72-c243-c401-8a38433b723e.png)

　　
#### 3：設定ファイルの編集
開発環境に合わせて，`config.ini` ファイルを編集します．
RZBoardを接続しているCOMポートを設定する必要があります． 
（COMポートの番号が分からない場合はとりあえず，そのままにして進む） 
  
```
[COMMON]
COM=7

[BOOTLOADER]
FLASH_WRITER=flashwriter_rzboard.mot
FILE_BL2=bl2_bp-rzboard.srec
FILE_FIP=fip-rzboard.srec
```

#### 4：フラッシュツールで書き込み
RZBoardのUSB typeCコネクタに電源を供給します．  
PCで `flash_bootloader.bat` を実行します．  
書き込むメディアとしてeMMCを選択します．  
![cmd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/a49f128c-e80f-71d3-bcc1-d243d1b70d37.png)
  
#### 5：RZBoradの電源を入れる
USB Type-Cコネクタ（J10）に電源を接続します．  
 `SW1` を長押しして，RZBoardの電源を入れるとPCでTera Termが立ち上がります．  
自動でスクリプトが実行されるので，キー入力などは必要ありません．  
スクリプトの処理が終了するとTera Termから抜けます．  
（COMポートの番号があっていない場合，TeraTermが立ち上がりません．手動でTera Termを立ち上げるなりして，COMポートの番号を確認し，`config.ini`ファイルを編集します．
`*.srec`は予め`images`フォルダに入れておく）
  
### システムイメージの書き込み
　次に `flash_system_image.bat` を使ってLinuxイメージをeMMCに書き込みます．作業の流れを次に示します．  
  
ブートローダ書き込みのために取り付けていたジャンパ（5V電源）をRZBoardから取り外しておく．  

#### 1：OSイメージの取得
次のようなファイル名でLinuxイメージを `images` フォルダに保存します．
`core-image-rzboard.rootfs.wic`  
  
#### 2：ハードウェアのコンフィグレーション

|      Elements       |                            Action                            |
| :-----------------: | :----------------------------------------------------------: |
|      ブートモードBoot Mode      | eMMCブートモード(次の図のようにSw1を設定する．Boot2をGNDに接続するかフローティングにする) |
| USB Type-c 5V入力 |                5V DC電源に接続する              |
|    デバッグ用シリアルDebug Serial     |         PCに接続する (USB-serialポートを推奨)        |
|       SD card       |     Out (EMMCにプログラムする場合，SDカードは抜いておく     |
|    ネットワークポートNetwork Port     |           ネットワークケーブルを接続            |

#### 3：設定ファイルの編集
開発環境に合わせて `config.ini` ファイルを編集します．  
`config.ini` 内に書かれたOSイメージ（`.wic`）のファイル名を実際のファイル名と合わせる必要があります．  

  
```
[COMMON]
COM=7
IPADDR=192.168.2.56  //PCと通信できるように設定する

[SYSTEM]
FILE_SYSIMG=core-image-rzboard.rootfs.wic
```

#### 4：`flash_system_image.bat`を実行
Tera Termが自動的に起動します．
  
#### 5：USB Type-Cから5Vを入力し(J10)，ボードを起動する

Note：ボードの電源を入れる前に，PCでBATスクリプトを実行しておく必要がある

#### 6：スクリプトの終了を待つ
自動でTera Termが起動し，LinuxをeMMCに書き込むために `new BAT script` が走ります．  

![a123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/acef529e-4ece-ad92-da57-3c36937e24dd.png)


![](pics/image-finished.png)

スクリプトによって自動でプログラムが転送されます．しばらく待ちます．  
PCの画面に`press any key to exit the BAT script` と表示されたら，適当なキーを押すとスクリプトの画面が自動で閉じます（Tera Termは閉じなかった）．  
  
DIPスイッチSW1を希望のブートモードになるように再設定して電源を再投入すると，書き込んだOSイメージで起動します．  
emmcの場合は， `SW1` を下図の通りにします．
![emmc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/22796ad3-a9c8-6fb3-3eef-f58bd8c147bb.png)

PCでTera Termを起動します．（先ほど自動で起動したTera Termと違い，この際は自分で起動する）
設定：115200，8，n，1
起動したらキーボードでエンターを入力すると，ログインプロンプトが出ます（HDMIにも画面出力されている）．  
user：root  
pass：avnet  
  
次のコマンドでデモプログラムを実行する． 
予めUSBカメラを接続しておきます．
（MIPI-CSI接続のカメラを使う場合は設定しないと動かない）<sup>（4）</sup>．Avnetの資料に設定の仕方が書いてあるけど…う～ん　うまくいかない…

```
# cd app_demos
# ./demo.sh
```

デモプログラムが起動したら，a～dキーで実行したいデモを選びます．  
デモ起動後は，Enterを入力すると終了します．  
![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/a6431b42-adc6-1929-b663-60b6b486b322.png)
  
|デモ|説明（スクリプトに書いてある）|内容|
|---|---|---|
| a | Detection + Pose Estimation(HRNet) | よくわからない |
| b | Detection + Pose Estimation(HRNet, TinyYOLOv2) | 人数検出 |
| c | Object Classification(ResNet50)| 物体認識 |
| d | Object Classification(Tiny YOLOv2) | 物体認識 |

![bird.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/5cfba1e7-c74d-b0cf-d3a6-b0359fa8c1dd.jpeg)
デモ：dを実行している様子  
  
# 方法2：Yoctoを使って開発環境を構築
最新のライブラリなどを使いたい場合は自分でYoctoビルドする必要があります．
やり方は<a href="https://github.com/Avnet/meta-rzboard">ここ</a>に書いてあります．
以下，やってみた内容を書きます．
（2023年6月にリポジトリが更新されています）

　WSL2上のUbuntu20.04や22.04で試すがなかなかうまく行きませんでした．
　22.04はソフトウェアのバージョンが合わないので，そのままではうまく行かなさそうでした．
　20.04でうまく行かなかったのは，何が原因か分かりません（実行時にすでに色々なものがインストールされている環境で試したため）．
~~現在，gstreamerのビルドでエラーが出るため　止まっています…  
後日別な方法でトライする予定~~ 

　やっとビルドに成功しました．
結局，まっさらなUbuntu 20.04を新規にインストールし直してYoctoを実行したら，Avnetの資料通りにビルドできました．

割と，ハマる人が多いようです．うまくいかない場合は，まっさらな環境を用意した方が早そうです．

その後，WSL2上のUbuntu 20.04でもビルドに成功しました（HP proLiant DL380 Gen9）．

## 使ったマシン（HP ProLiant DL360 GEN7）
- Xeon X5650　2機（計24スレッド）
- メモリ64GB
- OS Ubuntu 20.04
bitbakeタイムは2時間30分程度でした．
  
LinuxのビルドシステムYoctoを使って，RZBoard用のOSイメージを作ります．
 - 最低300GBのディスク領域，8GBのRAM
 - Ubuntu 64bit 20.04LTS（仮想環境とかDockerでも可）

## 必要なパッケージ
 aptで入れる． 
- 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
- p7zip-full
- libyaml-dev
- rsync
- curl
- locales
- bash-completion

## ソースコードのダウンロード
　ダウンロードして，homeディレクトリに置く．
　ダウンロード元ウェブサイト
（6つあるファイルの内，日本JPと英語ENから選択できるものがある．コーデックは評価版と正規版？がある）
全て2023年2月末時点の最新版で試した．

2023年6月にリポジトリが更新されています．
次のリポジトリの説明に書いてあるライブラリファイルをダウンロードするとよいです．
https://github.com/Avnet/meta-rzboard


```
https://www.renesas.cn/us/en/products/microcontrollers-microprocessors/rz-mpus/rzv2l-general-purpose-microprocessor-equipped-renesas-original-ai-accelerator-drp-ai-12ghz-dual
```

- RZ/V Verified Linux Package v3.0.2（RTK0EF0045Z0024AZJ-v3.0.2.zip）
- RZ MPU Graphics Library V1.21（RTK0EF0045Z14001ZJ-v1.21_EN.zip）
もしくは評価版　RTK0EF0045Z13001ZJ-v1.21_EN.zip
  
- ~~RZ MPU Codec Library Evaluation Version V0.58（RTK0EF0045Z15001ZJ-v0.58_EN.zip）~~
- RZ MPU Codec Library Unrestricted Version V1.0(RTK0EF0045Z16001ZJ-v1.0_rzg_EN.zip)
 もしくは評価版　RTK0EF0045Z15001ZJ-v1.0_JP
- RZ/V2L DRP-AI Support Package V7.30（r11an0549ej0730-rzv2l-drpai-sp.zip）
- RZ/V2L ISP Support Package V1.21（r11an0561ej0121-rzv2l-isp-sp.zip）
- RZ/V2L Multi-OS Package V1.10（r01an6238ej0110-rzv2l-cm33-multi-os-pkg.zip）

## スクリプトをダウンロードしてファイルを展開する
#### スクリプトをダウンロードする．

```
$ wget https://raw.githubusercontent.com/Avnet/meta-rzboard/rzboard_dunfell_5.10/tools/create_yocto_rz_src.sh
```

#### パーミッション

```
chmod a+x create_yocto_rz_src.sh
```

#### 実行
このスクリプトは，先に取得した必要ファイル6個を展開するだけのものです．
ダウンロードした6個のファイルのファイル名に合わせてスクリプト`create_yocto_rz_src.sh` を適宜編集してください．
　6つのファイルについて，最新版をダウンロードすると，幾つかのファイル名は編集する必要があります．逆に言えば，スクリプトに書いてあるファイル名に合わせて（バージョンなどを）ダウンロードしておけば，スクリプトファイルを編集する必要はありません．

次のコマンドでスクリプトを実行します．
```
./create_yocto_rz_src.sh
```

#### meta-rzboardのダウンロード
```
$ cd ~/yocto_rzboard
$ git clone https://github.com/Avnet/meta-rzboard.git -b rzboard_dunfell_5.10
```
これでYoctoでビルドするために必要なファイルが集まりました．

## Yoctoのビルド
### ビルドのコンフィグレーション

```
cd ~/yocto_rzboard
$ mkdir -p ~/yocto_rzboard/build/conf
$ cp meta-rzboard/conf/rzboard/* build/conf/
$ ls build/conf/
bblayers.conf local.conf
```
 
~~Yocto用のダウンロードディレクトリのパスを`conf/local.conf`に書く．~~
やってもやらなくても良いが，
bitbakeでダウンロードファイルを保存するディレクトリを指定したい場合は，build/conf/local.confを編集します．
（基本的にやらなくてヨシ．新しいSOPからはこの手順が削除されている）

```
DL_DIR ?= "${HOME}/downloads"
```

### ビルド

```
$ cd ~/yocto_rzboard/
$ source poky/oe-init-build-env build/
$ bitbake avnet-core-image
```

#### ハマりポイント：1
　gitプロトコルでファイルフェッチにいくパッケージもあるので，9418が開いていないとビルドに失敗するようである．弊社では無理！

#### ハマりポイント：2
　en_US.UTF-8で実行する必要がある．ja_JP.UTF-8とかにしている人は次のコマンドでチェンジ！

```
$ sudo locale-gen en.US_UTF-8
$ update-locale LANG=en_US.UTF-8
```


 |  |  |
 |-|-|
<small><i>bitbakeを実行するOS側にインストールされたライブラリのバージョンなどによって，bitbakeがうまく完走しない場合があります．yoctoでビルドする一連のパッケージ取得でエラーが出ることがよくあります．その際，gitの仕様変更（git →　https）に絡む問題のように見える場合があります．しかし，既に現在のyoctoのレシピではbbappendなどのファイル内でhttpsアクセスするように，変更されているようなので，直接の原因ではなさそうです．お勧めは，ネイティブのLinuxシステムを新たに用意してbitbakeすることです．yoctoに精通した人でなければ，問題を探して解決するよりそちらの方が早いと思います．</i></small>


ビルドに成功すると，
`/yocto_rzboard/build/tmp/deploy/images/rzboard/`
に成果物が生成される．

- Flash_Writer_SCIF_rzboard.mot
- bl2_bp-rzboard.srec
- fip-rzboard.srec
- avnet-core-image-rzboard-xxxx.rootfs.wic
- Image
- rzboard.dtb
- overlays/rzboard-*.dtbo
- avnet-core-image-rzboard-xxxx.rootfs.tar.bz2

必要なファイルは，次の4つ．
- Flash_Writer_SCIF_rzboard.mot
- bl2_bp-rzboard.srec
- fip-rzboard.srec
- avnet-core-image-rzboard-xxxx.rootfs.wic

ボードへの書き込み方法は，方法1．と同じ．
上記4つのファイルを `images` フォルダに上書きして， `config.ini` を編集する（ファイル名を合わせる）．


# 方法3：Yocto weston
現在，検証中だがRZBoard向けの情報ではないので，やらないかも…
RZBoardを使う場合に，参考にはなる
`https://github.com/Ignitarium-Renesas/RZV2L_AiLibrary`
RZ/V2L-SMARC board向けの手順でビルドしてみる．
## ボード起動手順
Ubuntu 20.04が指定されているが，Ubuntu 22.04で実行した．

ビルドに必要なパッケージをUbuntuに入れる．  

```
sudo apt-get update
sudo apt-get 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 p7zip-full libyaml-dev
```
  
ルネサスのパッケージを展開．  
```
mkdir ~/rzv_vlp_v3.0.0
cd ~/rzv_vlp_v3.0.0
unzip ~/RTK0EF0045Z0024AZJ-v3.0.0-update2.zip
tar zxvf ./RTK0EF0045Z0024AZJ-v3.0.0-update2/rzv_bsp_v3.0.0.tar.gz
```
  
```
cd ~/rzv_vlp_v3.0.0
unzip ~/RTK0EF0045Z14001ZJ-v1.xx_EN.zip
tar zxvf ./RTK0EF0045Z14001ZJ-v1.xx_EN/meta-rz-features.tar.gz
```
  
```
cd ~/rzv_vlp_v3.0.0
unzip ~/RTK0EF0045Z16001ZJ-v0.xx_EN.zip
tar zxvf ./RTK0EF0045Z16001ZJ-v0.xx_EN/meta-rz-features.tar.gz
```
  
```
cd ~/rzv_vlp_v3.0.0
unzip ~/r11an0549ej0720-rzv2l-drpai-sp.zip
tar -zxvf ./rzv2l_drpai-driver/meta-rz-features.tar.gz
```

```
cd ~/rzv_vlp_v3.0.0
source poky/oe-init-build-env
```

```
cd ~/rzv_vlp_v3.0.0/build
cp ../meta-renesas/docs/template/conf/smarc-rzv2l/*.conf
```
  
bitbakeする前に言語を設定しておく．  

```
$ sudo apt-get install language-pack-en
$ sudo update-locale LANG=en_US.UTF8
```
  
```
cd $WORK/build
bitbake core-image-weston
```

## SDKインストール手順








# 方法4：カーネルのスタンドアロンビルドとu-Boot
この方法は未検証です．  
そのうちトライします．  
  
スタンドアロン環境でYocto SDKもしくはARM GCCを使って，u-Bootとカーネルをビルドする方法を説明する．

## ツールチェーンのクロスコンパイル
### Arm gcc
Developer GNU-Aのダウンロードページから，A-profileアーキテクチャ用のツールチェーンをダウンロードする．
バージョン8.3の利用をお勧めする．
`gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz`
それをローカルのディレクトリで解凍する．

```
$ mkdir ~/toolchain
$ tar -xJf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C ~/toolchain
```

　gccが実行できるか確かめるために，次のコマンドを実行する

```
$ cd toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/
$ ./aarch64-none-linux-gnu-gcc -v
```

Arm gccでプロジェクトをコンパイルするために，次のコマンドで環境を作る

```
$ TOOLCHAIN_PATH=$HOME/toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
$ export PATH=$TOOLCHAIN_PATH:$PATH
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-gnu
```

### Yocto
　Yoctoプロジェクトのビルド環境から次のコマンドでSDKを作る

```
$ cd ~/yocto_rzboard/
$ source poky/oe-init-build-env build
$ bitbake avnet-core-image -c populate_sdk
```

SDKが生成される．
`~/yocto_rzboard/build/tmp/deploy/sdk/poky-glibc-x86_64-avnet-coreimage-aarch64-rzboard-toolchain-3.1.14.sh`

このスクリプトでSDKがインストールされる．
デフォルトの場所は，`/opt`であるが，ホストマシンのどこにでも変更できる．

`$ ./poky-glibc-x86_64-avnet-core-image-aarch64-rzboard-toolchain-3.1.14.sh`

SDKのターゲットディレクトリを入力する（デフォルト：`/opt/poky/3.1.14`）
プロジェクトをYocto SDKでコンパイルする時，まず次のコマンドで環境変数をコンフィグする．

```$ source /opt/poky/3.1.14/environment-setup-aarch64-poky-linux```





（1）AVNET
https://www.avnet.com/wps/portal/us/products/avnet-boards/avnet-board-families/rzboard-v2l/
（2）Renesas， Avnet
https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rz-mpus/rz-partner-solutions/avnet-rzboard#overview
（3）RZBoard V2L Hardware User Guide
https://www.avnet.com/wps/wcm/connect/onesite/86d72e54-3eef-4ceb-8464-de54e28dd79f/RzBoard+V2L+Hardware+User+Guide+%28v1.0%29.pdf?MOD=AJPERES&CACHEID=ROOTWORKSPACE.Z18_NA5A1I41L0ICD0ABNDMDDG0000-86d72e54-3eef-4ceb-8464-de54e28dd79f-ogmeSxB
（4）Linux Yocto User Manual
https://www.avnet.com/wps/wcm/connect/onesite/9fe02bc9-8335-4da2-924a-1bdde941e534/RzBoard-Linux-Yocto-UserManual-v2.1.pdf?MOD=AJPERES&CACHEID=ROOTWORKSPACE.Z18_NA5A1I41L0ICD0ABNDMDDG0000-9fe02bc9-8335-4da2-924a-1bdde941e534-ogmf6kR