マルチプラットホーム、ＲＸマイコン、フラッシュプログラム

## はじめに

組み込み開発で、最もキーとなるのは、ターゲットのマイコンにどのようにしてプログラムを転送（書き込む）するかだと思います。
   
ＲＸマイコンでは、メーカー純正エミュレーター（Ｅ１など）を接続（Ｊ－ＴＡＧインターフェース）して、専用アプリで書き込む方法が一般的ですが、エミュレーターはそこそこのコストでもあり（１度買えば良いのですが）基本的に Windows 環境でしか使えません。
また、J-TAG インターフェース関係のピンなどを全て接続しなければなりません。
※自分の場合、インサーキットエミュレーションを使ってデバッグする事が殆ど無いのでＥ１を使う必要性があまり無いです。
![RenesasDebug.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58667/a55b23da-7d97-e253-3924-c7cd8e83b4ce.jpeg)
※ルネサスＥ１（秋月電子、￥１２６００）

![USB_Serial.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58667/8a5a9e26-7a2c-77a1-ba77-68a72e9b7cbe.jpeg)

最も簡単で、コストがかからない方法は、シリアルインターフェースを使って書き込む事で、ＵＳＢシリアルコンバーターがあれば実用的に書き込む事が出来ます。
通常、マイコンのＭＤ端子を「Ｌ」にしてリセットすると、フラッシュ書き込みのプロトコルを受け付けます。

※ＲＸマイコンでＵＳＢ端子を持っているデバイスでは、ＵＳＢ接続でも書き込む事が出来ますが、OS-X や Linux では、ＵＳＢのドライバーが無い為使えないと思いますし、ＵＳＢ接続のハードウェアーを作っておく必要があります。（シリアルインターフェースより少しだけ面倒です）

- ＲＸマイコンの場合、内臓フラッシュメモリを書き換える方法が複数あり、プロトコルが公開されています。
- 今回、独自プログラムでシリアルインターフェースを使って書き込む方法を紹介します。
- また、書き込みプログラムの設定や、具体的な接続方法など、参考例を紹介します。
- このプログラムはコマンドラインから動くので、ＧＵＩの操作が一切必要ないのも特徴です。
- Windows の場合、「Renesas Flash Programmer」を使えば、シリアル接続でも、USB 接続でも書き込む事が出来ます。
   
## ソフトウェアーの準備
マルチプラットホーム対応のフラッシュ書き込みプログラムを実装してあります、ソースコードは以下のリンクにあります。
https://github.com/hirakuni45/RX/tree/master/rxprog
※ＲＸ関係のフレームワークをチェックアウトすると、rxprog 関係のファイルも同根されています。

現在書き込みできる（書き込みを確認した）デバイスは、

- RX24T
- RX63T
- RX66T
- RX64M
- RX71M
- RX65N（未確認）

となっています。
※上記プログラムのコンパイルには「boost」が必要です。
※OS-X、Linux は、標準的にコンソールがありますので簡単ですが、Windows の場合、コンパイル環境が MSYS2 となっている為、事前に MSYS2 のインストールを行う必要があります。

rxprog ディレクリに移動して make、make install とするだけです。

```
make
make install
```

## ハードウェアーの準備
![RX_boards.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58667/b61bb117-fdf8-f107-90d8-913e5f98a82d.jpeg)

当然ですが、ＲＸマイコンを搭載したボードが必要です。
ほとんどの人は、デバイスを単体で入手して、ユニバーサル基板などに載せてから始める人は少ないと思いますが、ＲＸマイコンを使ったボードは、選択枠が限られており、どれも比較的高価です。
自分は、そのようなボードをほとんど買った事が無く、また、新しいデバイスに飛びつくので、ほぼユニバーサル基板で行っています。
一応、どのようにするのか、手順を記しておきます。

- マイコン側の VSS 端子と、USB シリアルの GND を接続。
- マイコン側の RXD1 端子と、USB シリアルの TXD を接続。
- マイコン側の TXD1 端子と、USB シリアルの RXD を接続。   
※ブート時のＳＣＩポート（通常 SCI1 です、要確認ハードウェアーマニュアル）
- UB 端子があるデバイスの場合、プルダウンする。(4.7K)
- EMLE 端子がある場合プルダウンする。（4.7K)
- MD 端子を「Low レベル」にして「リセット」信号を入れる。
- 内臓プログラムを実行する場合は MD 端子を「High レベル」にして、リセット信号を入れる。

|端子|RX24T (100 Pin)|RX66T (100 Pin)|RX64M (176 Pin)|RX71M (176 Pin)|RX65N (176 Pin)|
|---|---|---|---|---|---|
|UB|X|*UB/P00 (4)|PC7/UB (76)|PC7/UB (76)|PC7/UB (76)|
|MD|MD (6)|MD/FINED (6)|MD/FINED (18)|MD/FINED (18)|MD/FINED (18)|
|EMLE|X|EMLE (2)|EMLE (10)|EMLE (10)|EMLE (10)|
|RXD|PD5/RXD1 (20)|PD5/RXD1 (20)|PF2/RXD1 (31)|PF2/RXD1 (31)|PF2/RXD1 (31)|
|TXD|PD3/TXD1 (22)|PD3/TXD1 (22)|PF0/TXD1 (35)|PF0/TXD1 (35)|PF0/TXD1 (35)|

* RX66T は USB を内臓していないデバイスがあり、その場合、未接続とします。   
- UB、MD、EMLE 端子は、抵抗（4.7K 程度）でプルアップ、又はプルダウン。
- XTAL、EXTAL に適切なクリスタルを接続。
- VSS、VCC、AVSS、AVCC 等電源を全て接続、バイパスコンデンサを入れる。
- USB_VSS、USB_VCC などの USB 電源を適切に接続する。

※詳しくは、各デバイスのハードウェアーマニュアル「概要、ピン配置図」、「フラッシュメモル、ブートモ\\
ード」を参照して下さい。
※ルネサス製ボードの回路図が公開されていますので参考にして下さい。

---
## 操作方法
### rx_prog の起動確認
 - rx_prog を実行して、動作する事を確認（help がリストされる）

```
Renesas RX Series Programmer Version 1.10b
Copyright (C) 2016,2019 Hiramatsu Kunihito (hira@rvf-rc45.net)
usage:
rx_prog [options] [mot file] ...

Options :
    -P PORT,   --port=PORT     Specify serial port
    -s SPEED,  --speed=SPEED   Specify serial speed
    -d DEVICE, --device=DEVICE Specify device name
    -e, --erase                Perform a device erase to a minimum
    -v, --verify               Perform data verify
    -w, --write                Perform data write
    --progress                 display Progress output
    --device-list              Display device list
    --verbose                  Verbose output
    -h, --help                 Display this
```

### rx_prog.conf 設定
 - 各デバイスの設定、ポート、ボーレートの設定などを記述する。
 - 各プラットホームで設定を共有出来るように、シリアルデバイスのポートパスを個別に指定できる。
 - 自分の環境に合わせてポート名、ボーレートなど設定しておく。

rx_prog.conf 設定例

```
# 標準のシリアルポート、プラットホーム依存ポート名
# port_win, port_osx, port_linux は、プラットホーム別に認識し、port より優先されます。
#port = /dev/ttyS10
#port = COM12
port_win   = COM3
port_osx   = /dev/tty.usbserial-DA00X2QP
port_linux = /dev/ttyUSB0

# 標準のシリアル・スピード、プラットホーム依存スピード
# speed_win, speed_osx, speed_linux は、プラットホーム別に認識し、speed より優先されます。
# ※設定できる最大速度は、プラットホームにより異なります。
#speed = 230400
speed_win = 230400
speed_osx = 230400
speed_linux = 230400
```
rx_prog.conf は、以下の順番にスキャンされ、ロードされます。

- カレント・ディレクトリ
- コマンド・ディレクトリ（通常、/usr/local/bin）

対応デバイス・リスト表示

```
rx_prog --device-list
R5F563T6 (RAM: 8K, Program-Flash: 64K, Data-Flash: 8K)
R5F524T8 (RAM: 16K, Program-Flash: 128K, Data-Flash: 8K)
R5F524TA (RAM: 16K, Program-Flash: 256K, Data-Flash: 8K)
R5F564MF (RAM: 512K, Program-Flash: 2048K, Data-Flash: 64K)
R5F5671F (RAM: 512K, Program-Flash: 2048K, Data-Flash: 64K)
R5F564MG (RAM: 512K, Program-Flash: 2560K, Data-Flash: 64K)
R5F571MG (RAM: 512K, Program-Flash: 2560K, Data-Flash: 64K)
R5F564MJ (RAM: 512K, Program-Flash: 3072K, Data-Flash: 64K)
R5F571MJ (RAM: 512K, Program-Flash: 3072K, Data-Flash: 64K)
R5F564ML (RAM: 512K, Program-Flash: 4096K, Data-Flash: 64K)
R5F571ML (RAM: 512K, Program-Flash: 4096K, Data-Flash: 64K)
R5F565NE (RAM: 640K, Program-Flash: 2048K, Data-Flash: 32K)
R5F566TA (RAM: 64K, Program-Flash: 256K, Data-Flash: 32K)
R5F566TE (RAM: 64K, Program-Flash: 512K, Data-Flash: 32K)
R5F566TF (RAM: 128K, Program-Flash: 512K, Data-Flash: 32K)
R5F566TK (RAM: 128K, Program-Flash: 1024K, Data-Flash: 32K)
```

### コネクション検査
![RX64M_SERIAL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58667/83bb6f25-8975-7694-5631-fc598fbd637f.jpeg)

```
rx_prog -d RX71M --verbose
# Platform: 'Cygwin'
# Configuration file path: '/usr/local/bin/rx_prog.conf'
# Device: 'RX71M'
# Serial port path: 'COM3'
# Serial port speed: 230400
# Serial port alias: COM3 ---> /dev/ttyS2
# Serial port path: '/dev/ttyS2'
# Connection OK.
#01/01: Device Type TYP: 20 02 FD 09 01 48 40 00
#01/01: Device Type OSA: 16000000
#01/01: Device Type OSI: 16000000
#01/01: Device Type CPA: 120000000
#01/01: Device Type CPI: 120000000
#01/01: Endian is little.
#01/01: System clock: 120000000
#01/01: Device clock: 60000000
#01/01: Change baud rate: 230400
#01/01: ID: Disable
```

### 消去、書き込み、比較（プログレスバー付、「test_sample.mot」ファイルの場合）
```
rx_prog -d RX71M --progress --write --verify test_sample.mot
Erase:  #################################################
Write:  #################################################
Verify: #################################################
```

---
### 不必要なシリアルポートの削除（Windows）
```
set devmgr_show_nonpresent_devices=1
start devmgmt.msc
```

- 全ての USB シリアルデバイスをコンピューターから取り外す。
- 上記で BAT ファイルを作成して、右クリックにて、「管理者権限」で実行する。
- 「表示」-「非表示のデバイスの表示」にチェックを入れる。
- 使っていない COM ポートを削除する。
- 改めて、USB シリアルデバイスを順番にコンピューターに接続していく。

※同メーカーデバイスの場合、二個目以降、COM ポート番号の移り変わりなどが発生するので状況に応じてメ\\
ーカー専用ツールなどで内部シリアル ID 番号を変更するなどの対処を行う必要がある。
※専用ツールの利用に関して、デバイスメーカーのＨＰで確認下さい。

---
### FT232RL, FT231XS と CP2102 の違い
FT231XS, FT232RL:

```
time rx_prog -d RX66T --progress --erase --write --verify raytracer_sample.mot
Erase:  #################################################
Write:  #################################################
Verify: #################################################

real    0m16.617s
user    0m0.202s
sys     0m0.421s
```

CP2102:

```
time rx_prog -P COM12 -d RX66T --progress --erase --write --verify raytracer_sample.mot
Erase:  #################################################
Write:  #################################################
Verify: #################################################

real    0m6.616s
user    0m0.078s
sys     0m0.187s
```