RK平台mipi屏初始化序列都是在dts中进行配置,有两种方式,下面分别介绍两种方式的配置方法。
方式一
RK平台较老的SDK采用下面方式配置mipi参数,如:RK3128 5.1 SDK中就是采用的下面方式。
示例:
/ {
/* about mipi */
disp_mipi_init: mipi_dsi_init{
compatible = "rockchip,mipi_dsi_init";
rockchip,screen_init = <1>;
rockchip,dsi_lane = <4>;
rockchip,dsi_hs_clk = <550>;
rockchip,mipi_dsi_num = <1>;
};
disp_mipi_power_ctr: mipi_power_ctr {
compatible = "rockchip,mipi_power_ctr";
/*
mipi_lcd_rst:mipi_lcd_rst{
compatible = "rockchip,lcd_rst";
rockchip,gpios = <&gpio2 GPIO_D1 GPIO_ACTIVE_HIGH>;
rockchip,delay = <20>;
};
mipi_lcd_en:mipi_lcd_en {
compatible = "rockchip,lcd_en";
rockchip,gpios = <&gpio2 GPIO_D0 GPIO_ACTIVE_LOW>;
rockchip,delay = <100>;
};
*/
};
disp_mipi_init_cmds: screen-on-cmds {
compatible = "rockchip,screen-on-cmds";
rockchip,cmd_debug = <1>;
rockchip,on-cmds1 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x15 0xE0 0x00>;
rockchip,cmd_delay = <0>;
};
rockchip,on-cmds2 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x39 0x55 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10>;
rockchip,cmd_delay = <0>;
};
//SLP OUT
rockchip,on-cmds3 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x05 0x11>;
rockchip,cmd_delay = <120>;
};
//DISP ON
rockchip,on-cmds4 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x05 0x29>;
rockchip,cmd_delay = <5>;
};
};
disp_timings: display-timings {
native-mode = <&timing0>;
compatible = "rockchip,display-timings";
timing0: timing0 {
screen-type = <SCREEN_MIPI>;
lvds-format = <LVDS_8BIT_2>;
out-face = <OUT_P888>;
clock-frequency = <67330000>;
hactive = <800>;
vactive = <1280>;
hback-porch = <18>;
hfront-porch = <18>;
vback-porch = <10>;
vfront-porch = <20>;
hsync-len = <18>;
vsync-len = <4>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
swap-rb = <0>;
swap-rg = <0>;
swap-gb = <0>;
};
};
};
这里只分析disp_mipi_init_cmds的配置规则,disp_mipi_init、disp_mipi_power_ctl、disp_timings不分析,其中disp_timings可以参考“如何确定lcd timing参数”。
下面代码段为一条mipi初始化数据,主要关心的参数有“rockchip,cmd”和“rockchip,cmd_delay”。
rockchip,on-cmds1 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x15 0xE0 0x00>;
rockchip,cmd_delay = <0>;
};
rockchip,cmd
命令格式如下:
0x15 0xE0 0x00
| | |
| | 数据
| 寄存器地址
命令类型(0x05: 单字节数据 0x15: 双字节数据 0x39: 多字节数据)
单字节数据举例:
rockchip,on-cmds3 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x05 0x11>;
rockchip,cmd_delay = <120>;
};
双字节数据举例:
rockchip,on-cmds1 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x15 0xE0 0x00>;
rockchip,cmd_delay = <0>;
};
多字节数据举例:
rockchip,on-cmds2 {
compatible = "rockchip,on-cmds";
rockchip,cmd_type = <LPDT>;
rockchip,dsi_id = <0>;
rockchip,cmd = <0x39 0x55 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10>;
rockchip,cmd_delay = <0>;
};
rockchip,cmd_delay
此字段定义发送完命令后延时时长,单位毫秒(ms),大部分命令无须延时。
方式二
RK平台新的SDK已经统一采用下面方式配置mipi参数,如:RK3288 8.1 SDK中就是采用的下面方式。
示例:
&dsi0 {
status = "okay";
rockchip,lane-rate = <600>;
panel: panel {
compatible = "simple-panel-dsi";
reg = <0>;
backlight = <&backlight>;
enable-gpios = <&gpio7 3 GPIO_ACTIVE_HIGH>;
//reset-gpios = <&gpio7 4 GPIO_ACTIVE_HIGH>;
power-supply = <&vcc_lcd>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;
reset-delay-ms = <20>;
init-delay-ms = <20>;
enable-delay-ms = <120>;
prepare-delay-ms = <120>;
status = "okay";
panel-init-sequence = [
15 00 02 80 77
15 00 02 81 77
15 00 02 82 77
15 00 02 83 77
15 00 02 84 77
15 00 02 85 77
15 00 02 86 77
05 64 01 11
05 14 01 29
];
panel-exit-sequence = [
05 64 01 28
05 96 01 10
];
disp_timings: display-timings {
native-mode = <&timing2>;
timing2: timing0 {
clock-frequency = <52000000>;
hactive = <1024>;
vactive = <600>;
hback-porch = <160>;
hfront-porch = <160>;
vback-porch = <23>;
vfront-porch = <12>;
hsync-len = <10>;
vsync-len = <10>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
};
};
这里依然只分析panel-init-sequence和panel-exit-sequence的配置规则,其它配置可以参考“如何确定lcd timing参数”。
新的mipi初始化序列配置规则与老方法其实是一致的,只是改写了表达方式,如下:
panel-init-sequence = [
15 00 02 80 77
15 00 02 81 77
15 00 02 82 77
15 00 02 83 77
15 00 02 84 77
15 00 02 85 77
15 00 02 86 77
39 00 0D C3 01 66 13 23 00 66 85 33 20 38 38 00
05 64 01 11
05 14 01 29
];
中括号里的内容,每一行表示一串命令字,规则如下:
15 00 02 80 77
| | | | |
| | | | 数据
| | | | 寄存器地址
| | 数据长度
| 延时
命令类型(0x05: 单字节数据 0x15: 双字节数据 0x39: 多字节数据)
单字节数据举例:
05 64 01 11
双字节数据举例:
15 00 02 86 77
多字节数据举例:
39 00 0D C3 01 66 13 23 00 66 85 33 20 38 38 00
如何确定lcd timing参数
这里以Rockchip平台为例,Rockchip平台lcd timing常见参数配置如下:
disp_timings: display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <31000000>;
hactive = <480>;
vactive = <854>;
hback-porch = <24>;
hfront-porch = <72>;
vback-porch = <10>;
vfront-porch = <12>;
hsync-len = <24>;
vsync-len = <2>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
常规参数
其中以下参数根据屏的规格书填写:
hactive = <480>; // 分辨率-宽
vactive = <854>; // 分辨率-高
hback-porch = <24>; // 行可视范围前肩
hfront-porch = <72>; // 行可视范围后肩
vback-porch = <10>; // 帧可视前肩
vfront-porch = <12>; // 帧可视后肩
hsync-len = <24>; // 行同步肪冲宽度
vsync-len = <2>; // 场同步脉冲宽度
以下参数表示对应信号的有效电平,默认为低电平(0):
hsync-active = <0>; // 行同步信号
vsync-active = <0>; // 场同步信号
de-active = <0>; // de信号
pixelclk-active = <0>; // clk信号
clock-frequency 的计算方法
已知下面参数:
- fps: 屏幕刷新率(默认:60帧)
- htotal: hactive + hback-porch + hfront-porch + hsync-len
- vtotal: vactive + hfront-porch + vfront-porch + vsync-len
求clock-frequency公式如下:
htotal * vtotal * fps = clock-frequency
按照上面参考参数计算如下:
(480 + 24 + 72 + 24) x (854 + 10 + 12 + 2) x 60 = 31608000
计算出来的准确值为31608000,我们取整:
clock-frequency = <31000000>;
dsi_hs_clk 的计算方法
100 + ((htotal * vtotal * fps) * 3 * 8 / lanes)