嵌入式linux调试dsi,LCD 调试总结

LCD 调试总结

数据流程:

Framebuffer  -> DC  -> Dsi  ->  Dsi83 -> LCD

DC 通过DMA从framebuffer取数据 ,然后通过并口传递给Dsi , Dsi输出mipi信号给Dsi83 , Dsi83将MIPI信号转成LVDS信号给LCD。

初始化流程:

首先得给各个器件上电,然后执行各个控制器的初始化代码,这个过程里面要确保各个信号的稳定性以及时序符合芯片要求,这是调试驱动的第一步,这一步不能确保后面不管怎么搞都是瞎搞。

遇到的问题:

一、不知道pclk是什么意思,也不了解pclk与mipi clk的换算关系:

1,Pclk是一秒钟要送出的总的像素点,实际上就是 一行的像素点*总行数*帧率

2,mipi clk的算式就是mipi clk = pclk * bpp/num(lane)*2

文字解释,pclk*bpp就是一秒要送出的总的bit位也就是比特率,这是每一秒由DC送给Dsi的数据,因为它在芯片内部是以并口的形式送出的,而Dsi拿到数据后是以串口的形式送出的,所以这里计算mipi的clk要除以lane的总数,又因为mipi是上升沿下降沿都取数据,所以这里要除以2。

二、这次主要是遇到LCD不断闪屏,为了debug做过的实验有:

1, 测试模式下用mipi clk,仍然闪屏

2,测试模式下用外部clk,不闪屏

实际上从这里就有理由怀疑mipi的输出有问题,从原理上来看接下来也应该去check dsi的输出信号,但是因为mipi没有测试点接出来,所以一开始居然避开了这一项检测,转而去狂填参数,现在想起来大概是因为填参数对软件而言比较容易,但实在是没什么道理,我也对一开始没有坚持自己的推理让硬件去测信号感到不满。

解决问题:

最终吹掉dsi83 IC,量mipi信号,发现时钟的确输出不连贯,而对比使用该IC的能正常显示的板子,其clk是连贯的。那么我们首先要保证mipi信号输出的正确性。

最后改掉一个控制clk的 参数TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS即可。

总结: 遇到问题,应该跳出来,找人喝茶聊天,根据原理寻找思路,而不是匆匆忙忙冒冒失失的一头扎进去,以至深陷其中,不能自拔。

最后附上一张图:

81ed9db02953d3d8c0500e98b1cd453c.png

方向不对,越努力越尴尬。

========================================华丽丽的分界线================代码======================

代码介绍:

英伟达平台:

对于linux内核显示相关代码在Dc.c (drivers\video\tegra\dc)目录下。

这是display control的驱动文件,在这个文件中首先看driver结构体:

struct platform_driver tegra_dc_driver = {

.driver = {

.name = "tegradc",// 根据这个名字找到对应设备资源

.owner = THIS_MODULE,

},

.probe = tegra_dc_probe,

.remove = tegra_dc_remove,

#ifdef CONFIG_PM

.suspend = tegra_dc_suspend,

.resume = tegra_dc_resume,

#endif

.shutdown = tegra_dc_shutdown,

};

设备资源在文件Board-macallan-panel.c (arch\arm\mach-tegra) 中

static struct platform_device macallan_disp2_device = {

.name= "tegradc",

.id= 1,

.resource= macallan_disp2_resources,

.num_resources= ARRAY_SIZE(macallan_disp2_resources),

.dev = {

.platform_data = &macallan_disp2_pdata,

},

};

static struct platform_device macallan_disp1_device = {

.name= "tegradc",

.id= 0,

.resource= macallan_disp1_resources,

.num_resources= ARRAY_SIZE(macallan_disp1_resources),

.dev = {

.platform_data = &macallan_disp1_pdata,

},

};

这里tegra4有两个控制器,一个给Dsi用,另一个给HDMI用。这些板级资源的具体功能需要对照tegra4的spec来看,主要是一些寄存器的配置。

然后在看DC和DSI的控制器初始化代码前得看panel的代码,因为DC和DSI输出要匹配panel的接受,两者不匹配就会出问题,匹配了,就OK!

DC 的输出分HDMI和DSI,他们的配置是如下函数设置的:

static void tegra_dc_set_out(struct tegra_dc *dc, struct tegra_dc_out *out)

{

struct tegra_dc_mode *mode;

dc->out = out;

printk("liucong tegra_dc_set_out\n");

mode = tegra_dc_get_override_mode(dc);

if (mode)

tegra_dc_set_mode(dc, mode);

else if (out->n_modes > 0)

tegra_dc_set_mode(dc, &dc->out->modes[0]);

switch (out->type) {

case TEGRA_DC_OUT_RGB:

dc->out_ops = &tegra_dc_rgb_ops;

break;

case TEGRA_DC_OUT_HDMI:

dc->out_ops = &tegra_dc_hdmi_ops;

break;

case TEGRA_DC_OUT_DSI:

dc->out_ops = &tegra_dc_dsi_ops;// 通用显示串行输出接口,这里是mipi控制器的操作接口

break;

default:

dc->out_ops = NULL;

break;

}

if (dc->out_ops && dc->out_ops->init)

dc->out_ops->init(dc);

}

望文生义,tegra_dc_set_out就是设置DC的输出,这里是以结构体的方式赋值的,这个结构体包含了具体输出的各种接口,比如DSI的tegra_dc_dsi_ops:

struct tegra_dc_out_ops tegra_dc_dsi_ops = {

.init = tegra_dc_dsi_init,

.destroy = tegra_dc_dsi_destroy,

.enable = tegra_dc_dsi_enable,

.postpoweron = tegra_dc_dsi_postpoweron,

.disable = tegra_dc_dsi_disable,

.postpoweroff = tegra_dc_dsi_postpoweroff,

.hold = tegra_dc_dsi_hold_host,

.release = tegra_dc_dsi_release_host,

#ifdef CONFIG_PM

.suspend = tegra_dc_dsi_suspend,

.resume = tegra_dc_dsi_resume,

#endif

.setup_clk = tegra_dc_dsi_setup_clk,

};

Panel 的代码在Panel-p-wuxga-10-1.c (arch\arm\mach-tegra)

这里主要做三件事,1,背光数据的初始化,2,LCD相关上电时序的控制,3,DSI输出信号的配置(需要匹配panel)

背光初始化和上电时序就不说了,这里说下第三点:

static struct tegra_dc_mode dsi_p_wuxga_10_1_modes[] = {

{

.pclk = 68900000,

.h_ref_to_sync = 10,// 4

.v_ref_to_sync = 1,// 1

.h_sync_width = 32,// 16

.v_sync_width = 6,// 2

.h_back_porch = 80,// 32

.v_back_porch = 14,// 16

.h_active = 1280,// 1920

.v_active = 800,// 1200

.h_front_porch = 48,// 120

.v_front_porch = 3,// 17

},

};

望文生义,看这个结构体的名字就知道tegra_dc_mode是配置DC输出要求的,这里有PCLK HBP HFP HWP VBP VFP VWP等,他们的具体含义请自行百度了。

另外还有一个比较重要的结构体:

static struct tegra_dsi_out dsi_p_wuxga_10_1_pdata = {

#ifdef CONFIG_ARCH_TEGRA_3x_SOC

.n_data_lanes = 2,

.controller_vs = DSI_VS_0,

#else

.controller_vs = DSI_VS_1,

#endif

.n_data_lanes = 2,

.video_burst_mode = TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END,

.pixel_format = TEGRA_DSI_PIXEL_FORMAT_24BIT_P,

.refresh_rate = 60,

.virtual_channel = TEGRA_DSI_VIRTUAL_CHANNEL_0,

.dsi_instance = DSI_INSTANCE_0,

.dsi2lvds_bridge_enable = 1,

.panel_reset = DSI_PANEL_RESET,

.power_saving_suspend = true,

.video_data_type = TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE,

.video_clock_mode = TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS,// 这次卡这里了

.dsi_init_cmd = dsi_p_1280x800_8_0_init_cmd,

.n_init_cmd = ARRAY_SIZE(dsi_p_1280x800_8_0_init_cmd),

};

同样望文生义 tegra_dsi_out是配置dsi输出信号的,这些都很重要,具体含义也不细说了,看注释或百度即可。

一般而言,上面的信息填好后panel就可以工作了,但我们这里还有个转接芯片,转接芯片的代码在Dsi2lvds.c (drivers\video\tegra\dc),这里面就是做了dsi83芯片的初始化,通过I2C接口。

另外我们还要注意 的是,这个Dsi是用的mipi协议,要注意MIPI协议的一些规范,以及内核提供给我们的mipi协议的接口,比如进入LP模式的接口tegra_dsi_set_to_lp_mode等。代码在Dsi.c (drivers\video\tegra\dc)

=============================初始化流程========================

Init 流程:

[    2.012377] [] (unwind_backtrace+0x0/0x140) from [] (tegra_dsi2lvds_init+0x20/0xd8)

[    2.012821] [] (tegra_dsi2lvds_init+0x20/0xd8) from [] (__tegra_dc_dsi_init+0x80/0xd8)

[    2.013300] [] (__tegra_dc_dsi_init+0x80/0xd8) from [] (_tegra_dc_dsi_init+0x23c/0x3b8)

[    2.013733] [] (_tegra_dc_dsi_init+0x23c/0x3b8) from [] (tegra_dc_dsi_init+0x14/0xcc)

[    2.014165] [] (tegra_dc_dsi_init+0x14/0xcc) from [] (tegra_dc_set_out+0x88/0x10c)

[    2.014455] [] (tegra_dc_set_out+0x88/0x10c) from [] (tegra_dc_probe+0x558/0xb88)

[    2.014881] [] (tegra_dc_probe+0x558/0xb88) from [] (platform_drv_probe+0x20/0x24)

[    2.015345] [] (platform_drv_probe+0x20/0x24) from [] (really_probe+0x7c/0x2f0)

[    2.015780] [] (really_probe+0x7c/0x2f0) from [] (driver_probe_device+0x4c/0xa8)

[    2.016200] [] (driver_probe_device+0x4c/0xa8) from [] (__driver_attach+0x94/0x98)

[    2.016670] [] (__driver_attach+0x94/0x98) from [] (bus_for_each_dev+0x68/0x9c)

[    2.016933] [] (bus_for_each_dev+0x68/0x9c) from [] (bus_add_driver+0x190/0x270)

[    2.017405] [] (bus_add_driver+0x190/0x270) from [] (driver_register+0x80/0x134)

[    2.017832] [] (driver_register+0x80/0x134) from [] (do_one_initcall+0xa0/0x100)

[    2.018294] [] (do_one_initcall+0xa0/0x100) from [] (do_initcalls+0x78/0xac)

[    2.018721] [] (do_initcalls+0x78/0xac) from [] (kernel_init+0x90/0x128)

[    2.018976] [] (kernel_init+0x90/0x128) from [] (kernel_thread_exit+0x0/0x8)

Enable 流程:

[    2.121421] [] (unwind_backtrace+0x0/0x140) from [] (tegra_dsi2lvds_enable+0x18/0x208)

[    2.121856] [] (tegra_dsi2lvds_enable+0x18/0x208) from [] (tegra_dc_dsi_enable+0xb0/0x250)

[    2.122339] [] (tegra_dc_dsi_enable+0xb0/0x250) from [] (_tegra_dc_controller_enable+0x300/0x640)

[    2.122779] [] (_tegra_dc_controller_enable+0x300/0x640) from [] (tegra_dc_probe+0x6b8/0xb88)

[    2.123211] [] (tegra_dc_probe+0x6b8/0xb88) from [] (platform_drv_probe+0x20/0x24)

[    2.123687] [] (platform_drv_probe+0x20/0x24) from [] (really_probe+0x7c/0x2f0)

[    2.124110] [] (really_probe+0x7c/0x2f0) from [] (driver_probe_device+0x4c/0xa8)

[    2.124396] [] (driver_probe_device+0x4c/0xa8) from [] (__driver_attach+0x94/0x98)

[    2.124821] [] (__driver_attach+0x94/0x98) from [] (bus_for_each_dev+0x68/0x9c)

[    2.125255] [] (bus_for_each_dev+0x68/0x9c) from [] (bus_add_driver+0x190/0x270)

[    2.125724] [] (bus_add_driver+0x190/0x270) from [] (driver_register+0x80/0x134)

[    2.126146] [] (driver_register+0x80/0x134) from [] (do_one_initcall+0xa0/0x100)

[    2.126462] [] (do_one_initcall+0xa0/0x100) from [] (do_initcalls+0x78/0xac)

[    2.126721] [] (do_initcalls+0x78/0xac) from [] (kernel_init+0x90/0x128)

[    2.127154] [] (kernel_init+0x90/0x128) from [] (kernel_thread_exit+0x0/0x8)

MIPI DPHY&CPHY接口描述及FPGA实现要点 ———作者:Hello,Panda MIPI是移动领域最主流的视频传输接口规范,没有之一,目前应用最广泛的是MIPI DPHY和MIPI CPHY两组协议簇(另外还有MIPI MPHY,属于... 阅读详情

相关推荐

液晶接口系列——MIPI之DSI时钟的计算和常见概念区分_mipi ui是什么

B、有些平台,Bitclk的计算方式不同,上述公式是理论上的,以高通平台为例的,但是有些平台(比如展锐)公式如下,且建议用该公式进行计算:Bitclk = Total pixel x 位深 x 1.2 / lane number 加主要是为了提高时钟,因为MIPI传输协议中,实际传输数据还会包括包头、包尾等更多的非图像数据,而没有乘以1.2计算出来的时钟是刚好够传输图像的时钟,如果不乘以1.2,那么时钟就会过小,因为被协议数据占据了一部分时钟,这样会导致时钟过低,从而液晶无法正常显示。

2401_87557104的博客 2243

[Android5.1][RK3288] LCD Mipi 调试方法及问题汇总

1. 完成 dtsi 设置参数 timing 初始化 cmds 2. 背光相关 3. 检查电压 4. 调试顺序 5. 其它问题

Younix凌乱的草稿本 4万+

嵌入式8英寸DSI LCD驱动实战:从设备树配置到Linux内核调试

嵌入式系统开发中,显示接口技术是连接硬件与用户体验的关键。MIPI DSI(Display Serial Interface)作为一种高速串行接口,因其线缆少、功耗低的特性,已成为移动和嵌入式设备显示方案的主流选择。其技术价值在于通过串行化传输,显著简化了硬件设计,提升了系统集成度与可靠性。在智能硬件、工业HMI、便携式终端等应用场景中,DSI接口的LCD屏能有效平衡显示效果与功耗体积。本文将深入探讨基于Linux DRM/KMS框架的驱动开发实践,涵盖设备树(Device Tree)的详细配置、显示时序

weixin_29191081的博客 236

分辨率、刷新率、像素时钟速率、通道速率(dsi

分为垂直刷新率和水平刷新率,一般提到的刷新率通常指垂直刷新率。垂直刷新率表示 屏幕的图象每秒钟重绘多少次,也就是每秒钟屏幕刷新的次数,以Hz(赫兹)为单位。刷新率越高越好,图象就越稳定,图像显示就越自然清晰,对眼睛的影响也越小。越低,图像闪烁和抖动的就越厉害,眼睛疲劳得就越快。一般来说,如能达到80Hz以上的刷新频率就可完全消除图像闪烁和抖动感。

z1236464的博客 9282

嵌入式linux调试dsi,【转载】MIPI LCD调试经验

【转载】MIPI LCD调试经验[复制链接]以下是最近几个月在调试 MIPI DSI / CSI的一些经验总结,因为协议有专门的文档,所以这里就记录一些常用知识点:一、D-PHY1、传输模式LP(Low-Power) 模式:用于传输控制信号,最高速率 10 MHzHS(High-Speed)模式:用于高速传输数据,速率范围 [80 Mbps, 1Gbps] per Lane传输的最小单元为 1 个...

weixin_35422771的博客 1180

嵌入式linux调试dsi,做嵌入式开发时,你是怎么实现LCD显示的?

原标题:做嵌入式开发时,你是怎么实现LCD显示的?1.本文目的做嵌入式图形开发,我们往往都会利用到各种GUI进行交互设计,但是对于GUI的字符串处理与中文字库显示,也许并不会特别关注,因为GUI已经帮助我们封装了一些通用的API,在调用相对应的API就可以显示想要的图像和字符串了。那么这些底层原理到底是什么呢?正好和朋友讨论,我们做嵌入式开发都是将输出信息定位到串口,那能不能定位到I2C、SPI、...

weixin_36166714的博客 634

Tina Linux LCD调试避坑指南:从黑屏、闪屏到花屏的实战问题排查

本文详细介绍了Tina Linux LCD调试过程中遇到的黑屏、闪屏和花屏问题的实战排查方法。从硬件工具准备到软件命令调试,涵盖了MIPI DSI和RGB接口的配置技巧,帮助开发者快速定位和解决显示问题,提升调试效率。

weixin_30435261的博客 602

RK3566嵌入式Linux终端全栈开发实践

嵌入式Linux终端开发是连接硬件与操作系统的底层技术实践,其核心在于设备树(Device Tree)配置、内核驱动适配与SoC外设接口协同。本文围绕MIPI DSI显示驱动、I2C触摸控制器集成、PWM背光调节等关键环节,解析Linux内核如何通过设备树声明硬件资源、通过驱动模块实现时序控制与事件上报,并阐明阻抗匹配、电平兼容、电源去耦等硬件约束对软件功能的决定性影响。技术价值体现在将隐性工程知识显性化,支撑从芯片级信号定义到Android用户空间服务的端到端贯通。典型应用场景包括教育开发板定制、工业HM

weixin_42230607的博客 182

5英寸DSI LCD驱动全解析:从树莓派到STM32的嵌入式显示方案

嵌入式系统开发中,显示接口的选择直接影响设备的性能、功耗与集成度。MIPI DSI(Display Serial Interface)作为一种高速串行显示协议,通过差分信号和包交换机制,在提供高带宽传输的同时,实现了低功耗与低电磁干扰,成为移动设备和高端嵌入式人机界面的主流标准。其技术价值在于平衡了显示性能与系统复杂度,特别适用于对紧凑设计和能效有严格要求的场景,如便携式终端、工业HMI和物联网设备。本文聚焦于5英寸DSI LCD这一“黄金尺寸”屏幕的应用,深入探讨其驱动原理,并结合树莓派原生支持与STM

weixin_30520015的博客 386

嵌入式LinuxDSI接口LCD屏驱动开发全攻略:从硬件原理到设备树配置

嵌入式系统开发中,显示接口技术是连接处理器与视觉交互的关键。DSI(Display Serial Interface)作为一种高速串行接口,因其连线简洁、功耗低、带宽高的特性,已成为移动设备屏幕的主流标准。其工作原理基于MIPI联盟的规范,通过差分信号线以数据包形式传输像素数据与控制命令,相比传统的SPI或并行RGB接口,在简化硬件设计的同时能实现更流畅的视频显示。这项技术的核心价值在于,它能以极少的物理连线为嵌入式设备(如树莓派、香橙派等单板计算机)带来媲美移动设备的高清显示效果,非常适合智能家居中控、

weixin_32025789的博客 325

从零到精通:Linux与STM32的LCD开发完全指南

更高分辨率:4K/8K显示支持更低功耗:动态刷新率调节更智能:集成AI的显示优化更灵活:可折叠/卷曲显示无论您选择STM32还是Linux平台,掌握LCD开发技术都将为您打开嵌入式系统开发的大门。从点亮第一个像素开始,逐步构建复杂的图形界面,最终实现引人入胜的用户体验。

niuTyler的博客 966

树莓派CM4驱动6.25英寸DSI LCD全攻略:从硬件连接到设备树配置

MIPI DSI(Display Serial Interface)是一种专为显示设备设计的高速串行接口,它采用差分信号传输,具有线缆少、功耗低、抗干扰能力强的特点。其工作原理是通过一对时钟线和多对数据线,将像素数据和控制命令从主控芯片高效传输至显示屏。这项技术的核心价值在于为嵌入式设备提供了媲美移动设备的显示性能,同时极大简化了硬件设计,是实现紧凑型、高性能终端的关键。在树莓派CM4等嵌入式平台上,通过正确配置设备树(Device Tree)参数,可以充分发挥DSI接口的优势,驱动高分辨率屏幕。本文聚焦于

weixin_30628077的博客 537

[MTK] MT6589 DSI Video Mode的屏,加入ESD机制后每隔2S会闪一下屏(情形一)

[DESCRIPTION]          MT6589 DSI Video Mode的屏,加入ESD机制后每隔2S会闪一下屏,但是把MIPI clock改为    continuous clock则不会闪屏。 则属于这种情况,可以按照以下方法进行修改。           以SSD2075为例:   Root cause:  SSD2075 IC内的电压DVDDH由MIPI cloc

duanlove(技术路途)专栏 4438

MIPI CLK动态变频功能相关资料

MIPI CLK动态变频功能介绍: Ø添加mipi Synopsys/SPRD DSI PHY介绍 Ø删除MIPI动态变频的两个频率小于2MHz限制 Ø修改对于Synopsys DSI PHY的MIPI屏时钟频率选用原则 Ø添加使用Synopsys DSI PHY的MIPI屏在频率变换时显示异常的可能原因 Ø修改MIPI的干扰信道加减5个信道变为2个信道 Ø添加展频功能的

szx940213的博客 1508

mipi LCD 的CLK时钟频率与显示分辨率及帧率的关系

MIPI

u010783226的专栏 9204

MTKl 屏的时钟频率计算

[DESCRIPTION] 计算DSI数据速率的方式,以及如何配置时钟clk的方式 [KEYWORD]  dsi、data rate、mipi clk   [SOLUTION] 1、DSI vdo mode下的数据速率data_rate的大致计算公式为: Data rate= (Height+VSA+VBP+VFP)*(Width+HSA+HBP+HFP)* total_bit

u013478557的专栏 4535

MIPI协议

mipi相关的介绍

qq_1335857320的博客 3184

LCD之mipi DSI接口驱动调试流程

转发路径:https://blog.csdn.net/liwei16611/article/details/68146912 1.lcd MIPI DSI协议 MIPI-DSI是一种应用于显示技术的串行接口,兼容DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set),以串行的方式发送像素信息或指令给外围,而且从外围中读取状态信息或像素信息,而且在传输的过程中享有自

一路走到黑_dreams的博客 4991
上一篇: linux mysql 建立账号,linux 建立 MySQL 账号
下一篇: 嵌入式linux webkit,嵌入式平台arm linux 之qt 4.5交叉编译到webkit时出错解决方法
凡狗蛋
博客等级 码龄9年 2571粉丝 3090原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值