中華通販LCDパネルで作った1280x800のHDMIディスプレイに表示できました.
今回は、HDMI→LCDブリッジロジック回路設計にあたって困ったコトを書こうと思います.
【windows PCには接続できなかった】
windowsの表示解像度を1280x800に設定してからこのモニタを繋ぎます.しかし映りませんでした.
たぶん原因は、PC-モニタ間で行われるネゴシエーション対応を実装してないからだと思います.HDMI規格書には、ネゴに関する様々な情報が書かれていますが、それらのうちどれを実装すればwindowsにご満足いただけるのかが不明なので実装する気が起きません.
運よく表示できたのは、Raspberry-pi3のHDMI出力でした.Raspbianはモニタとのネゴシエーションをやってないみたいです.というわけで残念ですが、Raspbian専用モニタになってしまいました.
ちなみにRaspbianの表示解像度変更は /boot/config.txt のこの辺をいじりました.
# uncomment to force a console size. By default it will be display's size minus
# overscan.
framebuffer_width=1280
framebuffer_height=800
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=27
【HDMI信号のtiming仕様が不明】
HDMIケーブルの信号は、下図のようになっています.要点は、
1) 周波数は1280x800解像度でのおおよその値
2) 1ピクセルのデータを送信するのに各色ごとに10bitを要する (8/10変換のため)
3) クロック周波数はデータレートの1/10である (=ピクセルレート)
4) HDMIモニタは、75→750MHzの周波数逓倍回路を要する
ふ~ん、と思ったところで、さらに欲しい情報が2つあります.
5) 上図ではclockがD1D2境界とD5D6境界で遷移しています.しかし、この絵が正しいのかどうかはHDMI規格書Rev1.3のどこにも書かれていないのです.これが不明だと、シンボルをどこで区切ったら良いのかが不明になって困ってしまいます. (=シンボル同期問題)
6) 下図のような、bit遷移とclock遷移のtimingがHDMI規格書Rev1.3のどこにも書かれていません.これじゃFPGAを設計できないよ. (=bit同期問題)
シンボル同期問題を次の方法で回避しました.
光DISKやHDDでは、データには存在しない特定のシンボルパターンを検出することで同期します.
同じことをHDMIでもやれば良いので、特定のシンボルパターンをどれにするかを勝手に決めました.水平・垂直同期期間を示すシンボルパターン4種のうち、RGBのBに属するsync0を同期シンボルパターンとして実装したら上手く動きました. (これが正解なのかどうかは知りません)
wire [9:0] sync0 = 10'b1101010100; // zero
wire [9:0] sync1 = 10'b0010101011; // hd
wire [9:0] sync2 = 10'b0101010100; // vd
wire [9:0] sync3 = 10'b1010101011; // vd,hd
bit同期を次の方法で回避しました.
コンパイル制約で、めくら打ちでいいとこ探ししました. (げろげろ)
【LCD-IFのtiming仕様が不明】
上記6と同じことがLCD仕様にもいえまして、製品仕様書にこういう図は掲載されているのですが、timing情報の記載はありません.コンパイル制約で、めくら打ちでいいとこ探ししました. (げろげろ)
【PCは水平・垂直同期を出力しているのか?】
HDMI規格書によると、水平垂直同期期間では、HSYNC,VSYNC,DE,CTL[3:0]を伝送できるようになっています.
HSYNC 水平同期 (Bに乗る)
VSYNC 垂直同期 (Bに乗る)
DE 画像データか同期信号かの識別 (RGBに乗る ※)
CTL[1:0] いろいろ (Gに乗る)
CTL[3:2] いろいろ (Rに乗る)
ここまでは、HDMI規格書1.3に明記されています.
それでいつものように規格書の悩ましいところですが、上記の信号伝送能力を有すると規格書は述べていますけれど、実際の製品がこの機能を利用しているかどうかは規格書の知ったこっちゃありません.
Rapsberry-pi3のRaspbian OSで実際に試してみて判ったところでは、VSYNCもHSYNCも送信されていませんでした.CTL[3:2]は謎の信号が送信されていました.CTL[1:0]は常時ゼロでした.DEは送信されています.
そんなんでどうしてLCDが表示できるの?と思われるでしょう.
LCDパネルのIFは、VSYNCもHSYNCも不要なのです.
LCDパネルに必要なのは、DEだけなのです.LCDパネルには、RGB+DEを与えます.
※ DEが送信されるとは、この4パターンのいずれかが検出されたらDEが非アサートとなる、という意味です.DE bitがRGBに埋め込まれているわけじゃないんです.
wire [9:0] sync0 = 10'b1101010100; // zero
wire [9:0] sync1 = 10'b0010101011; // hd
wire [9:0] sync2 = 10'b0101010100; // vd
wire [9:0] sync3 = 10'b1010101011; // vd,hd
-----
なんだか他にもunknownがあったような気がするんだけど忘れちゃった.
もっとも、HDMI規格書を書いた人に恨みつらみを言う気はありません.
そもそも、技術規格というのはお金を払った人だけに開示されるものですから、表情報はここまでだよ、裏情報はお金次第だからね、という新興宗教みたいな性質が多かれ少なかれありますから.
また、規格書に書かれた膨大な情報のうち、どれが必須で、どれが盲腸なのかを規格書が明示する義理もないんです.どれが盲腸なのかはお金を支払った仲間同士で情報交換してくれたまえという新興宗教信者同士みたいな性質が多かれ少なかれありますから.
規格書モノで遊ぶには、規格策定者達のゲスな気持ちを察して快感を感ずる神経があるといいかもしれません.仕事でそれをやらされるとかな~り地獄なんですがねwww
前回へ 次回へ
なお、いつものように上記の情報で貴方が受けた損害についてわたしは知りませんのでハマったら素直に死んでください.
かしこ
面白い記事をありがとうございます。大変参考になりました。
返信削除Windows PCで認識されない件ですが、解像度設定データを書き込んだEEPROMをHDMIケーブルにつなげばよいのだと思うのですがどうでしょうか?
部品代に数百円とデータ作成のフリーソフトがあれば作れます。
ROMライターはラズパイかもしくはPCのHDMIポートからフラッシュROMに書き込むことができるので特に不要でできますよ。
やはりそういったプロファイル関係のようでしたか.
削除そのプロトコルもHDMI規格書に書かれているんでしょうね.
機会とやる気があったら調べてみたく思います.
HDMIモニターの仕組みとしてはモニター(か液晶パネル)側にEDIDというモニターの設定情報を書いたフラッシュROMが置いてあって
返信削除PCが接続時にI2Cの汎用のシリアル通信でそれを読んで画像信号の解像度やタイミングを調整して出力するというもののようです。
調べられるときはEDIDエミュレーターとEEPROMあたりで検索されると自作されている方の詳しい解説が見つかると思いますよ。
ありがとうございます!
削除