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

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を入れて書き込み可能にするのは変だと思うけど、出荷されるハードウェアにはもっと奇妙なことも見たことがある。

Hacker Newsで議論の続きを見る