MIPI DSI驱动LCD屏幕刷新的关键步骤解析

发布时间:2026/5/31 14:53:27

MIPI DSI驱动LCD屏幕刷新的关键步骤解析 MTK Command Mode 下LCM 驱动通过 MIPI DSI 向 LCD IC 发送图像更新前置命令的实现。它虽不直接搬运像素数据却是触发屏幕刷新的关键一步。下面从代码细节到协议层逐步解释数据是如何“写入”LCD IC 的。1. 函数意图设置更新窗口并打开 GRAM 写通道在 MIPI DCSDisplay Command Set标准中IC 内部的 GRAM 写入通常分三步2Ah设置列地址Column Address即 X 方向范围。2Bh设置页/行地址Page/Row Address即 Y 方向范围。2Ch写内存开始Write Memory Start。发完这个命令后IC 内部状态机进入“等待像素数据”模式后续 DSI 主机送来的任何长包数据都会被自动写入已设定的矩形区域。lcm_update 的参数 x, y, width, height 就决定了这个矩形区域。函数里先算出结束坐标 x1, y1然后分别拆成 8 位量通过命令 2Ah/2Bh 发给 IC最后补一个 2Ch 命令。注意这段代码里没有看到像素数据本身这是因为像素数据是通过 CMDQ 引擎在 2Ch 之后自动从 framebuffer 搬运的这个函数只负责“预备动作”。2. 数据打包data_array的结构与含义每个 data_array 元素是一个 32 位字它们共同描述一个DSI 协议命令包交由 dsi_set_cmdq 投递给硬件。2.1 设置列地址2Ah的包data_array[0] 0x00093902; data_array[1] (0x00 24) | (x0_MSB 16) | (0x00 8) | 0x2a; data_array[2] (0x00 24) | (x1_MSB 16) | (0x00 8) | x0_LSB; data_array[3] (x1_LSB); dsi_set_cmdq(data_array, 4, 1);第 [0] 个字0x00093902是 MTK DSI 驱动的“长包描述符头”将它按小端字节序拆开字节00x02 → 标志位通常表示虚拟通道 VC0、使用 HS 模式等字节10x39 →Data ID 0x39即 MIPI DCS Long Write长写字节20x09 → 有效负载长度低字节字节30x00 → 有效负载长度高字节 → 负载总长度 0x0009 9 字节。后续 data_array[1] ~ [3] 共 3 个 32 位字只取其低 8 位拼凑出 9 字节 payload最后 x1_LSB 单独占一个字节其余高 24 位为 0硬件会忽略。这 9 字节正是0x2A, 0x00, x0_MSB, 0x00, x0_LSB, 0x00, x1_MSB, 0x00, x1_LSB为什么这么多 0x00MIPI DCS 要求 16 位坐标参数以大端序传输所以每个参数后跟 0x00 高字节本质上就是 4 个参数Xstart_Hi0, Xstart_Lox0, Xend_Hi0, Xend_Lox1共 8 字节外加命令码本身 1 字节总共 9 字节。2.2 设置页地址2Bh的包构造方式与 2Ah 完全一样只是命令码换成 0x2B参数换为 Y 方向坐标。dsi_set_cmdq(data_array, 4, 1) 再次将 Y 范围发送出去。2.3 写内存启动2Ch的包data_array[0] 0x002c3909; dsi_set_cmdq(data_array, 1, 0);这一次只传递一个 32 位字。0x002c3909 按小端解读字节00x09 → 标志同上字节10x39 → Data ID 仍为 Long Write字节20x2C → 负载长度低位 0x2C这明显不符逻辑不可能长度 44 字节。实际上这里 MTK 驱动进行了特殊编码当负载长度为 0 时这个 32 位字直接内嵌了短命令。 更合理的解释是这个字构成了一个DCS Short Write 包——命令 0x2C 不带参数。对应的 MIPI Data ID 应为 0x05Short Write 1 byte而 0x09 可能指代带参数的短写但无论如何硬件通过这个描述符就能发送一个仅包含 0x2C 的命令不用附加数据。参数 1 和 0 分别表示一次发送的字数和模式HS/LP这里 0 常代表 High Speed。3.dsi_set_cmdq与底层硬件工作流程dsi_set_cmdq 是 MTK 平台提供的 DSI 命令传输接口。它做的事情将 data_array 中的描述符直接写入DSI 控制器的 Command QueueCMDQ或Config Register。DSI 控制器硬件解析描述符生成符合 MIPI 协议的Serial Packet对于前两个包2Ah/2Bh构造一个Long PacketSoTStart of Transmission→Packet HeaderData ID0x39, Word Count9, ECC→Payload9 字节→EoT。对于最后一个包2Ch构造一个Short PacketData ID 0x05 或 0x15SoT → Packet HeaderData ID 短写类型, 命令码 0x2C, ECC→ EoT。物理层MIPI D-PHY将并行的 Packet 串行化通过数据 Lane 的差分线发送到 LCM。关键点当 IC 收到 2Ch 命令后内部状态机已准备接收像素数据。此时与 CMDQ 联动的DMA直接接在 framebuffer 的物理地址上会自动启动下一段传输——将一整帧像素数据以DSI Long PacketData ID 0x39的形式紧跟着 2Ch 命令送出。这个 DMA 传输并非在 lcm_update 函数内直接触发而是由 CMDQ 调度引擎在命令序列完成后自动衔接的。因此lcm_update 只是将“触发命令”推入队列实际的数据海量传输全部由硬件自动完成CPU 完全不参与搬运。

相关新闻