はむすたーの巣

ちょっとかじって見たこととか興味持ったこととか記事というよりメモな感じにまとめます。たまに消します。きっと。

Atom Z3740搭載のタブレット(Acer iconia W4-820)にAndroid x86を焼こうとしたら詰んだ話

はじめに

皆さんは初期のAtomが出た時期に流行ったミニノートやBayTrailが出た時期に流行ったWindowsタブレット等は購入されましたか? それは今でも現役で使われてますか?
以前僕はWindowsタブレットを買いました、でも今はタンスの肥やしになってます。
そこで、今回は使わなくなった(というかタブレットサイズで使うには微妙な使い勝手な)WindowsタブレットAndroidタブレットとして使おうとして、そして失敗した話を書きます。

Android x86とは

WindowsPC等で用いられるx86_64互換の環境上で、AndroidOSを実行するプロジェクトです。
詳しくはこちら

Android-x86 - Porting Android to x86

Acer iconia W4-820とは

Acerが2013年の末ごろに出したWindows8.1搭載の8インチタブレットです。
僕が所有しているモデルは
CPU : Atom Z3740
メモリ : 2GB
ストレージ : 32GB OS : Windows8.1 with bing (後にwindows10にアップグレード)

なにをやろうとしたか

購入当初は持ち運んでツクール製のゲームをプレイするなどの目的を主として利用して居ましたが、スペック不足やキーボードマウスが無い状態での利用の不便さから現在はほぼ使っていません。
そこで、最近デレステに復帰したこともあり、快適にデレステができる(外部出力してPVを眺める等もしたい)タブレットとして、復活させようと考えました。

問題

Baytrail以降によくある問題として、UEFIは32bitオンリーだが、CPUは64bit対応というものがありますが、それについての問題は現在では修正済みなようで、普通に焼くことでブートが可能でした。
また、インストール作業についても、GRUBの自動インストールに失敗する以外の問題は起きませんでした。(それ以前の問題にぶつかってしまっているため、この問題は後ほど調査します、恐らく手動でインストールすれば解決するような気がしています)

画面が正常に表示されない

GRUBカーネル起動まではタブレット本体の液晶に表示が行われますが、カーネル起動後はなぜか画面が真っ暗なままバックライトのみが点灯しているという状態になってしまいます。
この時、タブレットについているmicroHDMIポートにモニタを接続すると、タブレット本体の液晶の解像度で映像が出力されます(正確には外部ディスプレイのEDIDを読み、その最適解像度で出力を行いつつ、その中にレターボックスの形でタブレットの解像度で映像が出力されているようにみえます)、この時、動作は非常にスムーズで正しいドライバが当たっているように思えました。

nomodesetでKMSを無効にするとやけに重い

このような表示関係の問題への解決策として、KMS(Kernel Mode Setting)を無効にすることがよく挙げられます、今回の問題は、KMSに映像出力の管理が移った時に発生するものであることからも、この解決策は有効であるように考えられます。
実際にGRUBカーネル起動部分に " nomodeset i915.modeset=0"と追記することでKMSを無効にしてみると、タブレット画面でAndroidを起動することが可能でした。
しかし、KMSを無効にした弊害として、汎用ドライバが当たってしまい、動作が非常に重くなってしまいました。
これでは、デレステはおろか、ブラウジングすら快適に行うことは不可能であったため、KMSを無効化するという方法では解決できませんでした。

試したこと

インストールするAndroid x86のバージョンを変えてみる

Android x86には、対象としたAndroidのバージョンやその他設定を追加したビルドなど、複数存在しました。
その中でも、下記のバージョンは今回の問題に関係がありそうな以下のイメージを焼いて動作を試しました。
しかし、どのイメージにおいても同様の問題が発生し、問題部分については各イメージごとに挙動の違いなどはありませんでした。

  • Android x86 6.0 r3
    これより古いバージョンで近い問題を抱えていた人が、このバージョンにすることで解決したとの投稿があったため
  • Android x86 7.1 r2
    ダウンロード数が最も多く、かつこの問題がほぼ報告されていないため、最もポピュラーなバージョンでは発生していない可能性があると考えたため
  • Android x86 8.1 rc1
    リリースノートに、Intel HDグラフィックスのハードウェアアクセラレーション対応が記載されていたため
  • Android-x86-7.1.0_Baytrail-k4.12-T100TA_Jul12-2017
    BaytrailCPU向けのビルドであり、またT100TAの中にはW4-820同様にz3740搭載モデルが存在するため

videoコマンドで出力先を変更する

ここまでで、恐らく問題はKMSにあることがわかっており、つまりKMSの設定を行えば問題は解決するのではないか、と考えるのが順当です。
まずは、KMS上での出力先デバイスが異なることなどが要因なのではないかと考え、/sys/class/drm/以下を参照し現在接続扱いになっているモニタの一覧を確認しました。
確認をすると、以下のデバイスが接続状態となっていました

このDSI-1とは恐らくDisplay Serial Interfaceを指しているものと考えられるので、これが内蔵ディスプレイだと思われます。
また、HDMI-a-1は本体についているmicroHDMI出力ポートのことを指すと思われます。

つまり、HDMI-a-1の出力を強制的に無効にして、DSI-1の出力を強制的に有効にすれば、KMSを介しても内蔵ディスプレイに出力を行えるのではないかと考えました。
そのため、カーネル起動時に "video=HDMI-a-1:d video=DSI-1:800x1280@60e" と記載しDSIからの出力を強制してみました。
しかし、残念ながらこの時も内蔵ディスプレイからの出力は得られず、結果としてHDMIに出てきていた映像出力が無効になるだけでした。

さらに、試しにDSI-1の出力を無効にしたところ、HDMIからHDMIのEDIDに合わせた最適解像度でAndroidが起動したため、未変更状態でもDSIは自動的に選択されEDIDを読みに行くことができているように思えました。

gfxpayloadで出力解像度を一度変更してみる

https://groups.google.com/forum/#!topic/android-x86/t8I2JER2C5g

上記リンクではBayTrailタブレットのblankscreenの問題のひとまずの改善案として、gfxpayloadで一度最適解像度でない解像度を設定するというものが投稿されていました。(なんかどうしてこれでいい感じになるのかはっきりしていないっぽい? ぶら下がってる投稿的にも解決したりしなかったりしてる模様)
これを参考にして、 "set gfxpayload=800x600" をセットしてみましたが、kms立ち上げ前の解像度が変わるだけで特に変化は見られませんでした。

考察

原因として考えられるもの

同様の問題について投稿をしている人が極端に少ないこと、同様の症状が起きている人はCPUが同じ(Z3740)であり、また同じインタフェース(DSI)で内蔵ディスプレイと接続されていることから、特定CPUと特定インタフェースのディスプレイ(Z3740&DSI接続ディスプレイ)との組み合わせで起きる問題?であるように考えられました。(もしかしたらCPUが同じだけでも近い状態になるのかも、近い症状をZ3740で訴えている人は居ました)

同じ問題と思しき人

同じ症状で、同じようなところまで試されている模様。

https://groups.google.com/forum/#!topic/android-x86/IvjwbGB-HjA

おわりに

くわしいマンたすけて!!!!!!
もう僕にはわからんw