来自 LVDS 面板规格的像素时钟不起作用 VAR-SOM-MX8M-PLUS IMX8MP 您好, ,我正在使用 Variscite SOM VAR-SOM-MX8M-PLUS(您可以通过谷歌搜索该 SOM 型号找到他们的网站),该 SOM 使用 LVDS,用于 640x480 60Hz LCD。在使用规格表中的显示时序参数时,我无法获得稳定的 LCD 图像。 synthesys_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.png 请就下一步的尝试提出建议。 谢谢, Jon 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 我更新了计时,总时长等于 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 线上添加电阻。我们可以关闭此工单。感谢大家的建议。
查看全文