MIPI DSI2
芯片名称 内核版本
- RK3576 LINUX Kernel 6.1
- RK3588 LINUX Kernel 5.10/6.1
1. Introduction
DSI-2 是 MIPI 联盟定义的一组通信协议的一部分,DWC-MIPI-DSI2 是一个实现 MIPI-DSI2 规范中定义的所有协议功能的数字核控制器,可以兼容 D-PHY 和 C-PHY 的物理接口,支持两路的 Display Stream Compression (DSC) 数据传输。
2. MIPI-DSI2 Features
- MIPI® Alliance Specification for Display Serial Interface 2 (DSI-2) Version 1.1
- MIPI® Alliance Specification for Display Command Set (DCS) Version 1.4
- MIPI® Alliance Specification for D-PHY v2.0
- MIPI® Alliance Specification for C-PHY v1.1
- Four data lanes on D-PHY and three data trios on C-PHY
- Bidirectional communication and escape mode through data lane 0
- Continuous and non-continuous clock modes on D-PHY and non-continuous clock mode on C-PHY
- End of Transmission packet (EoTp)
- Scrambling
- VESA DSC 1.1/1.2a
- Up to 4.5 Gbps per lane in D-PHY
- Up to 2.0 Gsps per trio in C-PHY
3. RK3576 与 RK3588 DSI 接口差别
功能 | RK3576 | RK3588 |
---|---|---|
Dual channel | Not support | Support |
Max resolution | 2560x1600@60Hz | 4096x2304@60Hz |
data lanes | 1/2/4 lanes | 1/2/4/8 lanes |
Max lane rate | D-PHY: 2.5Gbps/lane C-PHY: 1.7Gsps/lane | D-PHY: 4.5Gbps/lane C-PHY: 2.0Gsps/lane |
Color Format | RGB | RGB |
Max Color Depth | 10 bit | 10 bit |
DSC | Not support | Support VESA DSC 1.1/1.2a |
C-PHY | Support | Support |
4. MIPI DSI-2 Host 与 MIPI DSI Host 的差别
MIPI DSI-2 除了可以兼容 MIPI DSI 的所有协议功能外,还增加支持 MIPI C-PHY。
5. MIPI DPHY 差别
RK3588 平台 MIPI DPHY 不同以往平台 MIPI DPHY 版本,其带宽最高可以到 4.5 Gbps。
6. 应用领域
MIPI DSI 基于差分信号传输,可以降低引脚数量和硬件设计复杂度,并保持良好的硬件兼容性。另外,基于 MIPI DSI 协议的 IP 还具备低功耗、低 EMI 的特性。
其应用领域如下图:
7. 驱动代码说明
7.1 uboot
7.1.1 驱动位置
drivers/video/drm/dw_mipi_dsi2.c
drivers/video/drm/samsung_mipi_dcphy.c
7.1.2 驱动配置
CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI2=y
CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY=y
7.2 kernel
7.2.1 驱动位置
MIPI DSI-2 host controller:
drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c
MIPI DCPHY:
drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c
7.2.2 驱动配置
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_PHY_ROCKCHIP_SAMSUNG_DCPHY=y
7.2.3 参考设备树
DTS 路径:
arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi
arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi
arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi
arch/arm64/boot/dts/rockchip/rk3588-evb3-lp5.dtsi
arch/arm64/boot/dts/rockchip/rk3588-evb4-lp4.dtsi
arch/arm64/boot/dts/rockchip/rk3588s-evb.dtsi
arch/arm64/boot/dts/rockchip/rk3588s-evb1-lp4x.dtsi
arch/arm64/boot/dts/rockchip/rk3588s-evb2-lp5.dtsi
arch/arm64/boot/dts/rockchip/rk3588s-evb4-lp4x.dtsi
dts 配置用例场景说明:
rk3588-evb1: dsi0->dphy->1080p_panel && dsi1->dphy->1080p_panel;
rk3588-evb2: dsi1->dphy->1080p_panel;
rk3588-evb3: dsi0->dphy->1080p_panel && dsi1->cphy->cphy_panel;
rk3588-evb4: dsi0->dphy->1080p_panel;
rk3588s-evb1: dsi0->dphy->1080p_panel && dsi1->dphy->cmd_no_dsc_panel;
rk3588s-evb2: dsi0->cphy->cphy_panel & dsi1->dphy->1080p_panel;
rk3588s-evb4: dsi0->dphy->1080p_panel && dsi1->dphy->cmd_dsc_panel;
8. DSI 控制器和屏端配置
8.1 DTS 配置
&dsi0 {
status = "okay";
//rockchip,lane-rate = <1000>;
//auto-calculation-mode;
//disable-hold-mode;
//support-psr;
};
&dsi0_panel {
status = "okay";
compatible = "simple-panel-dsi";
reg = <0>;
power-supply = <&vcc3v3_lcd_n>;
backlight = <&backlight>;
reset-gpios = <&gpio2 RK_PB4 GPIO_ACTIVE_LOW>;
reset-delay-ms = <10>;
enable-delay-ms = <10>;
prepare-delay-ms = <10>;
unprepare-delay-ms = <10>;
disable-delay-ms = <60>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;
//phy-c-option;
//compressed-data;
//slice-width = <720>;
//slice-height = <65>;
//version-major = <1>;
//version-minor = <1>;
panel-init-sequence = [
...
05 78 01 11
05 00 01 29
];
panel-exit-sequence = [
05 00 01 28
05 00 01 10
];
disp_timings0: display-timings {
native-mode = <&dsi0_timing0>;
dsi0_timing0: timing0 {
clock-frequency = <132000000>;
hactive = <1080>;
vactive = <1920>;
hfront-porch = <15>;
hsync-len = <4>;
hback-porch = <30>;
vfront-porch = <15>;
vsync-len = <2>;
vback-porch = <15>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
};
8.2 配置说明
8.2.1 通用配置
Property | Description | Value |
---|---|---|
rockchip,lane-rate | 选择手动指定 mipi 通道速率 | 单位可以支持: D-PHY: Mbps/lane 或 Kbps/lane C-PHY: Msps/lane 或 Ksps/lane 比如指定800Mbps: rockchip,lane-rate = <800> ;或者 rockchip,lane-rate = <800000> ; |
auto-calculation-mode | 使能 Auto Calculation 工作模式 | 布尔类型 string |
disable-hold-mode | 不配置 TE 也能刷帧 | 布尔类型 string |
support-psr | 使能 PSR 功能 | 布尔类型 string |
compatible | Compatible string | simple-panel-dsi |
power-supply | 屏端供电 [option] | 相关 regulator 引用 |
backlight | 背光 | 背光引用 |
enable-gpios | 屏使能 GPIO [option] | GPIO 引用描述 |
reset-gpios | 屏复位 GPIO | GPIO 引用描述 |
reset-delay-ms | panel sequence delay | 参考 panel spec |
enable-delay-ms | ||
prepare-delay-ms | ||
unprepare-delay-ms | ||
disable-delay-ms | ||
dsi,flags | DSI2 工作模式 | cmd mode: MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET video mode: MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET |
dsi,format | 像素数据格式 | MIPI_DSI_FMT_RGB888 MIPI_DSI_FMT_RGB666 MIPI_DSI_FMT_RGB666_PACKED MIPI_DSI_FMT_RGB565 |
dsi,lanes | mipi data 通道数 | 1/2/3 trios [cphy] 6 trios [cphy 双通道] 1/2/3/4 lanes [dphy] 8 lanes [dphy 双通道] |
phy-c-option | C-PHY panel [option] | 布尔类型string |
compressed-data | 带DSC panel [option] | 布尔类型string |
slice-width | 定义dsc slice宽 [option] | 参照panel spec |
slice-height | 定义dsc slice高 [option] | |
version-major | 定义dsc版本 [option] | 参照panel spec |
version-minor | ||
panel-init-sequence | 屏上电初始化序列 | [hex] data_type delay_ms payload_lenth payload |
panel-exit-sequence | 屏下电初始化序列 | |
display-timing | panel timing | 参考panel spec |
8.2.2 display Timing
8.2.3 dsi,flags
8.2.3.1 CLK Type
在 MIPI DSI 协议的 5.6.1 时钟要求章节介绍:所有DSI发射器和接收器都应在时钟通道上支持连续时钟行为,并且可以选择性地支持非连续时钟行为,所以显示应用中时钟通道工作在连续模式还是非连续模式取决于显示外设的需求。
默认情况,MIPI DPHY 的时钟通道工作在连续模式,是 DSI 显示系统中主从都支持的时钟行为,另外如果 DSI 外设需要依赖主机端的时钟工作时,则时钟通道必须工作在连续模式,如下图:
当系统需要考虑节省功耗时,尤其是在传输期间,可以配置成非连续时钟模式,可以避免在不需要数据传输时浪费电力,把 MIPI_DSI_CLOCK_NON_CONTINUOUS 追加到 dsi,flags 时,MIPI DPHY 的时钟通道将会配置 成非连续模式,如下图:
8.2.3.2 Eotp
Eotp 在 DSI 规范版本 V1.0 以及更早版本是不支持的,只有符合 DSI V1.0 之后的较新规范版本的设备必须支持 Eotp 的生成和检测,RK3588/RK3576 DSI 版本是 V2.0,为了确保与早期设备的互操作性,主机应该能够启用和禁用生成和检测手段。总之,是否启用 Eotp 取决于屏端是否支持。
Eotp 是一个短包用于指示数据链路上高速传输的结束。Eotp 主要作用是增强系统高速传输通信的稳健性,出于这个目的,DSI 不需要在 LP 模式发送 Eotp。
Eotp 不同于其他 DSI 包,它有固定的格式:
- Data Type = DI [5:0] = 0b001000
- Virtual Channel = DI [7:6] = 0b00
- Payload Data [15:0] = 0x0F0F
- ECC [7:0] = 0x01
将 MIPI_DSI_MODE_EOT_PACKET 追加到 dsi,flags 属性可以开关 Soc MIPI DSI TX 在高速模式发送 Eotp。
如下是在 HSDT 模式下捕获 Eotp 波形:
8.2.3.3 BLANK_HS_EN
在数据通道,一般存在一行会有两个 LP11 消隐,如下图:
但往往有些显示模组或者外接 MIPI 转接芯片,不支持在 Hblank 阶段有两个 LP-11, 可以将 BLK_HFP_HS_EN 或 BLK_HBP_HS_EN 追加到 dsi,flags 属性,使 HFP 或 HBP 以高速的形式存在。
8.2.4 屏上电时序
8.2.5 屏下电时序
8.2.6 初始化序列常见数据类型
data type | description | packet size |
---|---|---|
0x03 | Generic Short WRITE, no parameters | short |
0x13 | Generic Short WRITE, 1 parameters | short |
0x23 | Generic Short WRITE, 2 parameters | short |
0x29 | Generic long WRITE | long |
0x05 | DCS Short WRITE, no parameters | short |
0x15 | DCS Short WRITE, 1 parameters | short |
0x07 | DCS Short WRITE, 1 parameters, DSC EN | short |
0x0a | DCS long WRITE, PPS, 128 bytes | long |
9. Timing for DSI video mode
10. Bandwidth
MIPI DSI 驱动中会自动按如下公式根据不同的工作模式进行带宽的计算,当然在调试过程中也许对计算的结果想做些微调可以通过 DTS dsi 节点下 rockchip,lane-rate 属性进行指定,单位可以是 Kbps/Mbps(D-PHY) 或 Ksps/Msps (C-PHY)。如下带宽计算用例中可以发现,4K@60 的分辨率对于 RK3588 MIPI DSI DPHY 不需要 DSC 也完全可以支持,但 CPHY 会稍微超出本身最大带宽。
11. DSC
DSC 是 Display Stream Compression 缩写,如下是一个完整的 DSC 系统框图,整个系统为实时工作,未压缩的原始视频像素数据按光栅扫描顺序实时进入编码器并输出比特流,通过显示链路实时传输到解码器,解码器将接收的比特流解码为原始的视频像素数据并送到显示模块显示。从编码器解码输出的图像和输入到编码器前的图像数据信息格式是一样的。RK3588 具有两个 DSC 编码器,可以有效将高分辨率画质内容以低带宽、低延时传输,从而实现MIPI DSI 可以点更高分辨率的画面。
11.1 Slice
DSC为加速编码过程,并减少经过压缩失真,DSC导入界面(slice),将每一帧的画面加以切割,切割出的截面同时进行编码。DSC可支持的截面数有1、2、4、8个,甚至更多的截面数。需要注意的是单位为slice/line,line是指画面成形时以raster-scan顺序为一行的像素。除不同截面数外,DSC也可以使用不同长宽的截面。如下图右上及右下两张图片,同样都是一行4个截面,但右上的图切割为长条形截面,右下的图则切割成较窄的长方形截面。要使用哪一种长宽的截面取决于Source Device及Sink Device DSC支持的截面数以及DSC压缩或解压缩率。
RK3588 DSC0 最多支持 8 slices,DSC1 最多支持 2 slices。
当实际显示方案中需要确认RK3588 DSC 是否能否支持某款什么分辨率具有多少Slices DSC时,参考如下公式:
- DSC_8K:
active_slice_num * slice_width <= 960 * 8
- DSC_4K:
active_slice_num * slice_width <= 2048 * 2
11.2 DSC Encode
在影像数据压缩之前,图像将由Source Device和Sink Device共同协商都能支持的slice数量进行网格均等切割,以3840x2160为例,假如Source Device和Sink Device DSC都能支持8slices,可以在水平方向均等切割4份,垂直方向均等切割2份,假如DSC encoder有4个独立并行处理影像数据压缩的core组成,这该图的左边切割的8个slice可以分成4组同时并行进行压缩,有效将4k画质内容以低带宽、低延时进行传输。
11.3 DSC Bandwidth
以4Kp60的分辨率为例子,启用DSC前后 MIPI D/C-PHY 带宽变化如下,使能DSC后,链路带宽可以降到原始带宽数据的三分之一到二分之一。
下图为RK3588 MIPI DSI 驱动 1440x3120p60 4lanes with DSC 显示模组时,分别测量以原始带宽和原始带宽的三分之一的信号波形。
11.4 PPS
PPS 一共有128 bytes 长度,如下表会描述一些 DSC 系统需要的重要信息:
- DSC 版本;
- DSC 压缩编码前的 BPC;
- DSC 压缩编码后的 BPP;
- DSC 压缩编码前输入原始图像的宽高;
- DSC 压缩编码的 Slice 宽高。
11.5 实例
11.5.1 何时启用 DSC
在具体项目 MIPI DSI 相关的显示方案中何时可以启用 DSC。以下面客户提供的显示模组参数为例说明启用 DSC 条件:
- 该模组为一个 DPHY 4 data lanes 接口,最大速率为1Gbps/lane;
- 该模组为 Video Burst mode, 原始带宽:1.866Gbps 24 bits RGB 60帧;
- 该模组支持 DSC 1 Slice
- 该模组目标速率:676Mbps/lane
11.5.2 双通道MIPI 如何启用 DSC
如下图为客户方案中点一款带DSC功能 2560x2560p120 双 mipi 显示模组,其实现的显示链路框图如下。
12. Display Route
12.1 MIPI with DSC
12.2 MIPI with DSC Bypass
12.3 DTS 配置
如 DSI0 挂载在 VP3:
&dsi0_in_vp2 {
status = "disabled";
};
&dsi0_in_vp3 {
status = "okay";
};
如 DSI1 挂载 VP2:
&dsi1_in_vp2 {
status = "okay";
};
&dsi1_in_vp3 {
status = "disabled";
};
13. 开机LOGO
13.1 route_dsi0
例如 vp3->dsi0 或 vp3->dsc0->dsi0:
&route_dsi0 {
status = "okay";
connect = <&vp3_out_dsi0>;
};
13.2 route_dsi1
例如 vp2->dsi1 或 vp2->dsc1->dsi1:
&route_dsi1 {
status = "okay";
connect = <&vp2_out_dsi1>;
};
13.3 route_dsi0 && route_dsi1
例如 (vp3->dsi0 或 vp3->dsc0->dsi0) && (vp2->dsi1 或 vp2->dsc1->dsi1):
&route_dsi0 {
status = "okay";
connect = <&vp3_out_dsi0>;
};
&route_dsi1 {
status = "okay";
connect = <&vp2_out_dsi1>;
};
14. DSI HOST
DSI 可以配置成 Manual/Auto-Calculation 模式,驱动默认时配置成 Manual 模式,用户可以选择配置成 Auto-Calculation 模式,该模式有如下特点:
主机被配置为从lPl和PPl接口自动提取所有必要的信息和时序参数,以满足视频模式中的帧时序要求。 Auto-Calculation 模式具有以下优点:
- 无需用户配置一组寄存器
- 简化了配置流程,且控制器不易出现不期望的行为
- 允许IPI帧动态变化,同时控制器适应输出帧的变化
ports
以下实例中 ports 是用来 Dispaly Interface 和 panel 之间进行关联。
详细配置说明参阅如下文档: Documentation/devicetree/bindings/graph.txt
14.1 单 DSI
14.1.1 DSI0
&dsi0 {
status = "okay";
//rockchip,lane-rate = <1000>;
//auto-calculation-mode;
//disable-hold-mode;
//support-psr;
dsi0_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
...
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi: endpoint {
remote-endpoint = <&dsi_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi>;
};
};
};
};
&mipi_dcphy0 {
status = "okay";
};
14.1.2 DSI1
&dsi1 {
status = "okay";
//rockchip,lane-rate = <1000>;
//auto-calculation-mode;
//disable-hold-mode;
//support-psr;
dsi1_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
...
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};
};
};
};
&mipi_dcphy1 {
status = "okay";
};
14.2 双通道 DSI
MODE1:
MODE2:
双通道的配置注意如下标红属性:
rockchip,dual-channel = <&dsi1>
dsi,lanes = <8>;//DPHY 屏, CPHY 屏值改成 6
&dsi0 {
status = "okay";
rockchip,dual-channel = <&dsi1>;
//auto-calculation-mode;
//disable-hold-mode;
//support-psr;
dsi0_panel {
status = "okay";
compatible = "simple-panel-dsi";
dsi,lanes = <8>;
...
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <260000000>;
hactive = <1440>;
vactive = <2560>;
hfront-porch = <150>;
hsync-len = <30>;
hback-porch = <60>;
vfront-porch = <8>;
vsync-len = <4>;
vback-porch = <4>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi0: endpoint {
remote-endpoint = <&dsi0_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi0_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi0>;
};
};
};
};
&dsi1 {
status = "okay";
};
&mipi_dcphy0 {
status = "okay";
};
&mipi_dcphy1 {
status = "okay";
};
14.3 Dual-link DSI
&dsi0 {
status = "okay";
//rockchip,lane-rate = <1000>;
//auto-calculation-mode;
//disable-hold-mode;
//support-psr;
dsi0_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
...
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi: endpoint {
remote-endpoint = <&dsi_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi>;
};
};
};
};
&dsi1 {
status = "okay";
//rockchip,lane-rate = <1000>;
//auto-calculation-mode;
//disable-hold-mode;
//support-psr;
dsi1_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
...
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};
};
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};
};
};
};
&mipi_dcphy0 {
status = "okay";
};
&mipi_dcphy1 {
status = "okay";
};