ttの日記: PC-SDVD/U2G を解析してみるなど
軽くググルと、同じようなカテゴリの商品でも、 プリンストンの PCA-DAV2 だと em28xx ドライバで普通にLinuxでも使えるが、SDVD/U2G は今のところうまくいかない、とのこと。
ためしにDebian Squeezeの入ったマシンにさして見るが、そのとおりであった。一応オーディオ入力だけは汎用USB Audio扱いになって使えるようになったが…
はい終了、では面白くないのでー、まずは部品をチェックしてみる。 ねじは一つも使わず、単純に挟んであるだけなんで、わりと簡単に分解できる。 が、自分で分解するまでもなく、ぐぐると出てくる分解してみたページに書いてあったりする。
- USB IF部分? STK1150
- Video Decoder TW9910
- Audio ADC CS5340
という組み合わせ。なおこのページにもあるとおり、回路構成の関係で品質に問題があるロットがある模様だけど、私のやつをWindowsで使う限り特に問題ないようだ。まあ、最悪他のAudioIF使えばいいので気にしないことにする。
このうち、ADCはまあ普通のチップだし、Linuxで既に使えているので問題ない。
TW9910はごく普通のビデオデコーダチップで、PCIスロット接続タイプのものならLinuxにドライバもあるようだ。チップの機能としては3D Y/C分離とか無いけど、USB BusPowerの枠内で動かすためにはこのぐらいが限界か。まあSvideo入力使うなら問題ない。 ちなみにTechWell社、どっかで聞いた社名だと思ったら日経エレに連載中の、日本人創立者がシリコンバレーでIPOした最初の会社であった。とりあえず尊敬しますな。
で、このなかでメインチップと思われているSTK1150が問題。 当然ながらこいつのドライバが無いから認識されてないわけで。
STK1150 でググルと、EasyCap といわれる USB ビデオキャプチャ製品が存在していて、 こいつはSTK1160+SA7113の組み合わせらしい。 そしてこいつにはリバースエンジニアリングによるドライバ stk11xx が存在している。 あとLinuxカーネルにはSA7113もPCI接続タイプ用の独立したドライバが存在している。
型番的にはSTK1150とSTK1160は同じようなものに見えるが、さて…うまくいけば EasyCapドライバのSA7113用に書かれた部分をTW9910用に入れ替えるだけで動くかもしれないのだけど…
チップベンダのページを見ると両者の違いは一箇所だけで、 1160には"Built-in ADC for mono microphone audio" がある、 ってところだけのように見える。EasyCapにはADCチップなしのパチモンがあって、 非常に音がしょぼい、という情報があるが、多分そいつはこの機能を使っている のだろう(まあ今回はADCがあるので余り関係ない)。
しかし問題はこーゆー表に表れる機能一覧ではなく、制御コマンドとかが変わっている可能性があるということである。 この手のチップは中にマイコンが入っててそいつのソフト部分がコマンド対応をする、てなのが多いが、 そのマイコンのファームは細かく変更が入ったり、下手すると同じチップだけど納入先ごとに違ったりするので…
STKのサイトを見てもデータシートとかはなさそうなんでここはもう全く分からない。 PC CAM以外のProductのページにはドライバとかデータシートがおいてあるのに。 っていうかPC CAMチップの概要として"Linux kernel 2.6.26 and later release"に対応とか書いてるけどどーゆーことやねん。ソース未公開のドライバがあるって事なんかな…
気を取り直して。 STK1160+SA7113, SA7113, TW9910 の各ドライバソースを見ている限り、これらのデコーダは I2CというかSMBUSで制御するようである。まあふつーそうするよね。 STK1150/1160 に備え付けの "serial interface" というのは SMBUS のことなのだろう。 なので常識的に考えて SDVD/U2G も STK1150 と TW9910 は SMBUS で接続されていると予想される。
ということでSMBUS経由でTW9910を制御する(映像調整系)コマンドについては何とかなりそうである。が、STK1150 そのものの制御は全く不明である。
とりあえず強引だが stk11xx ドライバをいじって SDVD/U2G を EasyCap と同じ扱いにしてみる。コードのUSB のベンダーIDとかを書き換えるだけ。結果は…
[93401.782896] stk11xx: Check device return error (0x0201 = 0C) !
ってな感じで、初期化パケットの段階で応答がNGとかいわれた。残念。まああたりまえか。
もう少し真面目にUSBパケットを覗いてみる。 お仕事ならハードウェアの箱を使うんだが、個人ではそうも行かない。 ということで完全ソフトのソリューションを探す。 ぐぐると色々あるようだが、最初に見つかったとあるシェアウェアは評価版が2週間無料ということで、 とりあえずインストール。結果、ダンプは出来たが、ダンプした結果を見ていると数秒で 「ソフトの反応がなくなりました」というダイアログが出て強制プロセス終了させるほか無くなってしまう。うぐぅ。
ということでフリーソフトのUSB snoopy proを使ってパケットをみる。 しばらくメンテナンスされてないので動かないかも、と思ったが、少なくとも 32bit の Windows7 では動かせた(キャプチャ時には管理者権限で実行が必要なぐらい)。
これでゲットしたパケットと、stk11xxドライバのコードを並べて眺める。 目grepならぬ目diff。 ところどころ同じようなシーケンスは存在しているが、結構違うようだ。
これは結構大変そうだが、まあ、根気さえあれば何とかなりそうではある。 時間があったらがんばるとしよう。いやないけど。
あと俺向けメモ。USB Snoopy Proの使い方
- F2 (View → USB Devices)
- 出てきた窓でFile → Unpack Drivers
- 同じくFile → Install Service
- 窓を閉じてデバイス一覧から解析したいデバイスを右クリック → Install Restar
取れたダンプファイルは http://www.stillhq.com/usblogdump/ で解析できる、らしい。
PC-SDVD/U2G を解析してみるなど More ログイン