1. 屏幕点亮绕不开的那根线MIPI-DSI 到底是个啥搞嵌入式显示这一块只要涉及到屏幕点亮十有八九会撞上 MIPI-DSI 这个接口。尤其是最近全志 T113-i 这类平台在社区里讨论度很高很多人拿到板子第一件事就是想把自己的屏幕点起来结果一打开原理图就懵了——MIPI-DSI 那几对差分线、时钟线、控制线到底哪个管哪个为什么有的屏接上就能亮有的屏死活不出图这篇文章就围绕 MIPI-DSI 这个硬件接口把屏幕点亮过程中最常打交道的那些东西掰开揉碎讲清楚。先说清楚定位MIPI-DSI 全称是 Mobile Industry Processor Interface - Display Serial Interface翻译过来就是移动产业处理器接口下的显示串行接口。它本质上是一个高速差分串行总线专门用来把处理器或桥接芯片产生的图像数据送到显示屏的驱动 IC 里。你可以在手机、平板、车载中控、智能家居面板、工业 HMI 上看到它的身影。它替代了早期 RGB 并口那种几十根线满天飞的做法用几对差分线就能跑出高分辨率、高刷新率的画面。这篇文章适合谁看如果你正在用 T113-i 或者其他带 MIPI-DSI 输出的 SoC 做屏幕适配如果你对 DSI 的物理层、协议层、时序参数只有模糊概念如果你点屏时遇到过“背光亮了但没图像”“花屏”“闪屏”“颜色不对”这类问题那这篇内容就是给你准备的。我会从硬件接口的物理构成讲起一路说到实际点屏时的配置思路和排查手段尽量让刚入行的朋友也能跟着走一遍。需要提前说明的是不同厂家的 SoC 在 DSI 控制器实现上会有差异屏幕驱动 IC 的初始化序列也各不相同但底层的物理连接逻辑和协议框架是相通的。下面讲到的参数计算和配置方法是基于常见工程实践总结出来的通用思路具体到你的项目还需要结合原理图和屏幕规格书做调整。2. 从物理层到协议层MIPI-DSI 的硬件接口拆解2.1 差分信号线几对线就能撑起一块屏MIPI-DSI 最直观的部分就是它的物理连线。一条 DSI 链路通常包含以下几类信号时钟差分对Clock Lane一对差分线负责传输同步时钟。DDR 模式下时钟的上下沿都会采样数据所以实际数据速率是时钟频率的两倍。数据差分对Data Lane通常有 1 到 4 对记作 Lane 0 到 Lane 3。Lane 0 是必须存在的因为它除了传数据还要负责传输控制信息。Lane 1 到 Lane 3 是可选的用来扩展带宽。控制信号包括复位Reset、待机Standby等通常是普通 GPIO不是差分信号。以常见的 4 Lane 配置为例加上时钟线一共是 5 对差分线也就是 10 根走线。相比 RGB 并口动辄 24 根数据线加一堆控制线布线压力小了很多。但代价是差分线对阻抗匹配、等长、参考层这些要求更严格PCB 设计时不能随便走。这里有个容易踩的坑很多人以为 Lane 数越多越好其实不然。Lane 数量要和屏幕驱动 IC 支持的 Lane 数匹配也要和 SoC 的 DSI 控制器输出能力匹配。比如你的屏只支持 2 Lane你非要在设备树里配 4 Lane那大概率是点不亮的。另外Lane 的映射关系也要注意有的 SoC 的 Lane 0 对应的是物理上的某一对引脚换到另一块板子上可能就变了必须以原理图和芯片手册为准。2.2 数据打包与传输模式高速模式和低功耗模式MIPI-DSI 的差分线上并不是一直跑高速信号的。它有两种传输模式高速模式HS Mode用于传输实际的图像数据和命令差分摆幅小速率高通常几百 Mbps 到几 Gbps 每 Lane。低功耗模式LP Mode用于传输控制命令和进入/退出高速模式的切换单端信号摆幅大速率低。这两种模式会在同一条差分线上分时复用。DSI 控制器会根据当前要传的内容自动切换。你在调试时如果发现示波器上抓到的波形一会儿是差分小信号一会儿是单端大信号不要慌这是正常现象。从协议层次看DSI 的数据包分为短包和长包。短包通常 4 个字节用来传命令、参数、同步事件长包用来传像素数据长度可变。每个包都有 ECC 校验和 CRC 校验保证传输可靠性。这些细节在写驱动时一般由控制器硬件处理但理解它们有助于你分析为什么某些命令没生效。2.3 屏幕驱动 ICDSI 的另一端是谁MIPI-DSI 只是传输通道真正让屏幕亮起来的是屏幕模组上的驱动 IC。常见的驱动 IC 有 ILI9881、JD9365、ST7701S、NT35510 等等。这些 IC 内部有寄存器、GRAM显存、时序控制器、电源管理模块。SoC 通过 DSI 发送初始化命令序列配置驱动 IC 的电源、时序、像素格式然后才能开始送图像数据。不同驱动 IC 的初始化序列差异很大有的需要上电后延时再发命令有的对命令之间的间隔有要求有的需要先发解锁命令才能写关键寄存器。这些序列通常由屏幕厂家提供但有时候厂家给的序列是针对特定平台的换到你的平台上可能需要微调。我个人的经验是拿到初始化序列后不要直接照搬先看一遍每条命令的作用尤其是电源相关的命令顺序错了可能导致屏幕不亮甚至损坏。3. 点屏之前必须搞清楚的几个关键参数3.1 分辨率与时序像素时钟怎么算屏幕点亮的本质是让驱动 IC 按照正确的时序把 GRAM 里的像素数据一行一行地显示出来。这个时序由一组参数决定通常包括水平有效像素H Active一行有多少个有效像素。水平前肩H Front Porch有效像素结束后到行同步信号之前的空闲像素数。水平后肩H Back Porch行同步信号之后到下一个有效像素之前的空闲像素数。水平同步宽度H Sync Width行同步信号的宽度。垂直有效行数V Active一帧有多少行有效像素。垂直前肩V Front Porch有效行结束后到帧同步信号之前的空闲行数。垂直后肩V Back Porch帧同步信号之后到下一个有效行之前的空闲行数。垂直同步宽度V Sync Width帧同步信号的宽度。这些参数加起来决定了总的像素时钟频率。计算公式是像素时钟 (H Active H Front Porch H Back Porch H Sync Width) × (V Active V Front Porch V Back Porch V Sync Width) × 刷新率举个例子一块 1024×600 的屏刷新率 60Hz假设 H Total 是 1344V Total 是 635那么像素时钟大约是 1344 × 635 × 60 ≈ 51.2 MHz。这个频率必须和屏幕规格书里给出的一致否则可能出现画面偏移、闪烁或者完全不出图。在实际配置时很多平台的 DSI 控制器不需要你直接填像素时钟而是填一组时序参数控制器自己算。但你要知道这些参数之间的制约关系调的时候才有方向。比如画面整体偏左可能是 H Back Porch 太小画面整体偏上可能是 V Back Porch 太小。3.2 Lane 速率与带宽匹配别让数据堵在路上DSI 的 Lane 速率决定了单位时间内能传多少数据。计算所需带宽的公式大致是总带宽 像素时钟 × 每像素位数bpp比如 1024×60060HzRGB888 每像素 24 位像素时钟约 51.2 MHz那么总带宽约 1.23 Gbps。如果使用 4 Lane每 Lane 需要承担约 307 Mbps如果使用 2 Lane每 Lane 需要约 615 Mbps。你的 SoC DSI 控制器和屏幕驱动 IC 都必须支持这个 Lane 速率。这里有个常见误区有人觉得 Lane 速率越高越好实际上速率越高对信号完整性的要求越苛刻PCB 走线稍微差一点就可能误码。所以在满足带宽的前提下尽量选择较低的 Lane 速率或者增加 Lane 数量来分摊。当然Lane 数量增加也会带来布线和功耗的问题需要权衡。另外要注意DSI 传输像素数据时并不是 100% 效率协议开销、消隐期都会占用时间。所以实际需要的 Lane 速率要比理论计算值留一些余量一般建议留 20% 到 30%。3.3 像素格式RGB565 还是 RGB888像素格式决定了每个像素用多少位表示。常见的有RGB56516 位每像素红 5 位、绿 6 位、蓝 5 位。带宽小颜色数少。RGB66618 位每像素每种颜色 6 位。折中方案。RGB88824 位每像素每种颜色 8 位。颜色最丰富带宽最大。选择哪种格式要看屏幕驱动 IC 支持哪些以及你的应用对颜色的要求。如果只是显示文字和简单图标RGB565 就够了如果要显示照片或视频建议 RGB888。需要注意的是SoC 端输出的格式和屏幕端接收的格式必须一致否则会出现颜色错乱。比如 SoC 发 RGB888屏幕按 RGB565 解析那颜色肯定不对。4. 实际点屏流程从设备树到屏幕亮起4.1 硬件连接检查先别急着上电在写任何代码之前先确认硬件连接没问题。这一步看似简单但很多点不亮的情况都是硬件问题。检查清单如下差分线对是否正确连接Clock Lane 的正负有没有接反Data Lane 的顺序有没有搞错。有些 SoC 的 Lane 映射是可配置的但物理连接必须和配置一致。复位和待机引脚屏幕的 Reset 和 Standby 引脚有没有接到 SoC 的 GPIO极性对不对。有的屏幕是高电平复位有的是低电平复位搞反了屏幕一直处于复位状态。电源屏幕模组通常需要多路电源比如 IOVCC、VCC、AVDD、VGH、VGL 等。这些电源的上电顺序有严格要求错了可能导致屏幕不亮或损坏。一般规格书里会给出上电时序图照着做就行。背光背光电路是否正常。背光亮了但没图像说明 DSI 数据没传过去背光不亮先查背光电路。我个人的习惯是上电之前先用万用表量一遍各路电源对地阻抗确认没有短路。然后上电用示波器看复位引脚和时钟引脚有没有信号。如果复位引脚一直不动那后面就不用查了先解决 GPIO 控制的问题。4.2 设备树配置把硬件信息告诉内核以 Linux 平台为例MIPI-DSI 屏幕的配置通常在设备树里完成。需要配置的内容包括DSI 控制器节点使能 DSI 控制器设置 Lane 数量、Lane 速率、像素格式等。屏幕节点描述屏幕的时序参数、初始化序列、电源控制 GPIO、背光控制等。连接关系把 DSI 控制器和屏幕节点关联起来有的平台还需要配置显示管道Display Pipeline的连接。下面是一个简化的设备树片段示例展示了大致的结构dsi { status okay; #address-cells 1; #size-cells 0; panel0 { compatible vendor,panel-model; reg 0; reset-gpios pio 3 5 GPIO_ACTIVE_LOW; standby-gpios pio 3 6 GPIO_ACTIVE_LOW; backlight backlight; power-supply panel_power; port { panel_in: endpoint { remote-endpoint dsi_out; }; }; }; };这只是一个框架实际配置要复杂得多。比如初始化序列通常以字节数组的形式写在驱动里或者通过设备树属性传递。时序参数也需要根据屏幕规格书填写。这里有个经验设备树改完之后一定要用dtc工具反编译检查一遍确认没有语法错误。有时候一个分号或者括号错了内核启动时不会报错但屏幕就是不亮排查起来很费时间。4.3 驱动初始化序列屏幕的“开机密码”屏幕驱动 IC 上电后并不会自动工作需要 SoC 通过 DSI 发送一系列初始化命令。这些命令通常包括退出睡眠模式让驱动 IC 从低功耗状态唤醒。设置像素格式告诉驱动 IC 接下来要接收的像素数据是什么格式。设置时序参数把 H/V 同步相关的参数写入驱动 IC 寄存器。电源控制配置驱动 IC 内部的电荷泵、稳压器等。Gamma 校正调整显示曲线的参数。开启显示最后发送开启显示的命令。这些命令的顺序和参数值必须严格按照屏幕厂家提供的初始化序列来。有的命令之间还需要插入延时比如上电后延时 120ms 再发第一条命令。这些延时不能省省了可能导致驱动 IC 还没准备好就收到命令结果初始化失败。我在实际项目中遇到过一个问题屏幕厂家给的初始化序列里有一条命令是写某个寄存器但那个寄存器在另一款驱动 IC 上地址不一样。直接照搬导致屏幕颜色偏红。后来查了驱动 IC 手册才发现地址错了。所以拿到初始化序列后最好对照驱动 IC 手册核对一遍关键命令。4.4 背光控制亮度和开关背光通常由 PWM 信号控制。设备树里需要配置 PWM 控制器、PWM 频率、极性等。背光亮度通过调整 PWM 占空比来实现。有的屏幕背光芯片还支持通过 I2C 或单总线调光那就需要额外的驱动。背光控制看起来简单但也有坑。比如 PWM 频率太低会导致屏幕闪烁太高又可能超出背光驱动芯片的范围。一般建议 PWM 频率在 1kHz 到 20kHz 之间。另外背光开启的时机也有讲究最好在 DSI 初始化完成、开始送图像数据之后再开背光否则用户会看到一瞬间的白屏或花屏。5. 点屏常见问题与排查思路5.1 背光亮但无图像数据没到屏幕这是最常见的问题。背光亮说明背光电路正常但屏幕没有显示内容说明 DSI 数据没有正确传输或屏幕没有正确初始化。排查步骤检查 DSI 控制器是否使能在内核日志里搜索 DSI 相关的信息看控制器有没有 probe 成功。检查 Lane 速率和 Lane 数量确认设备树里的配置和屏幕规格书一致。检查初始化序列确认命令有没有发送成功有没有报错。用示波器或逻辑分析仪抓 DSI 信号看 Clock Lane 有没有时钟Data Lane 有没有数据。如果没有信号说明控制器没工作如果有信号但屏幕不亮可能是初始化序列有问题。我遇到过一次DSI 控制器 probe 成功初始化序列也发了但屏幕就是不亮。后来用示波器抓 Clock Lane发现时钟频率只有设定值的一半。查了半天发现是设备树里时钟源的配置错了导致 DSI 控制器的参考时钟不对。改过来之后屏幕就亮了。5.2 花屏或闪屏时序或速率不匹配花屏通常表现为画面上有杂乱的色块或条纹闪屏则是画面忽明忽暗或整体闪烁。这类问题多半和时序参数或 Lane 速率有关。花屏可能是 H/V 时序参数不对或者 Lane 速率和屏幕不匹配导致误码。可以尝试降低 Lane 速率或者调整时序参数。闪屏可能是像素时钟不稳定或者背光 PWM 频率和刷新率产生了干扰。可以尝试调整 PWM 频率或者检查电源是否稳定。还有一种情况是颜色错乱比如红色显示成蓝色。这通常是像素格式不匹配或者 Lane 映射顺序错了。RGB 三个通道的顺序在不同平台上可能不一样需要根据实际情况调整。5.3 屏幕偶尔亮偶尔不亮电源或复位时序问题这种间歇性故障最难查。可能的原因包括电源上电顺序不对有的屏幕要求 IOVCC 先上VCC 后上反了可能导致驱动 IC 内部状态异常。复位脉冲宽度不够复位信号需要保持一定时间才能让驱动 IC 可靠复位太短了可能复位不成功。初始化序列中的延时不够驱动 IC 需要时间准备延时太短会导致命令丢失。我的做法是在关键步骤之间加足够的延时宁可多等一会儿也不要抢时间。另外用示波器同时抓电源、复位和 DSI 信号看它们之间的时序关系是否符合规格书要求。5.4 常见问题速查表现象可能原因排查方向背光不亮背光电路故障、PWM 配置错误检查背光电源、PWM 信号背光亮但无图像DSI 未初始化、Lane 配置错误查内核日志、抓 DSI 信号花屏时序参数错误、Lane 速率不匹配调整时序、降低 Lane 速率闪屏像素时钟不稳、PWM 干扰检查电源、调整 PWM 频率颜色错乱像素格式不匹配、Lane 映射错误核对像素格式、调整 Lane 顺序间歇性不亮电源时序、复位脉冲问题抓电源和复位时序6. 调试工具与实操技巧6.1 示波器和逻辑分析仪你的眼睛调试 MIPI-DSI 离不开示波器。高速差分信号需要带宽足够的示波器一般建议 1GHz 以上带宽配合差分探头。如果只是看低速控制信号和电源普通示波器就够了。逻辑分析仪可以用来抓 I2C、SPI 等控制总线的信号比如屏幕的初始化命令如果是通过 I2C 发送的逻辑分析仪就能派上用场。不过 DSI 高速信号逻辑分析仪一般抓不了需要用专用的协议分析仪。我的经验是先抓低速信号确认控制通路正常再抓高速信号确认数据通路正常。不要一上来就抓高速信号那样容易迷失在波形里。6.2 内核日志与调试节点Linux 内核里有很多调试手段可以帮助排查 DSI 问题dmesg查看内核启动日志搜索 DSI、panel、backlight 等关键词。sysfs有的平台在/sys/class/drm/或/sys/kernel/debug/下提供了调试节点可以查看 DSI 控制器的状态、寄存器值等。debugfs如果内核编译时开启了 debugfs可以挂载后查看更详细的调试信息。我习惯在驱动里加一些打印把关键步骤的返回值打出来。比如初始化序列发送成功还是失败时序参数设置是否生效。这些打印在调试阶段非常有用问题解决后可以删掉或降级为 debug 级别。6.3 实操心得少走弯路的几个建议先点屏再优化不要一开始就追求高分辨率高刷新率先用一个较低的配置把屏幕点亮确认通路没问题再逐步调整参数。保留一份能工作的配置每次修改参数前把当前能工作的配置备份一份。调乱了可以快速回退。多看规格书屏幕规格书和驱动 IC 手册是最权威的资料遇到问题先翻书不要凭感觉猜。注意电源和地的处理DSI 高速信号对电源噪声很敏感电源滤波要做好地平面要完整。不要忽视软件配置的细节比如设备树里的status属性有没有改成okayGPIO 的极性有没有搞反这些低级错误经常发生。7. 关于 T113-i 点屏的一些补充T113-i 是最近社区里讨论比较多的平台它自带 MIPI-DSI 输出适合做显示相关的应用。在 T113-i 上点屏除了上面讲的通用流程还有一些平台特有的注意事项。T113-i 的 DSI 控制器支持的最高 Lane 速率和 Lane 数量需要查芯片手册确认。设备树的配置方式和其他全志平台类似但具体的节点名称和属性可能不同。社区里有一些开源的配置可以参考但要注意分辨哪些是经过验证的哪些是半成品。另外T113-i 的显示管道可能涉及 DEDisplay Engine和 TCONTiming Controller的配置DSI 只是最后一级输出。如果 DE 或 TCON 配置不对DSI 也不会有信号输出。所以排查问题时要从整个显示管道入手不要只盯着 DSI。我在 T113-i 上点屏时遇到过一个情况DSI 配置看起来没问题但屏幕就是不亮。后来发现是 DE 的输出格式和 DSI 的输入格式不匹配DE 输出 RGB888DSI 配置成了 RGB565导致数据错位。把两者统一之后问题解决。这个例子说明显示管道上的每一级都要对齐任何一级不匹配都可能导致最终不出图。8. 写在最后MIPI-DSI 点屏这件事说难也难说简单也简单。难在细节多任何一个参数不对都可能导致失败简单在只要掌握了基本原理和排查方法大部分问题都能定位到。我个人的体会是点屏最考验的不是写代码的能力而是耐心和系统性思维。遇到问题不要慌按照硬件、电源、时序、配置、驱动的顺序一步步排查总能找到原因。最后分享一个小技巧如果你手头有同型号的屏幕模组和已知能工作的板子可以把能工作的配置读出来对比差异往往就是问题所在。另外多和社区里的朋友交流很多坑别人已经踩过了问一句可能省你几天时间。
阅读完成 · 觉得有帮助?