4、eDP 时序参数总览:水平、垂直、时钟、极性

做 eDP 面板驱动,绕不开的就是那几组时序参数。说白了一共就四类:水平、垂直、时钟、极性。把这四类吃透了,大部分面板的初始化问题都能搞定。

我在项目中遇到过好几次,明明寄存器配得都对,显示就是偏的。最后查出来,不是 HBP 少算了两个像素,就是极性反了。这东西纸上谈兵容易,上手才会发现到处是坑。

4.1 水平时序参数(Horizontal Timing)

水平方向,说白了就是一行像素怎么排布。这是最基本的时序概念。我习惯管它叫“行时序”。

参数全称单位说明
HactiveHorizontal Active像素有效显示区的像素数,即分辨率宽度
HBPHorizontal Back Porch像素行同步信号结束到有效数据开始之间的空白
HFPHorizontal Front Porch像素有效数据结束到下一行同步信号开始之间的空白
HsyncHorizontal Sync Width像素行同步脉冲的宽度
HtotalHorizontal Total像素Hactive + HBP + HFP + Hsync

为什么要有 HBP 和 HFP?你想想看,电子枪从右边扫回左边需要时间,面板内部也需要一点点缓冲时间来稳定数据。HBP 和 HFP 就是给这些“喘口气”的时间。我刚开始设计时,为了省带宽把 HBP 削到只剩 2 个像素,结果画面右边出现了一条若隐若现的竖线。后来老老实实加到了 10 个像素,问题就消失了。

实战建议: 大多数 eDP 面板的 HBP 推荐值在 20~80 像素之间,HFP 在 10~40 之间。具体看面板 datasheet,不要自己凭空设。

4.2 垂直时序参数(Vertical Timing)

垂直方向跟水平方向结构一样,只是把“像素”换成了“行”。嗯,这里要格外注意:垂直方向的单位是“行数”,不是像素。

参数全称单位说明
VactiveVertical Active行有效显示区的行数,即分辨率高度
VBPVertical Back Porch行场同步信号结束到有效数据开始之间的空白行
VFPVertical Front Porch行有效数据结束到下场同步信号开始之间的空白行
VsyncVertical Sync Width行场同步脉冲的宽度
VtotalVertical Total行Vactive + VBP + VFP + Vsync

垂直时序常常被忽视,但它直接影响刷新率。我算一笔账:帧率 = 像素时钟 / (Htotal × Vtotal)。Htotal 和 Vtotal 大了,像素时钟不变,帧率就往下掉。面板 datasheet 给的 Vtotal 一般是一个范围,取中间值比较保险。

避坑: 我曾经把 VBP 设成了 0,结果场消隐期不够,面板内部的帧缓冲没来得及写完,显示出现了撕裂(tearing)。VBP 至少留 10 行以上才安全。

4.3 时钟参数(Clock Timing)

时钟是 eDP 时序的血脉。三个关键值你必须搞清楚:

  1. 像素时钟(Pixel Clock) – 单位 MHz。等于 Htotal × Vtotal × 帧率。这是最基础的参考时钟。
  2. 链路时钟(Link Clock) – 单位 MHz。eDP 主链路使用差分信号,每 lane 的数据率 = 像素时钟 × 每像素位数 / 通道数。通常链路时钟频率是像素时钟的整数倍。
  3. 数据速率(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 决定了帧的总行数。这两者加上像素时钟,就决定了最终的帧率。

eDP 时序参数结构总览 水平方向(一行) HBP Hactive(有效像素) HFP HSync ← 前一行的末尾 → ← 下一行的开始 → 垂直方向(一帧) VBP Vactive(有效行) VFP VSync ← 前一帧的末尾 → ← 下一帧的开始 → 帧率 = 像素时钟 / ( Htotal × Vtotal ) Htotal = Hactive + HBP + HFP + HSync 重要说明 1. 水平空白(HBP+HFP)和垂直空白(VBP+VFP)都用于 同步信号的恢复以及面板内部数据的稳定。 2. 极性参数(HSync/VSync/DE极性)影响数据对齐, 配置错误会导致画面偏移或撕裂。 3. 时钟参数决定了物理链路的带宽需求,必须依据 eDP 标准选择对接速率(RBR/HBR/HBR2/HBR3)。

4.6 实战:如何从 datasheet 找到这些参数

拿到一块新面板,我第一步就是翻到 TIMING 章节。典型的面板 datasheet 会给出类似下面的表格:

参数符号最小值典型值最大值单位
像素时钟f_dclk130148.5165MHz
HactiveH_act—1920—像素
HBPH_bp283280像素
HFPH_fp41230像素
HSyncH_sync4832像素
VactiveV_act—1080—行
VBPV_bp61234行
VFPV_fp2410行
VSyncV_sync248行
HSync 极性H_polLowLowHigh—
VSync 极性V_polLowLowHigh—

拿到这个表格后,我一般先算 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 时序参数说到底就是横平竖直两条坐标轴,加上一个时间轴。水平参数控制行内布局,垂直参数控制帧内布局,时钟参数决定速度,极性参数决定对齐方向。把这四个维度搞明白了,任何面板的时序配置都只是一个数值替换的问题。