T230C2を使えるようにする話。media_buildを頑張って使用可能に

ここ数か月はT230C2に振り回されてばかりです。不安定だし動かない環境もあるしで色々苦しめられました。結果的には安定して(?)よいうかひとまずドロップはさておきチューナーを見失ったり意味不明に録画データが細切れにならないように頑張った話を残しておきます。

回りくどいかもしれませんが、私が何をして確認したのかなど細かめに残しておきます。解決策だけ知りたい人はいらない部分は読み飛ばしてください。

最初に書いておきますが、この記事はT230やT230AやT230Cではなく、T230C2(T230C v2):デバイスがc68aのものについてです。

ちなみに、以前の記事に追記はしていますが、最終的には上手くいくのがこの話で以前は何故か安定しないなぁ…環境のせいか?等と思いながら書いていた記事で内容的には微妙なのですが、結構長いこと掲載した状態だったので別記事を書くことにした次第です。以前の記事はこちら。

この記事のタイトル通りですがRaspberry Piで動かしたいという目的から始まっているため、Raspberry Piに関連した内容を本記事は含みますが、割と試行錯誤の上では必要な部分でもありました。こちらも不要な部分は読み飛ばしてもらえたらと思います。

目次

不調の症状

まず色々な環境で試したのでその道中に発生していた不調について記します。どのバージョンでどの症状だったかはそこで書きます。

まず、Raspberry Pi OSを使っていた時の話です。Kernelは5.4.0.71だったと思いますが、この状態が一番厄介です。なんせ一見dmesgなどを見ても一切問題なさそうに見えるからです。バージョンなどを細かく特定する術を知らないので不明ですが、症状的にはこのスレッドの修正が行われた後だと考えられます。

https://github.com/raspberrypi/linux/issues/3809

このissueはcloseされておりさも問題なく使えるかのような記述になっています。しかし、エラーこそ出ないものの録画を行うと録画ファイルが細切れになります。しかも途中の一部は録画できていません。当然ながらmirakurunのバッファーが枯渇しているわけでもないのは確認しています。録画が途切れるので気になって色々調べてみると録画が切れた直後はチューナーをオープンできない状態になっていました。dmesgにエラーもありません。何が悪いんだろうとずっとぐるぐるしていたのですが、結果論で言うならドライバーが悪かったというオチでした。

これがkernel 5.4.0での出来事なわけです。なので、もしかしたらこの修正が適用されていないかもしれないと思い、最新のRaspberry Pi OSのkernel 5.10系に変えてみました。

すると、今度は別の症状に見舞われました。録画が始まらないことがある、私は2個T230C2を指しているのですが、録画が始まらなかったり、片方だけ録画できていないことがありました。これを調べていくとdmesgには以下のエラーが出ています。

dvb_usb_v2: usb_bulk_msg() failed=-110

正直ここが一番混乱しました。このエラーは先ほどのissueで解決されているはずなのに、内容的には同じエラーが発生しています。これが片方のチューナーのみで発生していたために録画が片方だけ失敗していたみたいです。これはDebian系OSが原因なのかと思い別系統のOSを試してみますが、カーネルのバージョンにかかわらず、同様のエラーが発生し、T230C2が壊れているのではないかとまで疑い始めました。

しかし、エラーをはくT230C2を確認すると、実はポートに関係はないですし、その個体に限った状態ではないことを突き止めました。つまり、デバイスは故障しているわけではないということですね。

Raspberry Pi系のOSやデバイスに起因するエラーなのかと考えました。ARM環境は色々特殊なので、そういう変なエラーが出ることがないとは言えないわけなので疑ってみます。というわけで、Intel CPUを搭載したミニPCを使ってクロスチェックを行ってみます。使ったのはファンがうるさい&仕様が嘘まみれとボロクソに書いたCHUWIの「HeroBox Pro」です。

2.5インチSSDも余っていたのでwindows環境を壊すことなく挑戦できるのでやってみます。しかし、結果は変わらず。

じゃあ、何が悪いんだと考えて試行錯誤したのが今回の話になります。

試した環境

最初に書いておくと、最終的に上手く言った環境はRaspberry Pi環境にはなりますが、結果的にはドライバー側の問題なのでIntelなどの環境でも同様に解決可能だと思います。私は試していませんが。

次に試したRaspberry Pi環境を全て記します。

  • Raspberry Pi OS
    • Kernel 5.4.x(32bit buster)
    • Kernel 5.10.x(64bit bullseye)
  • Ubuntu Server (64bit)
    • Kernel 5.4.x
    • Kernel 5.10.x(HWE kernel)

以下はIntel製CPUを搭載したx86/AMD64アーキテクチャのOSでの環境を記します。CPUは先述の通りCHUWI HeroBox Proに搭載されているCeleron N4500です。Jasper Lakeなので性能的には申し分ありません。

  • ubuntu Server 20.04
    • Kernel 5.4.x
    • kernel 5.10.x(HWE kernel)
  • Debian 11
    • Kernel 5.10.x
  • Debian 10
    • kernel 5.4.x

これらで試しました。最終的に上手く言った環境が以下のRaspberry Pi環境でした。

  • Raspberry Pi OS (64bit bullseye: 5.10.92-v8+)
  • Raspberry Pi 4 model B
  • 電源: 5.1V 3A
  • デバイス
    • T230C2 x2
    • PX-W3PE4
  • モニターなし

別に細かい環境に意味はないと思いますが一応ということで残しておきます。

ここに書いておきますが、これはあくまでT230Cのドライバをビルドして使えるようにした話なので、ファームウェアを入れておいたり、チャンネル設定は別途する必要があります。これは以前の記事に書いてあるのでそちらをご覧ください。

失敗:バニラカーネルのドライバー(Kernel:5.4.x)

最初にカーネル付属のドライバが早々悪いことは無いと考え5.4.x系のカーネルドライバを試してみました。

結果は、UbuntuでもDebianでもしばらく使用するとdmesgにエラーが出ました。このエラーが一度出ると再起動する以外に直す術はありません。この症状の面倒なところは症状は1日たってから出ることもあればそうでない場合もあります。早ければ数時間で出ることもあります。おかしいと思ったらとりあえずdmesgを確認すると以下のエラーが出ています。

dvb_usb_v2: usb_bulk_msg() failed=-110

これはエラーが出るタイプなのでわかりやすいです。録画の症状でいうと、二つのうち片方の録画ができなくなっていて、チューナーがオープンできない状態でした。frontend0のデバイスにアクセスできないという内容だったと思います。なので、PC側からはadapter0とadapter1で2個認識自体している状態でした。

ちなみに、Raspberry Piの一部5.4.x系バージョンは最悪で上述のエラーは出ないものの、録画に失敗したり途切れたりとぱっと見原因不明の症状が現れます。症状としてはmirakurunのバッファ枯渇の症状と似ているのですが、ログを追ってもバッファオーバーをした記録もなく、最初は色々疑いました。

しかし、録画が途切れたあたりで直接チューナーが開けるか確認したところチューナーがオープンできないことがわかります。症状的には他の場合と似ているような気もしますが、決定的に違うのがこちらはチューナーがオープンできなくなったらずっとオープンできないわけではなく少し時間を置くとオープンできるようになります。エラーが出ない分本当に厄介でした。

失敗:バニラカーネルのドライバー(Kernel:5.10.y)

こちらを検証した意図は単に新しいからです。もともとT230Cがサポートされたのはバニラカーネル5.4の時みたいなので、バグなら新しくなれば取れているだろうと踏みました。ちなみにT230Cのサポートバージョンの話についてはここに乗っています。

https://www.linuxtv.org/wiki/index.php/Geniatech_T230C

ここによると5.4以降のバニラカーネルでサポートされているので基本的にはドライバをビルドする必要はない、4.xなど古いカーネルの場合はドライバをビルドしないといけないことが書いています。

症状は5.4.xの同様のエラーが出るときと全く同じです。

dvb_usb_v2: usb_bulk_msg() failed=-110

ですが、デバイスもOSも関係なく全て同様のこのエラーが出ます。どうしたものかと考えた結果、公式ドライバがあるのでそれを使ってみることに。

失敗:公式ドライバー(Raspberry Pi)

ここでT230Aではバグがあって使えないと話題のT230Cのドライバを使ってみます。そもそも怪しい予感しかしませんが使ってみましょう。

とりあえず公式サイトへ行ってみます。公式サイトは以下のリンクです。

Mygica official Site

サポートページの中でT230Cの場所を探すと右端にRaspberry Piドライバがあります。これをとりあえずダウンロードして使ってみます。zipファイルなのでとりあえず解凍すると中に別のファイルとREADMEが入っていたので指示通りにしてみることに。

因みにファイル名的にもAliexpressなどの海外のサイトを見てみてもKernelのバージョンが5.4向けになるみたいです。READMEにはそんなこと全く書いていませんけどね。というかその中身がたったこれしかありません。


1, install dvb driver
	sudo make install
	sudo reboot
	

2, uninstall dvb driver
	sudo make rminstall
	sudo reboot

というかこんな手順で使える気がしません。make installってコピーするだけのが殆どじゃんと思いながらとりあえず実行してみます。

すると、エラーの細かいのは面倒で記録していなかったのですが、とりあえずカーネルのバージョンとドライバのバージョンがあってないってdmesgで怒られて使えませんでした。そりゃコンパイル済みのカーネル使えばこうなるとしか。

余りにもお粗末でびっくりしましたが、5.4以降はサポートしてるからいいでしょみたいな感じなのかもしれません。というわけで別の方法を試します。Ubuntu用のドライバが公式であるのでそれを使ってみます。

失敗:公式ドライバ(Ubuntu 20.04用)

こちらも先ほどのMygica公式からダウンロードできます。

同様にzipファイルになっているので解凍してみると何やらpdfが入っていました。ビルドの仕方が書いてありました。こちらは先ほどのバイナリをコピーするだけでなくきっちりビルドするようです。

ちなみに中身はmedia_buildなので何も書いていませんがカーネルヘッダーが必要になるのと、書いていない必要パッケージがないとダメでした。例によって何も書いていませんがバージョンはUbuntuの20.04のみをサポートするようです。

こちらをビルドしたところ何かエラーが出てT230Cが使えませんでした。こちらは半ば呆れていたのでやっぱりかと諦めていたので、何のエラーかも覚えていません。今になって思い返すと、最後の方法とエラー内容が同じであれば同じ対処方法でも使えるかもしれません。

余談ですが、何も考えずtar -xfなどで解凍すると動いてくれませんというのも、解凍後のフォルダ名がスペースが入っているためビルドするときにそのスペースでディレクトリの文字列が切断されているためにエラーが出ます。適当な名前に変更してビルドすればビルドまでは持っていけます。結論は上述の通りです。

失敗:crazycat版media_build

こちらは同じようにmedia_buildをビルドするのですが、このレポジトリを使います。

https://github.com/crazycat69/media_build

余談ですがmedia_buildはビルドするのにマシンの性能にもよりますが1時間ぐらい見積もっても良いぐらい時間のかかる作業です。なので、ここから以下はmedia_buildをビルドする間はしばらくマシンが使えないと思っておいた方が良いです。

さて、海外のLinuxのwikiなどによれば、古いカーネルでT230Cを利用する場合はこの方の改造されたmedia_buildを使うそうです。理由はDVB関係のドライバが何個かあるのですが、最近カーネルに組み込まれているものと以前のそれではドライバが大きく違うためだそうです。

とりあえずこれをGitHubを見ながらとりあえずビルドしてインストールしてみます。

./build
sudo make install

結果は予想通りではありますが、使えるドライバが二つある状態になってしまったためにエラーが出ました。先ほども言った通り別の古いドライバでT230Cがサポートされているためなので、逆に新しい方を消してしまえばよかったのですが、少し不安だったのでこれは実行しませんでした。あとKernelが新しいのにドライバのベースが古いものを使うのは後々違う問題が起こりそうだったというのも理由です。もしかしたら元のドライバを削除することで使えるのかもしれませんが、今回はとりあえず後々のことを考えて別の方法を検討します。

そこで、最後に考えたのが最新版のドライバをビルドすることでした。割とkernel 5.10も新しいと思いますが、最新のmedia_buildを試してみることにしました。これ以上は何をしたらいいかあまり検討が付かないので頼みの綱だった感じはします。

成功:本家のmedia_build

結果的にはこれで成功しましたが色々やりました。こちらは本家のLinuxTVのDVBドライバをビルドするmedia_buildです。gitはこのページです。

https://git.linuxtv.org/media_build.git

とりあえず色んなサイトを見ながらビルドします。以下のコマンドでできます。

git clone git://linuxtv.org/media_build.git
cd media_build
./build
sudo make install

ビルドは何の問題もなくできました。ですが、この状態では認識できていないため、状況を確認してみるとdmesgにはこんな感じのエラーが出ていました。

[   39.348639] usb 1-1.2: new high-speed USB device number 5 using ehci-pci
[   39.996293] dvb_usb: disagrees about version of symbol rc_register_device
[   39.996295] dvb_usb: Unknown symbol rc_register_device (err -22)
[   39.996356] dvb_usb: disagrees about version of symbol rc_free_device
[   39.996358] dvb_usb: Unknown symbol rc_free_device (err -22)
[   39.996392] dvb_usb: disagrees about version of symbol rc_allocate_device
[   39.996393] dvb_usb: Unknown symbol rc_allocate_device (err -22)
[   39.996460] dvb_usb: disagrees about version of symbol rc_unregister_device
[   39.996461] dvb_usb: Unknown symbol rc_unregister_device (err -22)

また今までと違うエラーと霹靂しながらエラー内容を読んでみるも対処法の検討も付きません。ですが、色々調べてみるとこのRCというのは赤外線(IR)センサー関連のエラーだとわかります。

ここでふと気が付きます。これはあくまでT230CではなくT230C2なんだよなと。そもそもT230CとT230C2でデバイスIDがなぜ違うのかと言われたら違う部分が存在するから別IDなわけです。T230CとT230C2は内部でGPIOが違うためこのように違いますし、このGPIOが違うせいで苦しんだデバイスだと兄弟機のT230Aがいます。おそらく根本的な原因はGPIOの違いを正しく認識・設定できていないことが原因でこのエラーが出ているとは思います。

ですが、これがわかったところでなぁと思っていたのですが、調べているとTBSのチューナーでも同様の症状があったみたいです。それがこのページ。

https://github.com/tbsdtv/linux_media/issues/209

簡単にまとめると、IRとRC周りの設定を消してしまえば大丈夫みたいです。この対処法をベースの今回の件を対処してみます。このページの下の方にあるまとめ手順通りでは使えるようになりませんでした。その手順の中でこのコマンドがどうやってもエラーが出て実行できませんでした。

make allyesconfig

これでv4lフォルダのconfigファイルを生成するのですが、これが通らず困りました。./buildのコマンドが通るのでおかしいということは無いと思うのですが原因はいまいちよくわかりませんでした。ただ、./buildのコマンドを実行した後であればconfigファイルは生成されていることに気づいたので強引な方法で突破することにしました。

先に一度全てビルドして、その後でconfigファイルを書き換えて再ビルドしてインストールすれば、無駄なものは生成されるもののエラーをはかないバイナリをインストールできるという流れです。これを以下のコマンドで行いました。

git clone git://linuxtv.org/media_build.git
cd media_build
./build
sed -i -r 's/(^CONFIG.*_RC.*=)./\1n/g' v4l/.config
sed -i -r 's/(^CONFIG.*_IR.*=)./\1n/g' v4l/.config
make -j$(nproc)
sudo make install

この手順でビルドしてT230C2を使うとエラーを出さずに使えるようになりました。長時間使用してもエラーが出ず問題なくなりました。

結局、原因不明のエラーの答えはドライバの不具合でした。ファームウェアも最初と同じものなのでこれは間違いないですね。

さて、とりあえず最低限途切れないというところまで持っていけたので実際に録画テストを行っているのですがここでまた気づいたことがあります。これは次の項で。

Raspberry PiでのT230C2のドロップの原因

安定して接続できるようになったので録画テストをし始めたものの、以前のような片方だけ録画できていないとか、データが分かれるといった症状はなくなりましたが、そこで目につくのがこの手のマシンではおなじみのドロップ問題。

問題がなくなるとまた問題が出てくるのがなんともraspberry Piらしいです。今までPX-W3PE4などを使っていましたが、BSを使っていた当時もほとんどドロップはなく1か月に1個あるかないかぐらいのレベルでした。ですがT230C2半分ぐらいがドロップがある印象を受けます。ドロップの数は80とか下手したら200ぐらいのときもありました。流石にこれはドロップしすぎなので原因を追究し始めました。

ログを見ると大体ドロップしている時間はEPGの取得していることがわかりました。何か悪さをしているのかと考えましたが、結果的にはただの性能不足です

原因を突き止めた方法は特徴を洗い出して、それに対する対応をしてみただけです。

まず、ドロップのタイミングについてですがこれはランダムでした。ですが、ドロップするときは基本的にEPGの取得をしてチューナをオープンしたりしています。なので、EIT prsingをOFFにしてEPGを取得しないようにしてみると、ドロップが明らかにへりました。それでも30ぐらいありました。この時点ではチューナーを開くときに何か悪さをするのかもしれないぐらいにしか思っていませんでした。

次に、パケットが詰まっている可能性を考え、マシン性能の変化によるドロップの変化を確認しました。Raspberry Pi 4Bは最近のステッピングになって動作周波数が1.8GHzになったみたいなので、これを基準にOCを行ってみました。私のは古い4Bなので最大でも1.5GHzまでのやつです。なので数字上30%近く性能が向上するので性能不足によるパケ詰まりならかなり効果があるはずです。この結果は非常に効果がありました。当初80ぐらいドロップしていましたが、ドロップするときでも20~40程度に減りました。さらにOCをして2.0GHzぐらいで動かしてみたところさらに減り、1桁台のものが大分増えました。

クロックを上げることによってドロップが減ったことから性能不足が原因でドロップ発生していたことがわかりました。

ちなみに、PX-W3PE4ではほとんどドロップがなかったのはなぜ?となるのですが、これはバッファの保持する部分の違いだと思います。px4_drvはマシンのメモリをバッファとして使っていてそれを調整したりできるみたいですが、DVBのドライバはデバイス側のバッファを使っているのかユーザー側からバッファをいじれないためバッファからあふれた分が捨てられているのではと考えます。ここらへんはDVBデバイスの仕様を細かく理解していないので予想でしかありません。ただ、結果だけで言うならT230C2ではドロップが頻発してPX-W3PE4ではほとんどドロップがないというだけの話です。

まとめ

無事にT230C2を利用できるようになりました。結果的にドライバのバグでしたが、同様の症状に他の方が悩まされていないのかは少し気になります。Web上に残っている記事は時期的にはT230Cだった時期のものな気がするので、T230Cでは問題はなかったのかもしれませんが、T230C2ではダメでした。結果的に使えるようになったので良かったです。

ただ、個人的にはGeniatech(Mygica)の方は評価が下がりましたね。ここまでずさんなドライバーを提供しているとは思いませんでした。

そりゃ海外の人もエラーばかりでイライラしますと書くわけですね。T230Aのエラーで奔走していた人も私と同じような気持ちだったのかもしれませんね。余談はこれくらいにしましょう。

以上です。お読みいただきありがとうございました。

1件のコメント

コメントする

メールアドレスが公開されることはありません。