LVDSパネル仕様からのピクセルクロックが動作しない VAR-SOM-MX8M-PLUS IMX8MP こんにちは、 私は、640x480 60HzのLCDにLVDSを使用するVariscite SOM VAR-SOM-MX8M-PLUS(このSOMモデルをGoogleで検索すると、彼らのウェブサイトが見つかります)を使用しています。仕様書に記載されている表示タイミングパラメータを使用しても、LCDに安定した画像を表示させることができません。 私のデバイスツリーの変更点: #include "imx8mp-var-som-symphony.dts"
/ {
panel {
compatible = "panel-lvds";
backlight = <&backlight>;
width-mm = <211>;
height-mm = <158>;
label = "640x480";
data-mapping = "jeida-24";
status = "okay";
panel-timing {
clock-frequency = <25175000>;
hactive = <640>;
vactive = <480>;
hback-porch = <40>;
hfront-porch = <8>;
vback-porch = <25>;
vfront-porch = <2>;
hsync-len = <96>;
vsync-len = <2>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
};
port {
panel_in: endpoint {
remote-endpoint = <&lvds_out>;
};
};
};
};
&clk {
assigned-clock-rates = <0>, <0>,
<1000000000>,
<800000000>,
<500000000>,
<400000000>,
<800000000>,
<393216000>,
<361267200>,
<352450000>;
};
&media_blk_ctrl {
assigned-clock-rates = <500000000>, <200000000>,
<0>, <0>, <352450000>;
};
&ldb {
status = "okay";
lvds-channel@0 {
fsl,data-mapping = "jeida";
fsl,data-width = <24>;
status = "okay";
port@1 {
reg = <1>;
lvds_out: endpoint {
remote-endpoint = <&panel_in>;
};
};
};
};
PLLクロックを更新して、25.175 MHzのピクセルクロック(25.175 * 14 = 352.450MHz )を反映させました。また、異なる乗数(14以外)がある場合に備えて、他のクロックも追加しました。 static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = {
PLL_1443X_RATE(1039500000U, 173, 2, 1, 16384), /* 74.25 MHz */
PLL_1443X_RATE(910000000U, 455, 3, 2, 0), /* 65 MHz */
PLL_1443X_RATE(1040000000U, 208, 3, 1, 0), /* 65 MHz */
PLL_1443X_RATE(455000000U, 379, 5, 2, 10923), /* 65 MHz */
PLL_1443X_RATE(650000000U, 325, 3, 2, 0),
PLL_1443X_RATE(594000000U, 198, 2, 2, 0),
PLL_1443X_RATE(519750000U, 173, 2, 2, 16384), /* 37.125 MHz */
/*PLL_1443X_RATE(420000000U, 175, 5, 1, 0),*/ /* 30 MHz */
PLL_1443X_RATE(393216000U, 262, 2, 3, 9437),
/*PLL_1443X_RATE(378000000U, 126, 4, 1, 0),*/ /* 27 MHz */
PLL_1443X_RATE(361267200U, 361, 3, 3, 17511),
PLL_1443X_RATE(352450000U, 220, 15, 0, 18432), /* 25.175 MHz */
PLL_1443X_RATE(400000000U, 200, 3, 2, 0), /* 25 MHz */
PLL_1443X_RATE(700000000U, 175, 3, 1, 0), /* 25 MHz */
PLL_1443X_RATE(350000000U, 175, 6, 1, 0), /* 25 MHz */
PLL_1443X_RATE(245760000U, 328, 4, 3, 0xae15),
PLL_1443X_RATE(225792000U, 226, 3, 3, 0xcac1),
PLL_1443X_RATE(122880000U, 328, 4, 4, 0xae15),
PLL_1443X_RATE(112896000U, 226, 3, 4, 0xcac1),
PLL_1443X_RATE(61440000U, 328, 4, 5, 0xae15),
PLL_1443X_RATE(56448000U, 226, 3, 5, 0xcac1),
PLL_1443X_RATE(49152000U, 393, 3, 6, 0x374c),
PLL_1443X_RATE(45158400U, 241, 2, 6, 0xd845),
PLL_1443X_RATE(40960000U, 109, 1, 6, 0x3a07),
};
imx8mp-ldb.c 内のハードコードされたクロックをコメントアウトしました。 /*
* Due to limited video PLL frequency points on i.MX8mp,
* we do mode fixup here in case any mode is unsupported.
*/
/*if (ldb->dual)
mode->clock = mode->clock > 100000 ? 148500 : 74250;
else
mode->clock = 74250;*/
return 0;
搭載PLLクロックを検証済み: root@imx8mp-var-dart:~# cat /sys/kernel/debug/clk/video_pll1/clk_rate 352450000 写真はこんな感じです 次に何を試すべきか、アドバイスをお願いします。 ありがとう、 ジョン i.MX 8M | i.MX 8M Mini | i.MX 8M Nano Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP パネルの仕様を確認してください。タイミングが正しく設定されていないようです。h_totalが800、v_totalが525になっています。もう一度確認してください。 Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP サポート担当者の@joanxieに見てもらえるように再投稿します Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP こんにちは、 @synthesys 現在のタイミング設定を教えていただけますか? よろしくお願いします、 志明 Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP タイミングを更新して、htotal 800、vtotal 525 になるようにしました。写真は同じように写ります。 オシロスコープでクロックを測定したところ、ピクセルクロックは25MHzで問題ありませんが、垂直同期と水平同期が不安定です。 IMX8MPは640x480の解像度に対応していますか?水平・垂直同期のタイミングが不安定にならない理由は何だろうか? 私たちはimx6solox用の同じLCDを持っていますが、問題はありませんでした(カーネル4.9)。デバイスツリーのsimple-panelの設定は簡単で、すぐに動作しました。 Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP こんにちは、現在の時刻表はこちらです。 panel {
compatible = "panel-lvds";
backlight = <&backlight>;
width-mm = <211>;
height-mm = <158>;
label = "640x480";
data-mapping = "jeida-24";
status = "okay";
panel-timing {
clock-frequency = <25175000>;
hactive = <640>;
vactive = <480>;
hback-porch = <46>;
hfront-porch = <8>;
vback-porch = <38>;
vfront-porch = <4>;
hsync-len = <106>;
vsync-len = <3>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
};
port {
panel_in: endpoint {
remote-endpoint = <&lvds_out>;
};
};
}; LCDのデータシートと、タイミングに関する該当ページを添付しました。当社には、LVDS信号をパラレルRGB信号に変換するLCD基板があります。先ほども述べたように、この同じLCDはIMX6SoloXでも問題なく動作します。 どういうわけか、12.5MHzだと画像は素晴らしいのですが、リフレッシュレートは30Hzしかありません。25MHz、リフレッシュレート60Hzの仕様を使用したい。 Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP 志明、 新しいタイミングを試してみましたが、画像は依然として悪く、最初の投稿で掲載した画像と似ています。パネルのタイミングを変更することが解決策ではないかもしれないと考えています。 これを有効にするために、デバイスツリーやカーネルに他に何か必要なものがあるのでしょうか? PLL(ピクセルクロック×7またはピクセルクロック×14)を変更してみましたが、依然として同じ問題が発生します。 他に何か提案はありますか? この問題に関して、引き続きサポートいただきありがとうございます。 ジョン Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP 参考までに、ピクセルクロック12.5MHzは安定しており、画像もかなり鮮明です。ピクセルクロックは63MHz~74.25MHzで安定しているが、わずかに色が変化する。ピクセルクロックが12.5MHz~63MHzの範囲では、不安定でノイズの多い画像が表示されます。とても奇妙だ! Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP こんにちは、 @synthesys
データシートとあなたのdtsに記載されているタイミングパラメータを確認しました。
データシート:
水平方向:
TH = 800 クロック // 合計
TWH = 30クロック // HSパルス幅
THS = 144クロック // HSの立ち下がりエッジからDENの開始へ
TEP = 640クロック // DENパルス幅、hactive
垂直:
TV = 525行 // 合計
TWV = 3ライン // VSパルス幅
TSTV = 35行 // VSからDENへの開始
Linuxでは、 htotal = hactive + hfront_porch + hsync_len + hback_porch となります。
hsync-active=0 を使用しているため、データシートからhsync_len + hback_porch = THS = 144、 hsync_len = TWH = 30 となります。
hback_porch = 144 - 30 = 114
hfront_porch = htotal - hactive - hsync_len - hback_porch
= 800 - 640 - 30 - 114
= 16
垂直方向も同様なので、以下のパラメータを試してみることをお勧めします。
panel-timing {
clock-frequency = <25175000>;
hactive = <640>;
vactive = <480>;
hfront-porch = <16>;
hsync-len = <30>;
hback-porch = <114>;
vfront-porch = <10>;
vsync-len = <3>;
vback-porch = <32>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
};
よろしくお願いします、 志明 Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP こんにちは、 @synthesys アノテーションを使用する代わりに、imx8mp-ldb.c の次のセクションを希望の `mclock` 値に変更してみてください。 そして、この`mclock`への変更は実際に私の場合うまくいきました。 imx8mp_ldb_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state、 struct drm_connector_state *conn_state) { struct imx_crtc_state *imx_crtc_state = to_imx_crtc_state(crtc_state); struct imx8mp_ldb_channel *imx8mp_ldb_ch = enc_to_imx8mp_ldb_ch(エンコーダー); struct ldb_channel *ldb_ch = &imx8mp_ldb_ch->base; struct imx8mp_ldb *imx8mp_ldb = imx8mp_ldb_ch->imx8mp_ldb; struct ldb *ldb = &imx8mp_ldb->base; struct drm_display_mode *mode = &crtc_state->adjusted_mode; struct drm_bridge_state *bridge_state = NULL; struct drm_bridge *bridge; bridge = drm_bridge_chain_get_first_bridge(encoder); bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, bridge); if (!ldb_ch->bus_format) ldb_ch->bus_format = bridge_state->output_bus_cfg.format; imx_crtc_state->bus_flags = bridge_state->input_bus_cfg.flags; switch (ldb_ch->bus_format) { CASE MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: imx_crtc_state->bus_format = MEDIA_BUS_FMT_RGB666_1X18; 壊す; CASE MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: CASE MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: imx_crtc_state->bus_format = MEDIA_BUS_FMT_RGB888_1X24; 壊す; デフォルト: -EINVAL を返します。 } /* * i.MX8mp のビデオ PLL 周波数ポイントが限られているため、 * いずれかのモードがサポートされていない場合に備えて、ここでモードの修正を行います。 */ if (ldb->dual) mode->clock = mode->clock > 100000 ?148500 : 74250; そうでない場合、 mode->clock = mode->clock >=74250 ? 74250 : 25175; 0を返す。 } imx8mp_ldb_encoder_mode_valid(struct drm_encoder *encoder, const struct drm_display_mode *mode) { struct imx8mp_ldb_channel *imx8mp_ldb_ch = enc_to_imx8mp_ldb_ch(エンコーダー); struct ldb_channel *ldb_ch = &imx8mp_ldb_ch->base; struct imx8mp_ldb *imx8mp_ldb = imx8mp_ldb_ch->imx8mp_ldb; struct ldb *ldb = &imx8mp_ldb->base; /* パネルがあれば問題ないはずです */ if (ldb_ch->panel) MODE_OKを返します。 /* * i.MX8mp のビデオ PLL 周波数ポイントが限られているため、 * ここではモードの有効性チェックを行います。 */ if (ldb->dual && mode->clock != 74250 && mode->clock != 148500 && mode->clock != 25175) MODE_NOCLOCK を返します。 if (!ldb->dual && mode->clock != 74250 && mode->clock != 25175) MODE_NOCLOCK を返します。 MODE_OKを返します。 } 私の単純な推測では、オリジナルのimximp-ldb.c148.5MHzと74.25MHzのみをサポートしています。他の解像度をサポートするには、このセクションに必要なコードスニペットを追加する必要があります。 Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP こんにちは、 @Zhiming_Liu さん。他に何かご提案はありますか?PLLまたはドライバコードを変更しますか? Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP @Zhiming_Liu @JESON @joanxie 皆さんこんにちは。どうやら問題はハードウェアにあるようです。複数のLVDSラインに抵抗器を追加する必要がありました。このチケットはクローズできます。皆様のご意見に感謝いたします。
記事全体を表示