Armadilloフォーラム

立上げ時の画面の乱れ

tomi_vhi

2023年8月1日 11時07分

渡邊です。

立ち上げ画面のロゴを変更して表示はできたのですが、どうもかなり画面が乱れてしまします。(添付参照)
色々と画面関係の設定を変更したのですが解決できていません。
(立ち上がりきれば、ほぼ画像は乱れなくなるが、やはりたまに線が出る)

何が考えられるでしょうか?

ファイル ファイルの説明
立上げ.jpg
コメント

溝渕です。

> 立ち上げ画面のロゴを変更して表示はできたのですが、どうもかなり画面が乱れてしまします。(添付参照)
> 色々と画面関係の設定を変更したのですが解決できていません。
> (立ち上がりきれば、ほぼ画像は乱れなくなるが、やはりたまに線が出る)
>
> 何が考えられるでしょうか?

https://armadillo.atmark-techno.com/guide/site/forum
上記に記載の通り、質問内容を具体的に書いていただけるとアドバイスしやすいです。

https://armadillo.atmark-techno.com/forum/armadillo/15915
前提としては上記の件でしょうか?

png_displayを起動スクリプト(rc.local等)で実行していますか? また、起動スクリプトの内容はどのようなものですか?

渡邊です。

>前提としては上記の件でしょうか?
下記の2つが絡むと思います。
https://armadillo.atmark-techno.com/forum/armadillo/15514
https://armadillo.atmark-techno.com/forum/armadillo/16369

下記はあまり関係ないかもしれません。
https://armadillo.atmark-techno.com/forum/armadillo/15915

LCDまわりのH/W構成は下記の通り。
Armadillo-460 のLCDコネクタ端子からFFCで、自作のLVDS変換基板に接続。
変換基板上にはDS90C385AのLVDS変換チップがあり、
変換後のデータをTM104SDH01(Tianma)のLCD(800x600)にLVDSで接続して使用。

解像度設定は下記の通り。
mxcfb_modedb.c
"G104AGE_L02", 60, 800, 600, 25000, 114, 112, 10, 15, 30, 3,
0, /* sync */
FB_VMODE_NONINTERLACED, /* vmode */
0, /* flag */
(G104AGE-L02 と TM104SDH01 はデータシート上互換性あり)

基本的に、上記のH/W環境と解像度設定で行っています。
画像の乱れは png_display と Xfbdev を動かしていない状態でも発生しているので、これらは関係ないかもしれません。
(アルマジロのロゴを差し替えた際に発生したと思っておりましたが。その後小さいアルマジロのロゴに戻した状態でも発生していることがわかりました。)

このような内容で分かりますでしょうか?
よろしくお願いいたします。

溝渕です。

> このような内容で分かりますでしょうか?

了解です。
https://armadillo.atmark-techno.com/forum/armadillo/16486
で描画したロゴが乱れるという意味ですね。

Armadillo-460に搭載のSoC(i.MX257)の仕様では、Pixel clock periodは最小22.5nsなので、Pixel clockは最大約44.4MHzとなります。

TM104SDH01の現在の設定だと、Pixel clockは約39.8MHzなので問題無さそうですね。

ただ、ユーザーランドから画面描画しない(Linux kernelで描画し続けている)状態でも画面の乱れが生じるとのことで、これだけを考えると(CPU処理能力の可能性は低く、)バス関連の問題かなとは思います。

なので、問題切り分けの為に、現在60fpsとしているframe rateを一旦30fpsにして動作確認してみてもらえますか?

ちなみにですが、Armadillo <-> LCD間にノイズ等は乗らない事は確認できていますか?

渡邊です。

>描画したロゴが乱れるという意味ですね。
起動時に表示させたロゴが乱れます。
正常に表示されているロゴの所々に短い横線がまばらに入るイメージです。
同期ズレのようには見えません。

"G104AGE_L02", 60, 800, 600, 25000, 114, 112, 10, 15, 30, 3, の60になっている所でしょうか?
これを30に変えてもfbsetに変化はありませんでした。
(画面の乱れも変わらず)

60、30のとき、どちらも下記のfbsetの表示

mode "800x600-60"
        # D: 40.000 MHz, H: 37.879 kHz, V: 60.317 Hz
        geometry 800 600 800 1200 16
        timings 25000 114 112 10 15 30 3
        accel false
        rgba 5/11,6/5,5/0,0/0
endmode

ちなみに解像度を800x480に変えても変わりませんでした。画面が乱れます。
(画面は 800x480 表示になる。 fbset でも 800x480 になる)

よろしくお願いいたします。

溝渕です。

> "G104AGE_L02", 60, 800, 600, 25000, 114, 112, 10, 15, 30, 3, の60になっている所でしょうか?
> これを30に変えてもfbsetに変化はありませんでした。
> (画面の乱れも変わらず)

各フィールドの意味は次の通りです。

include/linux/fb.h:
struct fb_videomode {
	const char *name;	/* optional */
	u32 refresh;		/* optional */
	u32 xres;
	u32 yres;
	u32 pixclock;
	u32 left_margin;
	u32 right_margin;
	u32 upper_margin;
	u32 lower_margin;
	u32 hsync_len;
	u32 vsync_len;
	u32 sync;
	u32 vmode;
	u32 flag;
};

"optional"となっている通り、恐らくこの値は使われません(または参考値として扱われます)。恐らくpixclockの部分の変更が必要だと思います。

渡邊です。

pixclock は、25000 ps => D: 40.000 MHz の部分だと思います。
因みに32895 ps => D: 30.4 MHz (LCDのMin値は 30MHz) でも画像は乱れます。

pixclock = 32895 のとき下記のようになりました。

mode "800x600-46"
        # D: 30.400 MHz, H: 28.788 kHz, V: 45.840 Hz
        geometry 800 600 800 1200 16
        timings 32895 114 112 10 15 30 3
        accel false
        rgba 5/11,6/5,5/0,0/0
endmode

午後からオシロが借りれるのでLCDデータの波形を確認してみます。
よろしくお願いいたします。

渡邊です。

LVDS変換基板の手前、FFC ケーブルとの接続部の立ち上げ時の信号波形を見てみました。(添付参照)
特にノイズが乗っているようには見えません。むしろ立ち上がった後の方がノイズが大きいです。

変換基板のGNDを太い線でArmadillo-460と繋ぎましたが変化なし。

ファイル ファイルの説明
hakei.jpg

溝渕です。

最初の投稿に戻りますが、

> 立ち上げ画面のロゴを変更して表示はできたのですが、どうもかなり画面が乱れてしまします。(添付参照)
> 色々と画面関係の設定を変更したのですが解決できていません。
>(立ち上がりきれば、ほぼ画像は乱れなくなるが、やはりたまに線が出る)

画面が乱れる場合とそうでは無い場合で、何が違うかを切り分けることはできますか?

例えば、xxxの通信をしている場合に乱れるとか、起動スクリプトのyyyを実行しないと乱れないとか。

渡邊です。

現状わかっていることを書いておきます。
・LCD_LSCLK、LCD_HSYN、LCD_VSYN、LCD_OE_ACD の波形は、画面が乱れるとき、乱れない時の形状は同じ。
 但し、データラインは違うものを表示しているせいか、変化します。
・立ち上げ時、DHCP で探索?しているときは、画面の乱れは落ち着きます。
・立ち上がり、xfbdev が動き画面(中央に×印)が出ると、その画面はほぼ乱れがない。(凝視するとごくごくまれに横線がでている)

よろしくお願いいたします。

むしろLVDS変換側(LVDS信号自体とその電源)側のノイズが気になりますね。

すでに、営業から答えていますが、
>xfbdev が動き画面(中央に×印)が出ると、その画面はほぼ乱れがない。
については、もとより映っている対象のラインがズレる乱れ方をしているので、
表示対象がXのチェッカー映像だと人間の認知として目立たないだけで、
常に起きていると思います。

渡邊です。

色々試しましたが、状況は変わっていません。
下記のことが判明しておりますが、下記から何かわかりますでしょうか?

・同じLDE信号の仕様の別のLCD(TM121SDSG05 V1.0)に接続しましたが、症状は全く同じ。
・22MHzまでクロックを落とすと、症状はなくなる。(LCDのMINは 30MHz なので実力で動いている)

よろしくお願いいたします。

ファイル ファイルの説明
console.png

やはり、クロックに連動するのであれば電源ノイズが疑わしいのですが、
営業から回答した計測方法で観察した結果は如何でしたでしょうか?

渡邊です。

LVDS側の波形と、LVDS周辺の電源の波形を撮りましたので添付します。(クロックは、40MHz)
測定個所は、LCDケーブルに接続するコネクタ部分です。
(LVDS側の波形は、マイナス側をGNDとしてプラス側を測定)

前回から変えたところがあります。
5V電源に33uF、3.3V電源に22uFの電解コンデンサをそれぞれ追加しています。
また、LVDS出力(LVDS transmitter IC)とコネクタ部分までのクロックとデータライン3つは、
できるだけ同じ長さにして、差動信号同士でツイストして接続するように変更しています。
上記の対策をしましたが症状は変わっていません。

よろしくお願いいたします。

ファイル ファイルの説明
wave.png

電源のノイズは目立ってなさそうですね。

しかし信号側がかなり鈍っているようです。オシロのサンプリング能力が十分か不明なのと、
同期して測定していないのでなんとも言えませんが、LVDS基板を依然基板をバラックで
組んでいるいるのであれば、信号品質的に鈍ったことでクロックと同期が取れてない
可能性がありそうです。

クロックを下げた場合に緩和されるのも、立ち上がり時間に余裕が出るからと考えると可能性が高いです。
(ただ前述の通りオシロの能力が十分か不明なのと、クロックと信号を同期して取っていないので仮定です)
dot clock30MHzとして、1clock中に7bit転送する場合の転送速度は210MHzになるので、インピーダンス
整合された基板を使う必要がありそうです。

渡邊です。

オシロのサンプリング能力ですが、TDS2024、2Gs/sec、200MHz (周波数帯域)なので、
恐らくそれ以上に速い信号のため鈍ってしまっているものだと思われます。
(ドットクロックが40MHzなので、信号は 40x7 = 280MHz のため、かなりなまっている?)

ドットクロックが25MHz でもNGだったので、この辺りの周波数でのタイミングも見てみようと思っております。

よろしくお願いいたします。

渡邊です。

どうも、ドットクロックを25MHzに設定した場合は、30MHzに勝手に変わって出力されるようです。
クロックとデータを同時に測定しました。
黄色がLVDS_CLK+、青色がLVDS_OUT0+です。
(前回の写真のプローブの状態で使用。プローブのGNDは、近くのGNDに接続)

左(クロック30MHz)が画面の乱れ発生、右(クロック24MHz)が画面の乱れなしの状態です。
立ち上がり切ると、立上げ時の画面を出しても乱れが極端に少なくなるので、LVDS側の問題であるかいまだに疑問を持っています。
これらから何が原因であるかわかりますでしょうか?

よろしくお願いいたします。

ファイル ファイルの説明
cs.png

松坂です。

すみません、ノイズの影響ではないようです。
hakei.jpgを見るとドットクロックが早すぎるため、本来矩形波のところが正弦波になってしまっているようです。
そのためタイミングがずれ、画面の乱れが発生しているものと思われます。

Armadillo-460では、SoCのLCDインターフェースピンとFFCコネクタの間にノイズ低減のための33Ωのダンピング抵抗がシリーズ接続されています。
その影響と配線経路上のキャパシタンスにより正弦波になっているものと思われます。

Armadillo-460側でダンピング抵抗を調整することができないため、現状はドットクロックを落として使用していただく必要があります。
大変申し訳ありません。

松坂です。

お使いのLCDパネルのドットクロック極性とSoCの設定に相違がある可能性があります。
以下の設定を試してみてもらえますでしょうか?

MXCFB_DISP_CLK_INVERTを追加してください。

mxcfb_modedb.c
{
.name = "G104AGE-L02",
.disp_iface = MXCFB_DISP_OE_ACT_HIGH | MXCFB_DISP_CLK_INVERT,
},

以上、宜しくお願いいたします。

渡邊です。

MXCFB_DISP_CLK_INVERT を入れてみましたが、さらに症状がひどくなりました。
乱れが酷くなり、文字がにじんでいたりする(RGB の順番が変わっている?)ので、恐らくクロック極性は元のものが正しいと思います。

LCDの下限が30MHzであり、このLCDでは24MHzで実力で動いているので、現在他の方法がないか検討しています。

よろしくお願いいたします。。

松坂です。

確認ありがとうございました、お手数かけてすみませんでした。

こちらで未接続時のドットクロック40MHzの波形を確認したところ添付画像となりました。
(SoCから見てダンピング抵抗後で測定)
LVDS変換ICには、極力この波形の状態で入力できるよう、回路等のご検討をお願いいたします。

・FFCケーブル含め可能な限り短く配線していただく
・LVDS変換IC付近でバッファを挿入し、波形を成形し直していただく等

以上、宜しくお願いいたします。

ファイル ファイルの説明
2023-08-30_08h25_12.png ダンピング抵抗後のLSCLK 40MHz波形

渡邊です。

LCD_LSCLK(DCLK)、LCD_HSYN(HSYNC)、LCD_VSYN(VSYNC)、LCD_OE_ACD(DE) の信号部において、
LVDS のICの手前側(コネクタの近く)にバッファを入れましたが、現象は変わりませんでした。
LCD_LSCLK(DCLK) 以外は、前回とあまり変わりません。
波形はバッファの出力部で撮っています。(DCLK は形が違ったので入力部も撮影しました)

よろしくお願いいたします。

ファイル ファイルの説明
lcx244.png

松坂です。

> LVDS のICの手前側(コネクタの近く)にバッファを入れましたが、現象は変わりませんでした。

変わらないということは、SoC側が出している波形自体が、LVDSトランスミッタが要求するCLK仕様から外れている可能性があります。
LVDSトランスミッタは、CLK信号を元にPLL回路でLVDS送信のタイミングを生成しているため、一般的なロジック回路と比べ電源ラインに乗るノイズやクロックの仕様が厳しいです。
LVDSトランスミッタの仕様をご確認いただき、実際のCLKデューティー比などがICの仕様内に収まっているかどうかご確認をお願いします。

渡邊です

> 変わらないということは、SoC側が出している波形自体が、LVDSトランスミッタが要求するCLK仕様から外れている可能性があります。
LVDSトランスミッタ(DS90C385A)のデータシートを見てみました。
ドットクロックですが、High、Low 共に 0.35T(MIN)、0.64T(MAX) と書かれています。(Typ は 0.5T)
実際のクロック(40MHz)は、ざっくり調べたところ Low 側が 0.28T、High 側が 0.72T と、High 側が長く出力されているように見えます。
(つまりは範囲から外れている)

なぜ、このような歪なクロックになっているのでしょうか?
また、30MHz でもNGなのですが、こちらは0.35T~0.65Tの範囲に入っています。

よろしくお願いいたします。

ファイル ファイルの説明
dclk_30mhz.jpg

松坂です。

> なぜ、このような歪なクロックになっているのでしょうか?

imx25の仕様と思われます。
クロックの分周(PCD)を偶数(1/2, 1/4..)にしないとデューティ比が崩れてしまうようです。
NXP Communityを確認したところ、以下の情報を見つけました。

■How to change Duty of LSCLK of i.MX25
https://community.nxp.com/t5/i-MX-Processors/How-to-change-Duty-of-LSCL…

カーネルのソースコードから、ドットクロックの元になるクロックが120MHzになっており、
そこから分周しており40MHzと30MHzの場合でデューティ比に違が出るようです。

LSCLK=40MHzの場合は、120MHzの1/3(奇数)のため、デューティ比が崩れてしまう
LSCLK=30MHzの場合は、120MHzの1/4(偶数)のため、デューティ比が崩れない

渡邊です。

出張があったため、返答が遅れました。
LVDS の仕様に収まっているにもかかわらず、LSCLK=30MHzの場合でも画面が乱れています。
LSCLK=24MHzの場合、120MHzの1/5(奇数)のため、デューティ比が崩れてしまいますが、画面が乱れません。
(同じ信号線の仕様の別のLCDを接続しても同様の結果です)

画面が乱れる原因は何が考えられますか?

松坂です。

> 画面が乱れる原因は何が考えられますか?
LSCLKにパルスの欠損やジッタは発生していないでしょうか?

LVDSコンバータはLSCLKのパルスを元にPLL回路でLVDSのためのクロックを生成しているため、
LSCLKには「絶えず」「正確に」発振してもらうことが必要になります。

下記NXPフォーラムのスレッドにも記載されているような、LSCLKの欠損や、LSCLKのジッタが発生してしまうとLVDSコンバータのPLL回路の動作に影響が出る可能性があります。

https://community.nxp.com/t5/i-MX-Processors/About-dropout-of-LSCLK-of-…
https://community.nxp.com/t5/i-MX-Processors/AA104SH02-T1-display-probl…

渡邊です。

>LSCLKにパルスの欠損やジッタは発生していないでしょうか?
LSCLK の波形を連続で履歴を残す方法で測定していますが、特に抜けや乱れている形跡は無いようです。
クロックの立ち上がりでRGBデータが変化していることも確認しました。

よろしくお願いいたします。

松坂です。

確認していただいた状況からしますと、パラレルRGB側の信号は問題となるようなところはなさそうですね。
そうなりますと、LVDSトランスミッタの回路、LVDSケーブル、LCDモニタ側で問題が発生している可能性があります。

おもに問題になりやすい箇所は
* 配線
* 電源品質
になります。

配線は、今よりも短くしていただく、LCDパネルとLVDS回路間の電源ラインを強化していただくなど、
LCDモニタに供給している電源、LVDSトランスミッタに供給している電源をArmadilloからではなく、
安定化電源などに切り替えた場合に症状は改善しないかなど、ご確認をお願いいたします。

松坂です。

現状、クロックを上げてブート中頻繁に画面が乱れる点については、
それらがきっかけになっているだけで他に原因がある可能性があります。

* クロックのデューティ比は関係なさそう
* クロック周波数を下げると正常になる
* クロック波形の欠損やジッタはない
* ブート中にのみ画面が乱れる

渡邊です。

LVDSケーブル、LCDモニタは、元々繋いでいたCPU基板に繋ぐと正常に表示するので、この2つは問題ないと思います。

よろしくお願いいたします。

渡邊です。

元々のCPU基板からRGB信号を自作のLVDS変換基板に繋ぎましたが問題なく出ます。
(クロックは当然40MHzです)
何が考えられるでしょうか?

よろしくお願いいたします。

松坂です。

> LVDSケーブル、LCDモニタは、元々繋いでいたCPU基板に繋ぐと正常に表示するので、この2つは問題ないと思います。

ほかの装置とのつながりでは問題ないとすれば、正常に動作する構成と今回の構成で違う部分が影響している可能性があります。

* LVDSケーブルに印加する信号(LVDSトランスミッタICが違ったり、ICに供給する電源品質、信号電圧)の違い
** ICを同じものに変えてみる
** ICに供給する電源をArmadillo-460の3.3Vではなく、安定化電源に変えてみる
** 電源に接続するバイパスコンデンサはICの動作周波数に見合った周波数特性のものを使う
* LVDS変換回路の構成(インピーダンスコントロールされたプリント基板上での配線または手配線のユニバーサル基板)の違い
* LCDモジュールに供給する電源経路の違い
** LCDモジュールに供給する電源を安定化電源に変えてみる

ドットクロックを上げるとNGとなることから、LCDモジュールまでの信号経路のどこかにそのクロックだと耐えられない部分などがあるのではと思われます。

渡邊です

今更なのですが、Armadillo-460は、LVDS 接続の実績はありますでしょうか?
ある場合、LVDS 接続の推奨回路はありますでしょうか?
LVDS 接続が問題であるのだとすれば、パラレルRGB の SVGAのLCD に接続することも考えております。

よろしくお願いいたします。

松坂です。

> 今更なのですが、Armadillo-460は、LVDS 接続の実績はありますでしょうか?
調べてみましたが、Armadillo-400シリーズでLVDS 接続をした実績はありませんでした。

渡邊です。

パラレルRGBのLCDを手に入れたので、変換基板に新たな配線を行い接続して動かしてみました。

結果は、LVDSの時と同じとなっております。
やはり、Armadillo-460側の信号の時点で出力されていると考えられます。

どのようにすれば、画面の乱れを解消できますでしょうか?
(Armadillo-460側の設定が問題であればご指摘願います)

よろしくお願いいたします。

溝渕です。

今迄の内容を纏めると、以下の場合に乱れが減少しています。
- OSが立ち上がりきった後
- ドットクロックを下げた場合

以上より、DRAMの帯域不足またはバス調停の問題によって乱れが生じている可能性があります。

いくつか対策が考えられます。LCD以外のデバイスを極力動かさないという方針で、以下を試してみてください。

- USBデバイスを接続している場合は抜いてみる
- 起動スクリプトを減らす(Ethernetの設定等)
- その他、動作するアプリケーション(デーモン含む)を減らす

もしこれで状況が改善するならば、ハードウェア(波形等)が問題である可能性は非常に低くなります。

また、バス調停に関し、LCDの優先度を上げる事ができます。

Armadillo を保守モードで起動して、次のように起動してください。

hermit> frob
hermit:frob> poke 0xb8003000 0x00000001
hermit:frob> peek 0xb8003000
*0xb8003000 == 0x00000001
hermit:frob> q
hermit> boot

LCDコントローラが優先調停されるようになるので、乱れが改善される可能性があります。

溝渕です。

もう1点、LCDコントローラのDMA関連設定値が(帯域確保を目的とした場合に効率が)良く無い可能性があります。

添付のパッチをLinuxカーネルに適用し、画面の乱れが改善されないか確認していただけますか?

ファイル ファイルの説明
linux-2.6.26-at31_mx2fb.patch

渡邊です。

このパッチを充てると、画面の乱れがなくなりました。

前回の返答の内容(LCDの優先度を上げるなど)を試しましたが、こちらでは改善せず、
パッチを充てたときだけ改善しました。

このパッチを充てると、他に何か悪影響は出ないでしょうか?

よろしくお願いいたします。

溝渕です。

> このパッチを充てると、他に何か悪影響は出ないでしょうか?

恐らく無いかと思います。

DMAバースト長が長くなって効率的にDMAを行うことができるようになる事で、今迄underrunが生じていた分のデータも送信できるようになりました。そうなるとLCDが占有する帯域が太くなり、他の帯域は相対的に細くなる可能性があります。

LCD同等の応答性能を必要とする機能を利用している場合は、そちらの方で問題が生じるかもしれません。

パッチの妥当性については、mainlineのLinuxカーネルでは該当レジスタはユーザーが任意の値に設定可能となっている為、変更する事については問題無いと判断しています。

渡邊です。

>恐らく無いかと思います。
>LCD同等の応答性能を必要とする機能を利用している場合は、そちらの方で問題が生じるかもしれません。
恐らく、それほど高速な処理は行わないと思いますので、とりあえずこの設定で進めたいと思います。
ご対応、ありがとうございました。