MyGica T230AでMirakurun&EPGStation環境構築

# 前書き的なもの

MyGica T230Aについて書いた前回の記事が古くなった上にT230やT230Cとは少々勝手が違うようなので今後購入する人向けにEPGStationで受信できるようになるまでの解説を追加と書き直ししたもの。

### 2021/11/29 追記
・今まで使っていた有志作成のGithubに公開されているカーネルだと不都合が出てきたので、公式のGithubで公開されている最新のマスターブランチにパッチを当ててビルドする方式に変更。

ラズパイ公式gitにてブランチ「rpi-5.15.y」以降にMyGica T230Aのドライバーが組み込まれているのを確認しました。
将来的には公式対応で刺すだけで、もしくはファームウエアを入れるだけで使えるようになってほしいですねぇ。

ブランチ「rpi-5.15.y」のkernelを試してみたい方は" git clone "の際に" -b "オプションで以下のように" rpi-5.15.y "のブランチを指定すると指定したブランチがcloneされます。

```bash:git&#x20;clone(rpi-5.15.y)
git clone --depth=1 -b rpi-5.15.y https://github.com/raspberrypi/linux
```

### 2021/12/06 追記

・一部Githubの直リンがリンク切れだったのを修正
・Mirakurunのチャンネルリスト作成方法を適当なBSチャンネルのTSファイルから一括出力に変更

### 2022/07/02 追記
ラズパイ公式のgithubにて「5.15.y」がマスターブランチに上がってました。
これにより[git clone]とコンパイルをせずともコンソールから「rpi-update」にてKernelバージョン5.15.y系に簡単にアップデートできるようになりました。

今後ラズパイにT230Aを導入される方は「rpi-update」にてKernelバージョン5.15.y系にアップデートするとドライバーがkernelに含まれていますので、ファームウエアのインストールのみで利用できるようになります。

# MyGica T230Aの購入

現在の入手はAliexpressのみ。

[Aliexpress - Dvb-t2 geniatech mygica usb tvチューナースティックT230A DVB-C dvb-t hdテレビロシア、タイコロンビアヨーロッパWin10アンドロイドos](https://ja.aliexpress.com/item/1883597971.html?spm=a2g0s.9042311.0.0.304b4c4ddMiQ4M)

公式の物はこれのみでお値段￥2,531-(送料無料)

2021年4月12日現在では注文から2週間で届いた。

2021年10月21日現在は中国からの荷物が全体的に約1か月程度かかる模様。

# MyGica T230A公式ドライバーについて

USBデバイスとして認識するものの、DVBデバイスとして認識しておらずドライバーとファームウエアが必要。

以下のサイトにドライバ一式があるが、このドライバー不具合があるまま公式が放置で使用不可らしい...。

[MyGica -　Support](https://www.mygica.com/support/)

```bash:lsusb&#x20;dmesg
pi@raspberrypi:~ $ lsusb
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 006: ID 3275:0080 VidzMedia Pte Ltd
Bus 001 Device 004: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
Bus 001 Device 005: ID 0572:689a Conexant Systems (Rockwell), Inc.  <--これがT230A
Bus 001 Device 003: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

pi@raspberrypi:~ $ dmesg | grep usb
~~~~~~~~~~~~~~~~~~~~//略
[    2.743672] usb 1-1.2.4: new high-speed USB device number 5 using xhci_hcd
[    2.905153] usb 1-1.2.4: New USB device found, idVendor=0572, idProduct=689a, bcdDevice= 8.00
[    2.905202] usb 1-1.2.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    2.905239] usb 1-1.2.4: Product: USB Stick
[    2.905269] usb 1-1.2.4: Manufacturer: Gen
[    2.905298] usb 1-1.2.4: SerialNumber: 2017.12.09
~~~~~~~~~~~~~~~~~~~~//略
```

Github等にてこの問題が質問されてるので詳細が知りたい方はこちらへ。

[Github - How to add new MyGica T230A?](https://github.com/tbsdtv/linux_media/issues/224)

[LibreELEC - MyGica T230A](https://forum.libreelec.tv/thread/23142-mygica-t230a/?pageNo=1)

上記の問題を要約すると、今までのT230・T230Cなどと違いチューナーチップを初期化する為のGPIOが変わっておりDriverを使いまわすことができないらしいが、有志がとりあえず動くWindows用Driverを解析しLinuxのDriver Module用にPatchを用意してくれた模様。

↓チューナー等のドライバーを有志が追加したLinuxのカスタムkernel

[Github - crazycat69
/
linux_media --- media: dvb-usb-v2/dvbsky: Mygica T230A support.](https://github.com/crazycat69/linux_media/commit/e1ef47d604775c550a8f0d1bda276c113f882c9b)

↓RaspberryPiのkernelベースにT230Aのドライバー等を追加したカスタムkernel(v5.10.23)

[Github - pego149
/
linux --- Added Geniatech MyGica T230C2_LITE and T230A](https://github.com/pego149/linux/commit/b890047329dde74ab9271e4212f228b8c309bed9)

~~今回の環境はRaspberryPi 4なのでこちらを利用させてもらう。~~

上記に公開されているカーネルだと古くなってきて不都合が出てきたので最新の公式カーネルのソースをGithubから引っ張ってきて、上記のカスタムカーネルを参考に作成したパッチを利用してドライバーを組み込む。

以下の説明もRaspberryPi 4(32bit)向けとなる。

# GithubからKernelを落としてPatch当てとBuild & Install

まずは更新してからKernelをビルドするのに必要なものをインストール
この時、公式で公開されている最新の安定板Kernelがインストールされます。
カスタムKernelを導入後に" apt upgrade "すると公式Kernelに上書きされるので、必ず最初に行ってください。

```bash:apt&#x20;Install
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt install -y git bc bison flex libssl-dev make
```

git cloneでラズパイ公式のgitから最新のKernel Sourceをダウンロード

```bash:git&#x20;clone
$ git clone --depth=1 https://github.com/raspberrypi/linux
```

cloneしたkernel sourceのバージョンを確認する場合はcloneしたKernel Sourceのディレクトリに入って以下の方法で確認可能

```bash:kernel&#x20;check
$ cd linux
$ head Makefile -n 4
# SPDX-License-Identifier: GPL-2.0
VERSION = 5
PATCHLEVEL = 10
SUBLEVEL = 81
```

patchファイルも落としてkernelにpatchを当てる

cloneしたKernel Sourceディレクトリに入ってPatchをダウンロード、Patchコマンドを利用してパッチ当て

以下出力結果のように" dvbsky.c "と" dvb-usb-ids.h "の2つのファイルにpatchが当たれば正常にpatchが適用されています。
なお、今回作成したpatchは作成時に公式gitで公開されている最新kernel(rpi-5.10.81)で動作を確認しています。

```bash:kernel&#x20;patch
$ cd linux
$ wget https://raw.githubusercontent.com/nisiharayosi/t230a_isdbc/main/kernel_rpi5.10.81_t230a.patch
$ patch -p1 < kernel_rpi5.10.81_t230a.patch
patching file drivers/media/usb/dvb-usb-v2/dvbsky.c
patching file include/media/dvb-usb-ids.h
```

RaspberryPiのドキュメントを参考にKernelをビルドする

[Kernel building - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/linux/kernel/building.md)

↓ [＊再度注意＊]以下RaspberryPi 4(32bit)向け手順

gitから落としたKernel Sourceディレクトリに入ってビルド設定

```bash:Build&#x20;Configuration&#x20;Set(Raspberry&#x20;Pi&#x20;4)
$ cd linux
$ KERNEL=kernel7l
$ make bcm2711_defconfig
```
Kernelをmakeでビルドする(RaspberryPi4で1時間半くらい)

```bash:make&#x20;Build
$ make -j4 zImage modules dtbs
```

Kernelを丸ごと差し替え

5行目が" sudo cp arch/arm/boot/zImage /boot/kernel7l.img "になっていることに注意。

公式ではcp先が環境変数の" /boot/\$KERNEL.img "となっているが、環境によっては" \$KERNEL "が定義されていなかったり中身が存在しなかったりするので明示的に" /boot/kernel7l.img "と指定する。

```bash:Kernel&#x20;Install(Raspberry&#x20;Pi&#x20;4)
$ sudo make modules_install
$ sudo cp arch/arm/boot/dts/*.dtb /boot/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
$ sudo cp arch/arm/boot/zImage /boot/kernel7l.img
```

ついでに必要なT230A用のファームウェアも入れる

```bash:Firmware&#x20;Install
$ wget http://palosaari.fi/linux/v4l-dvb/firmware/Si2168/Si2168-D60/6.0.1/dvb-demod-si2168-d60-01.fw
$ wget http://palosaari.fi/linux/v4l-dvb/firmware/Si2141/Si2141-A10/1.1.10/dvb-tuner-si2141-a10-01.fw
$ sudo cp ./{dvb-demod-si2168-d60-01.fw,dvb-tuner-si2141-a10-01.fw} /lib/firmware/
$ sudo reboot
```

再起動すればドライバが読み込まれ" /dev/dvb "にデバイスがマウントされてT230Aが使えるようになる。

```bash:ls&#x20;/dev/dvb
$ ls /dev/dvb
adapter0
```

# dvb-toolsをインストールしてチャンネルスキャン

国内のCATVはDVB-Cで受信できるので、まずは「dvb tools」を使用してT230Aを「DVBC/ANNEX_A」に設定する。

この設定はT230C等では記憶されていたらしいが、今回使用するT230Aでは記憶されないのでスタートアップに指定する。

またこの時、複数dvbデバイスがある場合は「-a」オプションで番号を指定する。うちの場合は「adapter0」がT230Aなので「-a 0」となる。

```bash:Install&#x20;dvb-tools&#x20;&&#x20;dvbv5-scan
$ sudo apt install -y dvb-tools
$ ls /dev/dvb
adapter0  adapter1  adapter2
$ dvb-fe-tool -a 0 -d DVBC/ANNEX_A
Changing delivery system to: DVBC/ANNEX_A
$ dvb-fe-tool -a 0
Device Silicon Labs Si2168 (/dev/dvb/adapter0/frontend0) capabilities:
     CAN_2G_MODULATION
     CAN_FEC_1_2
     CAN_FEC_2_3
     CAN_FEC_3_4
     CAN_FEC_5_6
     CAN_FEC_7_8
     CAN_FEC_AUTO
     CAN_GUARD_INTERVAL_AUTO
     CAN_HIERARCHY_AUTO
     CAN_INVERSION_AUTO
     CAN_MULTISTREAM
     CAN_MUTE_TS
     CAN_QAM_16
     CAN_QAM_32
     CAN_QAM_64
     CAN_QAM_128
     CAN_QAM_256
     CAN_QAM_AUTO
     CAN_QPSK
     CAN_TRANSMISSION_MODE_AUTO
DVB API Version 5.11, Current v5 delivery system: DVBC/ANNEX_A
Supported delivery systems:
     DVBT
     DVBT2
    [DVBC/ANNEX_A]
Frequency range for the current standard:
From:            48.0 MHz
To:               870 MHz
Step:            62.5 kHz
```

ドライバーに問題なければ上記のように「DVBC/ANNEX_A」に設定できる。

設定できなければドライバに問題があるので「dmesg」コマンドで確認するか、前の項を確認しながら再度Kernelのビルドとインストールをする。

ついでに複数チューナー環境向けにadapter番号の固定化と、スタートアップにT230Aの" DVBC/ANNEX_A "設定を登録する。

```bash:T230A&#x20;adapter&#x20;Number&#x20;Lock&#x20;&&#x20;Add&#x20;Start&#x20;Up&#x20;T230A&#x20;Setting
$ sudo sh -c 'echo "options dvb_usb_dvbsky adapter_nr=0" > /etc/modprobe.d/dvb_usb_dvbsky.conf'
$ sudo vi /etc/rc.local

以下囲いの中身を" rc.local "の最後にある「exit 0」手前に追加
##########  rc.local  ##########
# DVB Device Adapter0 Set "DVBC/ANNEX_A"
dvb-fe-tool -a 0 -d DVBC/ANNEX_A

exit 0
########## --- END ---##########
```

さらに、ファームウェアも問題なければ以下のように「dvbv5-scan」でチャンネルスキャンできる。

チャンネルリストは自作したISDB-C(CATV向け)をgithubに上げてるので必要な方はそちらから

```bash:dvbv5-scan
$ git clone --depth=1 https://github.com/nisiharayosi/t230a_isdbc
$ cd t230a_isdbc
$ dvbv5-scan -C JP -a 0 -N ./dvbv5_channels_isdbc.conf
ERROR    command BANDWIDTH_HZ (5) not found during retrieve
Cannot calc frequency shift. Either bandwidth/symbol-rate is unavailable (yet).
Scanning frequency #1 93000000
       (0x00) Signal= -36.00dBm C/N= 28.25dB UCB= 353 postBER= 14.0x10^-3
Scanning frequency #2 99000000
Lock   (0x1f) Signal= -36.00dBm C/N= 29.50dB UCB= 353 postBER= 1.00
ERROR    dvb_read_sections: no data read on section filter
ERROR    error while reading the SDT table
WARNING: no SDT table - storing channel(s) without their names
Storing Service ID 421: '99.00MHz#421'
Storing Service ID 422: '99.00MHz#422'
Scanning frequency #3 105000000
Lock   (0x1f) Signal= -36.00dBm C/N= 30.00dB UCB= 353 postBER= 1.00
Service F|K\1G2h!\;~Be7`4K, provider F|K\1G2hJ|Aw3t<02q<R: digital television
Scanning frequency #4 173000000
       (0x00) Signal= -37.00dBm
～～～～～～～～～～  以下略  ～～～～～～～～～～
```

この時「dvbv5-scan」で出力された" dvb_channel.conf "は後程Mirakurunのチャンネルリストを作るときに使用します。

受信できているのを確認できればそのままチャンネルリストを使用してMirakurunにデバイス登録してEPGStation等で視聴可能

# Mirakurunのインストールとセットアップ(nodejs,pm2)

まずインストール前に必要なもののインストール

```bash:apt&#x20;Install
$ sudo apt install -y pcscd libpcsclite-dev build-essential libccid pcsc-tools dvb-tools ffmpeg python2.7 python3.5 python3.6
```

次にnodejsのリポジトリを登録してインストール後、pm2もインストール

```bash:nodejs&#x20;&&#x20;pm2&#x20;Install
$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt-get install -y nodejs
$ sudo npm install pm2 -g
```

次はMirakurunのインストール

```bash:Mirakurun&#x20;Install
$ sudo npm install mirakurun -g --production
$ sudo mirakurun init
$ sudo npm install arib-b25-stream-test -g --unsafe-perm
```

Mirakurunに必要なファイルのコピーと設定をする

```bash:Mirakurun&#x20;Setting
$ wget wget https://raw.githubusercontent.com/nisiharayosi/t230a_isdbc/main/dvbv5_channels_isdbc.conf
$ sudo cp ./dvbv5_channels_isdbc.conf /usr/local/etc/mirakurun/
$ sudo mirakurun config tuners

以下の囲いの中身を" tuners.yml "へ追加
########## tuners.yml ##########
- name: T230A
  types:
    - SKY
  command: dvbv5-zap -a 0 -c /usr/local/etc/mirakurun/dvbv5_channels_isdbc.conf -r -P <channel>
  dvbDevicePath: /dev/dvb/adapter0/dvr0
  decoder: arib-b25-stream-test
########## --- END ---##########
```

Mirakurunへのチャンネル追加のため[CATVデジタルチューナーT230を使う - にゃののん日記](https://nyanonon.hatenablog.com/entry/20200820/1597932000_1)を参考に自作したプログラムでチャンネルリストを作成します。

まず先ほどの「dvbv5-scan」で出力された" dvb_channel.conf "が存在するディレクトリに移動後「grep」コマンドでチャンネルスキャンできた受信可能なBSチャンネルの周波数を1つ抽出し、その周波数を「dvbv5-scan」に利用したチャンネルリストから探し出す。

```bash:BS&#x20;channel&#x20;search
$ cd t230a_isdbc
$ grep -m 1 -A 8 "NETWORK_ID = 4" ./dvb_channel.conf | grep FREQUENCY
FREQUENCY = 563000000
$ grep -C1 563000000 ./dvbv5_channels_isdbc.conf
[28]
        FREQUENCY = 563000000
        SYMBOL_RATE = 5274000
```

受信可能なBSチャンネルが一つ見つかったら「dvbv5-zap」コマンドで90秒ほど記録し.tsファイルに出力
記録時間は" -t "オプションの後に秒数で指定

```bash:TS&#x20;Rec
$ dvbv5-zap -C JP -a 0 -c ./dvbv5_channels_isdbc.conf -r -P 28 -t 90 -o 28.ts
using demux 'dvb0.demux0'
reading channels from file './dvbv5_channels_isdbc.conf'
tuning to 563000000 Hz
pass all PID's to TS
  dvb_set_pesfilter 8192
dvb_dev_set_bufsize: buffer set to 6160384
       (0x00)
Lock   (0x1f) Signal= -44.00dBm C/N= 31.00dB UCB= 2 postBER= 0
Lock   (0x1f) Signal= -44.00dBm C/N= 31.00dB UCB= 2 postBER= 0
Record to file '28.ts' started
received 218812448 bytes (3561 Kbytes/sec)
Lock   (0x1f) Signal= -44.00dBm C/N= 30.25dB UCB= 2 postBER= 0
```

cソースをコンパイルするために「gcc」をインストール後、先ほどgit cloneした" t230a_isdbc "ディレクトリに入ってコンパイル

```bash:gcc&#x20;compile
$ sudo apt install -y gcc
$ cd t230a_isdbc
$ gcc ts_ch_dect.c -o ts_ch_dect
```

コンパイルされた実行ファイルにオプションで先ほど「dvbv5-scan」や「dvbv5-zap」で利用したチャンネルリスト" dvbv5_channels_isdbc.conf "と記録した.tsファイルを引数に指定して実行

そのまま出力するとチャンネル名が文字化けするので「nkf --ic=CP932」で適度に変換して" ch.txt "に出力する。

" ch.txt "が出力されたら「cat ch.txt」で中身を確認する
この時チャンネル名称部が" - name:　unkoun"になっているものが存在する場合は、tsファイルの記録時間が短いなどが原因でチャンネル名を拾いきれてないので再度「dvbv5-zap」で時間を＋30秒ほどして記録する。

なおこのプログラムで出力されるチャンネルリストは無料もしくは有料で視聴可能な番組配信チャンネルのみで、データ放送専用(株価チャンネル等)は除外されています。

```bash:channels&#x20;list&#x20;output
$ ./ts_ch_dect -t SKY -c ./dvbv5_channels_isdbc.conf ./28.ts | nkf --ic=CP932 > ch.txt
$ cat ch.txt
- name: ＢＳ－ＴＢＳ
  type: SKY
  channel: '40'
  isDisabled: false
  serviceId: 161
- name: ＢＳテレ東
  type: SKY
  channel: '41'
  isDisabled: false
  serviceId: 171
- name: ＷＯＷＯＷプライム
#########以下略#########
```

このプログラムはMirakurunのチャンネルリストフォーマットで出力するようにしているので中身が問題なければ設定ファイルのディレクトリへ名前を変えてコピーして再起動

```bash:channels&#x20;list&#x20;output
$ sudo cp ./ch.txt /usr/local/etc/mirakurun/channels.yml
$ sudo mirakurun restart
```

ここまで終わればVLCなどネットワーク対応のメディアプレイヤーからMirakurunのAPIを叩いてBS視聴可能

# EPGStationのインストールとセットアップ(nodejs,pm2)

EPGStationは公式のドキュメント通りにすれば基本問題ない

```bash:EPGStation&#x20;Install
$ git clone https://github.com/l3tnun/EPGStation.git
$ cd EPGStation
$ npm run all-install
$ sudo npm run build
$ cp config/config.yml.template config/config.yml
$ cp config/operatorLogConfig.sample.yml config/operatorLogConfig.yml
$ cp config/epgUpdaterLogConfig.sample.yml config/epgUpdaterLogConfig.yml
$ cp config/serviceLogConfig.sample.yml config/serviceLogConfig.yml
$ cp config/enc.js.template config/enc.js
```

EPGStationの起動とpm2を利用した自動起動設定

```bash:pm2&#x20;Startup
sudo pm2 startup
pm2 start dist/index.js --name "epgstation"
pm2 save
```

これでしばらく(10~20分くらい？)放置するとチャンネル情報や番組表をMirakurunが取得更新してくれて、EPGStationにも反映され視聴可能になる。

初めのうちはチャンネル情報や番組表が取得できてEPGStationに表示されているのに視聴や録画予約できないことがあるが、ラズパイ自体を何度か再起動すると落ち着いて以降視聴や録画予約ができるようになる。

# 後書き的なもの

当環境ではBS11が受信できないがBS日テレの録画に貢献してくれているので引っ越さない限りはT230Aを運用していくと思います。