e-tipsmemo

ごった煮

Ubuntu 22.04 amdgpu driver install for ffmpeg with AMF

Ubuntu 22.04にAMFを使用したffmpegでのエンコード環境を構築しようとした。

インストール

Linux® Drivers for AMD Radeon™ and Radeon PRO™ Graphics | AMD

Ubuntu 22.04なのでそれを入れる。

sudo apt install ./amdgpu-install_5.4.50403-1_all.deb

第705回 Radeon Software for Linuxを使用する[2022年版] | gihyo.jp
Radeon™ Software for Linux® Installation — amdgpu graphics and compute stack unknown-build documentation

amdgpu-installとかいうコマンドが使えるようになっていて
それを打つだけ。

ffmpegをビルドする

AMD VCE 対応の ffmpeg をつくる | ニコラボ
ffmpegでハードウェアエンコード (Intel, AMD, NVIDIA) - Qiita

./ffmpeg -encoders | grep AMF

でなんか出たらOKなはず


無事にAMF enableなffmpegを用意できた気がする(試していない)

GUIが壊れた

UbuntuGUIが壊れて、ログインすると
「あれっ!何かおかしいです。」という表示がでるようになった。
(ログインできないこともある)

sshはつながる

解決策

amdgpuをアンインストールする

amdgpu-uninstall

結果

cpuエンコードでKonomiTVを運用することにした。
Ryzen5 7600XはHWエンコードを使用しなくてもKonomiTVの運用にまったく支障がない。
(i7 6700を使用していたときよりもスムーズ)
mirakcを使用しているからなのかもしれない。

画質1080p 60fpsでの視聴をしているとき

Ubuntu 22.04 LTS on Zynq with Petalinux

前回Zynqにpetalinuxで生成されたいろいろなものを書き込んで
起動できた記事を書いた。

しかしrootfsがbusyboxベースであったので、使い勝手が悪いんじゃないかと思い
Ubuntuやその他軽量なものを入れられるかを試してみる。
(petalinuxはあんまり関係なかった)

やったことは以下の記事と同じだが、今回は追加の手順を書いておく
(ネットワークや開発に便利そうなところ)
e-tipsmemo.hatenablog.com

とりあえず起動

上の手順をやったらUbuntu 22.04 LTSが起動した

sudoers

手順内で追加したユーザーはsudoではないので
rootに代わってsudoに入れておく。

root@ubuntu:/home/petalinux# usermod -G sudo petalinux
root@ubuntu:/home/petalinux# id petalinux
uid=1000(petalinux) gid=1000(petalinux) groups=1000(petalinux),27(sudo)

どうやら再起動が必要な様子?

ネットワーク

e-tipsmemo.hatenablog.com
昔はMDIOがつながっていなかったりしていたが、Vivadoを確認したところ
デフォルトでMDIOが設定されていた。

記事同様にeth0を起動する必要がある

sudo ip link set eth0 up

ipv4ではないので普通だとつながらないが
ipv6はつながっている

petalinux@ubuntu:~$ ping6 2404:6800:4004:822::200e -c 3
PING 2404:6800:4004:822::200e(2404:6800:4004:822::200e) 56 data bytes
64 bytes from 2404:6800:4004:822::200e: icmp_seq=1 ttl=57 time=2.99 ms
64 bytes from 2404:6800:4004:822::200e: icmp_seq=2 ttl=57 time=2.85 ms
64 bytes from 2404:6800:4004:822::200e: icmp_seq=3 ttl=57 time=3.04 ms

--- 2404:6800:4004:822::200e ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 2.851/2.959/3.038/0.079 ms

ipv4の有効化

network:
 version: 2
 renderer: networkd
 ethernets:
     eth0:
      dhcp4: yes
petalinux@ubuntu:~$ sudo netplan apply

で構文チェック。
インデントがタブだと怒られるのでスペース1個にした。

その後、

WARNING: systemd-networkd is not running, output will be incomplete.

Failed to reload network settings: No such file or directory
Falling back to a hard restart of systemd-networkd.service

と言われてしまった

networkdを起動する

petalinux@ubuntu:~$ sudo systemctl enable systemd-networkd
[sudo] password for petalinux:
Created symlink /etc/systemd/system/dbus-org.freedesktop.network1.service → /lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-networkd.service → /lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/sockets.target.wants/systemd-networkd.socket → /lib/systemd/system/systemd-networkd.socket.
Created symlink /etc/systemd/system/sysinit.target.wants/systemd-network-generator.service → /lib/systemd/system/systemd-network-generator.service.
Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service → /lib/systemd/system/systemd-networkd-wait-online.service.
petalinux@ubuntu:~$
petalinux@ubuntu:~$ sudo netplan apply

ipv4もOK

petalinux@ubuntu:~$ ping -c 3 google.com
PING google.com(nrt13s52-in-x0e.1e100.net (2404:6800:4004:823::200e)) 56 data bytes
64 bytes from nrt13s52-in-x0e.1e100.net (2404:6800:4004:823::200e): icmp_seq=1 ttl=57 time=3.19 ms
64 bytes from nrt13s52-in-x0e.1e100.net (2404:6800:4004:823::200e): icmp_seq=2 ttl=57 time=2.65 ms
64 bytes from nrt13s52-in-x0e.1e100.net (2404:6800:4004:823::200e): icmp_seq=3 ttl=57 time=2.77 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 2.646/2.867/3.185/0.230 ms
petalinux@ubuntu:~$

LED点滅

devmemだと前回と同じなのでRustでmemmap2をつかって書く。
zynq上でビルドするのは遅いので、WSL2でクロスコンパイルする。
下準備

rustup default nightly && rustup update
cargo install cross
cargo new hello --bin
cd hello
cross build --target armv7-unknown-linux-gnueabihf

どうやらdockerがないとcrossは使えないらしい

info: downloading component 'rust-std' for 'armv7-unknown-linux-gnueabihf'
info: installing component 'rust-std' for 'armv7-unknown-linux-gnueabihf'
 26.9 MiB /  26.9 MiB (100 %)  12.9 MiB/s in  1s ETA:  0s
Error:
   0: `docker` failed with exit status: 1

Stdout:
   The command 'docker' could not be found in this WSL 2 distro.
   We recommend to activate the WSL integration in Docker Desktop settings.

   See https://docs.docker.com/docker-for-windows/wsl/ for details.

WSL2にDockerを入れてやり直した。

~/d/r/z/devmem-rs (master)> cross build --target armv7-unknown-linux-gnueabihf
   Compiling libc v0.2.139
   Compiling io-lifetimes v1.0.4
   Compiling rustix v0.36.7
   Compiling memmap2 v0.5.8
   Compiling is-terminal v0.4.2
   Compiling clap v4.1.4
   Compiling devmem-rs v0.1.0 (/project)
    Finished dev [unoptimized + debuginfo] target(s) in 6.30s

scpで転送して点いた(devmem2とだいたい同じフォーマットにしてある)
memmap2に関しては別記事で書く。

感想

XSDKをまったく使わずにアプリ開発できそうなのは良い
デバイスドライバとかを書いてみたいが
それらしいHDLを書く必要がある

Ubuntu 22.04 LTS 録画サーバー (3)Mirakc

e-tipsmemo.hatenablog.com

Mirakurunで構築したが、pid高速増加の原因がわからなかったので、
代替方法を調べていた。
Rustでの実用アプリ作成の練習として、実装したいかも、とおもって調べたらMirakcというのがすでに存在していた。
基本的なAPIは互換性があるらしいのでdockerで入れるだけで置き換えられそう。

GitHub - mirakc/mirakc: A Mirakurun-compatible PVR backend written in Rust

mirakc docker

Mirakurunと違ってconfigファイルが1つにまとまっている。

視聴コマンドは適宜置き換える必要があり

tuners:
  # Add tuners available on a local machine.
  - name: Tuner0
    types: [GR]
    command: >-
      recpt1 --device /dev/px4video2 {{{channel}}} - -

mirakc-docker版のイメージにはシングルバイナリのrecpt1が入っている(b25がdisableである)
b25をenableでビルドしたものを使いたい場合は、外からコピーするか、
中で再ビルドする必要がある(いろいろインストールしないといけない)

この再ビルドのために、mirakcのイメージはdebian版を使用することにした
(alpineだといろいろ足りなかった)

services:
  mirakc:
    image: docker.io/mirakc/mirakc:debian
    container_name: mirakc
    init: true
    restart: unless-stopped
    ...(以下サンプルと同じ)

起動

docker compose V2なら問題なく起動できた。
Mirakurunが先にdockerで動いているとポートが競合するので停止しておく。
mirakurunと違って、Tuner管理画面GUIがないので(真っ白なページがある)
コマンドで起動したか確認する。

curl -fsSL http://localhost:40772/api/version
{"current":"1.0.79","latest":"1.0.79"}

チャンネルスキャンはやってない(できるんじゃ)
(mirakurunのほうでチャンネル番号はわかっていたので。。)

TVTestから見るときは、Bondriver_mirakcが必要(≠Bondriver_mirakurun)
mirakurun互換なのでKonomiTVも動く

WSL2 fish shell petalinux

Petalinuxは昔は避けていたのだが、どこを検索してもそれしか出てこなくなってしまったので
とりあえずやっていこうと思う。

環境は
WSL2(fishがログインシェル)

インストール

これ通りに行えばOK
WSL2ではPetalinuxが使えるみたいです - Qiita

fishでPathを通す

fishだとsource settings.shできないので、

bash --noprofile --norc
printenv

環境変数をいじってない状態と、

source settings.sh
printenv

環境変数いじった後の状態を比較して、差分をconfig.fishに入れた
だいたい以下のようなパスを通して、環境変数を追加すればfishでも動く

set -x PETALINUX_MAJOR_VER "2022"
set -x PETALINUX_VER "2022.2"
set -x PETALINUX "{インストールしたところ}"
set -x XSCT_TOOLCHAIN "{インストールしたところ}/tools/xsct"
set -x PATH {インストールしたところ}/tools/xsct/petalinux/bin $PATH
set -x PATH {インストールしたところ}/tools/common/petalinux/bin $PATH
set -x PATH {インストールしたところ}/tools/xsct/gnu/microblaze/lin/bin $PATH
set -x PATH {インストールしたところ}/tools/xsct/gnu/armr5/lin/gcc-arm-none-eabi/bin $PATH
set -x PATH {インストールしたところ}/tools/xsct/gnu/aarch64/lin/aarch64-linux/bin $PATH
set -x PATH {インストールしたところ}/tools/xsct/gnu/aarch64/lin/aarch64-none/bin $PATH
set -x PATH {インストールしたところ}/tools/xsct/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin $PATH
set -x PATH {インストールしたところ}/tools/xsct/gnu/aarch32/lin/gcc-arm-none-eabi/bin $PATH
petalinux-create -h

などでヘルプが出ればOK

XSA生成

Vivadoでシンプルな構成を作成
Generate bitstreamしてExport HDFする
Petalinuxを動かしてみる - Petalinux をビルドする | 株式会社ピクセラ

LEDもつけとく

ビルド手順は参考サイト通りにすればOK

WSL2上でもちゃんとマルチコアビルドしてくれている

BOOT.BINとimage.ubが生成されればOK

Kernel Panic

SDカードをFAT32ext4に切って、それぞれにいくつかのファイルを配置する。
起動後、
[ end Kernel panic - not syncing: No working init found.
のようなエラーが出るときはext4の内部からinitを読み込めなかったのでそこがおかしくなっている
KERNEL PANIC on TRD Vivado default petalinux config · Issue #146 · Xilinx/Vitis-AI · GitHub

誤解していたのはext4ファイルシステムを"展開する"ということだった
(rootfs.tar.gzを置くだけではだめ)

sudo tar xf rootfs.tar.gz -C /media/username/ROOT/

LEDを点灯

Linuxが起動したら
devmemでLEDを点灯してみる
→点かなかった
VivadoのBlock diagramを確認すると、Tri-state IOのまま

AXO GPIOのレジスタマップを確認すると、
LogiCORE IP AXI GPIO (v1.01b) Data Sheet (AXI) - 1.01b English

オフセット+4のところにIOの方向を決めるレジスタがある

そこを読んでみる。

なので、全ポートInputに設定されていた。

0を書き込んで、出力ポートに設定したら、

sudo devmem 0x41200000 b 0x1

で1つのLEDだけが点灯した。

感想

petalinuxを使ったほうがlinuxの準備が簡単だった
大昔にdevice-treeとかXSDKとかいろいろあったがあれらが全部統合された様子。
あとはWSL2でも簡単にext4が扱えれば仮想Ubuntuを起動しなくて済むはず
しかしpetalinuxはbusyboxベースなのでちょっと物足りない
(実機でいろいろできないとデバッグするとき大変そう)
root filesystemだけ入れ替えればいいのかもしれない。

Ubuntu 22.04 LTS 録画サーバー (2) Mirakurun

recpt1を正しく動作させることができたが
docker版mirakurunを入れたらバージョン違いで動かなかったり必要な共有ライブラリがなかったりなどいろいろあった。

とりあえずmirakurunを入れる

Mirakurun

Mirakurun/Platforms.md at master · Chinachu/Mirakurun · GitHub
を参考に、

mkdir ~/mirakurun/
cd ~/mirakurun/
wget https://raw.githubusercontent.com/Chinachu/Mirakurun/master/docker/docker-compose.yml

PT3ではない場合

- /dev/dvb:/dev/dvb

があるとエラーが出るのでコメントアウトした。

docker内からpx4のデバイスが見えるように以下を追加

      - /dev/px4video0:/dev/px4video0
      - /dev/px4video1:/dev/px4video1
      - /dev/px4video2:/dev/px4video2
      - /dev/px4video3:/dev/px4video3
      - /dev/px4video2:/dev/px4video4
      - /dev/px4video3:/dev/px4video5
      - /dev/px4video2:/dev/px4video6
      - /dev/px4video3:/dev/px4video7
docker-compose pull
docker-compose run --rm -e SETUP=true mirakurun
docker-compose up -d

sudoはいらない

正しく立ち上がると以下のようになる

curl -o - http://localhost:40772/api/version
{"current":"3.9.0-rc.2","latest":"3.9.0-rc.2"}

/opt/mirakurun/config/tuners.yml

こんな形に書き換えて
チューナーの個数分書く。

- name: PX_T4
   types:
     - GR
   command:  (recpt1のコマンド)
   isDisable: false

Config内のTunersで確認できる。

Configを書き換えたら、MirakurunのWeb管理画面の右上のRestartをする

docker logs mirakurun

で no available tuners とかがでていると、
recpt1が正しく動いていないかconfig.ymlの記述が間違ってたりする。

recpt1再ビルド

recpt1が正しく動いていない理由の1つに、
共有ライブラリが足りないとかバージョン違いとかという問題があった。

docker exec -it mirakurun bash
ldd recpt1

最新のrecpt1を使いたいが、
GLIB~~のような文言や、not foundといった文字列がある。

./recpt1: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./recpt1)
./recpt1: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./recpt1)
./recpt1: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./recpt1)
        linux-vdso.so.1 (0x00007ffcddde0000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3738b21000)
        libarib25.so.0 => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3738960000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3738cbb000)

docker版mirakurun内部でrecpt1やlibarib25その他を前の記事と同じ手順でビルドしなおした

docker exec -it mirakurun bash

で中に入っていろいろとapt installすれば手順は同じ

動作確認としてmirakurunのdocker内で、recpt1コマンドを直接打つことで録画ができることを確かめる。

channel/scan

curl -X PUT "http://localhost:40772/api/config/channels/scan"

https://www.maspro.co.jp/contact/channel.pdf
にあるチャンネル番号が出てくるはず。
(出てこないときは、電波が弱かったりする)

電波が弱い例

./checksignal --device /dev/px4video7 <channel>

これは実際の電波が弱いわけではなく、
地デジとBSを混合した電波を分波せずに、
PLEXチューナーの地デジのところへ直接入力するとなぜかチャンネル16の電波が弱く見える現象
ちゃんと分波器を通してから地デジ入力すると、信号強度は正しくなる。

EPGstation

レポジトリ通りにやる
EPGStation/linux-setup.md at master · l3tnun/EPGStation · GitHub

config/config.yml

のmirakurunPathを書き換える

pm2で自動起動できるようにする。

configを書き換えたら

pm2 restart epgstation

で再起動する。

視聴確認

LANの別PC(Windows)から、Bondriver_mirakurunを入れたTVTestを使用して視聴する。
うまくいけばMirakurunのTuner管理画面で、Tunerがrecpt1によって占有されているのが見えるし、TVTestで視聴ができる。(この時は視聴できた)

問題

その後数日放置していると、TVTestを起動しても、Tuner管理画面のrecpt1プロセスが起動してはkillされるというのが高速で繰り返されることにより、視聴ができない現象が発生。(pidが高速で増加していく)
ログを見ても不明なので、別の対応策を考えることにした。→mirakc編

ここ最近dockerでごちゃごちゃやっていたが、
dockerは依存ライブラリをコンテナ内部で完結させられるからほかのアプリからの依存を気にしなくていいのが良いのだと思った。
しかし中身は最小限の環境が好まれるっぽいので(alpine linuxなどをベースにしている)、recpt1のようないろんな共有ライブラリを使用するアプリと相性がわるいのではないかという気がしてきた。
(シングルバイナリのrecpt1はないのかな?)

Zybo Z7を買いなおした

zynq 7010のZyboを持っていたが、知り合いに売った。
だがまたFPGAをいじりたくなったのでZynq 7020のZyboを購入した

このZYBOを持ってない間にXIlinxAMDに買収されたりなどしていたが
ソフトウェアはマシになっているのだろうか?

検索

Zynqレベルの組み込みをターゲットとしたXilinx FPGAに関する情報が2022年のものでほとんどないような気がする。(特に日本語)
英語でもVivado 2020を使用していたりと不安
とりあえずVivado 2022をインストールしてみる

Vivado 2022 installation

VitisとかいうのがVivadoを包含しているらしいのでVitisをインストールする

昔の通りアカウント情報を入力することでダウンロード&インストールができる。

インストール選択画面で、全部にチェック項目があると220GBも容量を要求してきたので相変わらず
だなと思った。

AlveoとかいうPCIeに接続する感じのHWアクセラレータ関連をOFFしたら要求容量が80GB程度になった。
ついでにUltrascaleとか高そうなデバイスのもOFFにしておく。

これで60GBぐらいになった。

10個ぐらいの”I Agree”にチェックマークを入れて
Cドライブにインストール。

SSDに入れたほうが後々コンパイルが速いと思う。

プロジェクト作成

まぞはHelloWorldから?
いつも通りCreate Projectでファイルやらなんやらを追加していく

Board fileがオンラインでダウンロードできるようになっているのは驚いた。

LED点灯


module main(
    input clk,
    output[3:0] led
    );
    
    wire clk;
    wire[3:0] led;
    
    reg[26:0] counter = 0;
    assign led[3:0] = counter[26:23];
    
    always@(posedge clk)begin
        if(counter == 125000000-1)begin
            counter <= 0;
        end begin    
            counter <= counter + 1;
        end
    end
endmodule

いろいろ用意して、Synth後に、Window→I/O portでGUI設定

Generate bitstreamして
点滅

Ubuntu 22.04 LTS 録画サーバー (1)recpt1

e-tipsmemo.hatenablog.com

以前作ったサーバーでついでに録画を行いたいと考えている。

必要なもの

チューナー

px-q3pe5を買った(表示はw3pe5)

BCASカード

カードリーダー

内臓カードリーダーは不安定だとかなんだとか・・
安定性とかを考えて適当に

柔らかいほうはこれ以降の手順の前に
libpcsckai.soを準備しなければならない
(ビルドにライブラリを使用するので)

カードリーダーが認識されていないと、

$ pcsc_scan
Using reader plug'n play mechanism
Scanning present readers...
Waiting for the first reader...

と出る。
pcscdサービスを再起動する。

sudo service pcscd restart

正しくカードリーダーが認識されると、

Sun Jan 15 20:58:50 2023
 Reader 0: NEC Corp. [CCID Interface] (xxxxxxxxxxxxxx) 00 00
  Event number: 7
  Card state: Card inserted, Unresponsive card,
/

のような状態になる。
(何かしらが差し込まれているが、認識されていない状態)

カードは裏面が上になるように差し込む。

Sun Jan 15 20:58:58 2023
 Reader 0: NEC Corp. [CCID Interface] (xxxxxxxxxxxxxx) 00 00
  Event number: 8
  Card state: Card removed,

Sun Jan 15 20:59:01 2023
 Reader 0: NEC Corp. [CCID Interface] (xxxxxxxxxxxxxx) 00 00
  Event number: 9
  Card state: Card inserted,
  ATR: xx xx xx xx xx xx xx .....

カードをうまく差すと16進数がたくさん出たり
メッセージがたくさん出る

recpt1ビルド

GitHub - stz2012/recpt1: PT1/PT2/PT3をLinuxで使う為の録画ツール(STZ版)
をクローンしてReadme通りにビルド

cd recpt1/recpt1
./autogen.sh
./configure --enable-b25
make

とりあえずインストールはしないでおく

libarib25ビルド

git clone https://github.com/stz2012/libarib25.git
cd libarib25
cmake .
make
sudo make install

録画テスト

recpt1をビルドしたところで

./recpt1 --b25 --stripe --sid hd 27 10 test.ts

で録画できるtsファイルをVLCなどで見てみる。
sid hdでフルセグ録画を指定している
これを指定しないと、画質が荒いワンセグを録画してしまっている可能性がある。
また、再生しても画面が真っ暗なのは、デコードに失敗しているので、
カードの接触や、libarib25のCMakeList.txtの編集を間違えている可能性がある。

チャンネルは
https://www.maspro.co.jp/contact/channel.pdf
を参照

まとめ

recpt1がうまく動いてくれれば、あとはmirakurunはそれをたたくだけということになるが、
Docker版だといくつかエラーがある。

Ubuntu22.04のglibが新しすぎて、docker版mirakurun内のglibとバージョン違いで動かなかったり
libarib25をいじったりするとarib25-stream-testと参照しているものを変更したくなったりといろいろと面倒なことがある。