BSP调试#10:LVDS(全志T527) 本合集分享的是我当初入门嵌入式 BSP 调试时调试人生中第一块板子的原始笔记。调试前对于全志平台适配一个新屏建议按照 kernel-uboot -android 的顺序进行适配因为 kernel的调试手段要方便且直观很多因此在内核适配完成后再适配 uboot 会方便很多基本只需要完成 dts 的拷贝即可。1显示模块工作原理显示模块框图如下由显示引擎DE和各类型控制器(TCON_LCDlcd/TCON_TV(hdmi、eDP))组成。输入图层layers在 DE 中进行显示相关处理后通过一种或多种接口输出到显示设备上显示以达到将众多应用渲染的图层合成后在显示器呈现给用户观看的作用。全志T527的DE 有 2 个独立单元可以简称 de0、 de1可以分别接受用户输入的图层进行合成输出到不同的显示器以实现双显。**DE 的功能**接收应用层传输下来的多个图层将它们合成为一个最终图像然后给到 TCON TCON 再通过不同的显示接口发送到不同的显示设备上。DE 的内部有多个核心可以抽象为不同的显示设备连接不同的 TCON 来传输图像。DE 有多个接收通道通道分为视频通道和 RGB 通道。视频通道支持 YUV 和 RGB 格式而 RGB通道则只支持 RGB 格式。不同的通道之间可以做 alpha 混合而且 zorder 可自行配置。2显示驱动框架显示驱动可划分为三个层面驱动层框架层及底层。**底层**与图形硬件相接主要负责将上层配置的功能参数转换成硬件所需要的参数并配置到相应寄存器中。**框架层**对底层进行抽象封装成一个个的功能模块。**驱动层**对外封装功能接口通过内核向用户空间提供相应的设备结点及统一的接口。在驱动层分为ramebuffer驱动、disp驱动、lcd驱动。 Framebuffer 驱动与framebuffer core 对接实现 linux 标准的 framebuffer 接口。Disp 驱动是整个显示驱动中的核心驱动模块所有的接口都由 disp 驱动来提供包括 lcd 的接口。硬件连接关系简图模块说明DE完成图层合成和渲染等工作的显示引擎显示系统的核心VIDEO_OUT显示子系统域并非所有平台都有这个模块用于显示系统顶层功耗管理和通路管理TCON时序控制器将 DE 合成的数据转换成对应的时序信息显示接口通常指显示接口的控制器常见的显示接口有 MIPI DSI、LVDS、eDP、HDMI 等PHY物理层根据时序信息生成对应的模拟信号并非每个显示通路都有部分显示接口集成在内部PANEL通常指的就是我们常规意义的物理屏幕如 DSI 屏、LVDS。软件 dts 连接关系简图显示接口所属 Video_OutTcon 连接外部 PHY 连接DSI0vo0dlcd0dsi0combophyDSI1vo0dlcd1dsi1combophy双 DSIvo0dlcd0 dlcd1dsi0combophy dsi1combophyLVDS0vo0dlcd0LVDS1vo1dlcd2RGB0vo0dlcd0N/ARGB1vo1dlcd2N/A硬件设计背光控制引脚PI3背光使能引脚PI2。软件配置显示框架驱动文件bsp/drivers/drm/*背光驱动路径uboot驱动./brandy/brandy-2.0/u-boot-2018/drivers/video/pwm_backlight.c kernel驱动./kernel/linux-5.15/drivers/video/backlight/pwm_bl.cpanel驱动路径uboot驱动./brandy/brandy-2.0/u-boot-2018/drivers/video/drm/panels/panel-lvds.c kernel驱动./kernel/linux-5.15/bsp/drivers/drm/panel/panel-lvds.c使用内核来调试 LCD 屏。我们知道 Uboot 和内核都需要添加 LCD 驱动这样才能快速显示logo但是 uboot 并不方便调试所以有时候我们需要把 uboot 的显示驱动关掉专心调试内核的 LCD 驱动调好之后才移植到 uboot。另外这样做的一个好处是我们可以在内核非常方便的修改lcd timing ——利用 uboot 命令的 fdt 命令修改 device tree而不需要重烧固件。因此适配屏幕之前我们可以先关闭 Uboot 的屏幕驱动在 Uboot 配置brandy/brandy-2.0/u-boot-2018/configs/sun55iw3p1_t527_defconfig中屏蔽如下配置。#CONFIG_DISP2_SUNXIydts 配置BackLight配置驱动路径./kernel/linux-5.15/drivers/video/backlight/pwm_bl.cpanel配置屏参说明clock-frequency时钟频率hactive水平有效像素数即水平分辨率vactive垂直有效像素数即垂直分辨率lcd_hbp水平后肩即行结束到水平同步开始之间的时钟周期数lcd_ht水平总周期数即一行的总时钟周期数前肩、有效像素、同步和后肩lcd_hspw水平同步脉冲宽度即水平同步信号的持续时间lcd_vbp垂直后肩即帧结束到垂直同步开始之间的行数lcd_vt垂直总周期数即一帧的总行数包括前肩、有效行、同步和后肩lcd_vspw垂直同步脉冲宽度即垂直同步信号的持续时间。lvds0tconcombophyvideo_outpinctl内核配置CONFIG_BACKLIGHT_PWMy CONFIG_AW_DRMy CONFIG_AW_DRM_LVDSy CONFIG_PANEL_LVDS_GENERALy CONFIG_DRMy调试过程**屏幕调试思路**首先配置背光、复位以及屏幕连接相关引脚。目的是先将屏幕点亮排除硬件问题。再进一步确认驱动、屏参。功能验证背光测试echoX/sys/class/backlight/backlight0/brightness显示测试查看 drm 设备ls/sys/class/drm/*花屏或清屏测试ddif/dev/urandom/dev/fb0ddif/dev/zeroof/dev/fb0调试总结调试思路当我们们拿到一块屏幕首先确认硬件的电压以及线序。硬件确认没问题后接上屏幕查看背光是否点亮。背光不亮需要先解决背光问题。然后根据屏幕参数修改 dts 屏参、复位/使能脚以及时钟等并确认使用的具体屏驱动以及其加载情况。最后就是根据 log 以及现象解决问题。LVDS 屏无初始化代码软件正确配置基本能点亮。说明全志平台的显示分为 uboot 和内核阶段需要同时修改这两个阶段的 dts。而 RK 平台显示是共用一份屏参的RK 调屏为何无需修改 uboot dts?因此调试时只需关注内核阶段即可。排查思路背光不亮1使用万能表对应原理图确认硬件各路电压2使用示波器确认 PWM 背光脚是否有波形输出并确认用户层是否存在并可控的背光节点3如以上两步都没有问题换一个屏幕。背光亮但黑屏1示波器抓一下时钟波形确认是否有输出如有那换个屏测试。如没有继续往下排查。2确认显示链路、图层是否正确这个一般可以通过 log 查看。不同平台显示链路和图层会有所差异具体排查手段参考原厂资料全志平台要特别留意 uboot 。完下期分享“MIPI接口调试”欢迎关注~合集系列《嵌入式分享》《BSP 调试从 0 到 1》往期文章保姆级教程RK平台Ubuntu调GPU实战指南比I2C快10倍RK3576的I3C你用了吗一文理清 RK3576 启动流程RK3576 板子变砖先搞懂 Maskrom 和 Loader 的区别RK3576改UART波特率【精简版】