skink用デバイスコードの得方 SONYの赤外線リモコンコードは以下のようになっている。 最近の機器(1998以降?)は20bit構成になっていて、 13bitのdevice code + 7 bit の controle code の組み合わせになっている。 device code の構成は 5bit + 3bit + 5bit である。 device code の一覧は以下に詳しい。 http://www.hifi-remote.com/sony/Sony_devtheory.htm slink 3.1.7 で使用するためにはドライバを書き換える必要がありそうだ。 src/driver/slink.h に driverの Control-A1コードとControl-Sコードの対応が定義されている。 { 0x94, 0x94, 0, 0x00 }, /* CD-2 (alternate) */ { 0x95, 0x95, 0, 0x00 }, /* CD-3 (alternate) */ { 0xA0, 0x00, 13, 0x0B92 }, /* DVD-1 */ { 0xA1, 0x00, 13, 0x0B44 }, /* DVD-2 */ { 0xA2, 0x00, 13, 0x0B5F }, /* DVD-3 */ { 0xAA, 0x00, 13, 0x0B46 }, /* DVD-1 MegaChanger Commands */ { 0xB0, 0x00, 5, 0x16 }, /* Tuner */ { 0xC0, 0xC0, 5, 0x06 }, /* Amp */ 最初の16進数が ドライバへ与える引数(Contorole-A1コード),次が不明だが、3番目のフィールドの数字はbit構成だろう。4番目の16進数がコントロールS信号のデバイスコードだと思われる。 BS/地上デジタルチューナーの登場時期は明らかにDVDより後なので、13bi構成のDVD-1,DVD-2,DVD-3が参考になるだろう。 さて、ドライバの作りがわかったとして、問題は デバイスコードである。 これがわからなければチューナをコントロールすることができない。 ひたすら検索した結果、以下を発見した。 http://www.hifi-remote.com/sony/Sony_devtheory.htm ここのデバイスコードは 5.3.5 の binaryを各桁毎に10進数に変換した値。 slink.hの4番目のフィールド定義は5.3.5の各桁をLSB-MSB変換を行ったうえで結合し、16進数変換した値のようである。 試算してみる。Windowsの電卓を関数電卓モードで使用して10進-2進-16進の数値を得る。LSB-MSB変換は手作業で行った。 DVD1(a) 10進 26 1 9 2進 11010 001 01001 ↓ ↓ ↓ LSB-MSB変換 01011 100 10010 driver code(hex) 0B92 ビンゴである。 さて、今回のターゲット機器は DST-BX300とDST-TX1である。 DST-TX1とDST-BX300はリモコンに互換性がないので、デバイスコードは別であると思われる。 DST-BX300 が "TV early DTV tuner(26.2.3)" 、DST-TX1が"IDTV(23.5.1)"ではないかとあたりをつけてみた。 それぞれ TV early DTV tuner 10進 26 2 3 2進 11010 010 00011 ↓ ↓ ↓ LSB-MSB変換 01011 010 11000 driver code(hex) 0B58 IDTV 10進 23.5.1 2進 10111 101 00001 ↓ ↓ ↓ LSB-MSB変換 11101 101 10000 driver code(hex) 1DB0 それを踏まえて、slink.h を以下のように編集した(Controle-A1 コードは重複しないように適当につける)。 { 0xB3, 0x00, 13, 0x0B58 }, /* TV eary DTV tuner(26.2.3) */ { 0xB4, 0x00, 13, 0x1DB0 }, /* IDTV(23.5.1) */ しかし、残念ながら動かない。やはり国内製品のデバイスコードは異なっているようだ。(ここの記述は 考え方のメモとして残しておく。 ) コントロールS信号のフォーマットはソニーの赤外線リモコンフォーマットそのもののようなので、実機のリモコンの信号をキャプチャしてデバイスコードを得るしかなさそうだ。 リモコン信号のキャプチャにはサウンドポートにリモコン信号を流し込んでWAVE波形で解析する方法があるが、新たに回路を作り起こす必要があり、若干面倒。 http://naruken.cweb.tk/labo/ir_rimocon/index.html http://www.geocities.jp/kobosunta/RcMenu.html そこで、たまたまWindows Media Center(MCE)用のリモコン受信機があったので、 lircを使ってみることにした。ドライバを組み込んでみた。 atrpms から SRPMパッケージを取得 wget http://dl.atrpms.net/all/lirc-0.8.2-68.src.rpm wget http://dl.atrpms.net/all/lirc-devices.spec rpm -ivh lirc-0.8.2-68.src.rpm cp lirc-devices.sec ~/rpmbuild/SPEC/ rpmbuild -bb --target xmode2 で xwindow 上で波形が取得できることを確認したら、 mode2 を使って標準出力のテキスト出力を得る。 space 100000 pulse 2550 space 450 pulse 1350 space 450 pulse 700 space 500 pulse 1300 space 500 pulse 700 space 500 pulse 1300 space 500 pulse 650 space 550 pulse 650 space 500 pulse 700 space 500 pulse 1300 space 500 pulse 700 space 500 pulse 1300 space 500 pulse 1250 space 550 pulse 650 space 550 pulse 1250 space 550 pulse 650 space 500 pulse 700 space 500 pulse 700 space 500 pulse 700 space 500 pulse 1250 space 550 pulse 1250 space 13250 pulse 2450 space 550 pulse 1250 space 550 http://www.boehmel.de/sircs.htm を参考にすると、 先頭 2400msecのHigh(+5v)状態の後、600msecのLow(0v)状態がスタート区切り(デリミタ)であることがわかる。 赤外線リモコンのコードは mode2のデータを眺めてみると、先頭の pulse 2550,space 450 という値が目に付く。若干値がすれるが、足して3000 になることから、おそらくここが デリミタであろう。1200〜1300のpulseが「1」。500〜700のpulseが「0」。450〜500のpauseがbit区切りで、12000以上のspaceがストップ区切りであろう。 この間のpulseを数えると、20。ぴったり 7+13bit構成。ここだ。 http://www.boehmel.de/sircs.htm の図から、データの先頭7bitがリモコンのコントロールコードで残り13bitがデバイスコードになる。 space 100000 pulse 2550 スタートデリミタ space 450 pulse 1350 1 space 450 pulse 700 0 space 500 pulse 1300 1 space 500 pulse 700 0 space 500 pulse 1300 1 space 500 pulse 650 0 space 550 pulse 650 0 space 500 pulse 700 0 space 500 pulse 1300 1 space 500 pulse 700 0 space 500 pulse 1300 1 space 500 pulse 1250 1 space 550 pulse 650 0 space 550 pulse 1250 1 space 550 pulse 650 0 space 500 pulse 700 0 space 500 pulse 700 0 space 500 pulse 700 0 space 500 pulse 1250 1 space 550 pulse 1250 1 space 13250 ストップデリミタ ここから後半13bitを得ると、 01011 010 00011 … 0x0B43 が得られる。 これだ。これがDST-BX300ののデバイスコードだ。 これを踏まえて slink.h の記述を以下のように追記する。 { 0xF1, 0x00, 13, 0x0B43 }, /* DST-BX300(26.2.24) */ { 0xF2, 0x00, 13, 0x0BCE }, /* DST-TX1(26.3.14) */ これで slink_cmd を呼び出したとき、device code 0xF1で0x0B43がcontorole-S端子に出力されるようになる。