2019/01/23追記: v1.1リリースしました。
BCM/mips mrubyのクロスビルドしたVMバイナリーを用意したので、使い方を書きます。mrubyは2.0.0ベースです。もちろん完全非保証です。
私はFreeBSDで実行していますが、LinuxやMac OS Xでもできると思います。
ターゲットはBCM4712とBCM535xです。
まずgithubのソースツリーをリカーシブルでcloneします。
$ git clone --recursive https://github.com/yamori813/bcmbm-mruby.git
mrubyとtoolsの下でmakeしてコマンドを用意します。mrubyはhostのコマンドだけで問題ありません。
最新のリリースタグにあるmain.bin.gzのバイナリファイルをダウンロードして同じディレクトリにコピーします。解凍の必要はありません。
flashに書き込み用のイメージをビルドします。
% make image
samples/hello.rbがコンパイルされて入ります。自分で作ったスクリプトを入れたい場合は以下のようにします。
% make image RBSCRIPT=myscript.rb
main.trxというファイルが出来上がるので、これをtftpでアクセスできるディレクトリにコピーします。
ブートローダのCFEのイメージ形式のtrxはこんな感じになってます。
Headerには一つ目のkernel.gzのサイズなどが入っています。二つ目のrootfs以降はただ追加されているだけです。Linuxの場合、64Kのブロックのバウンファリーにrootfsを開始位置を合わせるのですが、mrbはメモリにコピーしてから実行するので、VMのすぐ後にあります。
ターゲットにシリアルを接続して115200ボーでターミナルソフトを起動します。
ターゲットの電源を入れるとログが出るので^CでCFEを止めます。
IPアドレスはターゲットのデフォルトのIPアドレスのネットワークをホスト側にaliasで設定するか、ターゲットをホストのネットワークに設定します。
ターゲットのIPアドレスを設定する場合は以下のようにします。
CFE> ifconfig eth0 -addr=10.0.1.123
tftpでホストからmain.trxを取得してFlashに書き込みます。元々のルーターの機能は無くなりますので注意してください。
CFE> flash -noheader 10.0.1.37:main.trx flash1.trx
host側からputする場合は
CFE> flash -noheader : flash1.trx
として
echo "bin
put main.trx
quit
" | tftp 10.0.1.123
します。
これで電源を入れ直すとmrubyのスクリプトが実行されます。
Starting program at 0x80001000
bcmbm-mruby 2a3c2cd(master) Fri Dec 14 15:15:50 JST 2018
mruby ec812c64(master)
BOOT_CONSOLE : uart0
Clock : 200000000
Hello Bear Metal mruby on YABM..........
電源投入後5秒くらいで処理に入れるのもBear Metalのメリットと思います。DHCPとかNTPするとちょっと遅くなりますが。
蟹さんと同じようにVMとmrbを完全に分離して焼く事も出来るのですが、設定の手間がかかるので、一般的なCFEのファームウエアの構成にしました。
ほとんどmrbgemが入ってないので、追加したい時はvmのクロスビルドが必要です。
このmruby VMではfloatは使えません。
Mac OS Xでの場合
USB Ethernetモジュールを使って焼いてみました。(このときクライアントでアップできることを知らなかったので、tftpのサーバを上げる方法になります。ターゲットをtftpのサーバモードにしてputする方が簡単です。)
Ethernetインターフェースに適当なアドレスを設定します。
tftpdを起動します。
$ sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
imageを作りtftpのディレクトリにコピーします。
$ make image
$ sudo cp main.trx /private/tftpboot/
後はターゲットで読み込んで焼きます。
CFE> flash -noheader 10.10.10.3:main.trx flash1.trx
Reading 10.10.10.3:main.trx: Done. 294912 bytes read
Programming...done. 294912 bytes written
*** command status = 0
tftpdはリブート後も起動しますので、使わなくなったら止めた方がよいでしょう。
sudo launchctl unload -w /System/Library/LaunchDaemons/tftp.plist
雪豹で試しましたが、他でもいけるのではないかと思います。