こんにちは、
私はYocto Scarthgap BSP上でi.MX 8M Plusを使用していますが、HDMI EDIDの4ブロック(ブロック0~3)を読み取ろうとしたときに問題が発生しています。
[環境]
SoC: i.MX 8M Plus
BSP / OS: Yocto Project Scarthgap (カーネルバージョン: lf-6.6.52)
[問題の説明] EDIDの4つのブロックすべてを読み取ろうとすると、システムはブロック2(セグメント1)以降の読み取りに失敗します。ブロック0と1(セグメント0)は正常に読み取られますが、その直後の読み取り操作が失敗します。
【根本原因/分析】デバッグの結果、セグメントスイッチコマンドの後に使用されているDDCアドレスに問題があることが判明しました。
ブロック2とブロック3を読み取るには、セグメントスイッチコマンドが正しく実行されます。
セグメントを切り替えた後、ドライバは標準のDDCアドレス0xA0/0xA1 (I2Cアドレス0x50)を使用して実際のEDIDデータを読み取る必要があります。
しかし、ドライバは誤ってアドレス0x60/0x61 (セグメントポインタのアドレス)を使用してデータを読み取ろうとするため、読み取りエラーが発生します。
ドライバが、後続のデータ読み取りシーケンスでセグメントポインタのアドレスを誤って再利用しているようです。
【質問】
これは、i.MX 8M Plus Scarthgap BSP の HDMI/DDC ドライバーにおける既知の問題でしょうか?
このアドレスの不一致を修正するための既存のパッチや回避策はありますか?
変更が必要な関連ドライバコードに関するご助言やヒントをいただければ大変ありがたいです。
よろしくお願いいたします。
これは既知の問題ですか?
実質的にはそうです。NXP Communityには、i.MX8MPでブロック1/セグメント0以降のE-EDIDが正しく読み取られないという報告が少なくとも1件あり、その報告では調査のためにdrivers/gpu/drm/bridge/synopsys/dw-hdmi.c具体的にユーザーに示しています。
既存の回避策はありますか?
はい。報告されている回避策は、デバイスツリーでddc-i2c-busを設定することにより、HDMI内部のDDCエンジンをバイパスし、通常のSoC I2CコントローラをDDCに使用することです。NXPコミュニティのThreadによると、HDMI DDCピンをI2C5に再多重化し、 ddc-i2c-bus = <&i2c5>;を使用することで、i.MX8MPでのマルチブロックE-EDID読み取りの問題が解決したとのことです。
既に公開されているパッチはありますか?
検索結果には、貴社の BSP ラインのdw-hdmiにおける0x30 / 0x50スレーブ アドレス処理の問題を具体的に修正する、公開されているアップストリームまたは NXP が公開したパッチは見つかりませんでした。公開されているdw-hdmi.cコードには、この動作を引き起こす可能性のある「最初のI2Cメッセージから取得したスレーブアドレス」ロジックがまだ示されています。
ボードの配線が許せば、最もリスクが低く、既に報告されている回避策は、HDMI DDC を内部のdw-hdmi I2C エンジンから通常の SoC I2C コントローラに移動することです。i.MX8MPでは、報告された解決策が1つあります。
I2C5_SCL / I2C5_SDAに多重化されます。NXPコミュニティのThreadで、ユーザーがこの変更によってi.MX8MPでのマルチブロックE-EDID読み取りの問題が解決したと報告しました。