全志T113开发板LCD显示异常问题分析与解决

发布时间:2026/7/17 4:55:33
全志T113开发板LCD显示异常问题分析与解决 1. 问题背景与现象描述最近在调试全志T113开发板时遇到了一个棘手的问题连接7寸LCD屏幕后显示内容出现异常。具体表现为屏幕最右侧有一部分显示不正常经过初步分析这很可能是RGB行场同步时序配置不当导致的。作为一名有多年嵌入式开发经验的工程师我原本以为这个问题在设备树里简单调整几个参数就能解决。但实际情况却复杂得多前后花费了将近三周时间才彻底解决。这个过程中我发现全志的代码存在几个明显问题函数命名混乱可读性差代码结构松散大量使用全局变量设备树参数与实际使用存在差异2. 问题根源分析2.1 设备树参数的实际作用通过深入分析全志T113的显示驱动代码我发现设备树中关于LCD时序的配置存在几个关键点除了width、height、lcd_x和lcd_y这几个参数外其他时序参数实际上并没有被使用width和height主要用于计算DPI值lcd_x和lcd_y在内核中用于一张图片的缩放计算重要发现设备树中配置的大部分时序参数实际上并没有被驱动代码使用这导致了很多开发者在调整这些参数时发现无效。2.2 时序寄存器的设置流程全志T113的LCD时序寄存器设置流程比较特殊时序寄存器值是在uboot阶段设置的内核启动后会直接使用uboot设置好的值uboot中的时序计算方式存在问题导致屏幕显示向左偏移了几十个像素3. 解决方案实现3.1 设备树配置调整首先需要按照全志官方文档正确配置设备树中的timing参数。以下是一个参考配置示例lcd0 { lcd_used 1; lcd_driver_name default_lcd; lcd_backlight 50; lcd_if 0; lcd_x 800; lcd_y 480; lcd_width 154; lcd_height 86; lcd_dclk_freq 33; lcd_pwm_used 1; lcd_pwm_ch 0; lcd_pwm_freq 50000; lcd_pwm_pol 1; lcd_hbp 46; lcd_ht 1055; lcd_hspw 10; lcd_vbp 23; lcd_vt 525; lcd_vspw 10; lcd_lvds_if 0; lcd_lvds_colordepth 1; lcd_lvds_mode 0; lcd_frm 1; lcd_io_phase 0x0000; lcd_gamma_en 0; lcd_bright_curve_en 0; lcd_cmap_en 0; lcd_bl_en 0; lcd_bl_en_pin 0; lcd_power vcc-lcd; lcd_pin_power vcc-pd; lcd_gpio_0 0; };3.2 内核驱动修改需要在disp_lcd.c文件中添加自定义的时序设置函数。以下是具体修改步骤打开drivers/video/fbdev/sunxi/disp2/disp/de/disp_lcd.c文件在disp_init_lcd函数前添加以下代码typedef struct { volatile unsigned int Timing0; volatile unsigned int Timing1; volatile unsigned int Timing2; volatile unsigned int Timing3; } RegTypeDef; static void set_lcd_timings(unsigned int dwLcdRegBase, struct disp_video_timings* pTimings) { RegTypeDef* reg; unsigned int dwWidth, dwHeight; unsigned int dwHT, dwHBP; unsigned int dwVT, dwVBP; unsigned int dwHSPW, dwVSPW; reg (RegTypeDef*)(dwLcdRegBase 0x48); dwWidth pTimings-x_res; dwHSPW pTimings-hor_sync_time; dwHBP pTimings-hor_back_porch pTimings-hor_sync_time; dwHT pTimings-hor_total_time; dwHeight pTimings-y_res; dwVSPW pTimings-ver_sync_time; dwVBP pTimings-ver_back_porch pTimings-ver_sync_time; dwVT pTimings-ver_total_time; reg-Timing0 ((dwWidth - 1) 16) | (dwHeight - 1); reg-Timing1 ((dwHT - 1) 16) | (dwHBP - 1); reg-Timing2 (((dwVT - 1) * 2) 16) | (dwVBP - 1); reg-Timing3 ((dwHSPW - 1) 16) | (dwVSPW - 1); printk(width: %d, hspw: %d, hbp: %d, ht: %d\n, dwWidth, dwHSPW, dwHBP, dwHT); printk(height: %d, vspw: %d, vbp: %d, vt: %d\n, dwHeight, dwVSPW, dwVBP, dwVT); }在disp_init_lcd函数中的disp_lcd_init调用后添加set_lcd_timings(para-reg_base[DISP_MOD_LCD0], lcd-timings);3.3 编译与烧录完成代码修改后需要重新编译内核并烧录到开发板执行make命令编译内核使用全志提供的烧录工具将新内核烧录到开发板重启开发板观察LCD显示是否正常4. 常见问题与解决方案4.1 找不到disp_lcd_init函数有些开发者反馈在disp_init_lcd函数中找不到disp_lcd_init调用这通常是因为使用的内核版本不同。解决方法查找类似功能的初始化函数确认函数调用位置是否正确检查内核配置是否启用了相关驱动4.2 显示仍然不正常如果按照上述步骤修改后显示仍然有问题可以尝试以下方法检查设备树参数是否正确确认LCD屏幕规格书中的时序参数使用逻辑分析仪测量实际输出的时序信号调整uboot中的时序设置4.3 其他显示异常除了本文描述的问题外还可能遇到以下显示异常屏幕闪烁检查背光PWM配置颜色异常检查像素格式设置显示偏移调整同步信号位置5. 经验总结与建议通过这次调试经历我总结了以下几点经验不要完全依赖设备树参数实际查看驱动代码才能确认参数是否被使用全志芯片的显示驱动实现比较特殊uboot和内核的时序设置需要协调一致调试显示问题时逻辑分析仪是非常有用的工具遇到问题时可以尝试在驱动中添加调试打印了解实际的参数传递过程对于正在使用全志T113开发板的开发者我建议仔细阅读全志提供的官方文档保持内核和uboot版本的一致性在修改驱动前备份原始代码分步骤验证每个修改的效果这个问题的解决过程虽然曲折但也让我对全志的显示驱动架构有了更深入的理解。希望这篇分享能帮助其他遇到类似问题的开发者节省调试时间。