两年前我拿着一支 2GHz 带宽的示波器去测一块 MIPI DSI 屏幕的 HS TX 波形以为屏幕驱动没配对初始化命令明明发出去了逻辑分析仪抓到的包也正常屏幕却死活不出图。后来把探头切到差分模式、重新触发到 LP 转 HS 的那一瞬间才看到问题——HS 信号的上升沿软得像面条摆幅只有 120mV接收端 D-PHY 根本没有解锁到有效数据。从那以后凡是碰 MIPI 的案子我都会先把 HS TX 的物理层当成第一优先级来查。所以这篇就集中写 MIPI HS TX它到底是干嘛的、PCB 上该怎么处理、在 FPGA 里怎么把像素变成串行比特流、RK3588 的 Linux 驱动怎么把这条链路调通以及最容易翻车的那几个坑。适合刚接触 MIPI 的硬件工程师、FPGA 工程师以及正在为“花屏”“无显示”反复折腾的驱动开发人员。1. MIPI HS TX是什么从接口形态到物理层职责1.1 HS 与 LP一对“快车道”和“慢车道”MIPI D-PHY 规定了两种完全不同的传输模式HSHigh Speed和 LPLow Power。HS TX 就是发送端跑“快车道”时用的驱动电路输出低压差分信号单 lane 速率从几百 Mbps 到 2.5Gbps 甚至更高用来搬运真正的图像数据。LP TX 则是发送端跑“慢车道”的低速单端信号电平是 0 到 1.2V用来在链路空闲时传递同步信号、BTA 切换和初始化命令。很多第一次接触 MIPI 的人会把 HS 和 LVDS 搞混两种都是差分串行但 MIPI 的 HS 是有“班次”的——它在 LP 状态和 HS 状态之间来回切换就像赛道上的 F1 赛车需要进站、出站而不是全程飙到底而 LVDS 一般上电就持续输出差分时钟和数据没有低速握手这一说。正是这种 LP/HS 混合机制让 MIPI 能把“控制”和“数据”放在同一组物理引脚上。项目HS 模式LP 模式信号形态低压差分单端 0~1.2V单 lane 速率数百 Mbps ~ 数 Gbps10Mbps 量级用途图像像素、大块数据命令、握手、低功耗状态典型功耗高极低HS TX 的核心职责就是在需要时快速、稳定地输出符合 D-PHY 规范的高速差分信号。屏幕花不花、数据错不错往往不是驱动 IC 的问题而是 HS TX 这一脚没踩稳。1.2 HS TX 的发送端架构与数据通路从逻辑到引脚HS TX 的发送通路可以拆成四段协议层、字节层、串行器、模拟驱动级。先看数据流。MIPI DSI 的像素包、命令包在协议层被组帧变成一个个字节字节层把字节按 lane 分好每个 lane 拿到属于自己的字节流串行器Serializer负责把并行字节变成串行比特流最后模拟驱动级通过电流源和可控端接把比特流变成差分电压送到 PCB 走线。这里的“电流源驱动”是 HS TX 和普通 CMOS 驱动的本质区别。D-PHY 的 HS 发送端不是靠推挽电压输出而是用一个小电流源往接收端的 100Ω 端接电阻上灌电流。典型源电流在毫安级经过 100Ω 差分负载后在接收端形成一个约 200mV 的差分电压。正因为是电流驱动HS TX 对阻抗匹配极其敏感——负载不对电压摆幅和反射都会出问题。顺便说一句FPGA 的普通 IO 是电压模式毛刺输出直接接 MIPI 屏往往不满足规范。要么用 FPGA 的高速收发器serdes加外部端接近似模拟要么干脆外接一颗 MIPI DSI 转接芯片这些都是第 3 章要展开的内容。1.3 进入高速状态的关键时序参数HS TX 不是想切就切的它必须按 D-PHY 设定的状态机走完 LP 到 HS 的过渡。这个过渡时序如果不对接收端就认不出 HS 序列直接导致屏幕不亮或者花屏。以 D-PHY v1.2 的典型值为例一次正常的高速传输要经历线路先处于 LP-11两条线都是高电平的空闲状态TX 拉出 LP-01、LP-00进入准备阶段送出 HS-0 差分状态开始输出高速比特流数据结束后还要经过 HS-TRAIL再退回 LP-11。对应到规范里的时间参数常用的几个是tHS-PREPARE从 LP-00 到 HS-0 的准备时间典型 40ns 4×UItHS-ZEROHS-0 保持时间典型 105ns 6×UItHS-TRAILHS 转 LP 的拖尾时间典型 60ns 4×UItHS-EXITHS 退出到 LP-11 的时间典型 100ns。这里的 UI 是单位间隔等于 1/lane 速率。速率越高UI 越短。如果你在示波器上看到 HS 信号进入时长度不够、过渡沿太软多半就是这些参数没有按规范做或者驱动芯片配置有误。很多屏幕驱动 IC 内部会自动处理这套状态机但用 FPGA 裸 OPIO 去模拟 HS 时就必须自己逐拍检查这些时间是否达标。2. 电气设计与PCB为什么100欧差分让HS TX不出错2.1 100欧差分阻抗不是玄学MIPI 的 HS TX 和接收端之间规范明确要求差分阻抗 100Ω。如果你拿网络分析仪去测走线通常会看到差分阻抗落在 90~110Ω 之间才算正常。为什么是 100Ω因为它直接决定了 HS TX 电流源在接收端能产生多大摆幅。假设驱动电流是 2mA接收端有 100Ω 端接那么差分摆幅就是 2mA × 100Ω 200mV正好落在规范的 HS 摆幅区间。如果 PCB 走线实际阻抗只有 70Ω接收端看到的摆幅就只剩 140mV接收灵敏度下降如果实际阻抗到了 130Ω反射和振铃又会让人眼图质量恶化误码率直线上升。另外要记住MIPI 是源电流驱动它的输出幅度不像 LVDS 那样“设计时就定死”而是靠负载阻抗反推出来的。所以“把 HS TX 当 LVDS 画”虽然走线层面积差不多但终端电阻、共模电平和源端处理完全不同。D-PHY 接收端通常自带 100Ω 端接PCB 上不要再额外并一个 100Ω 电阻否则等于把电流源负载减半幅度直接塌掉。2.2 用 S 参数读懂通道质量对一套 HS TX 系统我能给的最实用建议是在设计阶段就做一次 S 参数仿真而不是等板子回来再救。S 参数里最关心两个S21插入损耗信号从 TX 到 RX 衰减了多少。对于 MIPI DSI假设单 lane 速率 1Gbps基频 500MHz建议 S21 在奈奎斯特频率处大于 -3dBS11回波损耗TX 端看进去的反射有多强。最好在目标频段内低于 -10dB越接近 -15dB 越稳。实际设计时S21 的恶化主要来自过孔、长走线和吸波介质S11 的恶化主要来自阻抗突变比如换层、挖空参考层、连接器引脚。用仿真软件HyperLynx 或 SiSoft 都可以跑一遍能避免至少一半的物理层翻车。2.3 同层挖空的真相有些资料会跟你说MIPI 差分对周围要“同层挖空”把同一层的其他信号覆铜去掉防止串扰。这个做法本身有道理差分对两边 3W 范围内不铺铜能降低临近信号耦合。但问题出在“挖空”被理解偏了。我在实际项目里见过最多的情况是工程师把底层参考平面也挖掉一块只为了让差分对正下方干净。结果阻抗急剧变化回波损耗变差插损也难看。MIPI 的高速返回电流走的是参考平面不是凭空消失的你把参考平面挖穿等于把回流路径切断信号只能在挖空边缘绕路产生严重的共模噪声和辐射。正确做法是差分对两旁留出 3 倍线宽的净空其他信号不要靠近差分对正下方保持完整参考平面通常是 GND不要挖如果担心平面噪声耦合用密集地过孔把差分对两侧“围栏”起来比挖空有效得多实在要挖空参考层比如为了避开其他高速信号必须在挖空边缘做阻抗补偿并仿真验证 S 参数。一句话总结MIPI 同层挖空挖的是“同一层的邻居信号”不是“下面的地”。2.4 HS TX 布线禁忌与工程经验MIPI HS TX 的 PCB 走线速度越高越敏感。我常用的检查清单如下差分对内等长同一对 P/N 走线长度差控制在 5mil 以内因为对内等长直接影响差分信号的共模转换lane 间等长对于多 lane 的 DSIlane 之间的长度差尽量控制在 100~150mil 以内接收端的 deskew 电路能补一部分但不要完全依靠它过孔越少越好每个过孔都是一个阻抗不连续点。原则上一条 HS 走线不超过两个过孔不要 90 度直角走线用 45 度切角或圆弧减少拐角处的阻抗突变参考平面必须完整换层时要让回流地过孔尽量靠近信号过孔形成向上/向下的连续回流路径。还有一条非常容易被忽略HS TX 走线不要和时钟线、复位线近距离平行超过 2cm。各种“花屏修不好”的案子最后查下来有一半是走线串扰。3. FPGA实现HS TX从并行像素到串行差分3.1 三条可行路线我建议先从外部PHY入手FPGA 不是专门做 MIPI 的芯片所以实现 HS TX 有不同的路子。我按工程风险从低到高排一下外部 MIPI DSI 转接芯片FPGA 只输出 RGB 和命令由转接芯片负责 D-PHY 协议和 HS/LP 切换。这是最稳的方案适合量产FPGA 内置高速收发器 外部端接用 serdes 把并行数据转成高速差分LP 信号用 GPIO 模拟然后把两条线通过电容耦合或电平转换接到屏。实验可行但 D-PHY 电气规范很难完全满足FPGA 普通 IO 直接模拟 HS适合低速率、短走线的原型验证速率超过 500Mbps 基本不建议。对绝大多数项目我建议先走第一条路线FPGA 做逻辑MIPI PHY 芯片处理物理层。把 HS TX 交给专业的 PHY你剩下来要做的就是组帧和时序控制工作量小得多。第三条路线看起来“省钱”但会花掉你大量时间调电平、调端接最后还不一定稳。3.2 HS TX 带宽估算你的FPGA需要多快做 FPGA MIPI TX 之前先算清楚 lane 速率。以 1080p60、RGB888 为例每像素 24bit1920 × 1080 × 60 ≈ 1.244 亿像素/秒裸像素比特流 ≈ 1.244 亿 × 24 ≈ 2.99Gbps。实际 MIPI DSI 进入 HS 模式后还要加包头、包尾、ECC/CRC再加上 blanking 时间总带宽会比 2.99Gbps 高一些。如果按 4 lane 发每条 lane 大约 750Mbps 左右如果按 2 lane 发每条 lane 就要 1.5GbpsPCB 和 PHY 压力明显变大。这个估算的价值在于你先知道自己要跑的 HS 速率再决定 FPGA 内部时钟怎么分。比如 byte clock 是 lane rate 的 1/8那么 750Mbps 对应 byte clock 约 93.75MHz内部逻辑很容易满足如果 1.5Gbps则 byte clock 到了 187.5MHz普通的软核逻辑就开始吃紧。3.3 用DDR原语把字节串化到差分IO在 FPGA 里实现 HS TX最底层的动作是“把并行的字节在 bit clock 下串行输出”。Xilinx 的 OSERDESE2、Intel/Altera 的 ALTDDIO_OUT、或者国产 FPGA 的 DDR 输出原语干的事都差不多利用 DDR 模式在一个时钟边沿输出第一位下一个边沿输出第二位达到倍频效果。下面是一段示意性的 Verilog用 OSERDESE2 把 4bit 数据变成串行输出。实际工程还需要配合 LP/HS 切换使能、同步 FIFO 和数据组帧。// 示意1-lane HS 串行化使用 OSERDESE2 DDR 模式 OSERDESE2 #( .DATA_RATE_OQ (DDR), .DATA_WIDTH (4), .TRISTATE_WIDTH (1) ) lane_oserdes ( .O (hs_tx_out), // 单端高速输出示意 .D1 (byte_data[3]), .D2 (byte_data[2]), .D3 (byte_data[1]), .D4 (byte_data[0]), .T (hs_tx_en), // 1 表示进入 HS0 表示高阻/ LP .CLK (bit_clock), .CLKDIV (byte_clock), .OCE (1b1), .RST (rst_n) );需要特别说明上面的代码只是串行化这一环。真实 MIPI HS TX 还需要差分输出结构、LP 电平控制和端接网络。很多开发板采用“FPGA 出 LVDS 外部电阻网络”来近似 MIPI HS能点亮屏幕但眼图不一定达标。如果你只是做原型可以接受如果进量产还是建议按 3.1 的路线用专用 PHY。3.4 ST7701S初始化HS TX的命令如何发出去很多新人以为初始化屏幕必须要 HS其实不是。以常见的 ST7701S 驱动 IC 为例上电后它先处于低速率待命状态FPGA 通过 LP 模式发送一串初始化命令把屏幕的工作模式、分辨率、lane 数、时钟极性配好配好后才让 DSI 进入高速模式开始刷图。LP 模式下发送命令本质上是把字节按 MIPI DSI 包格式封装然后在 LP 状态下一位一位“低速”拨动两根信号线。速率很低所以不需要高速驱动。这解释了一个现象如果屏幕能亮但花屏初始化命令往往是对的如果屏幕完全不亮问题很可能出在 LP 或复位时序而不是 HS TX。ST7701S 这类 IC 的初始化序列通常包括关闭显示、进入扩展命令模式写入厂商特定寄存器设置电源、VCOM、gamma、分辨率配置 DSI 工作模式lane 数、连续时钟、EOTPSleep Out、Display On。这些命令的详细参数驱动 IC 的 datasheet 或屏厂提供的初始化代码里都有。移植到 FPGA 时我的习惯是把初始化命令做成一张 ROM 表用一个小状态机逐包发送并预留一个 GPIO 控制复位/背光。这样调试花屏时可以直接对比屏厂参考代码而不是在逻辑里翻寄存器。3.5 国产FPGA实现MIPI TX的注意事项用紫光同创这类国产 FPGA 做 MIPI TX 的朋友代码思路和 Xilinx 差不多但有三个地方容易被坑原语名不同DDR 输出原语不是 OSERDES具体要看器件手册里的 HSIO 或 DDR 模组时序约束也要换成对应 SDC 命令高速 IO 能力差异普通 IO 的最高频率上限比专用 PHY 低必须查手册确认 lane rate 是否在芯片支持范围内建立/保持时间国产 FPGA 的高低温 corner 变化可能比国际大厂激烈建议在 HS TX 链路上加 ILA 抓数据并通过时序报告确认串行器时钟余量足够。从“能出图”到“量产稳定”差的往往就是这些工程细节。4. RK3588 Linux下MIPI屏幕适配HS TX到面板的最后一公里4.1 设备树DSI控制器和Panel节点的绑定RK3588 的 MIPI DSI 链路从系统架构看是这样的内部显示控制器VOP输出视频流给 DSI 控制器DSI 控制器负责把视频数据打包成 DSI 包再通过 MIPI D-PHY 的 HS TX 发往屏幕。Linux 驱动里链路关系由设备树描述。一个简化的设备树结构大致如下dsi0 { status okay; panel0 { compatible st7701s; reg 0; reset-gpios gpio4 14 GPIO_ACTIVE_LOW; port { panel_in_dsi: endpoint { remote-endpoint dsi0_out; }; }; }; ports { #address-cells 1; #size-cells 0; port1 { reg 1; dsi0_out: endpoint { remote-endpoint panel_in_dsi; }; }; }; };Device Tree 的作用是把“DSI 控制器”和“panel 驱动”两边对接起来。如果面板驱动没找到或者 endpoint 没接对HS TX 根本不会送出像素数据。我实测遇到最多的问题是 endpoint 编号和 remote-endpoint 配错驱动加载时直接报 DSI device not found。4.2 时序参数和驱动IC初始化一对夫妻RK3588 适配 MIPI 屏幕时最容易被忽略的是display-timings里面的前后肩HFP/HBP和 panel 驱动里初始化序列的匹配。HS TX 发送的是“带 blanking 的像素流”屏幕 IC 靠这些 blanking 时间完成行场同步。如果设备树里的 HFP/HBP 设得太小HS TX 就会连续追着发送像素数据导致 IC 内部复位行同步表现就是横向错位甚至滚动花屏。正确做法是先看屏厂规格书或参考驱动里给定的时序参数再对应修改设备树。不要凭经验随便填。下面是一个示例级配置数值只是占位不要直接抄display-timings { timing0 { clock-frequency 74250; // pixel clock hactive 720; vactive 1280; hfront-porch 40; hback-porch 60; hsync-len 20; vfront-porch 12; vback-porch 20; vsync-len 4; }; };如果屏参明明是对的却还是花屏那就要回到 HS TX 物理层测量波形、检查 lane 数、时钟极性。4.3 “横向花屏”的完整排查链路“横向花屏”是我在 RK3588 项目上被问得最多的问题。现象是画面能显示左/右两侧有雪花、错位或彩色条纹。它不像全黑一样能快速判断而是需要逐步锁定。排查链路我按下面这个顺序走确认初始化成功看串口日志DSI panel probe 是否成功、有没有报错。如果初始化都没成功不叫花屏是无显示数 lane 对不对DSI 控制器的 lane 数和屏幕 IC 实际用到的 lane 数必须一致。屏驱动里通常会写lane-count 4如果面板明明是 4 lane但设备树只配了 2 lane就会花屏确认像素格式RGB888 和 RGB666 的 padding 方式不同发错格式会导致每个像素“多出”或“少掉”几个 bit画面上出现规律性色块对时钟极性lane-polarities或>