4. 数据 Lane 的同步与对齐:Byte 对齐、Word 对齐、Lane 分布与去偏斜、训练序列与同步码
在 MIPI CSI-2/DSI 链路中,数据 Lane 的同步与对齐是确保接收端(Host)能够正确解析来自发送端(Sensor/AP)有效载荷的前提。由于高速时钟 Lane 提供的是位时钟参考,而数据 Lane 在传输过程中会引入 Lane-to-Lane Skew(通道间偏斜)和 Bit-level Skew(位级偏斜),接收端必须通过一系列对齐机制将数据恢复为正确的字节/字边界。
4.1 Byte 对齐:从串行位流到字节边界
MIPI D-PHY 在高速模式下,每个 Lane 传输的是 8 位(1 Byte)数据。然而,接收端在初始上电或退出 LP(低功耗)模式后,并不知道串行位流中哪一位是字节的起始位。因此,必须通过 Byte Alignment(字节对齐)过程来锁定字节边界。
实现机制: 发送端在每次高速传输开始时,会发送一个特定的 同步序列(Sync Sequence),通常为 0xB8(二进制 10111000)。接收端通过滑动窗口检测该模式,一旦匹配,即完成字节对齐。
4.2 Word 对齐:将字节组合成像素字
完成 Byte 对齐后,接收端获得了连续的字节流。但摄像头数据通常以 Word(字)为单位,例如 RAW10 格式每个像素占用 10 位,RAW12 占用 12 位,YUV422 每个像素占用 16 位(2 字节)。Word 对齐的目的是将字节流正确地映射到像素字边界。
对齐策略:
- 固定字长对齐: 对于 RAW8/YUV422 等字长为整数倍字节的格式,Word 对齐与 Byte 对齐自然一致。
- 非整数倍字节对齐: 对于 RAW10/RAW12 等格式,多个像素打包在一个字中(如 4 个 RAW10 像素打包为 5 字节),接收端需要根据协议规定的打包规则重新组合。
| 数据格式 | 像素位宽 | 字长(字节) | 对齐方式 |
|---|---|---|---|
| RAW8 | 8-bit | 1 | Byte 对齐即 Word 对齐 |
| RAW10 | 10-bit | 5(4 像素) | 需按 5 字节边界对齐 |
| RAW12 | 12-bit | 3(2 像素) | 需按 3 字节边界对齐 |
| YUV422 8-bit | 16-bit | 2 | Byte 对齐即 Word 对齐 |
4.3 Lane 分布与去偏斜(Deskew)
在多 Lane 传输中(如 2-Lane 或 4-Lane),数据被分发到多个物理 Lane 上。由于 PCB 走线长度差异、驱动器/接收器延迟差异,不同 Lane 之间的数据到达时间会存在偏差,称为 Lane-to-Lane Skew。MIPI 规范要求接收端能够容忍并校正最大 ±2 UI(Unit Interval,单位间隔)的 Lane 间偏斜。
去偏斜过程:
- 训练序列发送: 发送端在高速传输开始前,在所有数据 Lane 上同时发送相同的训练模式(如
0xB8重复序列)。 - 偏斜测量: 接收端测量每个 Lane 上训练序列的到达时间差。
- 延迟补偿: 接收端通过可编程延迟线(Delay Line)或 FIFO 缓冲,将较早到达的 Lane 延迟,使所有 Lane 对齐到最晚到达的 Lane。
4.4 训练序列与同步码
MIPI D-PHY 定义了一套完整的 训练序列(Training Sequence) 和 同步码(Sync Code),用于链路建立、对齐和错误恢复。
主要序列类型:
| 序列名称 | 模式值 | 用途 | 发送时机 |
|---|---|---|---|
| Sync Sequence | 0xB8 |
Byte 对齐、Lane 同步 | 每次高速传输开始 |
| Escape Mode Entry | 0x1E |
进入低功耗控制模式 | LP 模式切换 |
| HS-IDLE | 0x00 |
高速传输结束标记 | 高速传输结束 |
| Frame Start Code (FS) | 0x00 0x00 0x00 0x01 |
帧起始标识(CSI-2 层) | 每帧开始 |
| Frame End Code (FE) | 0x00 0x00 0x00 0x02 |
帧结束标识(CSI-2 层) | 每帧结束 |
1. 配置 D-PHY 的 Deskew 使能位。
2. 等待 PHY 完成 Byte 对齐(通常通过状态寄存器轮询)。
3. 检查 Lane 同步状态(所有 Lane 的 Sync Sequence 已检测到)。
4. 开始接收 CSI-2 长包数据。
4.5 驱动配置示例:对齐与同步初始化
以下是一个典型的摄像头驱动中,MIPI 链路对齐与同步的初始化代码片段(基于 Linux V4L2 + D-PHY 驱动框架):
/* 摄像头驱动 - MIPI 链路对齐与同步初始化 */
static int sensor_mipi_link_init(struct sensor_device *sensor)
{
int ret;
u32 status;
/* 1. 配置 D-PHY 参数:Lane 数、速率、Deskew 使能 */
ret = dphy_set_lane_count(sensor->dphy, sensor->cfg.lane_count);
if (ret < 0)
return ret;
ret = dphy_set_hs_rate(sensor->dphy, sensor->cfg.hs_rate_mbps);
if (ret < 0)
return ret;
/* 2. 使能 Lane 去偏斜(Deskew)功能 */
ret = dphy_enable_deskew(sensor->dphy, true);
if (ret < 0) {
dev_err(sensor->dev, "Failed to enable deskew\n");
return ret;
}
/* 3. 启动高速传输,等待 Byte 对齐完成 */
ret = dphy_start_hs(sensor->dphy);
if (ret < 0)
return ret;
/* 4. 轮询 Byte 对齐状态(超时 100ms) */
ret = readl_poll_timeout(sensor->dphy->base + DPHY_STATUS,
status, status & DPHY_BYTE_ALIGN_DONE,
1000, 100000);
if (ret) {
dev_err(sensor->dev, "Byte alignment timeout\n");
return -ETIMEDOUT;
}
/* 5. 检查所有 Lane 的同步状态 */
for (int i = 0; i < sensor->cfg.lane_count; i++) {
ret = dphy_check_lane_sync(sensor->dphy, i);
if (ret < 0) {
dev_err(sensor->dev, "Lane %d sync failed\n", i);
return ret;
}
}
dev_info(sensor->dev, "MIPI link aligned: %d lanes, %d Mbps\n",
sensor->cfg.lane_count, sensor->cfg.hs_rate_mbps);
return 0;
}