Rock64で録画サーバ(カーネルビルドまで)

この記事はロボPアドベントカレンダー25日目の記事です.

遅れました!!すみません!!

年末に向けてRock64で録画サーバを組み直したので作業記録です.なおカーネルビルドまでしたので長くなってます.

Rock64とは

https://www.pine64.org/?page_id=7147

ざっくりいうとRaspberryPiの完全な上位互換です.
今回購入したのはメモリ1GBのモデルになります.
Rock64は秋月電子,電源ケーブルは千石電商で購入しました.外径3.5mm,内径1.35mmは家になかった…

USB3.0があります.

IRっぽいやつもあるのでしばらく遊べそうです.

セットアップ(Debian)

日本語の情報があんまりなかったので書いておきます.
今回は録画サーバにするのでOSはDebianにしましたがWikiを見る限り他にもたくさん選べるみたいです.


imgを落としてetcherなどでsdに書き込みます.RaspberryPiとかと同じですね.

デフォルトでsshが有効になっていました.

録画サーバ

今回はPX-S1UD V2.0とカードリーダ,BCASカードを用意しました.

実は過去に同じようなことをしています…まあ3年前だしいろいろ変わってるよねってことで.

チューナ

巷で聞いた話だとブラジルとかのチューナが地デジ対応してるらしいですね.今回は余裕なかったのでAmazonでplex買っちゃったけど.

$ lsusb | grep VidzMedia
Bus 001 Device 002: ID 3275:0080 VidzMedia Pte Ltd 

V2.0ですがV1.0のファームで動きます.

$ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
$ sudo apt install unzip
$ unzip PX-S1UD_driver_Ver.1.0.1.zip
$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/

カードリーダ

焼きそばダメゼッタイ.gemaltoのやつはロットが変わったみたいで動いたり動かなかったりしたのでnttcomのやつに買い替えました.

$ lsusb |grep SCR
Bus 003 Device 002: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
$ sudo apt install pcscd libpcsclite-dev libccid pcsc-tools

B-CASを認識していればメッセージがでます.

$ pcsc_scan
PC/SC device scanner
V 1.4.27 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.8.17
Using reader plug'n play mechanism
Scanning present readers...
0: SCM Microsystems Inc. SCR 3310 [CCID Interface] (53311641707064) 00 00

    Japanese Chijou Digital B-CAS Card (pay TV)

arib25

ところでsoftarib25とかいう代物もあるみたいですね…

$ sudo apt install pkg-config
$ wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
$ unzip c44e16dbb0e2.zip
$ cd pt1-c44e16dbb0e2/arib25
$ make
$ sudo make install

recdvb

本家からforkしたものがあったので使ってみます.

$ git clone https://github.com/qpe/recdvb.git
$ sudo apt install autoconf automake
$ ./autogen.sh
$ ./configure --enable-b25
$ make
$ sudo make install

録画テスト

$ recdvb --b25 --strip --sid hd 26 10 test.m2ts

あれデバイスが開けない…

$ dmesg
[    4.905103] mali-utgard ff300000.gpu: Looking up mali-supply from device tree
[    4.905374] mali-utgard ff300000.gpu: Failed to get leakage
[    4.911158] mali-utgard ff300000.gpu: Looking up mali-supply from device tree
[    4.911233] vdd_logic: could not add device link ff300000.gpu err -17
[    4.911248] vdd_logic: Failed to create debugfs directory
[    4.911267] mali-utgard ff300000.gpu: Failed to get pvtm
[    4.923103] Mali: Mali device driver loaded
[    4.982722] smsusb:smsusb_probe: board id=18, interface number 0
[    4.987044] smsusb:smsusb_init_device: smscore_register_device(...) failed, rc -12
[    4.991505] smsusb:smsusb_probe: Device initialized with return code -12
[    5.010369] smsusb: probe of 4-1:1.0 failed with error -12
[    5.014639] usbcore: registered new interface driver smsusb

ほーんって感じですね.バグの匂いがプンプンするぜ

ということで構築できなかったので調査中です.たぶんsianoのドライバのバグだよね…

追記 ここからが本題

patchが出てたので当ててみようと思います.あんまり詳しくないので誰か教えて.

カーネルビルド

VirtualBoxにたってるUbuntu 16.04 LTSでクロスコンパイルしました.
とりあえずhome以下にkernelというフォルダを作ってその中で作業しました.

$ mkdir ~/kernel
$ cd ~/kernel

続いてKernelのソースを持ってきます.--depth=1でもってこないと大変なことになるので注意.

$ git clone --depth=1 https://github.com/ayufan-rock64/linux-kernel

bcというコマンドが必要らしいです.
https://unix.stackexchange.com/questions/439482/why-is-bc-required-to-build-the-linux-kernel

$ sudo apt install bc
$ sudo apt-get install gcc-aarch64-linux-gnu

patchを当てます.

$ wget -O siano.patch https://patchwork.kernel.org/patch/10256121/raw/
$ cd linux-kernel/
$ patch -p1 < ../siano.patch
patching file drivers/media/common/siano/smscoreapi.c
Hunk #1 succeeded at 637 (offset 6 lines).
Hunk #2 succeeded at 697 (offset 6 lines).
Hunk #3 succeeded at 731 (offset 6 lines).
Hunk #4 succeeded at 1243 (offset 6 lines).
patching file drivers/media/common/siano/smscoreapi.h
patching file drivers/media/usb/siano/smsusb.c
Hunk #1 succeeded at 161 (offset -18 lines).
Hunk #2 succeeded at 434 (offset -11 lines).

コンフィグを作ります.

$ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make rockchip_linux_defconfig
$ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make menuconfig

python必要っぽいので入れました.

$ sudo apt install python

Makefileに名前を書いておきました.

$ vi Makefile
EXTRAVERSION = ayushio

ビルドします.ジョブの数を選択できるのですが一応マルチコアなので5に設定しました.コア数+1がいいよっていう書き込みをみた.

$ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j5

ビルドできたらRock64のインストール済みSDの中にできたものを突っ込みます.Rock64のパーティション構成はちょっと独特です.

$  lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                     8:0    0   40G  0 disk 
├─sda1                  8:1    0  731M  0 part /boot
├─sda2                  8:2    0    1K  0 part 
└─sda5                  8:5    0 39.3G  0 part 
  ├─ubuntu--vg-root   252:0    0 38.3G  0 lvm  /
  └─ubuntu--vg-swap_1 252:1    0  980M  0 lvm  [SWAP]
sdb                     8:16   1 14.9G  0 disk 
├─sdb1                  8:17   1  3.9M  0 part 
├─sdb2                  8:18   1   64K  0 part 
├─sdb3                  8:19   1    4M  0 part 
├─sdb4                  8:20   1    4M  0 part 
├─sdb5                  8:21   1    4M  0 part 
├─sdb6                  8:22   1  112M  0 part 
└─sdb7                  8:23   1 14.7G  0 part 
sr0                    11:0    1 1024M  0 rom  
sr1                    11:1    1 1024M  0 rom 
$ sudo mount /dev/sdb7 /mnt/sd
$ sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt/sd modules_install
$ sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_PATH=/mnt/sd/boot/ install
$ sudo cp arch/arm64/boot/dts/rockchip/*.dtb /etc/flash-kernel/dtbs/

ここでSDをRock64に挿して起動し,kernelを選択します.

$ sudo flash-kernel --force 4.4.154ayushio-g61b4b11-dirty
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
Warning: root device  does not exist
Using DTB: rk3328-rock64.dtb
Installing /etc/flash-kernel/dtbs/rk3328-rock64.dtb into /boot/dtbs/4.4.132-1075-rockchip-ayufan-ga83beded8524/rk3328-rock64.dtb
Installing new rk3328-rock64.dtb.
Ignoring old or unknown version 4.4.132-1075-rockchip-ayufan-ga83beded8524 (latest is 4.4.154ayushio-g61b4b11-dirty)
Use --force if you want version 4.4.132-1075-rockchip-ayufan-ga83beded8524.
Installing /etc/flash-kernel/dtbs/rk3328-rock64.dtb into /boot/dtbs/4.4.154ayushio-g61b4b11-dirty/rk3328-rock64.dtb
Taking backup of rk3328-rock64.dtb.
Installing new rk3328-rock64.dtb.
flash-kernel: installing version 4.4.154ayushio-g61b4b11-dirty
Installing new Image.
Installing new initrd.img.
Installing new dtb.
$ sudo vi /boot/extlinux/extlinux.conf

こんな感じに編集しておきました.

timeout 10
menu title select kernel

label kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524
    kernel /boot/vmlinuz-4.4.154ayushio-g61b4b11-dirty
    initrd /boot/initrd.img-4.4.154ayushio-g61b4b11-dirty
    devicetreedir /boot/dtbs/4.4.154ayushio-g61b4b11-dirty
    append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4

label kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524
    kernel /boot/vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
    initrd /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
    devicetreedir /boot/dtbs/4.4.132-1075-rockchip-ayufan-ga83beded8524
    append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4

label kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524-memtest
    kernel /boot/vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
    initrd /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
    devicetreedir /boot/dtbs/4.4.132-1075-rockchip-ayufan-ga83beded8524
    append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4 me$

これでrebootしましょう!

$ sudo reboot

やったあ!

$ uname -a
Linux rock64 4.4.154ayushio-g61b4b11-dirty #1 SMP Fri Dec 28 12:43:10 JST 2018 aarch64 GNU/Linux
$  dmesg | grep sms
[    7.224776] smsusb:smsusb_probe: board id=18, interface number 0
[    7.776826] smsmdtv:smscore_init_ir: IR port has not been detected
[    7.781328] smsusb:smsusb_probe: Device initialized with return code 0
[    7.827547] smsdvb:smsdvb_hotplug: DVB interface registered.
[    7.833243] usbcore: registered new interface driver smsusb

$ recdvb --b25 --strip 26 10 test.m2ts
using B25...
enable B25 strip
pid = 1110
device = /dev/dvb/adapter0/frontend0
Using DVB card "Siano Mobile Digital MDTV Receiver"
tuning to 551143 kHz
polling..ok
STRENGTH: 0

Recording...
Recorded 10sec

パッチ作ってくれた人に感謝ですね.
Chinachuのインストールなどをしておしまいです.この辺は公式を見ましょう.

ではまた.