忘れる前にワンセグチューナーDUS-01の挙動についてメモしておく。半分は自分のため、あとの半分は「24時間ワンセグコミュニティ(?)」のため。Linuxやwindowsで使うときにどうぞ。
ハードウェア
- CPU: Silicon Laboratories C8051F342
- チューナー: sharp VA1A5JZ9902A (参考リンク:ascii24)
- アンテナ:ロッドアンテナ
- インターフェイス: USB1.1
USBデバイス情報
USBデバイスとしては、こんな感じ。ほかに何をかけばいいのかな。
- Vendor ID:0x1bc8 , Product ID:0x0001
- endpointは0,1,2,3の4本。
- EP1は制御用のバルク転送エンドポイント(読み書き可能)。
- EP3はMPEG2TS転送用のアイソクロナス転送エンドポイント(読み込み専用)
- EP2は使っているのを見たことないけど、ファームウェアアップデートなどに使うのじゃないかと推測
- 起動時にファームウェアロードなどは発生しない。電源を入れれば動く。
さらに詳しく知りたい人のためにNetBSDのusbgenの出力を載せておく。
CONFIGURATION descriptor index 0:
bLength=9 bDescriptorType=2 wTotalLength=46 bNumInterface=1
bConfigurationValue=1 iConfiguration=0 bmAttributes=80 bMaxPower=150 mA
INTERFACE descriptor index 0, alt index 0:
bLength=9 bDescriptorType=4 bInterfaceNumber=0 bAlternateSetting=0
bNumEndpoints=4 bInterfaceClass=0 bInterfaceSubClass=0
bInterfaceProtocol=0 iInterface=0
ENDPOINT descriptor index 0:
bLength=7 bDescriptorType=5 bEndpointAddress=1-out
bmAttributes=2 wMaxPacketSize=64 bInterval=5
ENDPOINT descriptor index 1:
bLength=7 bDescriptorType=5 bEndpointAddress=1-in
bmAttributes=2 wMaxPacketSize=64 bInterval=5
ENDPOINT descriptor index 2:
bLength=7 bDescriptorType=5 bEndpointAddress=2-out
bmAttributes=2 wMaxPacketSize=64 bInterval=5
ENDPOINT descriptor index 3:
bLength=7 bDescriptorType=5 bEndpointAddress=3-in
bmAttributes=1 wMaxPacketSize=188 bInterval=1
制御コマンド
制御コマンドはEP1をつかってやりとりする。今のところ分かっているコマンドはこれだけ。全部推測なので正しいかはわからないけど。
- ファームウェアバージョンチェック (0x9f) - 現在のファームウェアのバージョン(1.0.0)が返ってくる。
- チャネル設定 (0x10) - これに加えてKHz単位の周波数をくべるとチューナーが設定される。
- 入力検出(0x11) - 電波が受信できていたら0x1、受信できなければ0x0が返ってくる。
- ストリームモードチェック(0x12) - たぶんMPEG2TSストリームを出しているかしないかをチェック。
- ストリームスタート (0x20) - EP3へのMPEG2TS出力を開始する。
- ストリームストップ(0x21) - EP3へのMPEG2TS出力を停止する。
- シリアル番号チェック(0x43) - デバイス固有のシリアル番号を返す。
それぞれのコマンドは10byte長で、先頭にコマンドを、引数がないものは0x0で埋めて送る。
チャネルを変えるときのシーケンスは
- ストリームが出ていたら止める
- 止まったかモードをチェックする
- チャネル変更リクエストを出す
- ちょっと待つ
- 入力検出リクエストを出す
- 返り値をチェックして0x0だったら「ちょっと待つまで戻る」。0x1が出るまでがんばる。(もしくはタイムアウトする)
- ストリームを出力する
(2008/2/19修正:チャネル設定コマンドの例の先頭バイトをtypoしていたので修正)
出力ストリーム
EP3からはMPEG2TSもどきが出力される。先頭はMPEG2TSで規定された同期ビット列(0x47)でかつ、パケット長が188Byteというのは良いのだが、MPEG2TSとして解釈すると全部エラーになる、という変な状態。きっと、プログラムミスでこうなってしまっているのだろうとおもう。あまりにも不憫なので正しいストリームに治してあげよう。
「先頭の0x47を除いて、他のバイト列に対して0xb5を排他的論理和を取る。」
すると、普通のMPEG2TSになる。
まとめ
USB的には、「USBデバイスとしてのJ200への不満」、はほぼ解決されているようなデバイスだった。最初はストリームが見えるか少しどきどきしたが、まあすぐにわかってよかった。
まだ入手性もよいみたいだし、ここにある情報を使えば他にも対応ソフトを作れそうな人がいると思うので、いけているデバイスじゃないかと思う。明日もう少し補充を(自分用に)買っておこう。。