DSI 全称 Display Serial Interface,是由 MIPI 联盟定义的处理器与外设之间的移动设备接口规范。该规范建立在现有标准的基础上,并采用了 MIPI 联盟 DBI、DPI 和 DCS 标准中定义的像素格式和命令集。DSI是主要用于显示传输的接口。
一般而言,完整的DSI传输结构如下图所示,从上到下依次为(本文主要关注第二层与第三层):
MIPI 的协议庞大且版本众多,本文主要基于如下Spec版本:
DSI定义了两种基本操作模式,Video模式与Command 模式。使用哪种模式取决于外设的架构、功能与应用的目标。
Video模式是指从主机处理器到外围设备的传输采用实时像素流形式的操作。一般而言,显示模块依靠主机处理器以足够的带宽提供图像数据,以避免显示图像中的闪烁或其他可见伪影。而一些视频模式架构可能包括一个简单的时序控制器和部分帧缓冲区,用于在待机或低功耗模式下保持部分屏幕或较低分辨率的图像。 这允许关闭接口以降低功耗。当然为了降低复杂性和成本,仅在Video模式下运行的系统可以使用单向Data Lane。
视频信息只能使用高速模式传输。
Command模式是指其中事务主要采取将命令和数据发送到外设(例如显示模块)的形式的操作。显示控制器需要有本地寄存器和帧缓冲器。处理器通过向显示控制器发送命令、参数和数据来间接控制其显示行为,同时还可以读取显示模块状态信息或帧存储器的内容。 故Command模式操作需要一个双向Data Lane。
某些显示器仅能在LP模式下初始化
本节简要概述 DSI 中使用的物理层。 有关详细信息可以参考之前的D-PHY篇——MIPI 打怪升级之D-PHY篇。
DSI使用一个或多个串行数据信号和一个串行时钟在主机处理器和外围设备之间传输信息。 **通过总线发送高速串行数据的动作称为 HS 传输或Burst。**在高速传输之间,差分数据信号或通道进入低功耗状态 (LPS),且接口在不主动发送或接收高速数据时也应处于低功耗状态 LPS。
下图为HS模式下的数据传输:
> 协议规定了一个字节即最小数据单元,一次传输包含整数个字节。
由前面的结构图可知,底层为协议层将数据发给PHY层,但是协议层和 PHY 层之间没有握手,一旦传输开始,协议层就可以限制进出 PHY 层的数据传输。而数据包应完整无间断地发送和接收, 则需要链路两端的协议层和数据缓冲应始终具有等于或大于 PHY 层电路的带宽。 一个实际的结果是系统实现者应该确保接收器的带宽能力等于或大于发射器的带宽能力。
DSI 实现的物理层由一到四个数据通道和一个时钟通道组成。其中:
Note:
Clock Lane应仅由Master驱动,而不能由外设驱动。
LP传输应仅使用Data Lane0。
PHY 和协议层之间的接口有几个控制总线方向的信号。当Master需要外设的响应使用。例如 返回 READ 数据或状态信息,它有如下流程:
BTA机制是需要在LP下实现的。
在 Video 模式下运行的 DSI TX 的最低 PHY 要求是:
在 Command 模式下运行的 DSI TX 的最低 PHY 要求是:
DSI 时钟是从Master 到 Slave的信号。 它可能具有多种功能:
所有 DSI TX/RX都应支持时钟通道上的连续时钟行为,并且可以选择支持非连续时钟行为(可降低功耗)。
Note: 在低功耗信号模式下,LP 时钟在功能上嵌入在数据信号中。当 LP 数据传输结束时,时钟有效停止,后续的 LP 时钟对外设不可用。如果外设需要额外的时钟来推进其逻辑状态,通过顺序缓冲区移动数据,或类似的,可能需要在 LP 传输中添加“虚拟”数据字节以实现状态机的前向进程或推进数据通过时序逻辑。
BTA 的握手过程只允许 Master 和 Slave 之间的 Escape Mode 时钟频率存在有限的不匹配。 Master 和 Slave 之间的 Escape Mode 频率比不得超过 3:2。Master 负责控制自己的时钟频率以匹配外设。Master 的 LP 时钟频率应在外围 LP 时钟频率的 67% 到 150% 范围内。因此,外设实现者应指定外设的标称 LP 时钟频率和保证的精度。
在PHY层之上有一个通道管理层,在发送端,负责数据的分发到每个 Lane,而在接收端,负责将多个 Lane 的数据合成。
如下图所示,即发送端分别在单Lane与4Lane的情况下数据的Lane上分布。
接收端就正好相反,如下图所示,即发送端分别在单Lane与4Lane的情况下数据的Lane上分布。
当Slave通道数与Master不匹配时,可以通过调整D-PHY的通道数来匹配对方。如下图所示:当Receiver PHY只有两条Data Lane,而Transmitter PHY有四条Data Lane。这是可以调整Transmitter PHY输出使用两条Data Lane,同理也可以将两边都调整为使用一条lane。而在这种情况下并不影响DSI与D-PHY之间的连接。
我们知道DSI的数据是以Byte为最小单位的,使用的Data Lane的条数是可以调整。而一次传输包含了SOT、Data、EOT等。排布规则也比较简单:每条Lane都有自己的SOT与EOT,数据在SoT之后从Lane0~Lane3依次排布。
那么在线上则存在不同情况:
1,数据为Lane数的整数倍
2,数据非Lane数的整数倍
在 DSI 链路的发送端,并行数据、信号事件和命令会在协议层中转换为数据包。协议层附加数据包协议信息和包头,然后通过Lane管理层将所有字节发送到 PHY。 数据包由 PHY 序列化并通过串行链路发送。 DSI 链路的接收端执行与发送端相反的操作,将数据包分解为并行数据、信号事件和命令。
数据包协议和格式与使用的通道数无关。
DSI支持一次传输一个包活着多个包,每次传输包含一个SOT代表开始,一个EoT代表结束。要传 3 个包,那么如下所示两种方式:
DSI定义了两种数据包结构:长数据包和短数据包。 对于这两种数据包结构,数据标识符始终是数据包的第一个字节。
一个短数据包包含一个 8 位数据 ID,后跟 2 个字节数据和一个 8 位 ECC。 短数据包的长度为 4 个字节。主要用于传输命令、参数、读写寄存器,也可以传输一些时序信息,比如Hsync、Vsync等。
长数据包应由三个元素组成:32 位数据包头(PH)、具有可变字节数(0-65535)的特定应用数据有效负载和 16 位数据包尾(PF)。 包头进一步由三个元素组成:8 位数据标识符、16 位字数和 8 位 ECC。 包尾有一个元素,一个 16 位校验和。 长数据包的长度可以是 6 到 65,541 个字节。主要用于传输图像、视频等数据。
> Word Count 仅指数据的长度,以Byte为单位,而不包含后续的Checksum。
任何数据包的第一个字节是 DI(数据标识符)字节。 下图即数据标识符 (DI) 字节的组成。 DI[7:6]:这两位将数据标识为定向到四个虚拟通道之一。 DI[5:0]:这六个位指定数据类型。
ECC可以纠正单比特错误并在数据包报头中检测 2 比特错误。
外设应支持正向和反向通信中的 ECC。
DSI的传输都是基于包传输的(分短包与长包),而每个包的第一个Byte一定是Data ID。由前面我们可知,Data ID由Virtual ID 与 Data Type组成。Virtual ID很好理解,代表当前虚拟通道号。Data Type 即知名我们传输的包是干什么的,这样对端接收到包,第一时间解析除Data Type,它就知道怎么准备接收了。
Data Type 是分方向的,即Processor -> Peripheral 与 Peripheral -> Processor。
同步事件是短数据包,以准确地表示同步脉冲的开始和结束等事件 ==》“开始”和“结束”是独立且不同的事件,因此同步脉冲的长度以及相对于活动像素数据的位置,例如 前肩、后肩、SYNC等显示时序,可准确传达。
它EoTp用于在链路层指示一个 High-Speed 传输结束;引入它的目的主要是增强 DSI 系统在高速传输时候的可靠性。早期的 DSI 协议并不支持这个,所以为了兼容旧的 DSI 协议,这个 EoTp 是一个可配置的。EoTp 的主要目标是在 HS 传输模式下增强系统的整体鲁棒性,在 Low-Power 的时候,不应该出现 EoTp。
一个支持 EoTp 的包,应该是下面这个样子:
对于多通道系统,EoTp 字节分布在多个通道中。
Color Mode Off (0x02)是短数据包命令,它将Vide模式显示模块从low-color模式返回到正常显示。
Color Mode On (0x12)是短数据包命令,它将Vide模式显示模块从正常显示操作切到low-color模式。
Shutdown Peripheral(0x22)是短数据包命令,关闭视频模式显示模块中的显示以节省电力。但接口应保持通电以便接收开启命令。
Turn On Peripheral (0x32) 是短数据包命令,打开视频模式显示模块中的显示以进行正常显示操作。
Generic WRITE 有 4 种类型,3种Short Write Packet 与 1种 Long Write Packet:
它们目的是用于向显示设备发送通用数据;支持 0 ~ 2 个 Parameters。
BTA 应在该请求之后由主机端发送。
返回的数据,可能是 Short 也可能是 Long。
Set Max Return Packet Size 命令限制返回数据包的大小,以便主机端在从外设接收数据时防止缓冲区溢出。
完整的 Generic READ Request 包,和 WRITE 一样,当不传送 parameter 的时候,Data 0 和 Data 1 的内容设置为 0x00;当传输 1 个字节的 parameter 的时候,Data 0 就是这个 parameter,Data 1 需要被设置为 0x00;当传输 2 个字节的时候,直接往 Data 0 和 Data 1 里面写。
外设通过以下 2 种方式来回应主机的 READ :
1,如果外设监测到 Error,那么它会发送 Acknowledge and Error Report;如果是 ECC 错误被监测到,那么外设将按照主机的 READ 要求,返回需要读取的内容,同时在后面跟一个 Acknowledge and Error Report(在同一个传输中);
2,如果没有错误被监测到,那么外设就按照主机的要求返回数据(可能是 Short 和 Long 的 Packet)
DCS 是用于命令模式显示模块的标准化命令集,在 MIPI 的 DCS 文档中专门进行描述。对于 DCS 命令,DI字节之后的第一个字节是 DCS 命令字节, 如果 DCS 命令不需要参数,则第二个有效载荷字节应为 0x00。
DCS命令共有 4 种:
1.Data Types = 00 0101 (0x05):Write whit 0 个 parameter;
2.Data Types = 01 0101 (0x15):Write whit 1 个 parameter;
3.Data Types = 11 1001 (0x39):Long Write;
4.Data Types = 00 0110 (0x06):DCS Read Request;
Set Maximum Return Packet Size 是一个 Short Packet,用于指定外设发送给主机的 Long Packet 最多包含多少 payload,主要是怕主机的 buffer 爆掉,值得注意的是,当主机和外设 Power-on 或者 Reset 之后,在两者通信之前,这个值最好是先被设置好.
Null Packet 是一种在发送虚拟数据时将串行数据通道保持在高速模式的机制。 这是一个长数据包。 与所有数据包一样,其内容应为整数字节。Null 数据包由 DI 字节、两字节 WC、ECC 字节和 WC 字节的“空”有效载荷组成,以两字节校验和结束。 发送的实际数据值无关紧要,因为外围设备不捕获或存储数据。 但是,应生成 ECC 和校验和并将其传输到外设。
消隐数据包用于在长数据包中传送消隐时间信息。 通常,数据包代表Video模式显示器的有效扫描线之间的周期,其中传统的显示时序是从主机提供给显示模块的。 消隐期可能具有散布在消隐段之间的同步事件包。 与所有数据包一样,消隐数据包内容应为整数字节。 消隐数据包可能包含任意数据作为有效载荷。
YCbCr 格式的像素流主要有以下四种格式:
1. Loosely Packed Pixel Stream, 20-bit YCbCr 4:2:2 Format, Data Type = 00 1100 (0x0C)
2. Packed Pixel Stream, 24-bit YCbCr 4:2:2 Format, Data Type = 01 1100 (0x1C)
3. Packed Pixel Stream, 16-bit YCbCr 4:2:2 Format, Data Type = 10 1100 (0x2C)
RGB 格式的像素流主要有以下六种格式:
Execute Queue (0x16)是发送到一个显示驱动的短数据包,它控制和同步显示模块中的其他显示驱动以执行存储在执行队列中的帧同步命令 (FSC)。显示模块内的每个显示驱动可能已将一个或多个命令存储在Execute Queue中。
显示驱动接收执行队列:
不应使用具有四个 LSB = 0000 或 1111 的数据类型代码。 保留所有其他未指定的数据类型代码。
与5.4对应的,也有Peripheral -> Processor方向的Data Type。
外设检测到主机端发送的包有错误,但是主机一直没有发BTA,则外设就没有机会将错误报给主机。所以当主机发送BTA时,如果外设之前检测到了错误,外设就会第一时间发送Acknowledge and Error Report 来告诉主机。但是这里弊端也很明显,如果主机不是每次传输都发送BTA来接收外设的回复,则主机接收到错误报告之后无法判断时哪次传输有错。
在可纠正的 ECC 错误被监测到后,这个 Acknowledge and Error Report 会跟随被读到的 data 数据,在同一个 LP 传输下传送给 Host。
这个 packet 是为了响应来自 主机 的 Generic READ Request,共有三种方式:
1.Data Types = 01 0001 (0x11):即返回一个Byte Data0;
2.Data Types = 01 0010 (0x12):即返回两个Bytes Data0 与 Data1;
3.Data Types = 01 1010 (0x1A):即返回N个Bytes payload data;
如果命令本身可能由于不可纠正的 ECC 错误、SoT 或 SoT 同步错误而损坏,则不应发送请求的 READ 数据包,而应仅发送确认和错误报告包
这个 packet 是为了响应来自 主机 的 DCS READ Request,共有三种方式:
1.Data Types = 10 0001 (0x21):即返回一个Byte Data0;
2.Data Types = 10 0010 (0x22):即返回两个Bytes Data0 与 Data1;
3.Data Types = 01 1100 (0x1C):即返回N个Bytes payload data;
Video模式外设需要实时传送像素数据。 DSI有三种模式支持:
1,Non-Burst Mode with Sync Pulses:使外设能够精确地重建原始视频时序,包括同步脉冲宽度;
2,Non-Burst Mode with Sync Events:与上述类似,但不需要精确重建同步脉冲宽度,因此会使用单个 Sync Event;
3,Burst mode:RGB 像素数据 Packet 经过时间压缩,在扫描线期间留出更多时间用于 LP 模式(节省功耗)或将其他传输多路复用到DSI 链路上;
这里,定义了一个叫做 BLLP(Blanking or Low-Power Interval) 的东西:视频数据包未传输到外设的时间段;
为了能够正常的进行 PHY 的同步,host processor 需要周期性的关闭 High-Speed 传输,让 Data Lane 进入 LP 模式;至少每一帧开始都会做一次这样的操作;同时,Host Processor 应该在每次水平扫描消隐的时候,切换到 LP 模式;
在 BLLP 期间,DSI 链接可以做可以做下面的事情:
使用这种格式,目标是通过 DSI 串行链路准确传送 DPI 类型的时序。 这包括匹配的 DPI 像素传输率,以及同步脉冲等定时事件的宽度。 因此,同步周期是使用发送同步脉冲的开始和结束的分组来定义的。
这个是上面那个的简化模式,只有每个同步脉冲的 Start 被传输,外设那边根据收到的 Sync Event 重新生成同步脉冲;像素按照和上面一样的速度传输。
这种模式下,大量的像素数据能够在更短的时间内进行传输,使用 time-compressed burst 格式;这样可以有效降低 DSI 的功耗。
对于 DSI 系统,EMI、ESD 或其他瞬态错误机制可能会导致链路的一端进入错误状态,或者链路传输损坏的数据。故错误检测机制对于系统的稳定性不言而喻。在DSI中,错误检测主要是分三个部分:
PHY 中的逻辑可以检测某些类别的协议错误, 这些错误通过 PHY 协议接口传达给协议层。 外设识别以下错误并将其存储为状态位,以便后续向主机处理器报告:
• SoT Error
• SoT Sync Error
• EoT Sync Error
• Escape Mode Entry Command Error
• LP Transmission Sync Error
• False Control Error
Contention是十分严重的问题,虽然非常罕见,但可能会导致系统挂起并强制进行硬重置或断电/通电循环以恢复。DSI 定义了两种机制来最大限度地减少此问题并实现更轻松的恢复:
1,用于 LP 模式争用的 PHY 中的争用检测器;
2,以及用于其他形式的争用和共模故障的定时器;
在双向链路中,PHY 中的争用检测器应检测两种类型的争用错误:LP High 错误和 LP Low错误。当检外设测到任一争用故障时,应在错误报告字节中设置检测到争用。
下面用一个流程举例:、
PHY 无法检测所有形式的争用。 使用适当的定时器超时机制可确保发生的任何争用都是有限的持续时间。即在传输过程使用一个定时器计数,则可以通过超时机制来判断传输是否出问题。目前共有四种超时机制:
上述两种方法也未必能检测出所有错误,故DSI补充了另外即定时器,对其他操作进行检测。主要是为一下操作提供超时机制: