この記事は DTV Advent Calendar 2016 6日目の記事です。
MirakurunにおけるPT2サポートは、現在開発中です。
プルリクエストがマージされて、リリースされ次第、使えるようになります。
2.0.0-beta.3
では、まだPT2サポートは不十分で、chardev版pt1_drvのバグを回避できません。
今後リリースされるMirakurunのPT2サポートを利用することでchardev版pt1_drvのバグを回避することが可能です。
以下が本文になります。
PT1/2をご利用の方へ大切なお知らせとお願い
chardev版pt1_drvには録画失敗に至る危険性があります。 当該バージョンを未対応のままご利用になりますと、チャンネルの切り替えができなくなり、録画失敗に至る恐れがあります。 なお、再起動しますと、チャンネルの切り替えは正常に行えるようになります。 ハードウェアが故障するということは、ないはずなのでご安心ください。
対象
代表的なのは下記の通りになります。
これ以外にも、バグのあるドライバは転がっているはずです。 詳しくは対策をご覧ください。
対策
driver/pt1_pci.cをご覧ください。 pt1_release関数がありますが、次のような感じになっているかと思います。
static int pt1_release(struct inode *inode, struct file *file)
{
PT1_CHANNEL *channel = file->private_data;
mutex_lock(&channel->ptr->lock);
SetStream(channel->ptr->regs, channel->channel, FALSE);
channel->valid = FALSE ;
printk(KERN_INFO "(%d:%d)Drop=%08d:%08d:%08d:%08d\n", imajor(inode), iminor(inode), channel->drop,
channel->overflow, channel->counetererr, channel->transerr);
channel->overflow = 0 ;
channel->counetererr = 0 ;
channel->transerr = 0 ;
channel->drop = 0 ;
// 停止している場合は起こす
if(channel->req_dma == TRUE){
channel->req_dma = FALSE ;
wake_up(&channel->ptr->dma_wait_q);
}
mutex_unlock(&channel->ptr->lock);
/* send tuner to sleep */
set_sleepmode(channel->ptr->regs, &channel->lock,
channel->address, channel->type, TYPE_SLEEP);
schedule_timeout_interruptible(msecs_to_jiffies(100));
return 0;
}
注目してほしいのは次のところです。
}
mutex_unlock(&channel->ptr->lock);
/* send tuner to sleep */
set_sleepmode(channel->ptr->regs, &channel->lock,
channel->address, channel->type, TYPE_SLEEP);
schedule_timeout_interruptible(msecs_to_jiffies(100));
return 0;
これを次のように書き換えます。 mutex_unlockをreturnの前に移動させます。
}
/* send tuner to sleep */
set_sleepmode(channel->ptr->regs, &channel->lock,
channel->address, channel->type, TYPE_SLEEP);
schedule_timeout_interruptible(msecs_to_jiffies(100));
mutex_unlock(&channel->ptr->lock);
return 0;
確認方法
次のコマンドを実行することで、今、インストールされているドライバにバグがあるかどうか確認できる_かもしれません_
curl -L https://gist.github.com/akimasa/a2fc1fc098dee1e27ab88fab3ff27d23/raw/a0eb1fa2611ea2c930c1a892c1d4e78570ab668b/pt2-driverbug-checker.c > pt2-driverbug-checker.c && gcc -o pt2-driverbug-checker -pthread pt2-driverbug-checker.c && ./pt2-driverbug-checker
2回目からはソースのダウンロードとコンパイルが必要ないので、複数回実行する場合は./pt2-driverbug-checker
だけで問題ないです。
確認後はrmmod pt1_drv; modprobe pt1_drv
でドライバを読み直してください。
あるいは、reboot
等で再起動してください。
さもないと、チャンネルの切り替えができなくなり録画失敗の原因になります。
バグがなければ大丈夫ですが、多くの環境にはバグがあると思われるので、実施することをおすすめします。
"Your driver is probably safe."という行が表示されたら、多分大丈夫です。
心配なら数回./pt2-driverbug-checker
を実行してみてください。
手元の環境では2回実行しないと、バグの存在が確認できなかったことが結構ありました。
"Your driver has bug."と表示された場合は、残念ながらバグがあります。
対策を実施することをおすすめします。
また、プログラム実行後は、先ほども言ったように、チャンネルの切り替えができなくなります。
rmmod pt1_drv; modprobe pt1_drv
でドライバを読み直してください。
あるいは、reboot
等で再起動してください。
"Maybe I am using wrong channel."と出て、"Starting test."が表示されずテストが始まらない場合は、チャンネルを適切に書き換える必要があるかもしれません。 42行目が次のような感じになっています。
.frequencyno = 76,
76を適当な数字に書き換えてください。 recpt1/pt1_dev.hが参考になるのではないかとおもます。 76は地上波放送の26チャンネルの事を意味します。放送の来ているチャンネルに書き換えて実行してみてください。