借り初めのひみつきち

仮ブログです。

GPD MicroPC

正直、 GPD 社に期待はしてるけど今まで出した製品はあまり出来がいいと思ってない Nerry です。

エンジニア向けとして期待されていた GPD MicroPC ですが、やっと触る機会ができたので自作 OS の観点から調査してみましたヽ(•̀ω•́ )ゝ✧

結局、 Portrait なの? Landscape なの?

最近の小型 PC には避けて通ることができない Portrait 問題。

これは小型の液晶が基本的にスマホタブレットで使う前提で作られていることから Portrait (縦長) のものが多く、コストや性能の関係でスマホ用の液晶を止む無く横倒しにして使ってる事が多いことに起因する諸問題です。

GPD MicroPC が出る前後もこの問題で話題になり、 Landscape 液晶を使ってるのではという情報も飛び交った事がありました。

結論から言うと、少なくともデフォルトでは Portrait です。

通常起動すると GOP は解像度 720 x 1280 として報告し、実際 VRAM の構造もそのようになっています。最近のよくある小型 PC と変わらないですね。

問題は似非 Landscape モードがある点です。

内蔵の UEFI シェルから起動すると通常とは異なるドライバが読み込まれるようで、 GOP の報告する解像度が 1280 x 720 になり、 gop->Blt を呼び出した場合もそのように振舞います。

しかし、実際の VRAM 構造は Portrait のままなので、その状態で Windows を起動するとなんと横倒しのおかしな画面で起動します。(ディスプレイドライバが起動する前は)

これは本来

HorizontalResolution = 720
VerticalResolution = 1280
PixelsPerScanLine = 720

の画面モードを、単純に縦横入れ替えて

HorizontalResolution = 1280
VerticalResolution = 720
PixelsPerScanLine = 720

として報告しているようです。矛盾してます。

通常 PC の画面は HorizontalResolution <= PixelsPerScanLine が成立するので*1、拙作の OS では HorizontalResolution > PixelsPerScanLine だった場合に縦横を入れ替える処理を入れて対処しました。

USB とキーボードあれこれ

xHCI が特殊でうまく通信できないという前情報があったのでその調査がメインのつもりでしたが、拙作の OS では外部 USB キーボードが普通に動いたので、特に変わった挙動はなかったように思います。

内蔵キーボードが曲者で、ルートハブに繋がっている VID:PID = 6080:8061 という奇妙な ID *2 でプロダクト名も 「USB KEYBOARD」 と名乗っているデバイスのインターフェース #0 クラス 3.1.1 (ブートプロトコル、キーボード) からはデータがうまく読み出せず、インタフェース #1 クラス 3.0.0 (汎用 HID) から読み出せるデータはタッチパッドのデータのようでした。お前は一体何者なんだ。

一方 LPC バスに PS/2 コントローラーも存在し、ほとんどの PS/2 コマンドに対して意味のある応答があり、キーボードが存在するかのような応答はあるのですが、実際のキー信号がなぜかうまく取れません。
2回だけ、なぜかちゃんとキーボードが入力できた事があったのですが、再現性が不明で再起動後は同じコードでも何も起きず、ポーリングしてもキーコードを返してくれませんでした。

また、 UEFI シェルから ACPI ENABLE するコマンドを実行してみると USB 関連が正常に動作しなくなりますが、内蔵キーボードは相変わらず動作していました。

以上の経緯から内蔵キーボードは PS/2 接続してる可能性が濃厚ですが、 USB ・ PS/2 ともにキーボードとみられるデバイスにうまくアクセスできず、拙作の OS からはキー入力がちゃんとできていない状態です。

ACPI とレガシーモード

HW reduced ACPI ではありません!!(超重要)
先述のように ACPI ENABLE コマンドを実行すると UEFI の USB ドライバの挙動が変わります。

BIOS 設定画面で UEFI モードかレガシーモードか選択できるのですが、レガシーモードで起動すると起動デバイスが見つからないので結局使い道がありませんでした。ドライバが足りないだけで CSM は入ってるんでしょうか?

全体的にハードウェアは近年のよくある小型デバイスよりもレガシーな雰囲気があります。

TL; DR

GPD って変なデバイス好きですね。

*1:稀にパディングを入れて HorizontalResolution < PixelsPerScanLine になる機種があるが、ほとんどの機種では WindowsUEFI 要件によって HorizontalResolution = PixelsPerScanLine になる

*2:検索してもベンダーIDがまったく見つからない