Arch Linux で PT2 (DVB 版ドライバ earth-pt1 + fuse_b25)

以前 Arch Linux での PT2 環境のセットアップをまとめた.そこでは chardev 版のドライバを利用していた.
http://d.hatena.ne.jp/eagletmt/20110307/1299492620
が,BKL が削除されたことによって最近の Linux だとそのままではコンパイルできなくなっている.
(un)lock_kernel() を spin_(un)lock() に変えるという簡単な変更で対処できるらしいものの,これから先に不安が残る.


もうひとつのドライバである earth-pt1 のほうは既に Linux のメインラインに取り込まれており,取り込まれている間は少なくともコンパイルはできるよう保守されるはず.
earth-pt1 はずっと使ってみようとは思っていたんだけど,これまでの Linux だと自分の環境では earth-pt1 を正常にロードすることもできなかった.
そのへんの問題が今回の Linux 3.0 において改善されていると聞いて試してみた.
たぶんこれ http://git.kernel.org/?p=linux/kernel/git/stable/linux-3.0.y.git;a=commit;h=cae72c7c63fd4a8f20efc001108f12f34076c17b
その結果,たしかにちゃんと動作したのでそのログ.

Linux 3.0

Arch Linux では testing リポジトリLinux 3.0 が既にある.しばらくすれば順当に core にもくるでしょう.
Arch Linux では既にデフォルトのカーネルが 3.0 になっている.
今までの kernel26 というパッケージ名から linux という名前に変更されているので注意.

earth-pt1

最初に

% zgrep CONFIG_DVB_PT1 /proc/config.gz
CONFIG_DVB_PT1=m

で earth-pt1 がちゃんと含まれていることを確認し,

% ls /dev/dvb
adapter0  adapter1  adapter2  adapter3

で adapter が作られていることを確認する.0, 2 が BS 用で 1, 3 が地デジ用.
作られていない場合は dmesg あたりを見るといいかも.
adapter が作られていれば

% dmesg | grep DVB
[    4.951584] DVB: registering new adapter (earth-pt1)
[    4.951791] DVB: registering new adapter (earth-pt1)
[    4.952031] DVB: registering new adapter (earth-pt1)
[    4.952239] DVB: registering new adapter (earth-pt1)
[    5.219681] DVB: registering adapter 0 frontend 0 (VA1J5JF8007/VA1J5JF8011 ISDB-S)...
[    5.219767] DVB: registering adapter 1 frontend 0 (VA1J5JF8007/VA1J5JF8011 ISDB-T)...
[    5.219820] DVB: registering adapter 2 frontend 0 (VA1J5JF8007/VA1J5JF8011 ISDB-S)...
[    5.219847] DVB: registering adapter 3 frontend 0 (VA1J5JF8007/VA1J5JF8011 ISDB-T)...

こんなかんじのログになるはず.
ハードウェア的に認識されているかどうかは前回のエントリのように lspci で確認する.

s2scan

次に http://2sen.dip.jp/cgi-bin/dtvup/source/up0588.zip に含まれている s2scan をビルドして,受信可能なチャンネルの一覧を作る.

% unzip up0588.zip
% cd dvb_apps_0.92/cmds
% make clean
% make
% ./s2scan -a 1 > channels.txt

-a の後の数字はスキャンする adapter の番号.
しばらく待つと,channels.txt に

tvk1:DTV_DELIVERY_SYSTEM=8|DTV_FREQUENCY=503142857:24632
TOKYO MX1:DTV_DELIVERY_SYSTEM=8|DTV_FREQUENCY=515142857:23608
TOKYO MX2:DTV_DELIVERY_SYSTEM=8|DTV_FREQUENCY=515142857:23609
フジテレビ:DTV_DELIVERY_SYSTEM=8|DTV_FREQUENCY=521142857:1056
(snip)

こんなかんじの出力が得られているはず.

tune

そして http://2sen.dip.jp/cgi-bin/pt1up/source/up0219.gz の tune を修正してビルドする.
tune.c に

static struct channel isdbt_channels[] = {
        {   1, "NHK東京 総合",    557142857 },
        {   2, "NHK東京 教育",    551142857 },

みたいな一覧があるので,そこに channels.txt を基に

static struct channel isdbt_channels[] = {
        {   1, "NHK東京 総合",    557142857 },
        {   2, "NHK東京 教育",    551142857 },
        {   3, "tvk",             503142857 },

こんなかんじに設定して make する.チャンネル名は表示に使っているだけなので,自分がわかるように設定すればいい.


そうするとこの tune を使って

% ./tune 1 3 &
Successfully tuned to tvk .
% cat /dev/dvb/adapter1/dvr0 > tvk.ts

と録画できるようになる.録画を止めるには cat と tune を殺せばいい.
tune の1つ目の引数は adapter の番号で,2つ目の引数はさっき設定したチャンネルの番号.

fuse_b25

が,例によってスクランブルがかかっているのでこのままだと見ることはできない.
後から arib25 で解除する手もあるけど,ここでは fuse_b25 を利用する方法でいくことにした.
PKGBUILD を書いたのでビルド・インストール方法はそっちを参照.fuse と pcsclite をインストールしてから普通に configure + make するだけでいい.
https://github.com/eagletmt/PKGBUILDs/blob/master/fuse_b25/PKGBUILD
ただし,現時点で最新版の ccid 1.4 系ではなく 1.3 系を使うことに注意.
1.4 系を使うとおそらく FUSE_B25 から

Card I/O failed too many times.
dropped an ECM due to the failed/slow card.

というようなエラーログが syslog 経由で大量に吐かれてまともに動作しない.


fuse_b25 で既存の adapter に対して,デコードしたものを出力する新しい adapter を作ってそこから録画する,というような使い方をする.

# mkdir /dev/dvb/adapter9
# fuse_b25 --target /dev/dvb/adapter1 -o allow_other /dev/dvb/adapter9

と新しい adapter を作って,

% ./tune 9 3 &
Successfully tuned to tvk .
% cat /dev/dvb/adapter9/dvr0 > tvk.ts

と,さっきと同様に録画してみると,スクランブルが解除された状態で保存され,mplayer 等で見ることができる.
新しく作る adapter の番号は被らなければ何でもいいが,(元の番号) + 8 で作るのが慣例になっているっぽい.


ただまぁこの fuse_b25,無駄に CPU 負荷が高い気がする.
chardev 版ドライバを使った recpt1 はリアルタイムにデコードしても Core i3 で CPU 使用率数%程度だったのに対し,fuse_b25 は30%から50%くらい.

で,tune + cat で一応録画はできるものの,使い勝手はよくない.
例えば recpt1 のように,指定した時間だけ録画して終了したり,被っている時間帯に録画しようとしたときは空いているデバイスを勝手に探して使う,といったことをしてもらいたい.
こういう recpt1 のようなツールは既にあるんだろうか.俺は tune のコードをほぼコピペしつつ,今挙げた機能を入れた DVB 版の recpt1 っぽいツールを自分で書いて使ってみているところなんだけど.


DVB という標準的な仕組みに従っているため,MythTV でやるという方法もあるらしい.
http://www43.atwiki.jp/mythtv-dvb/
けれども recpt1 を使ったなんちゃって録画システムを既に作って使っていて,それほど不便さは感じていなかったので,MythTV という大きなツールを使うより recpt1 のような小さなツールだけあるといいなぁと思ってる.

参考

http://aqua-linux.blog.so-net.ne.jp/2010-12-26 を大いに参考にさせてもらった.