15 19 09 324円のHardOffの値札がある、IO Dataルーター(WN-AG450DGR)を久しぶりにいじってみました。SOCはRT3883とRT3052が入っていてAtherosのGIGAのSwitch(AR8327)も入ってます。おそらくWiFiの5GをRT3883で処理して、2GをRT3052で処理しているものと思われます。
このモジュールはOpenWRT方面に情報のあるSitecom WLR-6000と同じ所で作られたものだと思われます。Sitecomはオランダの会社でヨーロッパの多くの国で販売をおこなっています。WLR-6000もRT3883を使っていますが、RT3052ではなくPCI Chipを使っているようです。なんで気がつたかというとIT7652Mという部品を使っていて、"IT7652M OpenWRT"で検索して引っかかりました。基板の画像を見るとシルク印刷が類似していて、電源フィルターの部品番号の印刷が同じことからおそらく間違いないと思われます。
基板の写真を見るとWLR-6000はコスト削減した形跡が見れますが、WN-AG450DGRはかなり贅沢に部品を使っています。大きさもずいぶん違うように見えます。
基板にはRT3883とRT3052のシリアルが出ていて、とりあえずRT3883の方を見てみたら、u-bootからLinuxが起動していました。RT3052のほうはTFTP(192.168.99.7)でRT3883からファイルを拾ってそれを起動するようになっているようです。
RT3052はRAM 16MのFlash 2Mなので使い道がないので、RT3883の方をターゲットにします。たしか購入後に一度設定を作って焼いたときにはブートはできたももものネットワークが使えなかったので放置していたのではないかと思います。
とりあえずビルドしてtftpで焼いてみます。やはりネットワークが使えません。
ところがいろいろ試してみたところ焼いた後はネットワークが使えるのですが、リブートすると使えなくなる事がわかりました。これは良くあることで、イメージをtftpでロードするためにブートがifやswitchを初期化していて、それのおかげで使えたりします。
構成はこんな感じです。
switchをコントロールするためのMDIOはRT3883からつながっていますが、port0がRT3883でport6がRT3052です。
tcpdumpを入れて見ると焼いた後はRT3052の192.168.99.7のブロードキャストパケットがRT3883に届きます。このパケットは外のマシンにも届きます。しかし再起動すると届かなくなります。
このようなモジュールでネットワークが使えないのはホスト側のifかswitchの設定の問題になります。しかしRT3052のifの設定は変更していないのに、リブート後に使えなくなるのはswitchの方の問題と思われます。
AR8327はネットでデーターシートがダウンロードできます。いろいろ機能がありどこをみればよいのか途方にくれました。
EtherswitchのMIDOでswitchは認識できているので、MIBを見てみます。port0の受信バイト数は以下の方法で確認できます。
# etherswitchcfg reg 0x103c
port1が0x113cになりport6が0x163cです。switchの受信バイト数とはホストから見ると送信バイト数です。
焼いた後は数値が出てきますが、リブートするとport0とport6は0のままになり、switchが一切パケットを受け取ってないのが分かります。
arswich_8327.cにモリモリデバッグライトを入れて、レジスタの値を確認してみます。
ほとんど初期値ですが、0x04,0x0c,0x7c,0x94が焼いた後と再起動の後では変わっているのがわかりました。
同じにしたらport6は有効になりました。
これらの設定はarswitch_8327.cの中でもあったのですが、
val = getreg(0x04);
val = (val & 0x0f) | 0x01;
setreg(0x04, val);
のようなコードになっていて、初期値によって挙動が変わっていました。ドライバーコードで良くこのような事しますが、bootによって初期化される値を前提にしたりするのは危険で、getreg()すべきではない事も多いように思われます。
RT3883のほうはifにRGMIIの初期設定の必要がありました。ifのrtをRT2880対応したときにそんな項目があったことを思い出して修正してみました。RT3883の時の設定が抜けていたので、再起動後に使えなくなっていました。
とりあえずネットは使えるようになったのですが、USBの電源をIT7652Mで12Vから5Vを作ってGPIOでコントロールしているものと思われるのですが、GPIOの接続先がわかりません。USBのD+,D-はRT3883に接続ささているのでセルフパワーのデバイスは認識でます。
とりあえず今日一日調べてダメだったので、セルフパワーのHUBをかましてごまかしました。USB Audioは1.0の12Mなので1.0のHUBでOK牧場です。
Sitecom WLR-6000はGPIO 9ピンでコントロールしてるようなのですが、UARTFのpinctlをGPIOにしてもなぜか9,10,11のコントロールができません。なにかおまじないが必要なのかもしれません。(後日見つかりました)
ZRouter.orgでmpg123を追加して焼きます。
いつもはWWOZを聞いていますが、このちらのページにあった他の局を試してみました。
# kldload snd_uaudio
# /usr/local/bin/mpg123 http://wbgo.streamguys.net/wbgo128
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.29.2; written and copyright by Michael Hipp and others
free software (LGPL) without any warranty but with best wishes
Directory: http://wbgo.streamguys.net/
Terminal control enabled, press 'h' for listing of keys and functions.
Playing MPEG stream 1 of 1: wbgo128 ...
ICY-NAME: WBGO Jazz88
ICY-URL: http://wbgo.streamguys.net:80/wbgo128
MPEG 1.0 L III cbr128 48000 j-s
Warning: Encountered more data after announced end of track (frame 3/3). Frankenstein!
[src/libmpg123/layer3.c:INT123_do_layer3():1801] error: dequantization failed!
ICY-META: StreamTitle='';
本体+USBハブ+Aptivaスピーカーの消費電力を測ってみたら7WだったのでValueStar(i386)の5分の1くらいの消費電力です。
冷却用のファンもなく騒音を出さないので、オーディオ用音源としては理想です。
しかたなくセルフパワーのHUBを使いましたが、バスパワーで使うより音がよくなるという記事もあるようです。Audioは電源が重要で、本体の電源が不安定な場合は、セルフパワーで質の良い電源を供給できれば音が良くなるのは理にかなってるかもしれません。
我が家のエセスマートスピーカーで鳴らしていますが、結構音良いです。
別のUSB Audioモジュール(C-Media CM6206)でもご機嫌でした。
ugen1.3: <CMEDIA USB Sound Device> at usbus1
uaudio0 on uhub2
uaudio0: <CMEDIA USB Sound Device, class 0/0, rev 1.10/0.10, addr 3> on usbus1
uaudio0: Play[0]: 48000 Hz, 4 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Play[0]: 44100 Hz, 4 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record[0]: 48000 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: Record[0]: 44100 Hz, 2 ch, 16-bit S-LE PCM format, 2x8ms buffer.
uaudio0: No MIDI sequencer.
pcm0: <USB audio> on uaudio0
pcm0: Mixer "vol" -> "none": child=0x00000010
pcm0: Mixer "pcm": parent="vol"
pcm0: Mixer "line":
pcm0: Mixer "mic":
uaudio0: HID volume keys found.
RT3050な別のモジュールでも試してみたのですが、音が途切れてぜんぜん使い物になりませんでした。RT3050のUSBはOTGでRT3883とは違うので、ドライバーのできが悪いのかもしれません。sys/mips/mediatekのOTGサポートはOTGサポートの共通コードを利用しています。これは初期のラズパイなどでも利用されています。 MIPS 24Kとpcmフレームワークが愛称が悪いのかもしれません。pcmフレームワークはそれほど多くの処理はしていませんが、すべてCで書かれていて、ある程度のCPUパワーがないとダメな感じがします。
AR9341(74K)なモジュールで試したら、CM6206では音が出なくてTP6911ではちゃんと再生されました。謎です。
かなりの確立で問題があり、今回のケースはたまたまうまくいっただけなのかもしれません。
rtのMDIOのetherswitch対応は私が書きました。タイポありますが、CURRENTにはもうmipsはないので直しません。ZRouterのレポジトリで12-STABLEからforkしているので、そちらでは直そうと思います。
etherswitchは元々ZRouterといっしょに始められたプロジェクトのようなのですがZRouterのrayの実装とは袖を分けてしまい、HEADにはetherswitchが入りました。
etherswitchは良く出来たフレームワークだと思われますが、FreeBSD/mipsが消されたので、実質使える環境は無くなったと思われます。とってももったいないです。
WBGOはステーションコールでany deviceって言ってるけど、MIPSで聞いてるのは私だけかも。