第 14 篇 显示驱动(MIPI/LVDS 屏)适配与调试,DRM 框架详解

第 14 篇 显示驱动(MIPI/LVDS 屏)适配与调试,DRM 框架详解 目录开篇先搞懂RK 平台的显示架构到底是怎么回事RK3568 显示核心VOPDSI Host完整的画面显示流程一、核心框架DRM 显示框架大白话全解析什么是 DRM 框架DRM 框架的核心作用我们适配屏幕需要和 DRM 框架打什么交道二、MIPI DSI 屏核心知识点小白必懂1. 什么是 MIPI DSI2. MIPI DSI 核心参数适配屏幕必须搞懂3. 屏幕时序参数详解再也不用瞎抄了水平时序参数对应一行像素垂直时序参数对应一帧画面像素时钟DCLK计算三、保姆级实战MIPI DSI 屏完整适配流程基于 RK3568前置准备步骤 1解析屏幕规格书整理核心参数步骤 2修改设备树添加屏幕配置步骤 3初始化命令的转换方法步骤 4背光驱动配置步骤 5编译 SDK烧录验证四、LVDS 屏适配要点五、小白屏幕适配必踩的坑100% 问题排查指南问题 1屏幕完全不亮黑屏问题 2屏幕能亮但是花屏、画面错乱问题 3屏幕能亮但是闪屏、画面抖动问题 4屏幕能亮但是没有背光还是黑的结尾说两句大家好我是黒漂技术佬。上一篇我们搞定了 input 输入设备驱动后台收到最多的哭诉就是“佬我买了个 MIPI 屏按照厂家给的参数改了设备树结果屏就是不亮要么就是花屏、闪屏根本不知道从哪里排查快崩溃了”太懂这种痛苦了当年我入门的时候第一次适配 MIPI 屏光点亮屏幕就折腾了整整一周踩了无数坑要么是屏参不对要么是时序错了要么是背光没开根本不知道从哪里下手排查。今天这篇我就用大白话给你讲透 RK 平台的显示架构、DRM 显示框架手把手带你完成MIPI DSI 屏的完整适配流程从屏参解析、设备树配置、编译烧录到花屏、不亮、闪屏的全场景问题排查小白跟着走也能一次点亮屏幕。开篇先搞懂RK 平台的显示架构到底是怎么回事很多新手适配屏幕上来就瞎改设备树连 RK 的显示架构都没搞懂不踩坑才怪。先给大家用大白话讲清楚RK3568 的显示系统到底是怎么把画面显示到屏幕上的。RK3568 显示核心VOPDSI HostRK3568 的显示系统核心分为两大部分VOPVideo Output Processor视频输出处理器相当于显示系统的 “大脑”负责把内存里的画面数据转换成对应的时序信号输出给后面的显示接口。RK3568 有 2 个 VOP支持双屏同显 / 异显最高支持 4K 分辨率显示接口相当于显示系统的 “嘴巴”把 VOP 输出的时序信号转换成对应屏幕能识别的信号传输给屏幕。RK3568 支持的显示接口有MIPI DSI最常用的接口手机、平板、工业屏绝大多数都是 MIPI 接口我们今天重点讲这个LVDS工业屏常用的接口一般用于中低分辨率的屏幕HDMI外接显示器、电视用的接口官方已经适配好了不用我们自己改eDP笔记本屏幕常用的接口RK3568 也支持。完整的画面显示流程安卓系统把要显示的画面渲染到内存的帧缓冲区里DRM 框架把帧缓冲区的画面数据交给 VOPVOP 按照我们配置的屏幕时序把画面数据转换成并行的 RGB 信号MIPI DSI Host 控制器把 VOP 输出的 RGB 信号转换成 MIPI DSI 协议的串行信号通过 MIPI 排线传输给屏幕屏幕的驱动芯片收到信号后点亮对应的像素点画面就显示出来了。我们适配屏幕核心就是做两件事给 VOP 配置正确的屏幕时序参数让 VOP 输出符合屏幕要求的信号给 MIPI DSI Host 配置正确的初始化命令、通道数、速率让它能和屏幕正常通信。一、核心框架DRM 显示框架大白话全解析很多新手一听到 DRM 就头大觉得是天书其实完全不用怕我用大白话给你讲明白你只需要知道它是干嘛的不用深入啃源码就能完成屏幕适配。什么是 DRM 框架DRM 的全称是 Direct Rendering Manager直接渲染管理器是现在 Linux 内核里标准的显示框架RK3568 的安卓 11/12 系统全都是用的 DRM 框架之前老旧的 FBDEV帧缓冲框架已经被淘汰了。DRM 框架的核心作用简单说DRM 框架就是安卓系统和显示硬件之间的桥梁它统一管理显示硬件VOP、DSI 控制器、HDMI 控制器给上层安卓系统提供标准的显示接口负责画面的渲染、缓冲、输出让安卓系统不用关心底层的硬件细节。我们适配屏幕需要和 DRM 框架打什么交道99% 的场景下我们不需要修改 DRM 框架的代码RK 官方已经把 DRM 框架、VOP 驱动、MIPI DSI Host 驱动都写好了我们只需要在设备树里把屏幕的时序参数、初始化命令、接口配置填进去内核的 DRM 驱动会自动读取这些配置完成屏幕的初始化和显示。对你没看错适配屏幕90% 的工作就是修改设备树把屏幕厂家给的参数填到对应的设备树节点里就行不用写一行驱动代码这就是 RK 平台的优势官方已经把底层驱动全做好了。二、MIPI DSI 屏核心知识点小白必懂1. 什么是 MIPI DSIMIPI DSI 的全称是 Mobile Industry Processor Interface Display Serial Interface也就是移动行业处理器接口的显示串行接口是现在手机、平板、工业屏最主流的显示接口它的核心优势是引脚少、传输速率高、抗干扰能力强。2. MIPI DSI 核心参数适配屏幕必须搞懂你买屏幕的时候厂家一定会给你一份屏幕规格书datasheet里面的这些核心参数是我们适配的关键必须看懂分辨率屏幕的像素点数比如 8001280、10801920这个是最基础的MIPI 通道数Lane 数MIPI DSI 用差分对来传输数据一个差分对就是一个 Lane通道常用的有 1 Lane、2 Lane、4 Lane分辨率越高需要的通道数越多比如 8001280 一般用 2 Lane10801920 一般用 4 LaneD-PHY 速率每个 Lane 的传输速率单位是 Mbps一般在 500Mbps~1500Mbps 之间屏幕规格书里会给最大值我们配置的速率不能超过这个最大值屏幕时序参数也就是我们常说的 HFP、HBP、HSA、VFP、VBP、VSA这些是 VOP 输出时序的核心参数必须和屏幕规格书里的完全一致不然就会花屏、闪屏、不显示后面我会详细讲每个参数的含义初始化命令MIPI 屏在上电后需要通过 MIPI 总线给屏幕驱动芯片发送一串初始化命令才能正常工作厂家一般会给现成的初始化代码我们只需要转换成设备树里的格式就行像素格式一般都是 RGB88824 位色或者 RGB56516 位色绝大多数屏幕都是 RGB888。3. 屏幕时序参数详解再也不用瞎抄了很多新手适配屏幕就是从网上随便抄一套时序参数结果屏不亮就是因为没搞懂这些参数的含义。时序参数分为水平Horizontal和垂直Vertical两部分对应屏幕的行和列我用 800*1280 分辨率的屏举例给你讲透每个参数水平时序参数对应一行像素HACTIVEHdisp水平有效像素也就是屏幕的水平分辨率800*1280 的屏这个值就是 800HSAHorizontal Sync Width水平同步宽度行同步信号的持续时间单位是像素时钟HBPHorizontal Back Porch水平后沿行同步信号结束后到有效像素开始前的时钟数HFPHorizontal Front Porch水平前沿有效像素结束后到下一个行同步信号开始前的时钟数HTOTAL水平总长度 HACTIVE HSA HBP HFP也就是一行完整的时钟数。垂直时序参数对应一帧画面VACTIVEVdisp垂直有效像素也就是屏幕的垂直分辨率800*1280 的屏这个值就是 1280VSAVertical Sync Width垂直同步宽度帧同步信号的持续时间单位是行VBPVertical Back Porch垂直后沿帧同步信号结束后到有效帧开始前的行数VFPVertical Front Porch垂直前沿有效帧结束后到下一个帧同步信号开始前的行数VTOTAL垂直总长度 VACTIVE VSA VBP VFP也就是一帧完整的行数。像素时钟DCLK计算像素时钟是 VOP 输出的时钟频率单位是 MHz计算公式是plaintextDCLK HTOTAL * VTOTAL * 帧率 / 1000000比如 8001280 的屏帧率 60fpsHTOTAL1000VTOTAL1300那么 DCLK10001300*60/100000078MHz。这些参数屏幕厂家的规格书里都会给我们只需要照着填到设备树里就行不用自己算千万别自己瞎编三、保姆级实战MIPI DSI 屏完整适配流程基于 RK3568我们以 800*1280 分辨率、2 Lane MIPI、ST7701 驱动芯片的屏为例手把手带你完成完整的适配流程所有步骤一步不落小白跟着走就能点亮屏幕。前置准备RK3568 开发板配套的安卓 SDKMIPI DSI 屏厂家给的规格书、初始化代码已经搭建好的编译环境能正常编译 SDK。步骤 1解析屏幕规格书整理核心参数首先从屏幕厂家给的规格书里整理出我们需要的核心参数举个例子表格参数名值分辨率800*1280MIPI 通道数2 Lane最大 D-PHY 速率800Mbps帧率60fps像素格式RGB888HACTIVE800HFP20HBP20HSA10VACTIVE1280VFP10VBP10VSA2初始化命令厂家给的 ST7701 初始化代码步骤 2修改设备树添加屏幕配置RK3568 的屏幕配置都在rk3568.dtsi和板级.dts 文件里我们只需要在板级.dts 文件里添加对应的 dsi 屏节点修改对应的参数就行。打开你的板级.dts 文件添加下面的配置每一行都加了注释你只需要把参数换成你自己屏幕的就行dts// 1. 配置MIPI DSI Host控制器 dsi0 { status okay; // MIPI通道数2 Lane rockchip,lane-count 2; // D-PHY最大速率单位是Mbps不能超过屏幕的最大值 rockchip,max-bandwidth 800; // 屏幕格式RGB888 rockchip,format MIPI_DSI_FMT_RGB888; // 视频模式还是命令模式绝大多数屏都是视频模式 rockchip,mode MIPI_DSI_MODE_VIDEO; // 视频模式配置突发模式 rockchip,video-mode MIPI_DSI_VIDEO_MODE_BURST; // 同步信号极性根据屏幕规格书修改 rockchip,sync-pol 0; // 屏幕时序节点 panel0 { compatible simple-mipi-dsi-panel; reg 0; status okay; // 屏幕时序参数核心中的核心必须和规格书一致 display-timings { native-mode timing0; timing0: timing0 { clock-frequency 78000000; // 像素时钟单位Hz78MHz hactive 800; // 水平有效像素 hfront-porch 20; // HFP hback-porch 20; // HBP hsync-len 10; // HSA vactive 1280; // 垂直有效像素 vfront-porch 10; // VFP vback-porch 10; // VBP vsync-len 2; // VSA hsync-active 0; // 行同步极性0低电平有效 vsync-active 0; // 帧同步极性0低电平有效 de-active 1; // 数据使能极性1高电平有效 pixelclk-active 0; // 像素时钟极性0上升沿采样 }; }; // 屏幕上电时序配置根据屏幕规格书修改 power-supply vcc3v3_lcd0; // 屏幕供电引脚根据你的开发板修改 reset-gpios gpio4 RK_PA0 GPIO_ACTIVE_LOW; // 屏幕复位引脚 // 上电时序上电后延时10ms拉低复位延时10ms拉高复位延时120ms reset-delay-ms 10; prepare-delay-ms 10; init-delay-ms 120; // MIPI屏初始化命令厂家给的初始化代码转换成这个格式 dsi,init-commands [ 15 00 02 80 10 // 延时120ms 39 00 02 FF 77 01 00 00 10 // 发送命令FF 77 01 00 00 10 39 00 02 C0 63 00 10 // 发送命令C0 63 00 10 // 把厂家给的所有初始化命令都转换成这个格式后面讲转换方法 15 00 02 20 00 // 延时20ms 05 00 01 29 00 // 发送命令29开启显示 ]; }; }; // 2. 配置VOP绑定DSI控制器 route_dsi0 { status okay; // 绑定VOPRK3568有vopb和vopl这里用vopb connect vopb_out_dsi0; }; vopb { status okay; }; vopb_out_dsi0 { status okay; }; // 3. 配置背光后面讲 backlight { status okay; pwms pwm0 0 50000 0; brightness-levels 0 20 40 60 80 100 120 140 160 180 200 220 240 255; default-brightness 200; };步骤 3初始化命令的转换方法厂家给的初始化代码一般是这样的格式c运行Delay(120); Write_Cmd(0xFF); Write_Data(0x77); Write_Data(0x01); Write_Data(0x00); Write_Data(0x00); Write_Data(0x10); Delay(20); Write_Cmd(0x29);我们需要把它转换成设备树里的dsi,init-commands格式转换规则很简单延时命令格式是15 00 02 延时高8位 延时低8位单位是 ms。比如延时 120ms就是15 00 02 00 78120 的十六进制是 0x78写命令 数据格式是39 00 数据长度 命令 数据1 数据2 ... 10。比如写命令 0xFF后面跟 5 个数据数据长度是 0x0250x07所以就是39 00 07 FF 77 01 00 00 10只写命令无数据格式是05 00 01 命令 00。比如写命令 0x29就是05 00 01 29 00。步骤 4背光驱动配置屏幕点亮了还要开背光不然还是黑的。RK 平台的背光一般用 PWM 驱动我们只需要在设备树里配置好对应的 PWM 引脚、频率、亮度等级就行上面的设备树里已经加了 backlight 节点只需要把 PWM 引脚改成你开发板对应的就行。步骤 5编译 SDK烧录验证设备树修改完成后进入 SDK 根目录执行完整编译或者只编译内核和设备树bash运行./build.sh -CKu编译完成后把生成的 boot.img 和 update.img 烧录到开发板开发板上电正常情况下屏幕会在 U-Boot 阶段就点亮进入安卓系统后正常显示桌面。四、LVDS 屏适配要点工业屏常用的 LVDS 接口适配流程和 MIPI 屏几乎完全一样核心区别只有两点设备树里配置的是 LVDS 控制器而不是 DSI 控制器RK3568 有 2 路 LVDS 接口不需要配置 MIPI 初始化命令只需要配置好时序参数、LVDS 格式单路 / 双路、JEIDA/VESA 格式就行。厂家给的 LVDS 屏规格书里会明确说明是 JEIDA 格式还是 VESA 格式单路还是双路我们只需要在设备树里对应的节点里配置好就行其他的时序参数、背光配置和 MIPI 屏完全一样。五、小白屏幕适配必踩的坑100% 问题排查指南99% 的新手适配屏幕都会遇到屏不亮、花屏、闪屏的问题我把所有常见问题的排查步骤按优先级给你整理好了按这个顺序查99% 的问题都能解决。问题 1屏幕完全不亮黑屏按这个顺序排查先查硬件测量屏幕的供电引脚有没有 3.3V/5V 供电没供电先查供电电路测量复位引脚上电后有没有正常的复位电平变化没复位先查复位引脚的设备树配置测量 MIPI 排线的差分信号有没有数据输出没数据说明 DSI 控制器没正常工作。再查设备树配置检查 dsi0、route_dsi0、vopb 的 status 是不是 okay有没有被禁用检查 MIPI 通道数是不是和屏幕一致2 Lane 的屏不能配成 4 Lane检查初始化命令是不是正确有没有漏掉延时命令厂家给的初始化代码里的延时必须严格对应检查像素时钟是不是在合理范围内不能太高也不能太低。查内核日志开发板连串口开机的时候看内核日志搜索dsi、vop、panel相关的日志看有没有报错比如时序参数不对、初始化失败、DSI 通信失败日志里会明确告诉你哪里出了问题。问题 2屏幕能亮但是花屏、画面错乱99% 的原因是时序参数不对检查 HACTIVE、VACTIVE 是不是和屏幕分辨率完全一致检查 HFP、HBP、HSA、VFP、VBP、VSA 是不是和规格书里的完全一致差一个数都会花屏检查同步信号极性hsync-active、vsync-active是不是和规格书一致检查 MIPI D-PHY 速率是不是超过了屏幕的最大值降一点速率试试。问题 3屏幕能亮但是闪屏、画面抖动核心原因像素时钟不对计算错误导致帧率不对重新计算像素时钟时序参数里的前后沿太小不符合屏幕要求适当加大 HFP、HBP、VFP、VBP 的值MIPI 排线太长或者干扰太大降低 D-PHY 速率试试电源纹波太大屏幕供电不稳定加滤波电容。问题 4屏幕能亮但是没有背光还是黑的检查背光驱动的设备树配置PWM 引脚是不是正确有没有正常输出测量背光引脚的电压有没有正常输出背光使能引脚有没有拉高进入安卓系统后在设置里调节亮度看背光有没有变化串口看 backlight 相关的日志有没有报错。结尾说两句这篇文章我们彻底搞懂了 RK 平台的显示架构、DRM 框架完成了 MIPI/LVDS 屏的完整适配流程还给了你一套万能的屏幕问题排查指南以后再遇到屏点不亮、花屏的问题再也不用瞎改了。下一篇我们进入音频驱动的内容详解 ALSA 音频架构手把手带你完成 RK 平台的音频驱动适配与调试解决没声音、杂音、录音无声的问题。我是黒漂技术佬关注我带你零基础入门 RK 安卓驱动开发不踩坑。有任何屏幕适配的问题评论区留言我都会一一回复。