ivtv driver (hack版)で新しいカードを 使えるようにするための簡易マニュアル (2003/10 T.Adachi 記.未完成版) ■本ドキュメントの対象 本ドキュメントは,WIN TV-PVR-250/350 専用に開発された,本家 (http://ivtv.sourceforge.net)の ivtv ドライバに対し,玄人志向 ITVC16-STVLP (YUAN MPG600 の OEM)を利用可能にするパッチが当て られたドライバを対象とします.なお,本パッチは本家のドライバ に統合される予定ですが,最新版のステータスは,KOMORIYA Takeru さんのページ(http://www.paken.org/linux/itvc16/)をチェックして ください. ■本ドライバを使用するためにカードが満たすべき仕様と説明 (※仕様を満たしていても,必ず動く保証はありません) 基本的に現在のバージョンのドライバが対応可能なカードは,以下の チップが使用されている必要があります. TV tuner : tuner.c でコントロールできるもの Video decorder : SAA7115 MPEG encorder : CX23415 または CX23416 1) tuner チューナーは,アンテナ端子が接続されているユニットで,金属製 の箱に納められて基盤に取り付けられているはずです.tuner.c での 対応状況の詳細は,tuner.c のドキュメントを読んで下さい.日本 国内および NTSC 規格の放送地域は,Philips 製の NTSC チューナー である,FI1236 または FM1236 の互換製品が搭載されていることが 多いようです.チューナーに "Philips" と刻印されていれば Philips 製チューナーであり,型番は貼り付けられているシールに記載が あるでしょう. 2) Video decorder 次に Video decorder ですが,これはアナログで入力されたビデオ 入力(コンボジット入力/S入力)信号や,チューナーから入力された TV放送の映像をデジタル化(A/D 変換:アナログ/デジタル変換)する チップです.A/D変換を行う際に,何らかのフィルタを使用し, ノイズ除去が可能なものもあります.また,実際には SAA7115 で その他の処理も行っていますが,詳細は省略します. 本ドライバでは,Philips 製 SAA7115 の利用が前提となっています. カードの基盤上(表または裏)を眺めると,いくつかの非常に高密度に 四方に足を出した大きな黒いチップが見付かると思います(LQFP100). このチップ上に SAA7115 のような型番がシルク印刷されていれば, それがこのチップです.(SAA7114 の互換製品のようです) 3) MPEG encorder MPEG encorder はキャプチャカードのキモです.Video decorder が出力したデジタル化された映像信号と,sound processor (後述) が出力したデジタル化された音声信号を使用して,ハードウエア でリアルタイムにMPEG1/2形式に圧縮して出力します.このような 処理はソフトウエアで行った場合は CPU に多大な負荷がかかりま すが,ハードウエアエンコーダを使用した場合は,CPU に殆ど 負荷をかけずに高画質キャプチャが可能になります. PC用キャプチャカードに使用されるメジャーなハードウエアMPEG2 エンコードチップには,富士通製 MB86393,NEC製 μPD61051, 松下製 MN85560 や MN85572 等様々なものがありますが,本ドラ イバで対応しているのは,conexant 製の CX23415 または CX23416 のみです.Linux で動作が確認されているのは,私の知る限りでは CX23415, CX23416 のみであり,メーカーの壁(※)に依るものが大 きいでしょう. ※一般にメーカーが技術資料を非公開にしており,NDA契約(俗に言 う秘密保持契約)を結ばないとデータシートを開示してもらえな い場合が多い.また,日本国内メーカーの場合は特に,資料請求 をしたとしても,個人相手にはマトモに対応してくれない場合も 多いでしょう. もし,手元のカードが CX23415 または CX23416 を使用している ことが分かっている場合,基盤上にの 23mm角の PBGA233pin (四方 に端子の足が出ません) のチップを探せばすぐに見付かります.こ こで型番まで確認できれば良いのですが,CX23415 は MPEGデコーダ も内蔵しており,高消費電力かつ高発熱のチップです.CX23416 は ヒートシンクも付けずに実装されていることが多いため,シルク 印刷を読むことが可能でしょう.一方,CX23415 は大抵,冷却ファン が乗っているために型番の確認が困難です.逆に言うと,チップが むき出しになっていなければ,大抵の場合 CX23415 でしょう. 4) sound processor sound processor は,アナログで入力された音声信号を A/D 変換 し,I2S という規格の通信方式で CX23415/CX23416 に送るために 使用されます.conexant社のリファレンスカード(「このチップを 使用した製品を作成する際には,こんな感じで作りなさい」と いったリファレンスになるカード)では,Micronas社のMSP34XX シリーズが使われているらしいこともあり,大抵のカードにはこれ が使用されています. MSP34XXは,複数入力(ライン入力,チューナー入力 etc)に対応し ており,どれを CX2341X に出力するかを切り替えたり,音量調整 なども行えるようになっています.また,場合によっては音声多重 放送に対する処理を行い,「副音声を選択」のような処理も可能 です.基盤上に,割と小さな MSP34?? といった型番がシルク印刷 されているICが乗っていたら,それがこのチップです.ちなみに 本家のドライバでサポートされている Win TV PVR-250 等では, MSP3435 が使用されているようです. しかし,このチップは,このような用途に使用するには少々オーバー スペックな仕様になっているため,(おそらくコスト的な問題で)汎用 のICを使用して音声入力を切り替えたり,A/D 変換および I2S への 変換を行う場合があります.回路を解析した結果,玄人志向 の ITVC16-STVLPおよびITVC15-STVLP は正にこのような設計になって います. 入力の切り替えには 74HC4052D,A/D変換には 5331A を使用してお り,前者は4入力1出力(各2系統.2chであるステレオ信号をバチョン と切り替える)のアナログマルチプレクサ(切替機)であり,外部 ライン入力,基盤上にパターンはあるけどコネクタが実装されてい ない2入力,そしてチューナーからの入力(実際には音声多重放送を 処理するためのデモジュレータを経由)を切り替える役割を果たします. tuner, Video decorder, MPEG encorder, MSP34XX は I2C と呼ばれ る規格のシリアル通信インターフェイスを持ち,容易にコントロール が可能ですが,例えば 74HC4052D は,2本の端子に切り替え信号を 入力しなければいけません.つまり,これらICに信号を出力するため の,少々インテリジェントで本体側と通信を行える(コントロール可 能な)機構が必要となります.折角ケチッて(失礼!)汎用ICを使用した のに,それ専用のコントローラを乗せたのでは,コストアップに なってしまいます. CX23415/CX23416 はうまいこと作られていて,このような用途に 利用可能な,汎用の入出力ポート(GPIO)を16本(pin)持っています. そしてこれらに何を入出力するかは,本体側から容易にコントロール 可能です.実際,ITVC16ーSTVLP は GPIO を使用し,周辺ICをコント ロールするようになっています. つまり,音声入力を切り替える場合には,MSP34XXをコントロール するか,GPIO を操作することにより,周辺ICをコントロールする 必要があります. ここで一つ注意が必要なのですが,MSP34XX では,「1番目のポート の信号を出力せよ」のようなコマンドがきちんと定められているた め,入力を切り替えるのは容易です.しかし,GPIO は文字通り 汎用の入出力ポートですので,その先がどのような回路構成になって いるか全く分かりません.パターンを追ったり,総当たり戦であれこ れ試さないと,どの端子を操作すれば入力が切り替わるか分からない でしょう. ■新しいカードをドライバに認識させる 1) subsystem IDを確認する まず,普通にドライバをインストールし,ivtv ドライバ本体を 以下のように読み込ませて下さい.なお,ドライバのインストール 方法や,ファームウエアの準備の仕方は doc 以下のファイルを参照 してください. insmod ivtv debug=3 マシンがハングアップせずに,うまくドライバが読み込まれましたか? なお,上記のようにinsmod を実行すると,約1秒ほど待ち時間が発生 しますが,これは正常です. 次に,dmesg コマンドでメッセージを確認して下さい.ドライバで カードが認識できなかった場合には,自動的に Win TV PVR-250rev1 として動作するようになっていますが,その際に,以下のような メッセージが吐かれます. ivtv: subsystem_id is ivtv: Found an unknown chip, treating it like an iTVC15 ここの『』の部分には,16進数の数値が出力されている はずです.以下の作業に必要になりますので,これを何かに書き留め ておいてください. 2) 新しいカードの設定用スケルトンの準備 以下,使用しようとしているカードが CX23415 か CX23416 のいずれ を使用しているか,MSP34XX が搭載されているか GPIO を使用して音声 入力をコントロールしているかによって設定が変わって来ますので, まずはこれらの情報を正確に把握してから作業を行って下さい. まず,ivtv.h にエントリーを作成します.例えば今回新規に認識さ せるカードを IVTV_MYCARD とする場合,以下の行を追加して下さい. 2.1) カードのIDを登録 ivtv.h の #define IVTV_MPG160 4 /* Kurouto .... ... */ の下に,以下の行を追加 #define IVTV_MYCARD 5 なお,IVTV_MPG160 以降に別のカードの設定が追加されている場合 は,上記の"5"の部分を連番で+1した数にしておいてください. 2.2) カードストリーム情報を登録 ivtv.h の #define IVTV_MPG160_STREAMS 3 の下に,以下の行を追加 #define IVTV_MYCARD_STREAMS 3 なお,IVTV_MPG160_STREAMS 以降に別のカードの設定が追加されて いる場合は,その続きに追加して下さい.番号は"3"のままにして おいてください. 2.3) cardの機能フラグのスケルトンを追加 ivtv-driver.c の ivtv_card_flags を設定している部分の {IVTV_MPG160, 1, USE_GPIO, NOT_HANDLE_VOL} }; 行を以下のように変更し,MYCARDの設定を追加して下さい. {IVTV_MPG160, 1, USE_GPIO, NOT_HANDLE_VOL}, {IVTV_MYCARD, , , } }; 上記行の ,, は以下のように設定します. CX23415 使用: を 1 に設定 CX23416 使用: を 0 に設定 MSP34xx 使用: を USE_MSP34XX にし, を HANDLE_VOL に設定 GPIOを使用: を USE_GPIO にし, を NOT_HANDLE_VOL に設定 2.4) GPIO データのスケルトンを追加 ivtv-driver.c の ivtv_gpio_data を設定している部分の {IVTV_MPG160, 1, 0x7080, 0x400c, /* Normal/main ch./Stereo */ 0xcfff, 0x0000, 0x2000, 0xfffe, 0x0001, 0x0000, 0xfff1, 0x0006, 0x0004, 0x0004, 0x0000, 0x0008, 0xf6ff, 0x0100, 0x0900, 0x0100} }; を以下のように変更し,MYCARDの設定を追加して下さい. {IVTV_MPG160, 1, 0x7080, 0x400c, /* Normal/main ch./Stereo */ 0xcfff, 0x0000, 0x2000, 0xfffe, 0x0001, 0x0000, 0xfff1, 0x0006, 0x0004, 0x0004, 0x0000, 0x0008, 0xf6ff, 0x0100, 0x0900, 0x0100}, {IVTV_MYCARD, , , , , , , , , , , , ,

, , , , , , } }; はカードの仕様により,以下のように設定します. MSP34xx 使用: を全て 0 に設定 GPIO を使用: 『GPIOの設定について』のセクションを読んで下さい. 2.5) I2C アドレスの設定 ivtv-driver.c の ivtv_i2c_addresses を設定している部分の {IVTV_MPG160, IVTV_MPG160_TUNER_I2C_ADDR, IVTV_SAA7115_I2C_ADDR,0} }; を以下のように変更し,MYCARDの設定を追加して下さい. {IVTV_MPG160, IVTV_MPG160_TUNER_I2C_ADDR, IVTV_SAA7115_I2C_ADDR,0}, {IVTV_MYCARD, , IVTV_SAA7115_I2C_ADDR, } }; は,チューナーのI2Cアドレスを指定します.IVTV_TUNER_I2C_ADDR または IVTV_MPG600_TUNER_I2C_ADDR を指定してみて下さい.実際に 動作させた際に,エラーが出た場合はもう一方のに設定を変更します. は,MSP34XX を使用している場合にはそのI2Cアドレスを指定します. IVTV_MSP3400_I2C_ADDR を指定してみて下さい.MSP34XXが搭載されて おらず,GPIO で制御している場合は,0 にしてください. 2.6) MSP34XX のマッピングの設定 ivtv-driver.c の ivtv_msp34xx_audio_map を設定している部分の {IVTV_MPG160, 0, 0} }; と,なっている部分を {IVTV_MPG160, 0, 0}, {IVTV_MYCARD, , } }; としてください. MSP34XX が搭載されていない場合は,, はどちらも 0 を指定します. 搭載されている場合は,とりあえずに3,に1を指定して下さい. 2.7) カード情報の設定 ivtv-driver.c の ivtv_card_params を設定している部分の {IVTV_MYCARD, IVTV_PCI_ID_MPG160, (V4L2_CAP_VIDEO_CAPTURE|V4L2_CAP_TUNER| V4L2_CAP_AUDIO|V4L2_CAP_READWRITE), IVTV_250_V1_STREAMS, "MyCARD", "iTVC15"}, {-1,0,0,0,NULL} }; となっている部分を, {IVTV_MPG160, IVTV_PCI_ID_MPG160, (V4L2_CAP_VIDEO_CAPTURE|V4L2_CAP_TUNER| V4L2_CAP_AUDIO|V4L2_CAP_READWRITE), IVTV_MPG160_STREAMS, "YUAN MPG160/Kuroutoshikou ITVC15-STVLP", "iTVC15"}, {IVTV_MYCARD, , , IVTV_MYCARD_STREAMS, ,

}, {-1,0,0,0,NULL} }; としてください. には,先に控えておいたsubsystemIDの値を設定してください. その際には,0xを付け加えて書くようにしてください.例えば,先の dmesgの出力が "abcd" であった場合,0xabcd のように書いて下さい. は,使用中のカードがTV出力を持つか否かで設定を変える必要が あります.TV出力がある場合は (V4L2_CAP_VIDEO_CAPTURE|V4L2_CAP_TUNER| V4L2_CAP_AUDIO|V4L2_CAP_READWRITE| V4L2_CAP_VIDEO_OUTPUT) TV出力が無い場合は (V4L2_CAP_VIDEO_CAPTURE|V4L2_CAP_TUNER| V4L2_CAP_AUDIO|V4L2_CAP_READWRITE) と,設定して下さい. には,カードの型番を設定してください.単に『MYCARD』と出力 するだけで良い場合は,"MYCARD" としておいてください. 最後に
は,使用チップを設定します.表示上の問題だけなので すが,現在は便宜上 CX23415 の場合は "iTVC15",CX23416 の場合は "iTVC16" と設定するようになっています. これらを設定し,ドライバを再インストールし,ivtv.o を再読み込み させれば,基本的な機能は動作すると思います. ■動作しない場合のチューニング方法 以下,うまく動作しない場合の設定ファイルの修正方法について説明 します.なお,カードによって設定は様々だと思われますので,あく までも代表的な方法についてのみ説明します. ◯/dev/video0 から,動画すら出力されない いくつかの原因が考えられますが,大きく分けると以下に分類されます. 1.tuner の設定が異なる 2.ファームウエアの問題 3. SAA7115 または CX23415/CX23416 が搭載されていないカードで 使用しようとしている 3の場合はあきらめてください :-P 順に説明しますと,1の場合は, tuner.o を読み込む際に,チューナーの 型を設定していない可能性およびtunerのI2Cアドレスが異なる可能性が あります.前者の場合,insmod tuner type=2 (FI1236を利用している場合) のように読み込ませてください.後者の可能性が疑われる場合,dmesg で 出力されるメッセージを確認して下さい. ivtv: i2c client addr: 97 not found! または, ivtv: i2c client addr: 96 not found! のようなメッセージが出ている場合は,チューナーのI2Cアドレスの設定に 誤りがあります.前節の2.5)を参照し,"97 not found!" と,なっている 場合は をIVTV_MPG160_TUNER_I2C_ADDR (または 0x60) に.後者の エラーの場合はIVTV_TUNER_I2C_ADDR (または 0x61)にしてみてください. 同様に,"not found!" の前の値が 64 の場合は MSP34XX,33 の場合は SAA7115のI2Cアドレスが誤っています. 一般にこれら2種類のアドレスのいずれかを使用しているようですが,異な るようであれば,手打ちで色々と試してみる必要があります. ファームウエアの問題....YUANとPVRのファームによる問題... (未了.できたらよろしく〜) ◯映像は出るが,音が記録されていない 非常にありがちな現象です.音声関係のコントロールをMSP34XXで行って いるか,GPIOで行っているかによって対処方法が異なります. まず,いずれの制御方法を使用しているかを確認し,確実に設定ファイル に反映するようにしてください. MSP34XXを使用している場合: dmesg の出力で i2c client addr: 64 not found! と,出ている場合は, MSP34XX の I2C アドレスが異なります.前節の2.5)を参照し,正しい アドレスを設定して下さい.また,msp3400.cのソースも一部変更する 必要があります. MSP34XXが認識されているにも関わらず音が記録されていない場合, マッピングの設定が誤っている可能性があります.前節の2.6)を参照 してください.例えば IVTV_250V1 の設定では,3,1 となっています が,これはチューナーからの入力が3,外部入力が1を意味しています. コード上はこの値は 1〜8 までを選択可能ですが,チューナー入力 を選択しているつもりで別の音声入力が入力されているラインを選択 していると,このような症状になります.一つはこの値を絨毯爆撃で 試行錯誤するか,utils ディレクトリ直下の test_ioctl を使用し, MSP_SET_MATRIX を直接操作して確認してみて下さい. GPIOを使用している場合: この場合は設定が少々厄介です.前節の 2.4)を参照し,まずは IVTV_MPG600,IVTV_MPG160 の設定を試してみて下さい.それでも動作 しない場合は,『GPIOの設定について』のセクションを参照してくだ さい. ◯録音された音声が副音声,またはステレオ放送なのにモノラルになっている MSP34XXを使用している場合,音声多重に関する実装はなされていません. 別のカードにおいても様々な試行がされているようですが,動作したという 話はまだ聞きません.チャレンジャー募集中. GPIOを使用してモジュレータを操作している場合は,GPIOのパラメータを 操作することにより,ハンドリング可能です.また,この場合は,現在 放送中のものが音声多重放送であるかや,ステレオ放送であるか等も取得 可能な場合もあります.しかし,厳密に音声多重をハンドリングする場合 は,ソースコードをいじる必要があります(ITVC16-STVLP,ITVC15-STVLP 以外にもこのような仕様のカードが出て来た際には,汎用的なコードに置き 換わる可能性があります). GPIO の具体的な設定内容の調査方法に関しては,『GPIOの設定について』 セクションを参照して下さい. ■GPIOの設定について GPIOにどのような回路が接続されているかに関しては,全くリファレンス よ呼べるものがありません.また,CX23415/CX23416 の GPIO の仕様に関し ては未知の部分があるため,非常に難渋しています(最も信頼のおけるドキュ メントであるデータシートは,メーカーとNDAを締結しないと閲覧出来ない のです...). ・GPIOの仕様について CX23415/CX23416 は 16bitの GPIO が搭載されており,アドレスとして 9020h,9008h,900ch にマッピングされている32bitデータを読み書きする ことにより,指定可能です.これらアドレスはそれぞれ,入出力の設定, 入力,出力を示しており,それぞれ下位16bitがそれぞれのGPIOピンに 1対1の対応をします. GPIOを使用する際には,まず各ピンの入出力の方向を指定する必要があ りますが,現在公開されているドキュメントでは,入力の場合は0,出力 の場合は1といった具合に各ビットを立てたデータを入出力の設定レジ スタに書き込むべしとなっています.しかし,その後の調査で,どうも この記述には誤りがある可能性が示唆されています. 次にデータを入出力する場合は,それぞれ入力レジスタの値を読み込ん だり,出力レジスタへデータを書き込むことにより実現ができます. ・入出力の設定 http://www.paken.org/linux/itvc16/ から,PCIDEBUG.EXE を取得し, 上記Web Pageのドキュメントに従って Windows での利用時の 9020h アドレスのレジスタ値を確認して下さい. ・ステレオ/主音声視聴時の設定の確認 次に 各モード(音声多重時の主音声,副音声や,ステレオ放送時の ステレオ,モノラル)にWindows用ソフトを設定し,その都度 900Ch アドレスのレジスタ値を,確認してみてください. ※ここではステレオ放送時/主音声選択時のデータのみを使用します が,その他の情報もメインテナーに送って頂ければ,音声多重放送 に完全対応させることが可能です. ・GPIO初期化値の設定 2.4)を参照して設定して下さい.例えば9020h の値が3080で あり,ステレオ/主音声選択時に900Chの値が 0004 であった場合は, 以下のように設定します. {IVTV_MYCARD, 1, 0x3080, 0x0004, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0} これでとりあえず,普通にステレオ/主音声の音声を録音できると思い ます. ・GPIO を使用した音声多重への完全対応の仕方 ソースを読んでみてください :-) とりあえず,以下の部分を読むとその構造が分かると思います. ・ivtv.h で宣言されている ivtv_gpio_data_stと,ivtv-driver.c で宣言されている実際の値 ・ivtv-api.cのivtv_v4l2_ioctl関数内の VIDIOC_S_TUNER, VIDIOC_G_TUNERハンドリング部分 ・ivtv-driver.c の ivtv_set_mpg600_audiomode 関数