電気メガネ

XREAL Airを徹底的に改造した話

Amazonのアソシエイトとして、8796.jp管理日誌は適格販売により収入を得ています。
スポンサーリンク

ディスコンになってサポートもすっかり切れたXREAL Airをしゃぶりつくそうってワケ。

この記事で紹介するのは、XREAL Air(第1世代)の非公式なファームウェア改造です。メーカー保証を受けられなくなる可能性があり、失敗すればグラスが起動しなくなることもあります。

注意書き

  • 完全に自己責任。XREALとは一切関係のない非公式な改造である。
  • XREALにこのファームウェア改造のことを知らせたり問い合わせてはいけない。内緒です。
  • XREAL Beam ProのNebulaやXREAL SDKを使う公式アプリは動かなくなる。これらを使う人は書き換えない。
  • 公式ファームウェアやパッチ済みファームウェアは配布しない。公式ファームウェアの入手方法もここでは説明しない。
  • 手元の公式ファームウェアは復旧手段になるので、必ず別の場所にも保管する。本体からの吸い出しはできない。
  • DPブリッジとMCUは必ず対で書き換える。片方だけでは動作が不整合になる。
  • 発熱は増える可能性がある。表示と音声のテストはしているが、温度の定量評価はできていない。
  • 公式ファームウェアへの書き戻しは可能。開発中に何度か起動しなくなったが、実機で復旧できている。
  • ヤバいと思ったら引き返せ。

この改造が向いている人・向いていない人

通常の外部ディスプレイとして、またはnyan Real / Spatial WallでAirを使い倒したい人向け。Beam ProのNebula OSなど、公式の空間アプリを使い続けたい人には向かない。1200p用の光学補正データがないため、ホスト側で1080pへ落とすだけでは回避できず、公式へ戻す必要がある。

はじめに

開発の経緯。nyan Real / Spatial Wallで使うなら、Airの中に眠っている解像度や表示モードを全部使いたかった。

2022年3月発売、ディスコンになってメーカー保証も全員切れてるだろうからもうええでしょう。

xbx a01+が発売されて乗り換えた人が持て余してそうなので、今こそオモチャにしましょう!

XREAL Airとは

Nreal Airとして発売され、たぶん4万円ぐらいだったと思う。Nreal Lightの後継ではないけど廉価版っていうほど継続性はないので似て非なるものでしたね。当時はEDIDが特殊で、接続しても映らない機器が多くて大変だったんですが、度重なるファームウェアのアップデートで改善したのも遠い記憶になってますがまだ4年ぐらいしか経ってないのか…

スペックの詳細。片眼1920×1080を公称しているが、搭載されているソニー製マイクロOLEDパネルであるところのECX343Eは1920×1200。パネル自体はXREAL Oneや1Sにも使われている。さらに言うと末尾の違うECX343FがXREAL AURAで使われているはず。

当時ハイエンドだったNreal Lightが1080pだったため、製品構成上ナーフされたのではないかと思ってます。同様にXREAL OneもOne Proの下位ってことにするために1080pにナーフされてます。

発売以来ずっと実力を出せてなかったXREAL Airに本気を出させましょう!

今回の改造で何が変わるのか

先に結果をまとめる。公式では広告されていないタイミングをEDIDへ追加し、DPブリッジとMCUを実際の入力信号へ追従させることで、次の表示・動作が可能になった。

項目公式改造後
1280×720対応タイミングなしLT7911UXCが全画面へ拡大
1920×108060 / 90 / 120Hz従来どおり利用可能
1920×1200提示されない1920×1200@60Hzをpreferred timingに設定。90 / 120Hzも広告
Full-SBS 3D3840×10803840×1200、最大90Hz
USBデータなしの音声手動切替が必要約5秒後にDP音声へ自動切替

解像度だけでなく、パネルの行数、タイミンググループ、DPリンクレート、音声経路まで連動する。そのためDPブリッジ側とMCU側の両方を改造している。

Airの中には何が入っているのか

  • LT7911UXC:DisplayPort信号を受け、EDIDやスケーリング、パネルへ渡す映像タイミングを担当するDPブリッジ。
  • MCU:左右のパネル設定、ボタン、USBオーディオ、表示モードなどを管理する。
  • ソニー製ECX343E:左右に1枚ずつ搭載された1920×1200のマイクロOLEDパネル。

DPブリッジだけを1200行へ変更しても、MCUがパネルを1080行の設定で動かしていれば正しく表示されない。反対にMCUだけ変更しても、ホストへ1200pを提示できない。2つのファームウェアを対で扱う理由はここにある。

内部モード一覧

Nebulaなど公式アプリはリフレッシュレートを固定するため、内部的にEDIDを切り替えている。そのモード一覧は以下の通り。

起動時はmode 1、+ボタン長押しで切り替わるSBSモードはmode 3となる。それ以外はHIDで切り替えるのでユーザーが直接アクセスすることはできない。

mode用途公式ファームウェア改造ファームウェア
12D・自動/既定1920×1080@60Hzがpreferred。90 / 120Hzも広告1920×1200@60Hzがpreferred。90 / 120Hzにも対応。加えて1080pの60 / 90 / 120Hzと1280×720@60Hzを広告
3Full-SBS 3D・60Hz3840×1080@60Hz3840×1200@60Hz、HBR2
4Full-SBS 3D・72Hz3840×1080@72Hz3840×1200@72Hz、HBR2
52D・72Hz固定1920×1080@72Hz1920×1200@72Hzがpreferred。1920×1080@72Hzも選択可能
8Half-SBS 3D・60HzモードIDは存在するが、Airでは未対応未対応。今回の改造対象外
9Full-SBS 3D・90Hz3840×1080@90Hz3840×1200@90Hz、HBR2
102D・90Hz固定1920×1080@90Hz1920×1200@90Hzがpreferred。1920×1080@90Hzも選択可能
112D・120Hz固定1920×1080@120Hz1920×1200@120Hzがpreferred。1920×1080@120Hzも選択可能

眠っていた1920×1200を有効化する

Airに搭載されているソニー製ECX343Eは、もともと1920×1200のパネル。公式ファームウェアは1920×1080しか広告せず、縦方向の120行を使っていない。

EDIDのベースブロック先頭に1920×1200@60Hzをpreferred timingとして設定し、60 / 90 / 120Hzを広告する。そうすることでpreferred timingからネイティブ解像度を決めるmacOSでも、接続しただけで1920×1200が既定になる。実はXREAL 1Sと同じ手法。

入力が1080行か1200行かをDPブリッジ側で判定し、MCUが、パネルの行数とリフレッシュレート別のタイミンググループを入力信号に追従させる。ホスト側で解像度を切り替えるたびにグラスを操作する必要はない。

720pしか出せない機器をつなぐ

EDIDのCTAへVIC 4を追加し、1280×720@60Hzを受けられるようにした。720p信号が来ると、LT7911UXCがパネルの全画面へ拡大する。

このスケーリング機能自体は公式のDPブリッジがもともと持っているもの。なんか分からんが使おうとして放棄したっぽいHalf-SBSモード(mode 8)の痕跡から発掘して再利用してる。

専用スケーラほどの品質ではないが、720pしか出せないゲーム機などを映す用途には十分実用的だった。

LT7911UXCのスケーリング機能で発熱が増える可能性があるということは忘れずに。

以前XREAL OneシリーズでやったEDID偽装で720p対応するのと同じような感じだけど、あっちはX1チップが拡大しているので画質が良い。

XREAL OneがEDIDエミュレーターでお手軽に720p対応できたという話
EDIDエミュレーターを挟むだけで720pまでしか対応していなかったミニゲーム機が映ったよ!

3Dを3840×1200@90Hzにする

Full-SBSの3Dモードも3840×1080から3840×1200へ拡張した。60 / 72 / 90Hzに対応する。

これはもともとmode 9として存在していて、XREAL Beam Proのマイグラスアプリの開発者モードの裏設定で設定できるんだけど画面が映らなくなる謎モードだった。

3840×1200@90Hzのピクセルクロックは495MHzになり、HBRでは帯域が足りない。3D経路だけDPのリンクレートをHBR2へ引き上げることで、パネル本来の縦1200ピクセルを使った90Hz表示が可能になった。

なお、XREAL Oneシリーズでも3840×1200@90Hzには対応していない。

メーカーがHBR2を有効にしていないのはもしかしたら発熱の問題かもしれないので常用には向かないかもしれない。

USBデータ接続がない場合でも音を出す

HDMI→USB-C変換器や一部のゲーム機との接続では、映像と給電だけでUSBデータが運ばれない。この状態ではUSBオーディオが使えず、公式では長押しによる手動切替が必要になる。

改造したMCUはUSBのSET_ADDRESSを監視する。ホストからUSBアドレスが割り当てられないまま約5秒経過した場合だけ、DP音声モードへ自動的に切り替える。PCへ直結した場合はUSBオーディオのままなので、誤ってDP音声へ落ちることはない。

DP音声モードへ入るとUSB複合デバイスとしての接続が切れてHID制御が使えなくなる。自動的にDP音声モードになった場合はボタン操作(+ボタン長押しからのさらに長押し)でUSBオーディオに戻せないようにしてある。もちろんUSBオーディオ対応デバイスに挿し直せばUSBオーディオが有効になる。

どこまで検証したか

Windows(NVIDIA GeForce RTX 3060)とmacOS(Mac mini 2018)で、EDID、線上の解像度とピクセルクロック、DPブリッジとパネルのレジスタ、実VSYNC、音声、電源再投入後の復帰を確認した。

  • 2Dの1080p / 1200pを60 / 72 / 90 / 120Hzで確認。
  • Full-SBS 3840×1200を60 / 72 / 90Hzで確認。
  • 本物の1280×720信号が全画面へ拡大されることを確認。
  • USBデータのないHDMI変換経路で、映像とDP音声の自動切替を確認。
  • 1920×1200@72HzでUSBオーディオを再生しながら5分間測定し、フレーム落ちがないことを確認。
  • 電源再投入後も、1200pのpreferred timingとパネル設定が正常に復帰することを確認。

測定値と使用した診断ツールは実機検証の記録にまとめてある。

既知の制限・相性問題

  • Beam Pro / Nebula:1200p用の光学補正データがないため動かない。回避策は公式ファームウェアへ戻すこと。
  • NVIDIAのスケーリング:1080pを選んでもGPU側で1200pへ引き伸ばす場合がある。「スケーリングなし」をEDID構成ごとに設定する。
  • DP音声中:USB複合デバイスとしての接続が切れるためHID診断ツールや公式アプリから通信できない。
  • 対応OS:ビルド処理はPythonの標準ライブラリだけで完結するため、OSを問わない。実機への書き込みはWindowsでのみ検証した。
  • 発熱:発熱量が増える可能性があるが、温度上昇はまだ定量評価していない。

どうやって改造イメージを検証しているか

配布しているのはパッチ済みファームウェアではなく、利用者が自分で用意した公式イメージを変換するビルダ。決め打ちしたアドレスに無条件でバイト列を書き込むだけではなく、次の検証に通らなければ出力しない。

  • 入力する公式イメージのSHA-256、project code、コンテナCRCを照合。
  • すべての変更箇所で、パッチ前のバイト列が想定と一致することを確認。
  • 出力を決定論的に生成し、SHA-256、CRC、commit tag、変更バイト数を固定。
  • 生成したEDIDをデコードし、各モードの解像度とチェックサムを検証。
  • ファームウェア内の8051 helperを小さなエミュレータで実行し、全状態ベクタを検証。
  • フラッシュツール側でも機種識別子を照合し、別機種用のイメージを拒否。

ファームウェアの作り方と書き込み

Python 3.10以降を用意し、自分で入手した指定バージョンの公式ファームウェアをfirmware/に置く。書き込みにはhidapiが必要。公式ファイルは復旧にも使うため、別の場所にも必ずバックアップする。

pip install -r requirements.txt

python xreal/air/build_dp.py  --src firmware/1140                     --out air-dp.bin
python xreal/air/build_mcu.py --src firmware/07.1.02.387_20240428.bin --out air-mcu.bin

python xreal/dp_flash.py  --image air-dp.bin  --flash
python xreal/mcu_flash.py --image air-mcu.bin --flash

DPブリッジとMCUは必ず対で書き込む。ビルダは想定と違うファイルを拒否し、危険な--forceオプションも用意していない。コマンドを実行する前に、READMEの注意事項と出力されるSHA-256を確認する。

公式へ戻す・起動しなくなったとき

公式ファームウェアをfirmware/へ置いた状態で、次のコマンドで書き戻せる。

python xreal/dp_flash.py  --restore --flash
python xreal/mcu_flash.py --restore --flash
  • DPブリッジがfallbackへ落ちると、バージョン1109、60Hz固定、モード切替不能になる。同じツールで正常なイメージを焼き直す。
  • MCUが起動せずUSBの接続と切断を繰り返す場合は、ボタンを保持したまま接続してbootloaderへ入り、公式MCUを全書き戻しする。
  • 転送中断やFINISH異常時は、抜き差しでリセットしてから再試行する。

これらは開発中に実際に遭遇し、実機で復旧できた手順。ただし公式ファームウェアを失った状態では復旧できない。

GitHubで公開中

ビルダ、書き込みツール、診断ツール、コンテナ形式とHIDプロトコルの資料、設計判断の記録、実機検証結果をnyan Real / Firmware Kitで公開している。

公式ファームウェアとパッチ済みファームウェアは含まれない。対応する公式ファイルを自分で用意し、手元で改造イメージを生成する方式にしている。使い方と対応ファームウェアのハッシュ値はREADMEを参照。

ブラウザから手軽に書き換える方式ではなく、あえてPythonを使う方式にしているのは、意図的にハードルを上げるためです。あしからず。

動作不良などがあればIssueを出してください。対応できるものは対応しようという気持ちはあります。公式ファームウェアの入手方法などは聞かれても答えられません。

写り込み防止具 Slim for XREAL Air

そうそう、バードバス光学系で避けられない下からの写り込みを防止するパーツを作ってます。これも改造に入るかどうか判断が分かれるところですが、せっかくの機会なのでお知らせです。

写り込み防止具 Slim for XREALを作って公開したという話
インサートレンズ使用時でも斜め下が見やすくなったリニューアル版です。

おしまいに

ずっと長男を超えてはならないと抑圧されて生きてきたNreal Air改めXREAL Airが、本気を出せました。よかったね!

nyan Real / Spatial Wallと組み合わせれば、Airを1200pパネルとFull-SBS・90Hzを生かした空間ディスプレイとして、まだまだ使い倒せますよ!なお、nyan Real / Spatial Wallは現時点では未公開です。

Air 2でも720p対応とHBR2の有効化はできたので、次はAir 2向けの改造を公開する予定。マイクロOLEDパネルが1080pなので、1200pは物理的に無理です。

現場からは以上です。

タイトルとURLをコピーしました