TWELITE STAGE on Ubuntu 20.04

「TWELITE STAGE を試す」
https://qiita.com/nanbuwks/items/bb07970d5339177aa7a0
では Ubuntu18.04での設定をしましたが、Ubuntu20.04で追試です。

# 環境

- Ubuntu 20.04
- MWSTAGE2020_10（2020/10月9日） および MWSTAGE2020_12（2020/12月3日）

# インストール
https://mono-wireless.com/jp/products/stage/index.html
から

MWSTAGE-2020-10_linux-2.zip ( 2020/12月3日版の場合、MWSTAGE-2020-12_linux.zip )


をダウンロードして展開すると 「 MWSTAGE 」というフォルダができた。


## TWELITE STAGE APP の作業はパス

インストール作業は
「TWELITE Stage」
https://stage.twelite.info/
に基づき、「Linux - TWELITE STAGE」
https://stage.twelite.info/install/linux

の情報から以下のように導き出すことができる。

```

$ cd ./MWSTAGE/TWELITE_Stage/INSTALL/ubuntu/
$ sudo ./set_udev_sudo.sh
$ ./make_launch_icon.sh
```

このようにすると、 /etc/udev/rules.d/51-ftdi.rules に以下が追加される。


```

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666",  RUN+="/bin/sh -c 'rmmod ftdi_sio && rmmod usbserial'"
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="0666",  RUN+="/bin/sh -c 'rmmod ftdi_sio && rmmod usbserial'"


```

しかしながら前回と同様、この設定は他の usbserial モジュールを使用するアプリと干渉を起こすことになる。

http://www.linux-usb.org/usb.ids
を参照すると、以下のように 0403:6001 および 0403:6015 は FTDI 社の ID となっている。


> 0403  Future Technology Devices International, Ltd
	0000  H4SMK 7 Port Hub / Bricked Counterfeit FT232 Serial (UART) IC
	0232  Serial Converter
	1060  JTAG adapter
	1234  IronLogic RFID Adapter [Z-2 USB]
	1235  Iron Logic Z-397 RS-485/422 converter
	6001  FT232 Serial (UART) IC
	6002  Lumel PD12
	6007  Serial Converter
	6008  Serial Converter
	6009  Serial Converter
	6010  FT2232C/D/H Dual UART/FIFO IC
	6011  FT4232H Quad HS USB-UART/FIFO IC
	6014  FT232H Single HS USB-UART/FIFO IC
	6015  Bridge(I2C/SPI/UART/FIFO)
...

なので TWELITE STAGE APP を使わなくとも FTDI チップ搭載の該当 ID が被るアダプタをつなげるだけで ftdi_sio および usbserial が rmmod されてしまう。組み込みでは USB シリアルアダプタは息をするように使用する。TWELITE を使いながらシリアルモニターでデータを取得などは普通に行っているためにそういったことができなくなるのは問題だ。

上記のことから、この TWELITE STAGE APP は使用せず、別ツールを使うことで解決することにした。なので TWELITE STAGE APPの作業はパスとする。

## MWSDK_ROOT の設定

https://sdk.twelite.info/twelite-sdkno/twelite-sdknoinsutru

によると

> ビルドに TWELITE STAGEを用いず、makeコマンドを用いてビルドする場合はこちらを参照の上、MWSDK_ROOT環境変数を設定してください。

とあるので

```

$ echo MWSDK_ROOT=~/Downloads/MWSTAGE/MWSDK >> ~/.bash_profile
$ source ~/.bash_profile

```

とした。

~/Downloads/MWSTAGE/MWSDK

は自分の環境によって適宜変更する必要がある。


# MWSDK

今回のものを解凍すると以下のようなディレクトリ構成になる。

(MWSTAGE2020-10_linux-2) 前回の MWSTAGE-2020-05_linux.zip と変更なし。

```

MWSTAGE
├── BIN
├── MWSDK
│   ├── Act_samples
│   ├── ChipLib
│   ├── LICENSE
│   ├── MkFiles
│   ├── TWENET
│   ├── Tools
│   └── Wks_TweApps
└── TWELITE_Stage
    ├── INSTALL
    └── LICENSE
```

( MWSTAGE2020-12_linux ) Tools と Act_extras に変更が入る


```

MWSTAGE
├── BIN
├── MWSDK
│   ├── Act_extras
│   ├── Act_samples
│   ├── ChipLib
│   ├── LICENSE
│   ├── MkFiles
│   ├── TWENET
│   └── Wks_TweApps
├── TWELITE_Stage
│   ├── INSTALL
│   └── LICENSE
├── Tools
│   ├── ba-elf-ba2-r36379
│   └── tweprog_py
└── log
```



 
# サンプルプログラムのビルド


```

WSTAGE/MWSDK/Wks_TweApps/App_Twelite
```

を vscode でビルドしてみる。

```

WSTAGE/MWSDK/MyProjects/App_Twelite

```

にコピーして、vscode から 「File」-「Open Folder...[Ctrl+K Ctrl+O]」 でWSTAGE/MWSDK/MyProjects/App_Twelite を指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/226d4687-d630-88f9-e8ac-b20582950978.png)


[Terminal] - [Run Task...] - [Build for TWELITE BLUE] 

とすると、ビルドできた。

# 書き込み

書き込みは昔ながらの tweterm.py を使ってみる。

tweterm は

MWSTAGE/MWSDK/Tools/tweprog_py/tweterm.py (MWSTAGE2020-10_linux-2)
MWSTAGE/Tools/tweprog_py/tweterm.py (MWSTAGE2020-12_linux)


にあるので、適当にパスを通しておくかパス指定で実行することになる。

必要なパッケージを以下のように導入

```

$ sudo apt-get install libusb-dev
$ sudo apt-get install python3-pip
$ sudo pip3 install pyserial
```
また、pyftdi も必要ですが執筆時点で普通にインストールすると pyftdi は 0.52.0 が入り、それではうまくいきませんでした。
(ダメだった操作)

```

$ sudo pip3 install pyftdi
```
pyfydi は 0.30.3だとうまくいきました。(OKだった操作)

```

$ sudo pip3 install pyftdi==0.30.3

```
として、以下のようにして実行します。


```
$ sudo tweterm.py 
Tools/tweprog_py/tweterm.py:86: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':
Available interfaces:
  ftdi://ftdi:230x:R24UDE73/1   (TWE-Lite-R)

Please specify the USB device
```

と出ました。

となりました。この、

```

SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':
```

は Python 3.8 で表示されるようになった警告です。今回はこのまま無視して進めます。
出てきたデバイス名を使って書き込みをしてみます。


```
$ sudo tweterm.py -p ftdi://ftdi:230x:R24UDE73/1 -b 115200 --no-term -F MyProjects/App_Twelite/App_Twelite/build/App_Twelite_BLUE_L1304_V1-9-1.bin 
Tools/tweprog_py/tweterm.py:86: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':
*** TWE Wrting firmware ... MyProjects/App_Twelite/App_Twelite/build/App_Twelite_BLUE_L1304_V1-9-1.bin
MODEL: TWEModel.TWELite
SER: 10eb745
FILEINFO: 04 03 0008
0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..done - 10.49 kb/s
Bye.

```


# おまけ　うまくいかなかった記録

以下 0.52.0　を使ってうまくいかずトラブルシューティングした記録です。

TWELITE R2 + TWELITE DIP を PC につなげて

「TWELITE STAGE を試す」
https://qiita.com/nanbuwks/items/dc553119236e2a219297

のように、


```

$ sudo Tools/tweprog_py/tweterm.py 
```
とします。(この指定は MWSTAGE/MWSDK から呼び出しています)

```

Tools/tweprog_py/tweterm.py:86: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':
Available interfaces:
  ftdi://ftdi:ft-x:R24UDE73/1   (TWE-Lite-R)

Please specify the USB device

```

となりました。この、

```

SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':
```

は Python 3.8 で表示されるようになった警告です。今回はこのまま無視して進めます。
出てきたデバイス名を使って書き込みをしてみます。


```

$ sudo Tools/tweprog_py/tweterm.py -p ftdi://ftdi:ft-x:R24UDE73/1 -b 115200 --no-term -F MyProjects/App_Twelite/App_Twelite/build/App_Twelite_BLUE_L1304_V1-9-1.bin  
```

```

Tools/tweprog_py/tweterm.py:86: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':

Error: 'int' object has no attribute 'name'
Bye.

```

あらら。調べてみたら pyftdi のバージョン不整合によるものでした。

## pyftdi のバージョン

```

$ pip list
Package    Version
---------- -------
...
pyftdi     0.52.0 
...
```

とあります。


https://github.com/eblot/pyftdi
には、

> Warning
Starting with version v0.40.0, several API changes are being introduced. While PyFtdi tries to maintain backward compatibility with previous versions, some of these changes may require existing clients to update calls to PyFtdi.
> 
> Do not upgrade to v0.40.0 or above without testing your client against the new PyFtdi releases. PyFtdi versions up to v0.39.9 keep a stable API with v0.22+ series.
> 
> See the Major Changes section on the online documentation for details about potential API breaks.

とあります。


pipでインストール可能なバージョンをリストアップしてみました。

```

$ pip3 install pyftdi==
ERROR: Could not find a version that satisfies the requirement pyftdi== (from versions: 0.42.0.macosx-10.14-x86_64, 0.4.5, 0.5.1, 0.5.2, 0.6.3, 0.13.2, 0.13.4, 0.22.1, 0.25.0, 0.25.2, 0.26.3, 0.26.4, 0.27.0, 0.28.0, 0.28.2, 0.28.3, 0.28.8, 0.28.9, 0.28.10, 0.29.0, 0.29.1, 0.29.2, 0.29.3, 0.29.4, 0.29.6, 0.30.0, 0.30.1, 0.30.2, 0.30.3, 0.40.5, 0.40.6, 0.42.2, 0.43.0, 0.44.0, 0.44.1, 0.44.2, 0.47.2, 0.48.2, 0.48.3, 0.50.0, 0.50.1, 0.50.2, 0.51.0, 0.51.2, 0.52.0)
ERROR: No matching distribution found for pyftdi==
```

このうちの、0.30.3 をインストールすることにしました。


```


$ sudo pip3 uninstall pyftdi
```

```

$ sudo pip3 install pyftdi==0.30.3
```

として書こうとすると


```

$ sudo ./tweterm.py  -p ftdi://ftdi:ft-x:R24UDE73/1 -b 115200 --no-term -F MyProjects/App_Twelite/App_Twelite/build/App_Twelite_BLUE_L1304_V1-9-1.bin 
[sudo] nanbuwks のパスワード: 
./tweterm.py:86: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':

Error: Unable to open USB port ftdi://ftdi:ft-x:R24UDE73/1: Product ft-x is not referenced
```

となりました。なお、ここからデバッグしながらだったのでカレントディレクトリは

MWSTAGE/MWSDK/Tools/tweprog_py/tweterm.py 

で操作しています。

```

$ sudo ./tweterm.py 
```

とすると

```
./tweterm.py:86: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':
Available interfaces:
  ftdi://ftdi:230x:R24UDE73/1   (TWE-Lite-R)

Please specify the USB device
```

と出ました。

ライブラリによってデバイスネームの表記が変わるのですね。
ということで、デバイスネームを変えて

```
$ sudo ./tweterm.py  -p ftdi://ftdi:230x:R24UDE73/1 -b 115200 --no-term -F ../../MyProjects/App_Twelite/App_Twelite/build/App_Twelite_BLUE_L1304_V1-9-1.bin 
./tweterm.py:86: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if twefirm is not '':
*** TWE Wrting firmware ... ../../MyProjects/App_Twelite/App_Twelite/build/App_Twelite_BLUE_L1304_V1-9-1.bin
MODEL: TWEModel.TWELite
SER: 10eb745
FILEINFO: 04 03 0008
0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..done - 10.49 kb/s
Bye.

```

書けました。ふー。