2371564_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2371564_zh-CN

2371564_zh-CN

来自 LVDS 面板规格的像素时钟不起作用 VAR-SOM-MX8M-PLUS IMX8MP

您好,

,我正在使用 Variscite SOM VAR-SOM-MX8M-PLUS(您可以通过谷歌搜索该 SOM 型号找到他们的网站),该 SOM 使用 LVDS,用于 640x480 60Hz LCD。在使用规格表中的显示时序参数时,我无法获得稳定的 LCD 图像。

synthesys_0-1779842178027.pngsynthesys_0-1779842178027.png

我的设备树发生了变化:

#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)。 352.450 MHz)。我还添加了其他时钟,以防有不同的乘数(不仅仅是 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_pll1/clk_rate 352450000 照片看起来像这样


synthesys_1-1779843340131.pngsynthesys_1-1779843340131.png


请就下一步的尝试提出建议。


谢谢,
Jon

i.MX 8M | i.MX 8M Mini | i.MX 8M NanoRe: 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

我更新了计时,总时长等于 800 小时,总 vtotal 等于 525 vtotal。照片出来的效果是一样的。
我在示波器上测量了时钟,像素时钟的频率为 25MHz,但垂直和水平同步不稳定。
IMX8MP 能否支持 640x480?为什么 h/v 同步时序不会不稳定?
我们有同样的 imx6solox 液晶显示屏,没有任何问题(内核 4.9),设备树中的面板设置很简单,很简单,可以立即使用。

Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP

您好@synthesys

,能否分享您当前的时序设置?


Zhiming。

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>;
			};
		};
	};

我附上了液晶显示器的数据表和时序的具体页面。我们有一块液晶显示板可以将 LVDS 转换为并行 RGB。正如我之前提到的,同样的 LCD 在 IMX6SoloX 上也能正常工作。

由于某些原因,12.5MHz 的图像看起来很棒,但刷新率只有 30Hz。我想使用的规格是 25MHz @ 60 Hz 刷新率。

Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP仅供参考,像素时钟频率为 12.5 MHz,性能稳定,图像清晰。像素时钟频率为 63MHz - 74.25MHz,频率稳定,但略有变色。像素时钟频率在 12.5MHz 和 63MHz 之间时,图像不稳定/有噪音。非常奇怪!
Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP

Zhiming,

我尝试了新的定时,图像仍然很差,与我在原帖中发布的图片相似。我想解决办法可能不是改变这些面板的时序。

设备树或者内核中还有其他需要的东西才能启用此功能吗?

我试着更改 PLL(像素时钟 x 7 或像素时钟 x 14),问题依然如故。

还有其他建议吗?


感谢您一直以来对这个问题的支持。

乔恩

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

 

垂直
电视 = 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>;
};



致敬,
Zhiming

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(编码器);
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 频率点有限、
* 如果有任何模式不支持,我们会在这里进行模式修复。
*/
如果 (ldb->dual)
模式->时钟 = 模式->时钟> 100000 ?148500 : 74250;
else
mode->clock = mode->clock>=74250 ?74250 : 25175;
 
return 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.c仅支持 148.5MHz 和 74.25MHz。要支持其他分辨率,您需要在此部分添加必要的代码片段。


Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP

你好@刘志明还有其他建议吗?更改 PLL 或驱动程序代码?

Re: Pixel Clock from LVDS Panel Spec Not Working VAR-SOM-MX8M-PLUS IMX8MP

@Zhiming_Liu@JESON@joanxie
大家好,看来问题出在硬件上。我们需要在几条 LVDS 线上添加电阻。我们可以关闭此工单。感谢大家的建议。 

Tags (1)
No ratings
Version history
Last update:
‎06-12-2026 02:30 AM
Updated by: