世界を動かす技術を、日本語で。

Raspberry Piを使用したHDMIダミープラグのEDIDの変更

概要

  • HDMIダミープラグのEDID書き換え手順 を解説
  • Raspberry Pi Zero を使ったI2C経由のプログラム方法
  • EDIDバックアップと書き換え の安全な進め方
  • ダミープラグを 4Kから1080pへ変更 する具体例
  • 注意点やリスク も明記

HDMIダミープラグのEDIDを書き換える方法

  • HDMIダミープラグ は、パソコンなどの機器に「ディスプレイが接続されている」と誤認させるための小型ドングル
  • ダミープラグ内部には EDID(Extended Display Identification Data) を格納したI2C接続のEEPROMチップが搭載
  • EDIDには 解像度・メーカー情報・対応音声・色空間 などの詳細情報を保存
  • 今回は、 4K対応のダミープラグ を1080p認識に変更したいケース
  • 目的は、 ダミープラグのEDIDをHDMIキャプチャデバイスのEDIDで上書き し、PC側でキャプチャデバイスとして認識させること

必要なもの

  • Raspberry Pi Zero (I2Cコントローラ搭載、HDMI端子あり)
  • HDMI-Mini HDMI変換アダプタ (Pi Zero用)
  • i2c-toolsパッケージ (Raspberry Pi OS Liteにインストール)
  • ダミープラグEDIDをコピーしたいデバイス (例:HDMIキャプチャカード)

注意事項

  • 誤った操作でモニターや他のI2Cデバイスを破損する危険性
    • 特に実際のモニターやPCのメモリSPD EEPROM等への書き込みは厳禁
  • 書き込み前に必ずEDIDのバックアップ取得
  • I2Cバス番号の選択ミスに注意
    • Pi Zero/1/2/3: /dev/i2c-2
    • Pi 4: /dev/i2c-20, /dev/i2c-21
    • Pi 5: /dev/i2c-11, /dev/i2c-12

Raspberry Piのセットアップ

  • sudo raspi-configI2Cインターフェース有効化
  • sudo apt install i2c-toolsi2c-toolsインストール
    • Pi Zeroの場合、ネットワーク接続やUSB-Ethernetアダプタが必要
    • SDカードをPCに挿し、chrootでパッケージ導入という代替手段も

EDIDの読み出し・バックアップ

  • 使用するI2Cバス番号を指定(例:edid_i2c=2
  • i2cdetect -y $edid_i2cEDID EEPROMの存在確認
    • アドレス0x50で認識されるのが一般的
  • get-edid -b $edid_i2c > edid-orig.binダミープラグのEDIDをダンプ
  • od -v -An -txC edid-orig.binEDID内容を16進ダンプ表示
  • 同じ手順でキャプチャデバイスのEDIDもダンプ

EDIDの書き換え手順

  • ダミープラグを再接続し、 新しいEDIDデータを書き込み
  • 書き込みスクリプト例(bash/dash使用):
    edidbytes=($(od -v -An -txC edid-capture-card.bin))
    for i in "${!edidbytes[@]}"; do
      byte=0x${edidbytes[$i]}
      echo Writing byte $i: $byte...
      i2cset -f -y $edid_i2c 0x50 $i $byte
    done
    
    • EDIDデータを1バイトずつI2C EEPROMへ書き込み
  • 書き込み後、get-edid -b $edid_i2c > edid-test.binで再度ダンプし、diff edid-test.bin edid-capture-card.bin完全一致を確認

動作確認とまとめ

  • ダミープラグをPCに接続し、 キャプチャデバイスとして認識されるか確認
  • EDID書き換え成功 で、PCは4Kモニターではなく1080pキャプチャデバイスとして認識
  • 逆方向(1080p→4K)にも応用可能
  • I2C書き込みはRaspberry Pi上でのみ実施推奨、PC本体では絶対に行わないこと

まとめ

  • ダミープラグのEDIDはRaspberry Piとi2c-toolsで書き換え可能
  • 正しいバス番号とデバイスアドレスの確認が必須
  • 事前のバックアップと書き換え後の検証が安全確保の鍵
  • EDID編集により、仮想ディスプレイ用途やデバイス偽装が柔軟に実現可能
  • リスクを十分理解した上で慎重に作業実施

Hackerたちの意見

これらはパススルーで購入することもできるんだけど、古いシステムには便利だよね。俺の2011年のAMD FX8350システムでは、オンボードの880Gノースブリッジ+ビデオチップセットが4kディスプレイでHDMI経由で正しく映像を出力できないんだ。これを使って1080pの画像を送るようにすると、モニターが2倍の整数スケールで4kにアップスケールしてくれるから、すごくうまくいくよ。

俺もいくつかパススルーを持ってるんだけど、別の選択肢として投稿に書いておくべきだったかも。俺が持ってるのはちょっと高級で、モニターからEDIDを読み取って保存して、別のモニターのオーバーライドとして使えるんだ。もう一つすごいのは、モニターを常に検出させることができるところ。俺のモニターの一つは、電源を切るとほぼ自動でプラグが抜けちゃうから、いろいろ問題が起きてたんだけど、パススルーで完全に解決したよ。使ってるのはTHWTのHD-EWBってやつ。

ただし、このダミープラグには一つ注意点があるんだ。HDCPには対応してないんだよね。ヘッドレスマシン用に特定の解像度出力を強制するのはうまくいくけど、HDCPを必要とするものを動かす場合には失敗しちゃう。ここで聞きたいんだけど、HDCPを交渉できるようなHDMIダミープラグみたいな良い解決策知ってる人いる?HDCPが必要な動画ストリーミングアプリをフル解像度でテストしたいんだけど、テストごとにフルテレビを用意するのは面倒なんだ。見つけた一つの解決策はHDMIマルチビューワーで、各ポートに対してHDCPを交渉するみたい。

Amazonで「HDCPストリッパー」としてオープンに宣伝されているHDMIスプリッターの一つを試してみて。

HDCPを解除するのは難しいよ。HDCP 1.4にダウングレードして、1.4に「準拠」したデバイス(ダミーモニターとして使うため)を用意する必要がある。HDCP 1.4より新しいものが必要なら、たぶん無理だね。

俺はこのHDMIスプリッターを使ってる。プリプログラムされたEDIDを設定するか、HDMI出力1に接続したものからEDIDを学習して、スプリッターが接続されている限りは出力に何も接続しなくても接続されたモニターとして表示されるんだ。コンピュータやゲーム機とスプリッターの間でHDCPを交渉して、出力モニターにはHDCPなしで信号を送るみたい。 https://www.amazon.com/dp/B07VP37KMB

俺はちょっと違う使い方を考えてる。HDMIを出力する組み込みシステムがあるんだけど、そのブート画面を別のHDMIストリーム(静止画でOK)に置き換えたいんだ。組み込みシステムには何も手を加えたくない理由が千とあるから、安くて堅牢にこれを実現する方法はないかな?

Aliexpressでは、HDCPを解除してHDMIを転送するっていう商品が売ってるけど、買う時は注意してね。

面白いヒント:同じプロセスで、一般的なモニターやノートパソコンの画面に保存されているEDIDを変更できるよ。時々、他のi2cアドレスに書き込むことで、tconのさまざまな設定を変更できることもある。ラズベリーパイは必要ないから、どんなコンピュータでも大丈夫。

著者はPiを使うことを勧めてるけど、必須ではないって言ってるね。>「PCでこれらのコマンドを試すと、EDIDじゃないハードウェア、例えばRAMモジュールのSPD EEPROMを誤ってフラッシュしてしまう可能性がある。」

フラッシュチップには通常、書き込みを有効/無効にするピンがあって、ほとんどのモニターやテレビはEDIDへの書き込みを防ぐように配線してると思う。安いものだけは気にしないんじゃないかな。保護がないと、読み取り中に電圧のグリッチが起きて書き込みになっちゃってフラッシュが壊れるリスクがあるからね。

同じプロセスで、一般的なモニターに保存されているEDIDを修正することができる それはハードウェア開発者にとって奇妙な見落としだね。通常、彼らは事前にプログラムされたEPPROMを購入して、書き込み有効ピンが高に引っ張られないボードに取り付けるんだ。モニターのような製品にEEPROMを入れて書き込み可能にするのは変だと思うけど、出荷されるハードウェアにはもっと奇妙なことも見たことがある。

USB ibus2プラグのヘックスダンプはEDIDに連結されてるよ。

家でこれを試したい人へのちょっとした注意点だけど、これらの安いダミープラグは256バイトのEEPROMしか持ってなくて、高リフレッシュ・高解像度の設定を指定するために必要なさまざまな拡張EDIDブロックを保存するには足りないんだ。1080p60だけが欲しいなら大丈夫だけど、4k240モニターをシミュレートすることはできないよ。それに、いくつかは書き込み保護ラインが高(または低?忘れた)に引っ張られてて、実際に書き込むにはちょっと手を加える必要がある。

WPの高低は、使われるチップによるかもしれないね。

KVMとLinuxの問題を解決するための安いDisplayPort EDIDエミュレーターを知ってる人いる?前に調べた時は、HDMIよりずっと高くて、新しいKVMを買った方がいいレベルだった。

ここでの問題は、DisplayPortがEDIDのためにI2Cバスに接続された基本的なEEPROMを使ってないことだよ。代わりに、高速なDisplayPort専用のAUXバスを使っていて、これをいじるのはかなり複雑なんだ。正直、VESAに入会してたくさんのNDAにサインしないと、まともなドキュメントすら見つからないと思うよ。

カーネルオプションでEDIDをオーバーライドできるよ(https://foosel.net/til/how-to-override-the-edid-data-of-a-mo...)、でも仮想モニターを追加したいかは分からない(https://askubuntu.com/questions/453109/add-fake-display-when...がうまくいくかは不明)。

ところで、どこかにEDIDバイナリの良いアーカイブはないかな?それとも、もっと良い作成プログラムとか。いい感じのプログラマブルEDIDエミュレーターを持ってて、モニターや他のものをクローンできるんだけど、特定の解像度や機能を設定したい時があって、方法がないんだよね。(例えば、8KでDSCとか)https://github.com/bsdhw/EDIDは知ってるけど、最近のモニターに関してはちょっと限界がある。自分でもhttps://www.analogway.com/products/aw-edid-editorを使って作ったけど、いろんなモードのニュアンスや設定の優先順位を決めるのがかなり難しい、少なくとも私にはね :)

最近似たような問題があったんだ:安い5.1サラウンドシステムのサウンドバーを買ったんだけど、HDMI経由でDolby TrueHDまで対応してる。でも、ここが問題で、eArc対応のデバイス(新しい世代のテレビ)でしか動かないんだ。PCを接続すると、SPIDFやauxを使わなきゃいけなくて、音質が落ちちゃう。一つの解決策はオーディオエクストラクター/スプリッターを買うことだけど、サウンドバーにeArcとして認識させるためにPCのEDIDを偽装するってのもある。まだこれに取り組んでるけど、厳密なガイドラインがないのが残念だね。

EDID編集の経験は(ちょっと多すぎるくらい)あるよ。私の提案は以下の通り: - あなたが言ったAW EDID Editor。 - CRUはWindows専用のツールで、モニターからダンプしたEDIDファイルを修正できる(シリアルなどの記述を削除して詳細な解像度のためのスペースを作る)、でもWineでは動かないよ。 - 010 Hex EditorにはEDIDテンプレートがある。 - LinuxではFlatpakからwxEDIDをインストールできる(確か、配布パッケージはWxWidgetsでクラッシュする)。でも、セクションを作成できるかは分からない。 - v4l-utilsにはedid-decodeがあって(git diffのtextconvツールとして使える)、でもEDIDファイルをエンコードするのには役立たない。HDMIのEDIDにはCEA拡張ブロックがあって、DPのEDIDにはDisplayID拡張ブロックがあることが分かった。256バイトを超えるマルチページEDIDの作業はしたことがないし、それをエミュレートするためのEEPROMチップや、読み書きするためのプロトコルやAPIも知らない。

https://www.extron.com/product/software/edidmanager30 https://www1.kramerav.com/au/product/edid%20designer どちらも無料だけど、配布は自由じゃないよ。Extronの方は、彼らのハードウェアを使っているプロジェクトや組織で作業している必要があるかも。

ダミープラグって何で存在するの?ソフトウェアではできないことって何があるの?(18個の仮想ディスプレイを持ってて、ダミーは使ってなかった人として聞いてるんだけど)

モディファイドされたChromebox(WindowsとLinuxが起動するやつ)を持ってるんだけど、HDMIポートにビデオデバイスが接続されてないと起動しないんだ。だからダミープラグを使わざるを得なかった。

おそらく、簡単にソフトウェアを変更できないデバイスのためだろうね。

ダミープラグは大抵の人にとってはずっと簡単だよ。リモートゲームストリーミングのためにソフトウェアで偽の4Kモニターをデスクトップに追加したけど、思ったよりもずっと複雑だった[^1]。 [^1]: https://pfy.ch/programming/4k-sunshine.html

たくさんのOS/GPU/ドライバーの組み合わせでは、任意の設定で仮想ディスプレイを設定できないことが多いんだ。OBSやSteam/Parsecなどでのストリーミング設定に必要になることもあるし。数年前、LinuxのXorgとオープンソースドライバー、WindowsのNvidiaではなんとか動いたけど、MacOSやWindows+AMDまたはIntel GPUではうまくいかないことが多いね。

リモートデスクトップを使ったRaspberry Piは、モニターが物理的に接続されてないとデスクトップを表示しないんだ…博士課程の学生には一番簡単な解決策だね。

一例として、PCでLooking Glassというソフトを使って、Windowsの仮想マシンとやり取りしてるんだ。コンピュータには2つのGPUがあって、Linuxホスト用にAMDのやつと、Windowsゲスト用にパススルーするNVidiaのやつがある。Looking GlassはそのNVidia GPUの出力をキャプチャして、デスクトップのウィンドウに表示してくれる。これでVM内でWindowsソフトを使えて、まあまあのパフォーマンスが得られるんだ(Windowsは7以降、まともに動かすにはグラフィックアクセラレーションが必要だからね)。でも問題は、NVidia GPUはディスプレイが接続されてないと何もできないこと。NVidia Quadro GPUはモニターのEDIDをダンプして、そのファイルを出力にマッピングすることができるけど(そうするとGPUはその出力にモニターが接続されてると思い込む)、一般向けのGPUはこれに対応してないんだ。そこでダミープラグが必要になる。

バイナリの組み込みLinuxディストリビューションのテストに使ってるんだ。OSをだましてディスプレイが接続されてると思わせることで、ユーザーのデプロイメントにはない新しい変数が導入されるからね。そして、安価なハードウェアソリューションなんだ。これを買って取り付ける方が、エンジニアがecho on > /sys/whateverやその周りのロジックを書くよりもコスト効果が高いと思う。

HDMIダミープラグは、そもそも存在するべきじゃないソフトウェアの問題を解決するためのハードウェアソリューションだよ。

ダミープラグはデバイスのフィンガープリンティングを変更するために使えるのかな?