rtlbm-mruby v1.0の使い方

2019/01/23追記: [v2.1リリース](https://github.com/yamori813/rtlbm-mruby/releases/tag/v2.1)しました。
2018/12/13追記: [v2.0リリース](https://github.com/yamori813/rtlbm-mruby/releases/tag/v2.0)しました。
2018/5/14追記: v1.2リリースしました。
2018/4/30追記: v1.1リリースしました。

[蟹さん](https://qiita.com/yamori813/items/c1d8111a3f45c5a74655)用にクロスビルドしたmruby VMバイナリーを用意してmrbcでコンパイルしたバイナリをアップする事で試せるようになったのでv1.0リリースとしました。完全非保証ですが使い方を書きます。

自分はFreeBSD/amd64で試していますが、Linuxでも同じようにできるのではないかと思います。

イメージ作成用のコマンドがソースツリーに入っているので、rtlbm-mrubyのブランチをリカーシブルにcloneします。

```
$ git clone --recursive https://github.com/yamori813/rtlbm-mruby.git
```

mrubyとrtktoolsディレクトリにあるcvimgだけビルドが必要なので、makeしてビルドします。mrubyはhostのバイナリだけで大丈夫です。

最新のリリースタグにあるmain.rtl.gzのバイナリファイルをダウンロードして解凍してソースツリーのディレクトリに入れておきます。

bootのIPアドレスは192.168.1.6に設定されていてtftpでアップロードするためのホスト側のネットワークインターフェースに同じサブネットのipアドレスを設定します。FreeBSDの場合は以下のようにします。

```
% sudo ifconfig bge0 inet 192.168.1.1/24 alias
```

ターゲットにシリアルコンソールにUSBシリアルモジュールのTX,RX,GNDを接続してシリアルモニタープログラムを実行します。

![写真（2018-08-15 16.29）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/bb668b86-d2e0-29be-e10b-55614ef2b947.jpeg)

![RTLUART.png](https://qiita-image-store.s3.amazonaws.com/0/104066/d0d31f3d-2b9b-f5e1-5a19-347fb533fe35.png)

[Macには標準でcu](https://qiita.com/yamori813/items/29e6bcd2f090983abb9a)というプログラムがありますが、私はなんかトラブルがあったかでjermというオープンソースをビルドして使っています。プログラムをデバイスと38400ボーに指定して起動し、ターゲットの電源を入れてメッセージが出たらESCキーを入力してboot止めます。

```
========== SPI =============
SDRAM CLOCK:156MHZ
 ------------------------- Force into Single IO Mode ------------------------ 
|No chipID  Sft chipSize blkSize secSize pageSize sdCk opCk      chipName    |
| 0 c22017h  0h  800000h  10000h   1000h     100h   86   39   MX6405D/05E/45E|
 ---------------------------------------------------------------------------- 
 
---RealTek(RTL8196C)at 2011.11.13-11:40+0900 version v1.1f [16bit](390MHz)
no sys signature at 0009E000!
no sys signature at 00020000!

---Escape booting by user
Set 8196C PHY Patch OK

---Ethernet init Okay!
<RealTek>
```

ソースツリーのflash.shを使ってダウンロードしたmruby vmのmain.rtlを焼きます。mrubyとrtktoolsのコマンドを利用するので、このディレクトリでmakeしておきます。

```
% ./flash.sh main.rtl
```

mrubyのスクリプトが無い状態なので、もう一度bootで止めておきます。

mrbcコマンドでmrubyスクリプトをコンパイルしてイメージを作ります。

```
% ./mkmrb.sh samples/hello.mrb
```

hello.imgをFlashに焼きます。

```
% ./flash.sh sample/hello.img
Sent 412 bytes in 0.0 seconds
```

モジュールのシリアル出力には以下のように表示されます。

```
<RealTek>
Root filesystem upgrade.
checksum Ok !
burn Addr =0x100000! srcAddr=0x80500010 len =0x18c 
.
Flash Write Successed!
<RealTek>
```
これで電源を入れ直すとmrubyのスクリプトが実行されます。

```
Booting...
========== SPI =============
 
---RealTek(RTL8196C)at 2018.01.31-09:53+0900 version v1.1f [16bit](390MHz)
no sys signature at 00010000!
no sys signature at 00020000!
Jump to image start=0x80010000...
CPU 390MHz
Hello Bear Metal mruby on RTL8196C..............................................
.................................................
```

VMのクロスビルド環境を必要とせず、mrubyのコンパイルだけで試せるので、結構お手軽だと思います。

蟹さんのブートはGPIOの5ビット目のスイッチを押しながら起動するとブートで止まるターゲットもあるようです。これだと分解せず焼き直せるので便利かもしれません。蟹さんのリファレンスデザインがGPIOの5ビット目をリセットSWとしているようで、リセットSWを押しながら電源を入れるとブートで止まる機種多そうです。

スクリプトで使える固有の機能は[mruby-yabm](https://github.com/yamori813/mruby-yabm)に入っています。

これをベースに[mruby-simplehttp](https://github.com/yamori813/mruby-simplehttp)を改造して入れてあります。

スクリプトでfloatは使えません。またほとんどmrbgemsが入っていません。

Flashの本来linuxカーネルが配置されるところにmruby VMが焼かれて、rootfsのところにmrbを置くようにしてあります。mruby VMを焼き直さずmrbを焼き直すだけで別のmrubyアプリケーションをを実行する事が可能です。

![rtlbm-flash.png](https://qiita-image-store.s3.amazonaws.com/0/104066/aa3a94f1-80ea-d260-8936-86e6460ba64c.png)

注：v2.2でmrbのオフセットを0x180000に変更しました。

mrubyはgitのサブモジュールにしてビルド設定はbuild/mruby/build_config.rbの下の方にあるrealtekになります。

アプリケーションの開発はhost用のmrubyがビルドできてmrbcが使える状態でtftpコマンドがあれば試せます。Mac OS Xでも問題なくできました。

4万回程度ThengSpeakにupdateを投げていると固まりました。スクリプトでraiseするとmrubyが終了して再起動するので、定期的にraiseするのが良いようです。

RTL8198なターゲットでブートのIPアドレスが192.168.0.1になっているモジュールがありました。またこのモジュールはDOWNLOADコマンドを実行しないとtftpを受け付けない仕様でした。

RTL8197Dなターゲットで192.168.2.1のものもありました。こちらは普通にブート止めてtftpでputできました。