第4章:eDP 链路层协议基础
好,咱们开始聊链路层。这在 eDP 里算是个承上启下的角色。上面接的是显卡输出的视频流,下面要驱动物理层的高速差分线。链路层到底干了什么呢?说白了,就是把你要传的像素数据,打包、编码、加扰,然后塞进主链路送出去。
很多人觉得这步就是个“格式转换”,没什么技术含量。但我告诉你,链路层协议要是没吃透,你后面做时序约束、做信号完整性分析,经常会被一些莫名其妙的现象卡住。我今天就把这里面的几个关键点掰开揉碎讲清楚。
4.1 主链路数据封装格式
先看数据怎么装的。eDP 的主链路不直接传原始的 RGB 值,它有一层自己的“数据包”封装。这个设计思路其实借鉴了 DisplayPort 的标准,但 eDP 做了一些简化。
一个完整的数据包,大致长这样:
| 字段 | 位宽 | 说明 |
|---|---|---|
| BE(数据使能边界) | 2 bit | 标识当前行的起始/结束位置 |
| BS(数据使能起始) | 2 bit | 辅助标识行的起始列 |
| DE(数据使能) | 1 bit | 高电平表示有效像素数据 |
| RGB / 像素数据 | 24/30/36 bit | 实际的像素色彩信息 |
包与包之间,还会插入一些“填充符号”来维持链路时钟的稳定。我刚开始做这个的时候,就犯过一个错:以为只要把 RGB 数据按时发出去就行。结果发现,如果你不插入正确的 BE/BS 信号,接收端(也就是显示器的 TCON)根本没法对齐行数据。画面就会一片混乱。
4.2 符号映射:8b/10b 编码
封装好的数据包还不算完。接下来要干的事,叫“符号映射”。传统的 LVDS 接口用的是 7:1 串化,但 eDP 不一样,它用了 8b/10b 编码。
为什么会这样?因为 8b/10b 编码有一个巨大的好处:保证传输的 DC 平衡。你想想看,如果连续发一串 0,电平一直拉低,接收端的交流耦合电容就会充电,导致后面的数据判决出错。8b/10b 编码通过增加 2 个冗余位,确保“0”和“1”的数量基本相等。
映射表我就不全列了,书上都有。但你要记住一个关键点:编码后的码流里,连续相同符号的数量被严格限制在 5 个以内。这就是所谓的“游程长度”控制。
// 伪代码示例:8b/10b 编码的一小段逻辑
// 注意这里只是示意,实际编码表要查表实现
uint16_t encode_8b_to_10b(uint8_t data_in, int *disparity) {
uint16_t code;
// 根据 data_in 查表得到 code
// 根据当前 disparity 翻转 10b 码
if (*disparity > 0) {
code = ~code & 0x3FF;
}
// 更新新的 disparity
*disparity = calc_new_disparity(code);
return code;
}
4.3 扰码与去扰码机制
8b/10b 编码虽然解决了 DC 平衡,但 EMI(电磁干扰)问题还在。如果连续发送的图形像素值都一样(比如全白画面),那么主链路上的频谱能量会集中在几个点上,辐射很强,容易超标。
扰码,就是对编码后的数据进行一次“加扰”,让数据看起来随机化。我遇到过一款产品,EMI 测试总是差 2 个 dB,调了屏蔽和滤波都没用。后来发现是扰码没开,数据流太规律了。
eDP 用的扰码多项式是:
G(x) = x¹⁶ + x⁵ + x⁴ + x³ + 1
这是一个标准的 PRBS(伪随机二进制序列)生成器。发送端用这个多项式生成一个随机序列,跟你的 10b 码流做 XOR。接收端用同样的多项式、同样的初始种子,再做一次 XOR,数据就恢复了。
4.4 训练序列结构
最后说说训练序列。这是一个“握手”阶段,发生在 eDP 链路初始化或者链路重新配置的时候。
训练序列的目的很简单:让发送端和接收端在比特率、时钟相位、通道对齐上保持一致。既然叫“训练”,那必然有一套固定的序列。
整个训练流程大致分几步:
- LT (Link Training) 开始:主机发送特定的训练序列符号。
- 通道对齐:发送端发送 PAT1、PAT2 等预定义模式,接收端据此调整接收电路的时钟和数据采样位置。
- 均衡配置:根据链路质量,发送端调整自身的预加重和摆幅,接收端返回状态信息。
- 训练锁止:双方确认无误,主链路正式进入数据传输模式。
训练序列的符号是固定且特殊的,它们不经过扰码。具体符号包括:
- D0.0 ~ D3.6:用于时钟恢复的跳变模式
- K28.1/ K28.5/ K28.7:用于符号边界对齐的逗号字符
- K28.2/ K29.1:用于握手和状态交换
我刚开始调试 eDP 接口时,遇到过链路始终无法建立的情况。用示波器看主链路,发现训练序列一直在循环发送,接收端就是不回复 OK。最后排查出来是 K28.5 逗号字符的极性反了。这类问题用眼图不一定能直接看出来,但用协议分析仪抓一下符号序列,马上就能定位。
下面是本章核心知识体系的结构图。你可以把它当成一张导航图,用来理解链路层协议各模块之间的协作关系:
看到这张图,你应该能理解链路层的设计逻辑:先把数据包打好,然后用 8b/10b 编码保证信号质量,再通过扰码降低 EMI。训练序列在初始化和链路异常时介入,确保发送和接收两边步调一致。每个环节都有自己的使命,缺一个都跑不稳。