目次

Android TV Box Transpeed 8k618-t 構築メモ

Android TV BoxのLinux化について、導入の容易さ、ネットの情報量からするとAmlogicが断トツ一番。
安価なAndroid TV Boxを探すと、RockChip, AllWinner となる。
シングルボードコンピュータとしては、私の知っているところで、
RockChipは Radxa Rock
OrangePi/BananaPi はシリーズによって、RockChip製とAllWinner製が販売。

Armbian Communityでは、TV BoxとしてAmlogic製が対応CPUが多い。
RockChip製は、RK322X系のTVBOXのがメンテナンスされているようだ。

今回選定した、Transpeed 8k618-t は、Amlogic製以外でRockChip製かAllWinner製のTVBoxをLinux化している有志の方々がいないかな?と思い、フォーラムを見ていた。

How to install armbian in h618?
https://forum.armbian.com/topic/29794-how-to-install-armbian-in-h618/

安価なTVBoxの購入時に注意する事

・クローン製品(正規販売品の模倣製品)
 CPUは同じだが、HDMI/Network系/BluetoothのICが異なっていたりする。本家ファームウェアではなく、模倣品のファームウェア入手がかなり困難。文鎮化させてしまった場合、工場出荷時状態に戻せない。

・購入時の商品説明のスペック情報とは異なる商品が到着する
 CPUが異なる、MEM容量が少ない、eMMCの容量が少ないなど。

 悲しい事にAndroidOS上で表示情報が、偽装情報だったりするのでたちが悪い。
 詳細なデバイス情報を表示するアプリをインストールする事で露見できる場合もあるが、MicroSDやUSBメモリーからLinuxOSが立ち上がれば、LinuxOS上から確認したほうが信頼できる。
 また、商品レビューで“偽装”,“fake”とコメントされていたり、商品情報でのスペック値はさほど悪くないのに、「OSが重い」「まったく使えない」などの低評価レビューしている製品は注意したほうが良いだろう。

・海外通販サイトで購入する場合は、返品可能か返品時の送料などチェックしておいたほうが良い
 商品情報と異なる製品がであった為、返品したいと思う場合もある。(本来は交換して欲しいが)
 返品可能でも「送料は購入者負担」だと返品先が海外の為、送料が高くなる

OSイメージの入手先

すぐに動作させたい場合

〇 入手先
NickAlilovic /build
https://github.com/NickAlilovic/build
https://github.com/NickAlilovic/build/releases

Armbian-20241125-unofficial_24.11.0-trunk_Transpeed-8k618-t_bookworm_edge_6.10.10_server.tar.gz

当サイトでは、非定期にOSのイメージファイルをリリースされている模様
開発者の型がイメージを作成してアップしてくれているが、
イメージファイルを手軽に作れるように「compile.sh」プログラムを用意されているので、自分でカスタマイズしてイメージを作るのが本流のようだ。

インストール

ある程度MicroSDカードでOSの動作実績が得られるまで、eMMC領域への修正・保存は避ける事!
(1番目の)ブートローダーは、eMMCの特定領域に保存されている。
eMMCの特定領域には
・読込順位1 MicroSDカード/USBメモリーからの起動
・読込順位2 eMMCから起動
といった情報が保存されているようなので、eMMCの特定領域を誤って削除してしまうとmicroSDやUSBメモリーにOSイメージをインストールしたデバイスを挿していても、OSは起動しない
結果、TVBoxは文鎮化する事になる

文鎮化したTVBoxを工場出荷時状態に戻すには、ネットの情報やファームウェアの入手、書き込みソフトなどが必要
ソフト自体が存在するかどうかも分からないので、かなりの労力と手間、ある程度の知識が必要であり、ソフトやデータが無ければ文鎮化したままである。
当然、メーカーサポートなんて無い。

(1) 入手先よりリリースされているOSイメージをMicroSDカードに展開する。
(2) MicroSDカードを本体に差し込み、電源を入れる
 ※ 爪楊枝作戦は不要。
(3) OSが立ち上がる

MiroSDカードでのLinux化は成功したが、この機種。電源ランプが無いので電源が入っているのかどうか不明
前面に7セグLEDが実装されているので、OpenVFDで時刻でも表示させておかないと電源ON/OFF判定が出来ない。

HDMIの出力が少し遅いので注意。画面に出た時には、Linuxの起動メッセージの半分ぐらいまで進んでいるので、
HDMIドライバは、カーネルモジュールとしてロードされているかもしれない。

OSイメージをカスタマイズする場合は、シリアルコンソール接続した方が無難。
※ シリアルコンソール接続では、初期段階のu-boot起動メッセージから表示される
※ この機種は、基板上に接続ポイント(GND/RX/TX)が用意されているので、半田ごてでヘッダーピンを付ければOK

カスタマイズOSイメージ作成

購入したスペックは、MEM 2GB eMMC 16GBのモデル。

前述したとおりイメージ作成用の「compile.sh」があるので、実機にlinux-headerをインストしてリビルドを行っていたが、変更予定のファイルのパッチファイルを事前に準備しておく必要がり、慣れていない事もあり何度もリトライ。
実機では、1回のリビルドに6時間以上? かかっている(というか、あまりにも時間がかかるので放置)
トライ&エラーを行うには心が折れたので、WindowsPCの仮想OSソフト(VMware WorkStation)で、リビルド時間を短縮。

(1) TVBoxで使用予定のOSを確認
$ cat /etc/os_release

PRETTY_NAME="Armbian 24.11.2 bookworm"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian

(2) 上記情報により、debian12(bookworm) X64_64版を仮想OSへインストール。(Xなしで)

(3) クロスコンパイル (X86系環境でARMバイナリをコンパイルする)環境を整える
インストール直後は、gcc でのコンパイル(X86系)は既に導入済み。
ネットで調べると、以下パッケージをインストールすると、依存関係で芋づる式に必要なパッケージもインストされて簡単らしい。

x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめ
https://qiita.com/tetsu_koba/items/9bdcb59f912efbff3128

# apt install g++-arm-linux-gnueabihf

(4) ソースを入手

手順

 NickAlilovic / build
 https://github.com/NickAlilovic/build

$ git clone https://github.com/NickAlilovic/build.git

当初、リリースされているブランチのソース(v20241125 kernelバージョン 6.10.10)を入手して作業を進めていたが、OpenVFD関連のコンパイル時にエラーが出力された。
自力ではソース修正できそうに無いので、メインブランチを再入手して再実行。
Kernelバージョンは6.7.12で作成される。

(5) compile.shを実行

で、一気通貫で実行されるので、部分部分での実行する方法が分からない(未調査)
よって、手順通りにパッチを作成する。

(6) 上記の流れで、kernelのソースが入手され、コンパイルが始まったら、Ctrl+C で中断させる。
今回追加したいOpenVFDはu-bootでのdtbへ組み込みが必要で、dtsファイルで検索したら、debianの領域にもdtsがあり、こちらはどの段階で参照されているか不明。
かつ、dtsファイルが微妙に異なるので、

2種類のパッチが必要みたい。

(7) cacheディレクトリにパッチが適用済みのソースが残っているので、ソースを修正してパッチファイル作成
手順 (Note next step is for more advanced users.) の部分を参考に

# git add /home/develop/build/cache/sources/u-boot-worktree/u-boot/v2024.01/arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts
# git commit --signoff
 コメントは適当に入れて保存
# vi /home/develop/build/cache/sources/u-boot-worktree/u-boot/v2024.01/arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts

/sun50i-h618-transpeed-8k618-t.dts 修正箇所

# git add /home/develop/build/cache/sources/u-boot-worktree/u-boot/v2024.01/arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts
# git commit --signoff
 コメントは適当に入れて保存。とりあえず、「OpenVFD_Add」とした。
# git format-patch v2024.01
出来上がったパッチファイル 0001-OpenVFD_Add.patchをpatchディレクトリへ保存
$ cp 0001-OpenVFD_Add.patch ~/build/patch/u-boot/u-boot-sunxi/dts-Transpeed-8K618-T-Enable-OpenVFD.patch

パッチファイル名に注意。ファイル名のアルファベット順に適用される。
sun50i-h618-transpeed-8k618-t.dtsは既存パッチが適用されているので、今回のパッチはその後に当てないといけない。
という事で、ファイル名は「dts-Transpeed-8K618-T-Enable-OpenVFD.patch」とした

# git add /home/develop/build/cache/sources/linux-kernel-worktree/6.7__sunxi64__arm64/arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts
# git commit --signoff
 コメントは適当に入れて保存
# vi /home/develop/build/cache/sources/linux-kernel-worktree/6.7__sunxi64__arm64/arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts

sun50i-h618-transpeed-8k618-t.dts 修正箇所

# git add /home/develop/build/cache/sources/linux-kernel-worktree/6.7__sunxi64__arm64/arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts
# git commit --signoff
 コメントは適当に入れて保存。とりあえず、「OpenVFD_Add」とした。
# git format-patch linux-6.7.y
出来上がったパッチファイル 0001-OpenVFD_Add.patchをpatchディレクトリへ保存
$ cp 0001-OpenVFD_Add.patch ~/build/patch/kernel/archive/sunxi-6.7/patches.armbian/arm64-dts-allwinner-h618-add-Transpeed-8K618-T-openvfd.patch

$ cd ~/build/patch/kernel/archive/sunxi-6.7
$ vi series.conf
一番最下行に、今回追加したパッチのファイルパスを追加する。
patches.armbian/arm64-dts-allwinner-h618-add-Transpeed-8K618-T-openvfd.patch

(8) compile.shを再実行
一応、outputディレクトリ配下は事前に削除した。

# rm -fr /home/develop/build/output/*
$ cd ~/build
$ ./compile.sh

 対話形式で項目を選択

リビルドが行われ、正常終了したら、

  のイメージファイルがある。

  のパッケージファイルが作成されていた。
  (ファイル名にはtrunkバージョン、UUIDなどが付加されていたので、省略して記載している)

(9) (8)で作成したイメージファイルをMicroSDカードへ展開してTVBoxで起動させる。
 OSが無事に立ち上がったら、
 (9-1) linux-headerをインストール
 (9-2) openVFDソースの入手してカーネルモジュール作成
    arthur-liberman /linux_openvfd
    https://github.com/arthur-liberman/linux_openvfd
 (9-3) 同ソースのOpenVFDService.cもmakeしておく。

カーネルモジュールをどこに保存するかは一長一短。
セオリーだと6.7.12-edge-sunxi64/kernel/drivers配下だろうが、
ここに保存すると aptでkernelアップデート時に、/lib/modules/6.7.12-edge-sunxi64配下が空にならないので、アップデートに失敗する
私の場合は、6.7.12-edge-sunxi64-custom ディレクトリを作成して、この配下へインストール。
カーネルモジュールのロードは、insmodでロードする

(10) armbian-openvfdの入手と一部修正
ophub /amlogic-s9xxx-armbian
https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/sbin/armbian-openvfd
より、armbian-openvfd を入手。
armbian-openvfd は「modprobe」を利用しているので、「insmod」でロードするように編集する

# vi /usr/sbin/armbian-openvfd

コメントアウト部分(説明のところ)は、適時編集

armbian-openvfd 修正版 変更箇所

(11) OpenVFDの設定ファイルを準備する。
「How to install armbian in h618?」フォーラム
https://forum.armbian.com/topic/29794-how-to-install-armbian-in-h618/#findComment-202445
で入手した設定情報を元にファイルを作成。
 OpenVFD 設定ファイル

(12) インストール
 私の場合の保存先は以下

・ /usr/share/openvfd
|-- OpenVFDService
|-- conf
|   |-- diy.conf
|   |-- h96max-x3.conf
|   |-- hk1-x3.conf
|   |-- hk1box.conf
|   |-- t95.conf
|   |-- t95z-plus.conf
|   |-- tx3-mini.conf
|   |-- tx3.conf
|   |-- tx9-pro.conf
|   |-- whale.conf
|   |-- x88pro-x3.conf
|   |-- x92.conf
|   |-- x96air.conf
|   |-- x96max.conf
|   `-- x96maxplus.conf
`-- vfdservice -> OpenVFDService

・ /lib/modules/6.7.12-edge-sunxi64-custom
`-- kernel
    `-- drivers
        `-- auxdisplay
            `-- openvfd
                `-- openvfd.ko

・ /usr/sbin/
`-- armbian-openvfd

(11) 手動実行して、前面LEDが表示されるか確認

(LED ON)  # /usr/sbin/armbian-openvfd 99
(LED OFF) # /usr/sbin/armbian-openvfd 0

(12) 動作確認が終わったら、rc.localにて起動させる。
  時間があるときに、systemdのユニットファイルから起動するようにしたい。

(13) OSを再起動して、前面LEDが表示されるのを確認する

シリアルコンソール接続する際に筐体のフタを開けたが、前面と後面のツメで留まっているだけである。
フタを開ける事を想定していない作りで、かなり注意して開けないと、後面ツメが割れます。
一見、後面側からが一番開けやすいように見えるが、先に前面のツメを外してからフタを前面にスライドする感じにすると良いかも。
(後面から開けて、ツメ部分を破損させてしまった)

主 設定ファイル

u-boot dts

dts-Transpeed-8K618-T-Enable-OpenVFD.patch

From 644353cf83875ec1b821e0ebd0b6ecdd2d672298 Mon Sep 17 00:00:00 2001
From: root <root@debian12x-cross.chovits.com>
Date: Sat, 21 Dec 2024 10:41:03 +0900
Subject: [PATCH 1/1] OpenVFD Add

Signed-off-by: root <root@debian12x-cross.chovits.com>
---
 arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts b/arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts
index 49a4ed84f1..c7d798c456 100644
--- a/arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts
+++ b/arch/arm/dts/sun50i-h618-transpeed-8k618-t.dts
@@ -40,6 +40,19 @@
                regulator-max-microvolt = <3300000>;
                regulator-always-on;
        };
+
+       openvfd {
+               compatible = "open,vfd";
+               dev_name = "openvfd";
+               openvfd_gpio_clk = <&pio 8 11 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+               openvfd_gpio_dat = <&pio 8 12 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+               vfd_gpio_chip_name = "0300b000.pinctrl";
+               openvfd_chars = [02 01 02 03 04];
+               openvfd_dot_bits = [00 01 03 02 04 05 06];
+               openvfd_display_type = <0x03000000>;
+               status = "okay";
+       };
+
 };

 &emac1 {
--
2.39.5
Linux kernel

arm64-dts-allwinner-h618-add-Transpeed-8K618-T-openvfd.patch

From bb0743e41eb30fbdd896fd86d611043ebc89d3bd Mon Sep 17 00:00:00 2001
From: root <root@debian12x-cross.chovits.com>
Date: Sun, 22 Dec 2024 11:54:56 +0900
Subject: [PATCH 1/1] OpenVFD Add

Signed-off-by: root <root@debian12x-cross.chovits.com>
---
 .../dts/allwinner/sun50i-h618-transpeed-8k618-t.dts | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts b/arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts
index 3d9d42f30..e7ef2bab2 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h618-transpeed-8k618-t.dts
@@ -62,6 +62,19 @@ wifi_pwrseq: wifi_pwrseq {
                 pinctrl-names = "default";
                 reset-gpios = <&pio 6 18 GPIO_ACTIVE_LOW>; /* PG18 */
         };
+
+       openvfd {
+               compatible = "open,vfd";
+               dev_name = "openvfd";
+               openvfd_gpio_clk = <&pio 8 11 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+               openvfd_gpio_dat = <&pio 8 12 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+               vfd_gpio_chip_name = "0300b000.pinctrl";
+               openvfd_chars = [02 01 02 03 04];
+               openvfd_dot_bits = [00 01 03 02 04 05 06];
+               openvfd_display_type = <0x03000000>;
+               status = "okay";
+       };
+
 };

 &cpu0 {
--
2.39.5
OpenVFD 設定ファイル

diy.conf

# transpeed 8k618-t (Allwinner H618) configuration
#--------------------
vfd_gpio_clk='1,266,0'
vfd_gpio_dat='1,267,0'
vfd_gpio_stb='0,0,0xFF'
vfd_gpio_chip_name='300b000.pinctrl'
vfd_chars='2,1,2,3,4'
vfd_dot_bits='0,1,2,3,4,5,6'
vfd_display_type='0x03,0x00,0x00,0x00'
functions=''
armbian-openvfd 修正版 変更箇所
--- /tmp/armbian-openvfd.org    2024-12-22 11:32:37.417714798 +0900
+++ /usr/sbin/armbian-openvfd   2024-12-22 18:05:56.932269424 +0900
@@ -93,7 +93,8 @@
         error_msg "The LED profile [ ${conf_file} ] does not exist!"
     fi

-    modprobe openvfd vfd_gpio_clk=${vfd_gpio_clk} \
+    insmod /lib/modules/6.7.12-edge-sunxi64-custom/kernel/drivers/auxdisplay/openvfd/openvfd.ko \
+        vfd_gpio_clk=${vfd_gpio_clk} \
         vfd_gpio_dat=${vfd_gpio_dat} \
         vfd_gpio_stb=${vfd_gpio_stb:-0,0,0xFF} \
         vfd_gpio0=${vfd_gpio0:-0,0,0xFF} \