Raspberry Pi 4+PX-Q1UDの地デジ録画サーバをPX-Q3U4に換装する

# はじめに
中古の[PX-Q3U4](http://www.plex-net.co.jp/product/px-q3u4/)をお安く手に入れたので今使っている[PX-Q1UD](http://www.plex-net.co.jp/product/px-q1ud/)から換装しました。
変更点としては以下の通り。

### Before - PX-Q1UD
* 地上波 4ch

### After - PX-Q3U4
* 地上波 4ch
* BS/CS 4ch

使用するB-CASカードはもちろんBS/CS対応（赤い方）である必要があります。
PX-Q3U4にB-CASカードリーダーついてますがrecpt1経由でデコードするのでこいつは使いません。

# 手順
以下のモジュールは導入済みの状態で初めます。

* カードリーダードライバ pcsc-tools
* B25ライブラリ libarib25
* mirakurun
* chinachu

構築については[以前の記事](https://qiita.com/tomtwinkle/items/99fe34140fa5b1a70e7b)を参照して下さい。
`ffmpeg`に関してはraspbian fullのOSならデフォルトで入っています（ありがたい）。

## 必要なモジュールのインストール
```shell
$ sudo apt install raspberrypi-kernel-headers build-essential dkms autoconf
```

インストールされたカーネルヘッダのバージョンを確認しておきます。
2020/2/15時点では[4.19.97](https://github.com/Hexxeh/rpi-firmware/commit/993f47507f287f5da56495f718c2d0cd05ccbc19)のカーネルヘッダがインストールされます。

```shell
$ ls /usr/src/ | grep linux-headers
linux-headers-4.19.97+
linux-headers-4.19.97-v7+
linux-headers-4.19.97-v7l+
```

## raspbianのバージョン確認

driver(px4_drv)のインストールの際に前段階でインストールしたカーネルヘッダが必要なのですが
raspbianのバージョンとインストールするカーネルヘッダのバージョンがズレているとインストールに失敗します。

```shell
$ uname -r
4.19.97-v7+
```

ここでインストールされたカーネルヘッダとカーネルのバージョンが同じなら問題ないです。
バージョンが古い場合は次のカーネルバージョンアップの手順が必要です。

## raspbianバージョンアップ
※**raspbianのLinuxカーネルのバージョンアップは非推奨な行為になっています。**上げる場合はバックアップ等取ってから行うのが良いでしょう。

前述の通り、カーネルヘッダとカーネルのバージョンを合わせておく必要があるので
カーネルヘッダとカーネルのバージョンが違うならバージョンアップを行います。

特定のバージョンに上げる場合は事前にコミットハッシュを調べておく必要があります。
FirmwareのRepositoryを[「kernel: Bump」で検索する](https://github.com/Hexxeh/rpi-firmware/search?q=kernel%3A+Bump&type=Commits)とハッシュを調べることが出来ます。

4.19.97の場合のハッシュは[「993f47507f287f5da56495f718c2d0cd05ccbc19」](https://github.com/Hexxeh/rpi-firmware/commit/993f47507f287f5da56495f718c2d0cd05ccbc19)になります。

```
$ sudo rpi-update 993f47507f287f5da56495f718c2d0cd05ccbc19
```

バージョンアップが終了したら再起動してバージョンを確認。

```shell
$ uname -r
4.19.97-v7+
```

## driverのインストール
PLEX PX-W3U4/Q3U4/W3PE4/Q3PE4の非公式driverの[px4_driver](https://github.com/nns779/px4_drv)をインストールします。
基本的にカーネルのバージョンさえ合っていればREADME通りにやれば上手く行くんですが、手順多くて面倒くさいので今回はインストールスクリプトを使います。

```shell
$ curl -fsSL https://raw.githubusercontent.com/masnagam/sbc-scripts/master/install-px4-drv \
  | sh -s -- --dkms install
```

失敗する場合はカーネルヘッダが上手くインストールされていないかもしれません。
カーネルヘッダを再度インストールして

```shell
$ sudo apt install raspberrypi-kernel-headers
```

以下のbuildファイルがカーネルヘッダにリンクされているか確認して下さい。

```shell
$ ls -la /lib/modules/4.19.97-v7l+/
lrwxrwxrwx  1 root root     35  2月 12 22:33 build -> /usr/src/linux-headers-4.19.97-v7l+
```

ドライバーのインストールをやり直す場合は[アンインストール](https://github.com/nns779/px4_drv#dkms%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88)しておかないとエラーになります。

## ドライバーインストール確認

正常にインストールが成功していればlsmodで`px4_drv`ドライバが表示されるはず。

```
$ sudo modprobe px4_drv
$ lsmod | grep px4
px4_drv
```

PX-Q3U4を接続してデバイスファイルがチューナー分(8個)作成されることを確認します。
この時B-CASカードはPX-Q3U4のカードリーダーじゃなくて別途用意しているカードリーダーの方に差しましょう。

```
$ ls /dev/px4video*
/dev/px4video0  /dev/px4video1  /dev/px4video2  /dev/px4video3  /dev/px4video4  /dev/px4video5  /dev/px4video6  /dev/px4video7
```

## recpt1のインストール

今まで録画で使っていた`recdvb`はデバイスファイルの名称が異なるのでそのままでは使えないため、新たに録画用のツールをインストールします。

`px4_drv`はPLEX公式の`recpt1`でなくても動作するので
STZ版の`recpt1`を[こちら](https://qiita.com/tatsuya_info/items/3583182ac104a4958eac#recpt1%E3%81%AE%E6%A7%8B%E7%AF%89)を参考にしてインストールしました。


```
$ git clone https://github.com/stz2012/recpt1.git
$ cd recpt1/recpt1
$ sed -i -e "/^char \*bsdev\[NUM_BSDEV\] = {$/a \ \ \ \ \"/dev/px4video1\",\n\ \ \ \ \"/dev/px4video0\",\n\ \ \ \ \"/dev/px4video4\",\n\ \ \ \ \"/dev/px4video5\"," pt1_dev.h
$ sed -i -e "/^char \*isdb_t_dev\[NUM_ISDB_T_DEV\] = {$/a \ \ \ \ \"/dev/px4video2\",\n\ \ \ \ \"/dev/px4video3\",\n\ \ \ \ \"/dev/px4video6\",\n\ \ \ \ \"/dev/px4video7\"," pt1_dev.h
$ ./autogen.sh
$ ./configure --enable-b25
$ make -j 4
$ sudo make install
```

正常に録画できるか動作確認してみます。
各地域のチャンネルは[マスプロ](https://www.maspro.co.jp/contact/bro/bro_ch.html)で確認して下さい。

```
$ cd /mnt/hdd1
$ recpt1 --device /dev/px4video0 --lnb 15 --b25 --strip BS09_0 10 bs0.m2ts
$ recpt1 --device /dev/px4video1 --lnb 15 --b25 --strip BS09_0 10 bs1.m2ts
$ recpt1 --device /dev/px4video2 --b25 --strip 16 10 gr0.m2ts
$ recpt1 --device /dev/px4video3 --b25 --strip 16 10 gr1.m2ts
```

## Mirakurunチューナー設定

PX-Q3U4用のチューナー設定を行います。
PX-Q1UDをもう使わないのであれば、元々あったPX-Q1UD用チューナー設定は `isDisabled: true` で無効化しておきます。

```shell
$ sudo EDITOR=nano mirakurun config tuners

- name: PX4-S1
  types:
    - BS
    - CS
  command: recpt1 --b25 --device /dev/px4video0 <channel> - -
  isDisabled: false

- name: PX4-S2
  types:
    - BS
    - CS
  command: recpt1 --b25 --device /dev/px4video1 <channel> - -
  isDisabled: false

- name: PX4-S3
  types:
    - BS
    - CS
  command: recpt1 --b25 --device /dev/px4video4 <channel> - -
  isDisabled: false

- name: PX4-S4
  types:
    - BS
    - CS
  command: recpt1 --b25 --device /dev/px4video5 <channel> - -
  isDisabled: false

- name: PX4-T1
  types:
    - GR
  command: recpt1 --b25 --device /dev/px4video2 <channel> - -
  isDisabled: false

- name: PX4-T2
  types:
    - GR
  command: recpt1 --b25 --device /dev/px4video3 <channel> - -
  isDisabled: false

- name: PX4-T3
  types:
    - GR
  command: recpt1 --b25 --device /dev/px4video6 <channel> - -
  isDisabled: false

- name: PX4-T4
  types:
    - GR
  command: recpt1 --b25 --device /dev/px4video7 <channel> - -
  isDisabled: false
```

設定を反映させるためMirakurunを再起動します。

```shell
$ sudo mirakurun restart
```

## チャンネルスキャン

ここからは前回の記事と同じ流れです。
チャンネルスキャンして地上波のチャンネル一覧を更新します。
時間がかかるのでまったり待ちましょう。

```shell
$ sudo curl -X PUT "http://localhost:40772/api/config/channels/scan"
```

チャンネルスキャン後、EPGに反映されるのには暫く時間がかかります。
時間を置いてから`Chinachu`の表示を更新してみます。

```
cd [Chinachuのディレクトリ]
$ ./chinachu update
```

問題なくEPGが取得できていれば番組表にBS/CSの番組も表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536869/ae6c1de9-7f14-ee4f-6ab8-b352f492cab4.png)

# 参考サイト
[RaspberryPi 3B+ + PX-Q3U4 + EPGStation @tatsuya_info](https://qiita.com/tatsuya_info/items/3583182ac104a4958eac)
[MirakurunクローンをRustで実装しました @masnagam](https://qiita.com/masnagam/items/e71a234f2e66b1246a37)

# おまけ
MirakurunをRustで実装した[mirakc](https://github.com/masnagam/mirakc)が気になる。
[MirakurunクローンをRustで実装しました @masnagam](https://qiita.com/masnagam/items/e71a234f2e66b1246a37)
Raspberry pi 4はリソースに大分余裕があるので現状のままでも問題ないんですが、そのうち試してみたいと思う。