Mecool M8s Pro WのArmbianアップグレードで窮地に陥った話

この機種はAmlogic 905wのチップを使っていて、性能が905xに比べて若干低いい以外は性能は同じです。カーネル5.1なのでそろそろアップグレードしなきゃと思い続けていてようやく取り掛かることにしました。普段から不思議に感じていたのですが、完成度が高いわりにArmbianでは正式サポートしていません。なぜかという疑問がこのアップグレードを機にわかりました。

窮地その1:ddでeMMCに書き込む

ddでTFカードからeMMCに書き込めば、基本使えるはずなのですが、Amlogic製のTV-boxに限っては違います。eMMCデバイスのbootloaderの部分に固有の情報があり、それがないとシステムが動きません

Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk1p1      1368064  1617919   249856  122M  c W95 FAT32 (LBA)
/dev/mmcblk1p2      1619968 30777343 29157376 13.9G 83 Linux
...
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1       32768   557055   524288  256M  e W95 FAT16 (LBA)
/dev/mmcblk0p2      557056 60906687 60349632 28.8G 83 Linux

eMMCのスタートは1368064から始まっていて、一方、TFカードは32768です。その情報を上書きしなようにするためにarmbianではnand-sata-installというコマンドを使います。また最新のイメージではinstall-aml.shというコマンド使います。さらに厄介なのはinstall-aml.shコマンドでインストールするとなぜかもとのAndroidが立ち上がってしまうので、最初に旧Armbianのnand-sata-installでインストールし、さらに新Armbianのinstall-aml.shを使います。さらに悪いことにAndroidを最新にアップグレードすると今度はRFカードからブートができなくなります。さらにこの機種はTFカードからブートする手段が物理的にもソフト的にもありません。大抵のTV-boxではリセットスイッチを押しながら電源を入れたり、リモコンを押したりすればできるのですが、このTV-boxの基盤にそれらしきボタン部分のショートさせてもできませんでした。さらにこのTV-boxのリモコンはUSB接続なのでLircのようにカーネルに直接アクセスできません。またリセットボタンを長押ししながら電源を入れるとUSB OTGモードになれますがそれもできません。最大の問題点はOTGモードでWindows機からAmlogic専用のロム焼きツールが使えないということです。

窮地その2:インストール失敗でアクセスできない

eMMCにArmbianのインストール失敗。TFカードブートもできずリブートを繰り返すようになってしまいました。原因はDTのセッティングをuEnv.iniとextlinux/extlinux.confの両方に設定していなかったことでした。

こうなるをゲームオーバーです。そこで分解してUART接続してどうなっているのか見てみることにしました。

 

窮地その3:USBシリアルドライバーがない

Armbianに私が使っているUSBシリアルドライバーがない

私が使っているCH341は今まではUbuntuを使っていたので、なんの問題もなく動いていましたがArmbianに移行した今ではそのままでは使えないのでドライバーを作ります。ところが本家の中国のサイトからドライバーのソースをダウンロードしても最新のArmbianではコンパイルできません。本家のサイトにご丁寧にかいてあります。これは中華モノに共通して言えることですが、安くていいものなんだけどドライバーがないかあるいは何か問題がある。そこでパッチを探したところ、修正パッチの当たったリポジトリが見つかり、そのソースをコンパイルすると使えるようになりました。

https://github.com/juliagoda/CH341SER.git

解決

絶体絶命の状況下でUART接続してみたら、どうやらU-Bootのところでエラーを起こして止まっているという状態でした。これで首の皮1枚つなかったことになります。ここから復旧するために、いろいろDebian WIKI等で勉強して、TFTP/DHCPでブートが行けそうという感じになりました。さらにU-Bootのhelpで何が使えるか見てみると、x86_64のGrubと同じような復旧、すなわち、ローカルディスクにアクセスしてブートすることができそうだということがわかってきました。そこでarmbianのbootディレクトリでなにか情報を探ってみたところ、それらしきものがありました。USBは認識するもののアクセスできません。TFカードはできました。これで一筋の光が差し込んできました。この光に沿って解決していきます。これ以上長々書いても意味ないので次のようにしてU-BootでTFカードからブートできます。TFTPbootの場合はネットワークをセットアップします。pingで確認できます。ブート方法は多少違いますが基本同じです。

#setenv ipaddr "192.168.1.2"
#setenv netmask "255.255.255.0"
#setenv dnsip "192.168.1.1"
setenv env_addr "0x10400000"
setenv kernel_addr "0x11000000"
setenv initrd_addr "0x13000000"
setenv boot_start booti ${kernel_addr} ${initrd_addr} ${dtb_mem_addr}
fatload mmc 0 ${kernel_addr} zImage
fatload mmc 0 ${initrd_addr} uInitrd
fatload mmc 0 ${env_addr} uEnv.ini
env import -t ${env_addr} ${filesize}
fatload mmc 0 ${dtb_mem_addr} ${dtb_name}
run boot_start

この経験でAmlogic独自の方法でArmbianをブートしていることがわかりました。これは100%オープンソースという建前のArmbianの趣旨に反しています。よってArmbianからリリースされずフォークプロジェクトとしてリリースされるということです。