RK3568系列15——MIPI屏幕配置

  RK提供的RK3568样板默认都是基于MIPI屏幕的,因此有很多DTS配置可以参考。唯一需要注意的是必须从屏幕厂商拿到一个启停屏幕的控制命令,才可以正常控制屏幕的开关。

预备知识

  • MIPI是一种专为嵌入式设计的通用接口,目的就是使各个部件标准化
  • MIPI分为MIPI DSI(用于显示屏)、MIPI CSI(用于摄像头)等
  • MIPI DSI采用:4对差分数据线传输数据,1对差分信号传输时钟信号

原理图分析

  • 一个用于控制屏幕供电开关的GPIO
  • 一个用于控制屏幕背光升压电路的GPIO
  • 一个屏幕RESET信号GPIO

配置要点

  • 使能dsi0的同时要使能video_phy0,同理使能dsi1的同时要使能video_phy1

命令序列配置

  详细说明请参考《Rockchip_Developer_Guide_DRM_Panel_Porting_CN&EN》的3.3 Command章节。

命令格式

Data Type, Delay, Payload Length, [Payload]

  • Data Type:占1个字节,表示这条命令的类型
  • Delay:占1个字节,表示当前命令执行完x毫秒后再执行下一条命令
  • Payload Length:参数的长度
  • Payload:可选,具体参数

命令示例

39 00 04 B8 FF 83 94

  • Data Type:0x39 -> DCS Long Write
  • Delay:0x00 -> 0ms(不延时)
  • Payload Length:0x04 -> 参数长度为4个字节
  • Payload:0xB8 0xFF 0x83 0x94 -> 具体参数

05 14 01 29

  • Data Type:0x05 -> DCS Short Write, no parameters
  • Delay:0x14 -> 20ms(上条命令执行完毕后,延时20ms开始执行)
  • Payload Length:0x01 -> 参数长度为1个字节
  • Payload:0x29 -> 具体参数

常用命令类型

  • DCS Short Write(no parameters):0x05
  • DCS Short Write(1 parameters):0x15
  • DCS Long Write:0x39
  • Generic Short Write(no parameters):0x03
  • Generic Short Write(1 parameters):0x13
  • Generic Short Write(2 parameters):0x23
  • Generic Long Write:0x29

转换示例

  项目采用的MIPI屏幕使用的芯片是ILI9881C,厂家给了一个基于C语言的命令序列,部分内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// initial-command
Generic_Long_Write_3P(0xFF,0x98,0x81,0x03);

// GIP_1
Generic_Short_Write_1P(0x01,0x00);
Generic_Short_Write_1P(0x02,0x00);
Generic_Short_Write_1P(0x03,0x53);

// GIP_2
Generic_Short_Write_1P(0x50,0x00);
Generic_Short_Write_1P(0x51,0x23);
Generic_Short_Write_1P(0x52,0x44);

// Forward scan
Generic_Short_Write_1P(0x5E,0x00);
Generic_Short_Write_1P(0x5F,0x02);
Generic_Short_Write_1P(0x60,0x02);

// Backward scan
Generic_Short_Write_1P(0x75,0x02);
Generic_Short_Write_1P(0x76,0x02);
Generic_Short_Write_1P(0x77,0x02);

Generic_Long_Write_3P(0xFF,0x98,0x81,0x00);
DCS_Short_Write_NP(0x11);
Delay(120);
DCS_Short_Write_NP(0x29);
Delay(20);

// sleep-in-command
Generic_Long_Write_3P(0xFF,0x98,0x81,0x04);
Generic_Short_Write_1P(0x2D,0x02);
Generic_Short_Write_1P(0x2F,0x01);
Generic_Long_Write_3P(0xFF,0x98,0x81,0x00);
DCS_Short_Write_NP(0x28);
Delay(10);
DCS_Short_Write_NP(0x10);
Delay(120);

  我们只需要使用任意一个文本编辑器的查找替换功能,就可以轻松的转换为DTS中配置的命令序列,唯一需要手动修改的部分是Delay延时的设置。替换完成后的命令如下:

  • ,0x -> " "
  • ); -> ""
  • Generic_Long_Write_3P(0x -> 29 00 04
  • Generic_Short_Write_1P(0x -> 13 00 02
  • DCS_Short_Write_NP(0x -> 05 00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
panel-init-sequence = [
29 00 04 FF 98 81 03
13 00 02 01 00
13 00 02 02 00
13 00 02 03 53
13 00 02 50 00
13 00 02 51 23
13 00 02 52 44
13 00 02 5E 00
13 00 02 5F 02
13 00 02 60 02
13 00 02 75 02
13 00 02 76 02
13 00 02 77 02
29 00 04 FF 98 81 00
05 78 01 11
05 14 01 29
];

panel-exit-sequence = [
29 00 04 FF 98 81 04
13 00 02 2D 02
13 00 02 2F 01
29 00 04 FF 98 81 00
05 0A 01 28
05 78 01 10
];

DTS配置

  关于屏幕参数配置请参考前文《RK3568系列14——屏幕参数公共配置》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
&pinctrl {
dsi0 {
dsi0_panel_enable: dsi0-panel-enable {
rockchip,pins = <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_down>;
};
dsi0_panel_reset: dsi0-panel-reset {
rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};

// 使能相关组件
&dsi0 {
status = "okay";
};

&video_phy0 {
status = "okay";
};

&dsi0_in_vp0 {
status = "okay";
};

&dsi0_in_vp1 {
status = "disabled";
};

&route_dsi0 {
status = "okay";
connect = <&vp0_out_dsi0>;
};

&dsi0_panel {
status = "okay";
power-supply = <&vcc3v3_lcd0_n>;
reset-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&dsi0_panel_reset>;

// 见《RK3568系列14——屏幕参数公共配置》
prepare-delay-ms = <20>;
enable-delay-ms = <50>;
disable-delay-ms = <100>;
unprepare-delay-ms = <20>;
reset-delay-ms = <200>;
init-delay-ms = <100>;

panel-init-sequence = [
// 开启屏幕命令序列
......
];

panel-exit-sequence = [
// 关闭屏幕命令序列
......
];
};

&backlight {
status = "okay";
pwms = <&pwm6 0 25000 0>;
power-supply = <&vcc3v3_lcd0_n>;
post-pwm-on-delay-ms = <100>;
pwm-off-delay-ms = <50>;
default-brightness-level = <255>;
};

&vcc3v3_lcd0_n {
gpio = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>;
enable-active-high;
pinctrl-names = "default";
pinctrl-0 = <&dsi0_panel_enable>;
};

&dsi0_timing0 {
// 见《RK3568系列14——屏幕参数公共配置》
......
};

遇到的问题

  • 给定的MIPI屏复位信号电压必须是1.8V,板子没有设计电压电平转换电路,临时从1.8V的VCCIO4的无用信号飞线出来后解决,等待改版

参考文档

  • RKDocs/common/display/Rockchip_Developer_Guide_DRM_Panel_Porting_CN.pdf
  • RKDocs/common/display/Rockchip_Developer_Guide_DRM_Panel_Porting_CN&EN.pdf