[追記]

現時点において本年の10/02にリリースされた最新版Raspberry Pi OS(Debian 13「Trixie」ベース)だと以下のコマンドでドライバをインストールすると以下のエラーメッセージがdmesg上に出力され、当該TVチューナーカードがデバイスファイル(/dev/dvb/adapter0など)として認識されない模様である。

$ sudo modprobe dvb-core
$ sudo insmod ./cxd2857.ko
$ sudo insmod ./tbs6812.ko
[  188.358958] TBS6812 driver 0001:01:00.0: enabling device (0000 -> 0002)
[  188.358987] TBS6812 driver 0001:01:00.0: Turbosight TBS 6812 (Dual ISDB-T/S/S3)
[  188.360324] dvbdev: DVB: registering new adapter (TBSECP3 DVB Adapter)
[  189.495371] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  190.519327] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  190.519334] TBS6812 driver 0001:01:00.0: error reading MAC address for adapter 0
[  191.543287] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  191.543292] i2c i2c-15: cxd2857: i2c wrm err(-5) @0x00 (len=1)
[  192.567249] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  192.567258] i2c i2c-15: cxd2857: i2c rdm err(-5) @0x66 (len=1)
[  193.591209] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  193.591214] i2c i2c-15: cxd2857: i2c rdm err(-5) @0x66 (len=1)
[  193.591218] i2c i2c-15: cxd2857:Can not detect the chip.
[  193.591221] i2c i2c-15: cxd2857:error attaching frontend.
[  193.591229] TBS6812 driver 0001:01:00.0: TBSECP3 frontend 0 attach failed
[  193.591232] TBS6812 driver 0001:01:00.0: frontend attach failed
[  193.591563] TBS6812 driver 0001:01:00.0: adapter0 attach failed
[  193.591567] dvbdev: DVB: registering new adapter (TBSECP3 DVB Adapter)
[  194.711176] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  195.735136] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  195.735144] TBS6812 driver 0001:01:00.0: error reading MAC address for adapter 1
[  196.759102] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  196.759109] i2c i2c-16: cxd2857: i2c wrm err(-5) @0x00 (len=1)
[  197.783073] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  197.783082] i2c i2c-16: cxd2857: i2c rdm err(-5) @0x66 (len=1)
[  198.807043] TBS6812 driver 0001:01:00.0: i2c xfer timeout
[  198.807051] i2c i2c-16: cxd2857: i2c rdm err(-5) @0x66 (len=1)
[  198.807055] i2c i2c-16: cxd2857:Can not detect the chip.
[  198.807057] i2c i2c-16: cxd2857:error attaching frontend.
[  198.807066] TBS6812 driver 0001:01:00.0: TBSECP3 frontend 1 attach failed
[  198.807069] TBS6812 driver 0001:01:00.0: frontend attach failed
[  198.807389] TBS6812 driver 0001:01:00.0: adapter1 attach failed
[  198.807394] TBS6812 driver 0001:01:00.0: Turbosight TBS 6812 (Dual ISDB-T/S/S3): PCI 0001:01:00.0, IRQ 187, MMIO 0x1b80000000

ドライバのソースコードを見るとtbsecp3-i2c.cの以下の箇所でエラーが発生していることが分かる。

    bus->done = 0;
	tbs_write(bus->base, TBSECP3_I2C_CTRL, i2c_ctrl.raw.ctrl);
	retval = wait_event_timeout(bus->wq, bus->done == 1, HZ);
	if (retval == 0) {
	    tbs_read(bus->base, TBSECP3_I2C_STAT); // restore iic to its original state
		dev_err(&dev->pci_dev->dev, "i2c xfer timeout\n");
		retval = -EIO;
		goto i2c_xfer_exit;
	}

本エラーはI2Cバスを介してある番地にある値を出力したものの、一定時間内にそれが完了しなかったために起きるタイムアウトエラーである。前バージョンのRaspberry Pi OSでは起きなかったことから、MicroSDカードに書き込むOSとしてLEGACY(Bookworm)を選択することで本エラーを回避できる可能性がある。

はじめに

Raspberry Pi 5(以下、RPi5と呼称)はPCI Express x1(以下、PCIe1xと呼称)接続による拡張カードの増設をサポートする。そこで今般、PRi5にPCIe1xで接続するTVチューナーカードを設置して地上波放送とBS放送を視聴および録画する環境をセットアップしたので、その方法をここに忘備録としてメモする。

ハードウェアを準備する

今回使用するTVチューナーカードはTBS Technologies International製だと思われるPCIe1x接続のTBS6812(通称PT4K)である。本チューナーカードは地上波やBS放送だけでなくBS4K放送の復調にも対応している。ただし、自分が調べた限り、現時点においてLinuxでBS4K放送を視聴・録画する方法は確立されていない模様のため、ここでは地上波とBS放送のみを取り上げる。

 

 

RPi5はPCIe1xで接続するための信号線は予め準備されているものの、本体のサイズを抑えるため、物理的なコネクタは用意されていない。このため、RPi5から伸びるPCIe1xの信号線を物理的なPCIe1xのコネクタ形状へ変換するP02と呼ばれる拡張インタフェースボードを準備する。

 

 

本インタフェース変換カードは0.5mmピッチの16ピンの信号線をPCIe1xの規格に合致する物理コネクタへ変換する。なお、拡張カードの電源は、RPi5がもつ5Vを供給するGPIOピンを介してPCIe1xのコネクタから供給される模様である。本インタフェース変換カードは外部電源からの電源供給にも対応しているものの、ワットチェッカーで計測したところ、放送を視聴している場合の消費電力は約10ワット弱のため、RPi5の電源として推奨されている27ワットのアダプタを使用していれば、別途、チューナーカードのために新たに外部電源を準備しなくとも問題ない模様である。

 

RPi5に本インタフェース変換カードを接続する時、信号線のケーブルのコネクタに注意する。無理に信号線のコネクタを開けようとするとコネクタを破損させるおそれがあるためである。自分はそれでRPi Zero 2Wのカメラコネクタを破損させた経験をもつ。くれぐれも慎重に扱うこと。

 

他に必要なものを以下にリストアップする。

  • Windows PC
  • Raspberry Pi 5 (メモリ8GB)
    • 27W Type-C 電源アダプタ
    • MicroSDカード(32GB + 録画番組の保存領域)
      • MicroSDカードリーダ/ライタ
    • LANケーブル
    • HDMIケーブル
  • アンテナケーブル
  • ICカードリーダ/ライタ: SCR3310 v2.0
    • B-CASカード

ソフトウェアを準備する

次に以下の手順でソフトウェアをセットアップする。

microSDカードにRaspberry Pi OSをインストールする

このページからダウンロードできるRaspberry Pi Imagerを使用してmicroSDカードにRaspberry Pi OSを書き込む。PCにmicroSDカードを挿入後、Raspberry Pi Imagerを起動すると以下の画面が表示される。

 

 

Raspberry PiデバイスにRASPBERRY PI 5、OSにRASPBERRY PI OS(64bit)を選択し、次へを押下する。

 

 

「Would you like to apply OS customization settings?」(OSをカスタム設定しますか?)で「設定を編集する」を選択する。

 

 

「一般」タブで以下を設定する。

  • ユーザ名とパスワード
  • ロケール(タイムゾーンとキーボードレイアウト)

 

OSをインストールした後はコンソールから操作するため、「サービス」タブで「SSHを有効化する」と「パスワード認証を使う」をそれぞれ有効化し、「保存」を押下する。

 

 

再び下記の画面で「はい」を選択する。

 

 
PCに装着されているMicro SDカードの既存のデータを削除してもよいか確認する下記の画面で「はい」を選択する。
 
 
インストールが完了すると以下の画面が表示されるので続けるボタンを選択する。
 
 
OSのインストール後、RPi5にmicroSDカード、HDMI端子、有線LAN、キーボード、マウスをセットして最後に電源を投入する。

 

RPi5はサーバとして使用するため、グラフィカルな画面は必ずしも必要としない。このため、以後はWindows PCからsshによりRPi5を操作する。Windows PCのプロンプト画面で以下のコマンドによりRPi5に接続できる。

$ ssh ユーザ名@IPアドレス

RPi5のネットワークインタフェースに割り当てられているIPアドレスを確認するためには、画面右上にある「↑↓」アイコンにマウスポインタを重ねる(ここでは、192.168.0.6がIPアドレスとなる)。

 

OSをアップデートする

以下のコマンドでOSを最新の状態へアップデートする。updateでパッケージのリストを更新し、upgradeでそのリストに基づき更新可能なパッケージを更新する。

$ sudo apt update
$ sudo apt upgrade

終了後、RPi5を再起動する。

$ sudo reboot

ブート時のオプションを設定する

後述するチューナーカードのドライバをRPi5で正常に動作させるためにはあらかじめブートオプションを設定する/boot/firmware/config.txtに以下の行を追加する必要がある。仮にこれを設定しない場合、チューナーカードのドライバをインストールしても、認識はされるものの、オールゼロのデータしか来ず、復調に失敗する。

[all]
dtoverlay=pcie-32bit-dma

設定後、RPi5を再起動する。

sudo reboot

本情報は以下のサイトを参考にした。

 

 

チューナのドライバをインストールする

今回使用するチューナーであるPT4KのLinux向けドライバのソースコードは以下のサイトで公開されている。このため、以下の手順でソースコードをダウンロードしてビルドする。

 

 

はじめにドライバのビルドに必要なカーネルヘッダを以下のコマンドでインストールする。

$ sudo apt install raspberrypi-kernel-headers

ドライバのソースコードをダウンロード後、ビルドする。

$ git clone https://github.com/otya128/tbs6812_drv.git
$ cd tbs6812_drv
$ make -C "/lib/modules/$(uname -r)/build" "M=$(pwd)" tbs6812.ko cxd2857.ko

ドライバをビルド後、以下のコマンドでドライバをロードする。

$ sudo modprobe dvb-core
$ sudo insmod ./cxd2857.ko
$ sudo insmod ./tbs6812.ko

以下のコマンドでチューナーカードが認識されていることを確認する。

$ lspci
$ 0000:01:00.0 Multimedia controller: TBS Technologies DVB Tuner PCIe Card

以下のコマンドでチューナーカードのドライバが正常にロードされていることを確認する。

$ dmesg | less
[   67.213074] TBS6812 driver 0000:01:00.0: enabling device (0000 -> 0002)
[   67.213100] TBS6812 driver 0000:01:00.0: Turbosight TBS 6812 (Dual ISDB-T/S/S3)
[   67.213657] dvbdev: DVB: registering new adapter (TBSECP3 DVB Adapter)
[   67.332541] TBS6812 driver 0000:01:00.0: MAC address 00:22:ab:b2:1d:6c
[   67.333030] i2c i2c-13: Detect CXD2857 chip.
[   67.333034] TBS6812 driver 0000:01:00.0: DVB: registering adapter 0 frontend 0 (Turbosight TBS 6812 (Dual ISDB-T/S/S3))...
[   67.333114] dvbdev: DVB: registering new adapter (TBSECP3 DVB Adapter)
[   67.452570] TBS6812 driver 0000:01:00.0: MAC address 00:22:ab:b2:1d:6d
[   67.453060] i2c i2c-14: Detect CXD2857 chip.
[   67.453063] TBS6812 driver 0000:01:00.0: DVB: registering adapter 1 frontend 0 (Turbosight TBS 6812 (Dual ISDB-T/S/S3))...
[   67.453142] TBS6812 driver 0000:01:00.0: Turbosight TBS 6812 (Dual ISDB-T/S/S3): PCI 0000:01:00.0, IRQ 187, MMIO 0x1b00000000

以下のコマンドでチューナーカードがデバイスファイルとして認識されていることを確認する。

$ ls /dev/dvb
$ adapter0  adapter1

チューナーカードがデバイスファイルとして認識されていることを確認したら、実際にテレビ放送の信号を復調できることを確認する。そのためには始めに以下のコマンドでチューニングのツールをインストールする。

$ sudo apt install dvb-tools

また上記ツールを使用する上で必要となるチャンネルごとの周波数などの設定をもつ設定ファイルをダウンロードする。

$ git clone https://github.com/Chinachu/dvbconf-for-isdb.git

復調のためのツールと設定ファイルの準備ができたら以下のコマンドで指定したチャンネルの地上波放送の信号を復調する。

$ cd dvbconf-for-isdb/conf
$ dvbv5-zap -a 0 -c dvbv5_channels_isdbt.conf <チャンネル番号> -r -P -o test.mmts

ここでチャンネル番号はこのリンクを参照する。

 

復調後のデータは暗号化されているため、そのままでは視聴できない。このため、このサイトの「デコーダライブラリをインストールする」を参考にして暗号を解除するプログラムをインストールする。インストール後、以下のコマンドで復号する。

$ b25 test.mmts test.m2ts

復号後のファイルがオープンソースのメディアプレーヤであるVLCなどで視聴できることを確認する。

 

RPi5を起動する度にチューナーカードのドライバを手動でロードするのも難なため、以下のコマンドで起動時にドライバが自動でロードされるようにする。

$ sudo cp /path/to/tbs6812_drv/cxd2857.ko /lib/modules/$(uname -r)/kernel/drivers/media/tuners/
$ sudo cp /path/to/tbs6812_drv/tbs6812.ko /lib/modules/$(uname -r)/kernel/drivers/media/tuners/
$ sudo depmod
$ sudo echo cxd2857.ko >> /etc/modules-load.d/modules.conf
$ sudo echo tbs6812.ko >> /etc/modules-load.d/modules.conf

上記コマンドを実行後、RPi5を再起動し、下記のコマンドでチューナーカードのドライバが自動でロードされていることを確認する。

$ lsmod | grep cxd2857
$ lsmod | grep tbs6812

Mirakurunで視聴できるようにする

放送波を復調するdvbv5-zapコマンドを用いてMirakurunで視聴できるようにする。はじめに暗号化された復調後のデータを復号するツールを以下のコマンドでインストールする。

$ git clone https://github.com/tsukumijima/libaribb25
$ cd libaribb25
$ cmake -B build
$ cd build
$ make
$ sudo make install

次にチャンネルごとの周波数などを設定する設定ファイルを作成する。

$ sudo cat /path/to/dvbconf-for-isdb/conf/dvbv5_channelt_isdbt.conf >  /usr/local/etc/dvbv5_channels.conf
$ sudo cat /path/to/dvbconf-for-isdb/conf/dvbv5_channels_isdbt.conf >> /usr/local/etc/dvbv5_channels.conf

次にMirakurunのチューナーの設定ファイルを設定する。

- name: PT4K-1
  types:
    - GR
    - BS
    - CS
  command: dvbv5-zap -a 0 -c /usr/local/etc/dvbv5_channels.conf -r -P 
  dvbDevicePath: /dev/dvb/adapter0/dvr0
  decoder: arib-b25-stream-test

- name: PT4K-2
  types:
    - GR
    - BS
    - CS
  command: dvbv5-zap -a 1 -c /usr/local/etc/dvbv5_channels.conf -r -P 
  dvbDevicePath: /dev/dvb/adapter1/dvr0
  decoder: arib-b25-stream-test