3. DSI Host Controller 硬件架构

DSI Host Controller 是 SoC 内部负责将并行的像素/命令数据打包为 MIPI DSI 串行协议的核心硬件模块。理解其功能模块划分、时钟域关系以及数据通道映射,是正确初始化 DSI 接口和编写 DRM Connector 驱动的基础。

3.1 功能模块划分

一个典型的 DSI Host Controller 内部包含以下主要功能模块:

模块名称 功能描述 与驱动交互接口
APB/AXI 总线接口 负责 CPU 对控制器寄存器的读写访问,以及 DMA 传输控制。 寄存器基地址、中断号
命令模式引擎 解析并打包 DCS 短包/长包命令,支持 Generic/Long Write 和 Read。 命令 FIFO、状态寄存器
视频模式引擎 从帧缓冲区读取像素数据,按 Video Mode 时序打包为像素流。 帧基地址、行/帧参数
像素处理单元 完成 RGB/YUV 格式转换、数据位宽调整、DPI 接口时序生成。 像素时钟、同步信号
协议打包器 将数据封装为 DSI 包(包头 + 数据 + ECC/CRC)。 包类型、虚拟通道 ID
Lane 管理层 管理数据通道的使能、转向(Bidirectional)、均衡(Skew Calibration)。 Lane 映射寄存器
PHY 接口层 与 D-PHY 的 PPI(PHY Protocol Interface)对接,处理高速/低功耗状态切换。 PHY 状态机、时钟请求
驱动关注点: 在初始化阶段,驱动需要依次使能 PHY 接口层、配置 Lane 管理层、设置视频/命令模式引擎,最后通过总线接口下发初始化序列。任何模块的时钟或复位缺失都会导致 DSI 链路无法建立。

3.2 时钟域划分

DSI Host Controller 内部存在多个异步时钟域,时钟域之间的同步处理是硬件设计的难点,也是驱动配置的关键。

DSI Host Controller 时钟域划分 APB 总线时钟域 pclk / hclk 寄存器访问 中断处理 像素时钟域 pixel_clk 视频模式引擎 像素处理单元 DSI 字节时钟域 byte_clk 协议打包器 Lane 管理层 FIFO FIFO 外部时钟源 (PLL/XTAL) 时钟域同步要点: 1. APB 时钟域与像素时钟域之间通过异步 FIFO 隔离,避免跨时钟域亚稳态。 2. 像素时钟域与 DSI 字节时钟域之间通过深度 FIFO 进行速率匹配。
时钟配置提示: 在驱动初始化时,必须按以下顺序配置时钟:
1. 使能 APB 总线时钟(pclk),完成寄存器访问。
2. 配置 PLL 生成 pixel_clk 和 byte_clk,确保两者满足 DSI 数据速率要求。
3. 等待各时钟域 PLL 锁定后,再释放对应模块的复位信号。

3.3 数据通道映射

DSI 标准支持 1/2/3/4 条数据通道(Data Lane),每条通道由一对差分信号(Dp/Dn)组成。Host Controller 内部的 Lane 管理层负责将逻辑数据流映射到物理通道上。

3.3.1 通道映射寄存器配置

大多数 DSI Host Controller 提供可编程的通道映射寄存器,允许驱动将逻辑通道号(Lane ID)映射到物理 PHY 通道上。典型的映射寄存器结构如下:

/* 以 Synopsys DW-MIPI-DSI 为例的 Lane 映射寄存器 */
#define DSI_LANE_MAP         0x0134

/* Lane 映射字段定义 */
#define LANE_MAP_DATA0_SHIFT  0   /* 逻辑 Lane 0 映射到物理 Lane X */
#define LANE_MAP_DATA1_SHIFT  4   /* 逻辑 Lane 1 映射到物理 Lane X */
#define LANE_MAP_DATA2_SHIFT  8   /* 逻辑 Lane 2 映射到物理 Lane X */
#define LANE_MAP_DATA3_SHIFT  12  /* 逻辑 Lane 3 映射到物理 Lane X */
#define LANE_MAP_CLOCK_SHIFT  16  /* 时钟 Lane 映射到物理 Lane X */

/* 示例:4 Lane 配置,逻辑 Lane 0-3 映射到物理 Lane 0-3 */
#define LANE_MAP_4LANE  (0x3210)
/* 示例:2 Lane 配置,逻辑 Lane 0-1 映射到物理 Lane 1-2 */
#define LANE_MAP_2LANE  (0x0201)

3.3.2 通道映射策略对比

映射策略 适用场景 优点 缺点
直连映射 PCB 走线无交叉 配置简单,延迟最小 缺乏灵活性
交叉映射 PCB 走线需要绕线 方便 PCB 布局 增加驱动配置复杂度
动态重映射 多设备共用 DSI 总线 支持热插拔和通道切换 需要硬件额外支持

3.3.3 通道使能与状态机

每条数据通道在初始化时需要经历以下状态序列:

  1. ULPS(Ultra-Low Power State)退出:发送 Mark-1 序列唤醒 PHY。
  2. HS 时钟建立:等待时钟 Lane 进入高速模式并稳定。
  3. HS 数据训练:发送同步序列(SoT)进行 Bit 对齐。
  4. 均衡校准:调整各通道的 Skew,确保数据同时到达。
  5. 正常操作:进入高速数据传输模式。
数据通道初始化状态机 ULPS 退出 HS 时钟建立 HS 数据训练 均衡校准 正常操作 失败重试 驱动实现:每个状态转换都需要轮询 PHY 状态寄存器,超时未完成则触发错误处理。

3.4 硬件架构对驱动设计的影响

常见初始化陷阱:
  • 时钟顺序错误:先使能 byte_clk 再使能 pixel_clk 可能导致像素处理单元状态机异常。
  • Lane 映射不匹配:驱动配置的逻辑 Lane 映射与 PCB 实际走线不一致,导致数据错位。
  • 均衡校准超时:PCB 走线长度差异过大时,需要增加均衡校准的等待时间。
  • ULPS 退出失败:某些 PHY 在退出 ULPS 后需要额外的稳定时间,驱动需插入延迟。