4、eDP 时序参数总览:水平、垂直、时钟、极性
做 eDP 面板驱动,绕不开的就是那几组时序参数。说白了一共就四类:水平、垂直、时钟、极性。把这四类吃透了,大部分面板的初始化问题都能搞定。
我在项目中遇到过好几次,明明寄存器配得都对,显示就是偏的。最后查出来,不是 HBP 少算了两个像素,就是极性反了。这东西纸上谈兵容易,上手才会发现到处是坑。
4.1 水平时序参数(Horizontal Timing)
水平方向,说白了就是一行像素怎么排布。这是最基本的时序概念。我习惯管它叫“行时序”。
| 参数 | 全称 | 单位 | 说明 |
|---|---|---|---|
| Hactive | Horizontal Active | 像素 | 有效显示区的像素数,即分辨率宽度 |
| HBP | Horizontal Back Porch | 像素 | 行同步信号结束到有效数据开始之间的空白 |
| HFP | Horizontal Front Porch | 像素 | 有效数据结束到下一行同步信号开始之间的空白 |
| Hsync | Horizontal Sync Width | 像素 | 行同步脉冲的宽度 |
| Htotal | Horizontal Total | 像素 | Hactive + HBP + HFP + Hsync |
为什么要有 HBP 和 HFP?你想想看,电子枪从右边扫回左边需要时间,面板内部也需要一点点缓冲时间来稳定数据。HBP 和 HFP 就是给这些“喘口气”的时间。我刚开始设计时,为了省带宽把 HBP 削到只剩 2 个像素,结果画面右边出现了一条若隐若现的竖线。后来老老实实加到了 10 个像素,问题就消失了。
实战建议: 大多数 eDP 面板的 HBP 推荐值在 20~80 像素之间,HFP 在 10~40 之间。具体看面板 datasheet,不要自己凭空设。
4.2 垂直时序参数(Vertical Timing)
垂直方向跟水平方向结构一样,只是把“像素”换成了“行”。嗯,这里要格外注意:垂直方向的单位是“行数”,不是像素。
| 参数 | 全称 | 单位 | 说明 |
|---|---|---|---|
| Vactive | Vertical Active | 行 | 有效显示区的行数,即分辨率高度 |
| VBP | Vertical Back Porch | 行 | 场同步信号结束到有效数据开始之间的空白行 |
| VFP | Vertical Front Porch | 行 | 有效数据结束到下场同步信号开始之间的空白行 |
| Vsync | Vertical Sync Width | 行 | 场同步脉冲的宽度 |
| Vtotal | Vertical Total | 行 | Vactive + VBP + VFP + Vsync |
垂直时序常常被忽视,但它直接影响刷新率。我算一笔账:帧率 = 像素时钟 / (Htotal × Vtotal)。Htotal 和 Vtotal 大了,像素时钟不变,帧率就往下掉。面板 datasheet 给的 Vtotal 一般是一个范围,取中间值比较保险。
避坑: 我曾经把 VBP 设成了 0,结果场消隐期不够,面板内部的帧缓冲没来得及写完,显示出现了撕裂(tearing)。VBP 至少留 10 行以上才安全。
4.3 时钟参数(Clock Timing)
时钟是 eDP 时序的血脉。三个关键值你必须搞清楚:
- 像素时钟(Pixel Clock) – 单位 MHz。等于 Htotal × Vtotal × 帧率。这是最基础的参考时钟。
- 链路时钟(Link Clock) – 单位 MHz。eDP 主链路使用差分信号,每 lane 的数据率 = 像素时钟 × 每像素位数 / 通道数。通常链路时钟频率是像素时钟的整数倍。
- 数据速率(Data Rate) – 单位 Gbps。每个通道的数据率 = 链路时钟 × 2(因为双沿采样)。常见值有 2.16 Gbps、2.7 Gbps、5.4 Gbps 等。
举个例子:1920×1080@60Hz,像素时钟大概 148.5 MHz。如果使用 4 lane、每像素 24bit,每 lane 数据率 = 148.5 × 24 / 4 = 891 Mbps。嗯,这个值加一点 8b/10b 编码开销,实际链路时钟约 445.5 MHz。
关键公式: 链路时钟(MHz)= 像素时钟 × 每像素位数 / 通道数 / 2(因双沿采样)。再记住:实际链路上会加 20% 的编码冗余(8b/10b),所以有效数据率要比物理速率低一些。
4.4 极性参数(Polarity)
极性这个东西,很多新手会栽跟头。eDP 里主要有三种极性:
- HSYNC 极性 – 高电平有效还是低电平有效?有些面板用正极性(高有效),有些用负极性(低有效)。配反了画面会整体偏移几个像素。
- VSYNC 极性 – 跟 HSYNC 类似,配反了画面会上下窜动。
- DE 极性 – Data Enable 信号,高电平表示有效数据。这个一般固定为高有效,但也有少数面板用低有效,看 datasheet 为准。
我检查极性时有个习惯:先把 HSYNC 和 VSYNC 的极性寄存器配成 datasheet 推荐的默认值,然后调节 HBP/HFP 看画面是否对齐。如果画面左右颠倒或者上下颠倒,那肯定是极性反了,不是时序值的问题。
你想想看,如果 HSYNC 极性配置反了,面板内部的行计数器会跟实际数据错位,结果就是左边的像素跑到了右边。同样道理,VSYNC 极性反了,上下的数据会互换。
小技巧: 很多 eDP 面板支持自动检测极性(Auto Polarity Detection),但我不建议依赖它。我遇到过一次自动检测在某些温度下失效,画面直接花了。手动配置更可靠。
4.5 整体时序框架图
下面这张图把水平和垂直方向的关系画在一起,方便你有个整体概念。可以看到 HBP、HFP、VBP、VFP 如何包裹有效显示区。记住:水平方向的 Htotal 决定了行的总长度,垂直方向的 Vtotal 决定了帧的总行数。这两者加上像素时钟,就决定了最终的帧率。
4.6 实战:如何从 datasheet 找到这些参数
拿到一块新面板,我第一步就是翻到 TIMING 章节。典型的面板 datasheet 会给出类似下面的表格:
| 参数 | 符号 | 最小值 | 典型值 | 最大值 | 单位 |
|---|---|---|---|---|---|
| 像素时钟 | f_dclk | 130 | 148.5 | 165 | MHz |
| Hactive | H_act | — | 1920 | — | 像素 |
| HBP | H_bp | 28 | 32 | 80 | 像素 |
| HFP | H_fp | 4 | 12 | 30 | 像素 |
| HSync | H_sync | 4 | 8 | 32 | 像素 |
| Vactive | V_act | — | 1080 | — | 行 |
| VBP | V_bp | 6 | 12 | 34 | 行 |
| VFP | V_fp | 2 | 4 | 10 | 行 |
| VSync | V_sync | 2 | 4 | 8 | 行 |
| HSync 极性 | H_pol | Low | Low | High | — |
| VSync 极性 | V_pol | Low | Low | High | — |
拿到这个表格后,我一般先算 Htotal 和 Vtotal:Htotal = 1920 + 32 + 12 + 8 = 1972;Vtotal = 1080 + 12 + 4 + 4 = 1100。再用典型像素时钟计算实际帧率:148.5×10⁶ / (1972 × 1100) ≈ 68.5 Hz。咦,比 60Hz 多不少?注意,很多面板允许超频,但必须保证最小 VBP/VFP 不超下限。
有次我收到一块面板,datasheet 上极性写的是“HSYNC = negative, VSYNC = negative”。我按默认设成了 positive,结果画面上下方向整个反了。排查了半小时才发现是极性配置的问题。
经验法则: 极性、Htotal、Vtotal 这三个值是 FPGA 约束中最容易出错的三个点。建议先从典型值开始,逐帧刷新看画面是否完整,再微调空白区。
4.7 总结
eDP 时序参数说到底就是横平竖直两条坐标轴,加上一个时间轴。水平参数控制行内布局,垂直参数控制帧内布局,时钟参数决定速度,极性参数决定对齐方向。把这四个维度搞明白了,任何面板的时序配置都只是一个数值替换的问题。