●  20090814 ウエスティングハウスL2410NMの滲み

【L2410NM購入、それは地雷を踏んだとも言う】

 この液晶モニタを買った人は「滲み」に遭遇した人が多いと思います。

HDMIで接続しているにもかかわらず、こんな現象になります。
HDMIで繋いでいるのに...

オーバーシュート、アンダーシュートがひどい...的な絵。

 これを解消するには、GeForceであれば、レジストリにOverrideEdidFlagsを入れればOKなのですけど、私のPCはAMD780Gなのでその方法が使えません。
DVI-HDMIドングルを変えるとか、変換ケーブルにすればいいとかいう情報は転がっていたのですが、どうもうまくいきませんでした。

今回のメモはそんな地雷なモニタと激闘の末、見事勝利したという話です。

【それまではGeForceで妥協していた】

 まず、購入直後からその異変に気づきました。滲んでいると。
購入店のTWOTOPに相談したところ、店の人が色々対応してくれたあげく、返品しても良いとのことになったのですが、その場での返品はやめて、自分で調べてみることにしました。
その末でダメであれば返品することにしたんです。

Webで調べてみると、GeForceならば回避できるという情報をみつけ、グラフィック内蔵チップセットでありながら、GeForce 8400GSを購入した訳です。

GeForceではドライバ内のInf(あるいはレジストリ)をいじって、EDIDをオーバーライドする方法で回避できました。

[nv_SoftwareDeviceSettings]
HKR,,OverrideEdidFlags0,%REG_BINARY%,5C,85,80,51,00,00,FF,FF,04,00,00,00,68,34,20

しばらくは、これの呪文の意味がわからずとも、現象が収まったのでこれで運用していました。

しかし、ローエンドのGeForce8400GS(ファン付き)でさえ、手で触れないほど熱くなります。
この発熱の多さに嫌気がさして、この板を撤去することに決めました。

その決断が、この後に長い道のりを通らされる事になるとは、この時は予想もしていませんでした。

ちなみに、RadeonのドライバにGeforceのような設定がないものか?
色々調べてみたんですが、みつかりませんでした。

【ふとした思いつき】

OverrideEdidFlags とあるので、EDIDをでっち上げれば良いのではないかと...ふと思いついたんです。
要するに、モニタから出力されるEDIDを、ビデオカードが無視してレジストリからその値を持ってくる訳ですから、モニタが出すEDIDが変われば良いのではと考えました。

【EDIDの出所と流路】
EDIDは、モニタの中に装着されているEEPROMから出てきます。
モニタとPCをつなぐケーブル(DVIやHDMI)にはDDC(=I2C)バスの信号線があり、そこを経由してPCに流れています。

そんな仕組みから、ケーブルを加工して間にEEPROMを噛ませれば良いのではないかと考えました。

【DVI-HDMIドングルの改造】

AMD780Gのマザーボードには、DVI-HDMIドングルがついてきていましたので、それを改造しました。

それとこのドングル、中はどうなっているのか非常に興味があったんです。
高速なデジタル信号をやりとりするため、高度なエンジニアリングが投入されているのではないかという興味が。

で、ちょっと堅めの樹脂でモールドされているのでニッパーで一生懸命ほじくりほじくってみたところ、
現れたその中はなんとただのリード線!

これには驚きました。こんなもんでも大丈夫なのかと。大丈夫なんです。

期待を裏切られたのが幸いして、加工しやすかったです。
これをこんな風に改造しました。

スペシャルドングル

ドングルに、ICソケットとトグルスイッチをくっつけました。
トグルスイッチは、EDIDの出所をこれから作る変造EEPROMにするか、モニタにするかの選択です。
EDIDの出所を変造EEPROMにした場合には、モニタからのDDCバスは切り離されます。

こうして変造ドングルができあがりました。

【EEPROMの調達】

EDIDで使用できる石は、普通1Kbit品か、2Kbit品のようです。
いわゆる24C01とか24C02です。

私は、ここで使用したルータの残骸から運良く24C02が出てきましたのでそれを利用しました。
小さすぎて扱いづらい24C02

24C01とか24C02以外の、アドレス指定バイト数が1バイトでない石(24C64など)では代用できないようです。

なければDigi-KeyかRSでも行ってもらえれば確実に入手できると思います。

【ライタの製作】

EEPROMの書き込み機は、部品の入手性からJDMプログラマーに決定しました。
オリジナルのJDMプログラマーでは、PICなども焼けますが、EEPROMの書き込みに特化させ、8Vの出力機能を省きました。回路図は本家を参照していただければと思います。

この回路、チープな部品を少量で済ますことを目的としていますね。アイディアものです。

できあがりはこんな感じです。
24CXX専用ライタ

この為だけに作ったSSTって雰囲気です!悪く言えば適当に作ったって感じですけどね。

【EDIDの何処をどう直しゃぁいいんだ!】

EDIDを直せば滲みは直る。ということはNVIDIAのドライバ調整から証明されましたが、どこを直すかについては、全く訳わかりません。
というのは、先に登場した

[nv_SoftwareDeviceSettings]
HKR,,OverrideEdidFlags0,%REG_BINARY%,5C,85,80,51,00,00,FF,FF,04,00,00,00,68,34,20

は何を意味しているのかということが分からない。

色々調べているうちに、このフレーズが書いてあるサイトを複数見つけ、
それを眺めていると次の法則がわかりました。

HKR,,OverrideEdidFlags0,%REG_BINARY%,5C,85,80,51,00,00,FF,FF,04,00,00,00,68,34,20
先頭から、
5C,85,80,51→EDIDの9バイト目から4バイト
00,00,FF,FF→分からない(日付という情報あり)
04,00,00,00→これも分かりません
68,→オフセット0x68(=105バイト目)からオーバーライドを適用する
34,→0x34(=52)バイトオーバーライドを適用する。
20→オーバーライドするデータ

のようなのですが、
上の例だと、オーバーライドするデータが1バイト(=0x20)しかなく、何か変です。
しかも、オフセット0x68は、Descriptor Block 3のhigh significant bits for Horizontal Image Size (4 upper bits)
です。
この値、ちゃんと考えて作ったものなのかどうか???かなり怪しいと思います。

海外のサイトには、

HKR,, OverrideEdidFlags0, %REG_BINARY%, 5A,63,1F,0F,00,00,FF,FF,04,00,00,00,7E,01,00
をよく見かけます。

これは、0x7E = Extension EDID Block(s) 01バイト、00でオーバーライドするという意味で、
拡張ブロックを無効にするという意味です。
(拡張ブロックは、EDIDの先頭128バイトの後ろに続く128バイトのブロックのデータです。)

ちなみに、EDID128バイトをオーバーライドする記述も見つかりました。
HKR,, OverrideEdidFlags0, %REG_BINARY%, DE,10,92,02,00,00,FF,FF,04,00,00,00,00,80,00,FF,FF,FF,FF,FF,FF,00,4D,10,B1,0F....

今回、私が採用したデータは、拡張ブロックを無効にするという方法です。
(ほか、色々試しましたがこれが正解だと思います)

【EDIDのデータを用意する】

元のEDIDを吸い出す為、
Monitor Asset Manager
http://www.entechtaiwan.com/util/moninfo.shtm
というツールを使います。
これで、今使っているモニタのEDIDを吸い出すことができます。
吸い出した物を、コピー&メモ帳などにペーストして、テキストファイルとして保存します。

あと、チェックサムはどうしたもんか?
チェックサムは全てのバイト値を足し込んで、その下2桁(16進)を取り出し、256から取り出した値を引いた数となります。
私の場合、モニタから引っこ抜いたEDIDデータを直接編集するため、チェックサムを計算するVBAをささっと作り計算しました。
Sub aaa()
'    こんな形式のEDIDデータファイルのチェックサムを求めます
'00FFFFFFFFFFFF005C85805100000000
'1F120103683420782EC585A459499A24
'125054BFCF00810081C0B3009500950F
'010101010101283C80A070B023403020
'360006442100001A000000FD00384B1E
'5010000A202020202020023A80187138
'2D40582C450006232100001E000000FC
'004C323431304E4D0A2020202020002E

    Open "C:\EDID.txt" For Input As #1
    
    Dim strA    As String
    Dim lngA    As Long
    Dim lngB    As Long
    Dim lngSum  As Long
    
    Dim lngNum  As Long
    Dim lngByteCount  As Long
    
    Dim strW    As String
    Dim strSum  As String
    
    lngSum = 0
    lngByteCount = 0
    
    While Not EOF(1)
        Line Input #1, strA
        
        
        If Len(Trim(strA)) > 10 Then
            strA = UCase(strA)
            strSum = ""
            For lngA = 1 To 16
                lngNum = 0
                For lngB = 1 To 2
                    strW = Mid(strA, (lngA - 1) * 2 + lngB, 1)
                    If lngB = 1 Then
                        lngNum = lngNum + getnum(strW) * 16
                    Else
                        lngNum = lngNum + getnum(strW)
                    End If
                Next lngB
                
                lngSum = lngSum + lngNum
                
                lngByteCount = lngByteCount + 1
            Next lngA
        End If
    Wend
    lngSum = lngSum - lngNum    '最後のバイトを除外します。
    strSum = Hex$(lngSum)
    'チェックサムは256から引いたものとなります
    lngSum = 256 - (getnum(Left(Right(strSum, 2), 1)) * 16 + getnum(Right(strSum, 1)))
    Debug.Print Hex$(lngSum)
    Close #1
End Sub
Function getnum(strW As String)
    Dim lngA    As Long
    For lngA = 0 To 15
        If Hex$(lngA) = strW Then
            getnum = lngA
            Exit Function
        End If
    Next lngA
End Function
このコードは、Excelとか、WordのVBAの標準モジュールに貼り付けて使用します。
チェックサム値は、イミディエイトウインドウに出ます。
テキストファイルを直接書き換える訳ではありませんので、テキストエディタでチェックサムをコピペします。

ちなみにチェックサムがおかしいと、L2410NMはブルーバックを出力します。

【EEPROMにEDIDを書き込み!】

JDMプログラマーにEEPROMを突っ込み、icprog.exeをダウンロードして書き込みます。

icprog.exeのファイル読み込み機能を使用せず、先のデータファイルをクリップボードにコピーし、icprog.exeに貼り付けします。

私は、ドックに乗せたThinkpadT60pを使って書き込みしていますが、なぜか一回スタンバイから復帰させないとicprog.exeが働きませんでした。

そしてこの変造EEPROMが完成しました。

【変造ドングルに変造EEPROMをつけた、滲みは解消したが】

モニタの電源をOFFにして、ケーブルを差し込み、モニタONと。
見事!滲みは解消しました。
見事滲み解消

色味は結構違います。許容範囲内です。
これで今回のミッションは成功したかと思われたが、甘かった!

PCastTV for 地デジが「コンテンツは保護されています。現在のディスプレイ接続状態ではTVを出力できません。」とエラーを吐き、ハイビジョンが見られないんです。

これは痛い。痛すぎます。

その後、EDIDを色々変えて試してみたが、全てだめ。
試しに、EDIDをオリジナルと同じにしたら、滲みが復活しさらに「コンテンツは保護されています・・」が表示されてしまいます。最悪状態です。

【変造EEPROMではなぜダメなのか?】

オリジナルと同じデータでもなぜダメなのか?

変造EEPROMからEDIDを取得する場合は、DDCバスはディスプレイと切り離される点が違っている点に気づきました。
と次の瞬間、HDCP絡みの信号をDDCバスでやりとりしているのではないかと言うことが脳裏をかすめたんです。

(恥ずかしながら、それまでHDCP関係の情報はすべてTDMSに乗せてやっていると勝手に思い込んでいたんです)

早速、規格書
http://www.digital-cp.com/files/static_page_files/8006F925-129D-4C12-C87899B5A76EF5C3/HDCP_Specification%20Rev1_3.pdf
を読むと、どうやら、DDCバス経由でデバイスアドレス0x74と0x76にHDCP Portが設けられて情報をやりとりしていることが分かりました。

どうりで、変造ドングルで液晶本体とDDCバスを切り離すと、だめな訳です。
これで勝利へと一歩近づきました。

【変造EEPROM、本体へ内蔵】

であれば、変造ドングル作戦から、L2410NMを改造する作戦に切り替えることにしました。
すなわち、液晶本体のEEPROMを変更するという作戦です。

この液晶、買って1年たっていなくてまだ保証期間内ですが、もうこの件で改造しちゃってますので、躊躇することなくバラシました。

液晶パネルの裏はこんな感じです。
L2410NMの内部
左はインバータ、真ん中は制御基盤、下は電源です。わりかしきれいに作られています。

制御基盤にはHDMI端子があり、そばに、とってもちっちゃい24C02がくっついています。
HDMI端子の側についている24C02

こいつを外してデフォルトのEDIDを無効にしますが、なくすといけないので、5〜8番ピンだけ浮かせます。

変造EEPROMを裏面からくっつけます。
24C02を裏からくっつけた

【変造EEPROM、装着完了そして勝利】

必要最低限のカバーをつけて、電源を入れます。滲みはありません。

次、IO-DATAの地デジ環境チェックのソフトでHDCPが有効になっているかを確認します。
二重丸が3つ点きました。一応OKです。
HDCP -> OK

次にいよいよPCastTV for 地デジです。
地デジ -> OK
正常に録画番組が見られました。

うーん、感無量です。これで念願のRadeonで、滲みなしで、地デジ!が実現しました。

【滲みについて】

滲みは、EDIDの拡張ブロックを無効にしたことによって解決しました。
結局、TDMSに滲んだデータが既に流れているのか、液晶モニタ内で滲み加工されて滲んでしまうのか、どのようなメカニズムで発生しているのかは分かりません。
しかし、デジタル接続なのにこんな仕組みが用意されていたとは、なんと言うか、余計な物を!というか、別の意味で感心しました。

【こんなDVI-HDMI変換機器だと回避可能では?】

こんな仕様のドングルなどがあれば、今回の滲みは回避出来ると思います。
・EDIDを先頭128バイトでちょん切る。いわゆる Extension EDID Block(s) を0に設定してチェックサムを入れ替える機能を持つ。
・DDC信号のうち、EDIDのみオーバーライドし、そのほかHDCPなどはスルーする。


 いかがでしたでしょうか? Radeonでも滲みは解消できました。

 実は、改造なしで滲みが解消できたかも知れないということを次回のネタで知りました。
次回は、THinkpad T60p をQXGAに改造する話です。
-------------------

今回の回り道の数々
・当初作ったJDMプログラマーがまったく動かなかった。
あるサイトを参考にして作ったが、本家に行って調べて回路図を調べてみたところ、いくつか違う点が。本家を参考に修正したところ直った。
変だと思わずにそのまま作った私が情けない。

・例の「68,34,20」のデータをこちらの勝手な解釈で適当に書き込んでみた
0x68から0x34バイトということは、最初の128バイトを超えてしまう。それは大問題だと思いつつも実験。
オフセット0x34に0x20を書き込んで、それ以降0xFEバイト目までNULLにしたところ、滲みは解消した。拡張ブロックが無効になった効果だけのような。
オフセット0x34に0x20を書き込んで、それ以降0xFEバイト目までオリジナルと同じにしたところ、滲みあり。直っていない。
オフセット0x34に0x20を書き込んで、それ以降0xFEバイト目まで0xFF...については試す気にもならず。拡張ブロック255個はさすがにありえないかと。

・なんと、Thinkpad T60pのドックのDVIでは、オリジナルの状態でも滲まない。
しかし、HDCPは無効であった。Monitor Asset Manager では、拡張ブロックが無効と報告する。不思議だ。


EDID L2410NM 滲み 解消 解決 RADEON

オーディーへのMail

ホーム