设计了一块嵌入式电路板,运行linux系统,主控CPU为px30,需要适配一块显示驱动IC为ILI9881D的5.0寸液晶屏,分辨率为720*1280。
液晶驱动电路如下:
MIPI通道为4lane,pwm调光驱动为负极性(占空比最小亮度最高)。
液晶屏厂家提供了一份初始化代码文件和一份时序参数文件;
参照Rockchip官方参考文档:Rockchip_DRM_Panel_Porting_Guide_V1.3_20171209.pdf-Linux文档类资源-CSDN下载
第二章MIPI-DSI部分,在px30_linux->kernel->arch->arm64->boot->dts文件夹下新建一个lcd-mipi720x1280-KLD50225HHMB.dtsi文件,加入如下代码:
&dsi_in_vopl {
status = "disabled";
};
&dsi_in_vopb {
status = "okay";
};
&route_dsi {
status = "okay";
};
&mipi_dphy {
status = "okay";
};
根据厂家提供的初始化代码编辑panel-init-sequence = [],初始化代码如下:
initinal:
{
Generic_Long_Writ_3P(0xFF,0x98,0x81,0x03);
Generic_Short_Write_1P(0x01,0x00);
Generic_Short_Write_1P(0x02,0x00);
Generic_Short_Write_1P(0x03,0x73);
Generic_Short_Write_1P(0x04,0x00);
Generic_Short_Write_1P(0x05,0x00);
Generic_Short_Write_1P(0x06,0x0A);
Generic_Short_Write_1P(0x07,0x00);
Generic_Short_Write_1P(0x08,0x00);
Generic_Short_Write_1P(0x09,0x01);
Generic_Short_Write_1P(0x0a,0x00);
Generic_Short_Write_1P(0x0b,0x00);
Generic_Short_Write_1P(0x0c,0x01);
Generic_Short_Write_1P(0x0d,0x00);
Generic_Short_Write_1P(0x0e,0x00);
Generic_Short_Write_1P(0x0f,0x1D);
Generic_Short_Write_1P(0x10,0x1D);
Generic_Short_Write_1P(0x11,0x00);
Generic_Short_Write_1P(0x12,0x00);
Generic_Short_Write_1P(0x13,0x00);
Generic_Short_Write_1P(0x14,0x00);
Generic_Short_Write_1P(0x15,0x00);
Generic_Short_Write_1P(0x16,0x00);
Generic_Short_Write_1P(0x17,0x00);
Generic_Short_Write_1P(0x18,0x00);
Generic_Short_Write_1P(0x19,0x00);
Generic_Short_Write_1P(0x1a,0x00);
Generic_Short_Write_1P(0x1b,0x00);
Generic_Short_Write_1P(0x1c,0x00);
Generic_Short_Write_1P(0x1d,0x00);
Generic_Short_Write_1P(0x1e,0x40);
Generic_Short_Write_1P(0x1f,0x80);
Generic_Short_Write_1P(0x20,0x06);
Generic_Short_Write_1P(0x21,0x02);
Generic_Short_Write_1P(0x22,0x00);
Generic_Short_Write_1P(0x23,0x00);
Generic_Short_Write_1P(0x24,0x00);
Generic_Short_Write_1P(0x25,0x00);
Generic_Short_Write_1P(0x26,0x00);
Generic_Short_Write_1P(0x27,0x00);
Generic_Short_Write_1P(0x28,0x33);
Generic_Short_Write_1P(0x29,0x03);
Generic_Short_Write_1P(0x2a,0x00);
Generic_Short_Write_1P(0x2b,0x00);
Generic_Short_Write_1P(0x2c,0x00);
Generic_Short_Write_1P(0x2d,0x00);
Generic_Short_Write_1P(0x2e,0x00);
Generic_Short_Write_1P(0x2f,0x00);
Generic_Short_Write_1P(0x30,0x00);
Generic_Short_Write_1P(0x31,0x00);
Generic_Short_Write_1P(0x32,0x00);
Generic_Short_Write_1P(0x33,0x00);
Generic_Short_Write_1P(0x34,0x04);
Generic_Short_Write_1P(0x35,0x00);
Generic_Short_Write_1P(0x36,0x00);
Generic_Short_Write_1P(0x37,0x00);
Generic_Short_Write_1P(0x38,0x3C);
Generic_Short_Write_1P(0x39,0x35);
Generic_Short_Write_1P(0x3a,0x01);
Generic_Short_Write_1P(0x3b,0x40);
Generic_Short_Write_1P(0x3c,0x00);
Generic_Short_Write_1P(0x3d,0x01);
Generic_Short_Write_1P(0x3e,0x00);
Generic_Short_Write_1P(0x3f,0x00);
Generic_Short_Write_1P(0x40,0x00);
Generic_Short_Write_1P(0x41,0x88);
Generic_Short_Write_1P(0x42,0x00);
Generic_Short_Write_1P(0x43,0x00);
Generic_Short_Write_1P(0x44,0x1F);
Generic_Short_Write_1P(0x50,0x01);
Generic_Short_Write_1P(0x51,0x23);
Generic_Short_Write_1P(0x52,0x45);
Generic_Short_Write_1P(0x53,0x67);
Generic_Short_Write_1P(0x54,0x89);
Generic_Short_Write_1P(0x55,0xab);
Generic_Short_Write_1P(0x56,0x01);
Generic_Short_Write_1P(0x57,0x23);
Generic_Short_Write_1P(0x58,0x45);
Generic_Short_Write_1P(0x59,0x67);
Generic_Short_Write_1P(0x5a,0x89);
Generic_Short_Write_1P(0x5b,0xab);
Generic_Short_Write_1P(0x5c,0xcd);
Generic_Short_Write_1P(0x5d,0xef);
Generic_Short_Write_1P(0x5e,0x11);
Generic_Short_Write_1P(0x5f,0x01);
Generic_Short_Write_1P(0x60,0x00);
Generic_Short_Write_1P(0x61,0x15);
Generic_Short_Write_1P(0x62,0x14);
Generic_Short_Write_1P(0x63,0x0E);
Generic_Short_Write_1P(0x64,0x0F);
Generic_Short_Write_1P(0x65,0x0C);
Generic_Short_Write_1P(0x66,0x0D);
Generic_Short_Write_1P(0x67,0x06);
Generic_Short_Write_1P(0x68,0x02);
Generic_Short_Write_1P(0x69,0x07);
Generic_Short_Write_1P(0x6a,0x02);
Generic_Short_Write_1P(0x6b,0x02);
Generic_Short_Write_1P(0x6c,0x02);
Generic_Short_Write_1P(0x6d,0x02);
Generic_Short_Write_1P(0x6e,0x02);
Generic_Short_Write_1P(0x6f,0x02);
Generic_Short_Write_1P(0x70,0x02);
Generic_Short_Write_1P(0x71,0x02);
Generic_Short_Write_1P(0x72,0x02);
Generic_Short_Write_1P(0x73,0x02);
Generic_Short_Write_1P(0x74,0x02);
Generic_Short_Write_1P(0x75,0x01);
Generic_Short_Write_1P(0x76,0x00);
Generic_Short_Write_1P(0x77,0x14);
Generic_Short_Write_1P(0x78,0x15);
Generic_Short_Write_1P(0x79,0x0E);
Generic_Short_Write_1P(0x7a,0x0F);
Generic_Short_Write_1P(0x7b,0x0C);
Generic_Short_Write_1P(0x7c,0x0D);
Generic_Short_Write_1P(0x7d,0x06);
Generic_Short_Write_1P(0x7e,0x02);
Generic_Short_Write_1P(0x7f,0x07);
Generic_Short_Write_1P(0x80,0x02);
Generic_Short_Write_1P(0x81,0x02);
Generic_Short_Write_1P(0x82,0x02);
Generic_Short_Write_1P(0x83,0x02);
Generic_Short_Write_1P(0x84,0x02);
Generic_Short_Write_1P(0x85,0x02);
Generic_Short_Write_1P(0x86,0x02);
Generic_Short_Write_1P(0x87,0x02);
Generic_Short_Write_1P(0x88,0x02);
Generic_Short_Write_1P(0x89,0x02);
Generic_Short_Write_1P(0x8A,0x02);
Generic_Long_Write_3P(0xFF,0x98,0x81,0x04);
//Generic_Short_Write_1P(0x00,0x80);
Generic_Short_Write_1P(0x70,0x00);
Generic_Short_Write_1P(0x71,0x00);
Generic_Short_Write_1P(0x82,0x0F);
Generic_Short_Write_1P(0x84,0x0F);
Generic_Short_Write_1P(0x85,0x0D);
Generic_Short_Write_1P(0x32,0xAC);
Generic_Short_Write_1P(0x8C,0x80);
Generic_Short_Write_1P(0x3C,0xF5);
Generic_Short_Write_1P(0xB5,0x07);
Generic_Short_Write_1P(0x31,0x45);
Generic_Short_Write_1P(0x3A,0x24);
Generic_Short_Write_1P(0x88,0x33);
Generic_Long_Write_3P(0xFF,0x98,0x81,0x01);
Generic_Short_Write_1P(0x22,0x0A);
Generic_Short_Write_1P(0x31,0x00);
Generic_Short_Write_1P(0x53,0x93); // 8A VCOM1
Generic_Short_Write_1P(0x55,0xA2); // A2 VCOM2
Generic_Short_Write_1P(0x50,0x81);
Generic_Short_Write_1P(0x51,0x85);
Generic_Short_Write_1P(0x62,0x0D);
Generic_Long_Write_3P(0xFF,0x98,0x81,0x01);
Generic_Short_Write_1P(0xA0,0x00);
Generic_Short_Write_1P(0xA1,0x1A);
Generic_Short_Write_1P(0xA2,0x28);
Generic_Short_Write_1P(0xA3,0x13);
Generic_Short_Write_1P(0xA4,0x16);
Generic_Short_Write_1P(0xA5,0x29);
Generic_Short_Write_1P(0xA6,0x1D);
Generic_Short_Write_1P(0xA7,0x1E);
Generic_Short_Write_1P(0xA8,0x84);
Generic_Short_Write_1P(0xA9,0x1C);
Generic_Short_Write_1P(0xAA,0x28);
Generic_Short_Write_1P(0xAB,0x75);
Generic_Short_Write_1P(0xAC,0x1A);
Generic_Short_Write_1P(0xAD,0x19);
Generic_Short_Write_1P(0xAE,0x4D);
Generic_Short_Write_1P(0xAF,0x22);
Generic_Short_Write_1P(0xB0,0x28);
Generic_Short_Write_1P(0xB1,0x54);
Generic_Short_Write_1P(0xB2,0x66);
Generic_Short_Write_1P(0xB3,0x39);
Generic_Short_Write_1P(0xC0,0x00);
Generic_Short_Write_1P(0xC1,0x1A);
Generic_Short_Write_1P(0xC2,0x28);
Generic_Short_Write_1P(0xC3,0x13);
Generic_Short_Write_1P(0xC4,0x16);
Generic_Short_Write_1P(0xC5,0x29);
Generic_Short_Write_1P(0xC6,0x1D);
Generic_Short_Write_1P(0xC7,0x1E);
Generic_Short_Write_1P(0xC8,0x84);
Generic_Short_Write_1P(0xC9,0x1C);
Generic_Short_Write_1P(0xCA,0x28);
Generic_Short_Write_1P(0xCB,0x75);
Generic_Short_Write_1P(0xCC,0x1A);
Generic_Short_Write_1P(0xCD,0x19);
Generic_Short_Write_1P(0xCE,0x4D);
Generic_Short_Write_1P(0xCF,0x22);
Generic_Short_Write_1P(0xD0,0x28);
Generic_Short_Write_1P(0xD1,0x54);
Generic_Short_Write_1P(0xD2,0x66);
Generic_Short_Write_1P(0xD3,0x39);
Generic_Long_Write_3P(0xFF,0x98,0x81,0x00);
Generic_Short_Write_1P(0x35,0x00);
//Generic_Short_Write_1P(0x36,0x03);
// Generic_Long_Write_3P(0xFF,0x98,0x81,0x04); //BIST
//Generic_Short_Write_1P(0x2F,0x01);
DCS_Short_Write_NP(0x11);
Delay(120);
DCS_Short_Write_NP(0x29);
}
9881d_enter_sleep_code()
{
Generic_Long_Write_3P(0xFF,0x98,0x81,0x00); //page 0
DCS_Short_Write_NP(0x28); //display off
delay 10ms
DCS_Short_Write_NP(0x10); //sleep in
delay 120ms
}
9881d_exit_sleep_code()
{
Generic_Long_Write_3P(0xFF,0x98,0x81,0x00); //page 0
DCS_Short_Write_NP(0x11); // sleep out
delay 120ms
DCS_Short_Write_NP(0x29); //display on
delay 10ms
}
根据厂家提供的时序文件编辑display-timings {},时序参数如下:
一些延时相关参数厂家没有提供,如reset、init等,这个可根据官方文档的建议设置,如果不成功再做些调整。
编辑完成的dtsi文件:
/*
* Copyright (C) 2018 9tripod, Inc.
* arch/arm/boot/dts/lcd-mipi720x1280-KLD50225HHMB.dtsi
* lcd model: KLD50225HHMB
* resolution: 720x1280
* mipi channel: single
*/
&dsi {
status = "okay";
rockchip,line-rate = <550>;
panel@0 {
compatible = "sitronix,ILI9881D", "simple-panel-dsi";
reg = <0>;
power-supply = <&vcc3v3_lcd>;
backlight = <&backlight>;
//backlight = <&pwm_bl>;
reset-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
prepare-delay-ms = <100>;
reset-delay-ms = <220>;
init-delay-ms = <120>;
enable-delay-ms = <120>;
disable-delay-ms = <100>;
unprepare-delay-ms = <120>;
width-mm = <62>;
height-mm = <110>;
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>;
panel-init-sequence = [
39 00 04 FF 98 81 03
15 00 02 01 00
15 00 02 02 00
15 00 02 03 73
15 00 02 04 00
15 00 02 05 00
15 00 02 06 0A
15 00 02 07 00
15 00 02 08 00
15 00 02 09 01
15 00 02 0A 00
15 00 02 0B 00
15 00 02 0C 01
15 00 02 0D 00
15 00 02 0E 00
15 00 02 0F 1D
15 00 02 10 1D
15 00 02 11 00
15 00 02 12 00
15 00 02 13 00
15 00 02 14 00
15 00 02 15 00
15 00 02 16 00
15 00 02 17 00
15 00 02 18 00
15 00 02 19 00
15 00 02 1A 00
15 00 02 1B 00
15 00 02 1C 00
15 00 02 1D 00
15 00 02 1E 40
15 00 02 1F 80
15 00 02 20 06
15 00 02 21 02
15 00 02 22 00
15 00 02 23 00
15 00 02 24 00
15 00 02 25 00
15 00 02 26 00
15 00 02 27 00
15 00 02 28 33
15 00 02 29 03
15 00 02 2A 00
15 00 02 2B 00
15 00 02 2C 00
15 00 02 2D 00
15 00 02 2E 00
15 00 02 2F 00
15 00 02 30 00
15 00 02 31 00
15 00 02 32 00
15 00 02 33 00
15 00 02 34 04
15 00 02 35 00
15 00 02 36 00
15 00 02 37 00
15 00 02 38 3C
15 00 02 39 35
15 00 02 3A 01
15 00 02 3B 40
15 00 02 3C 00
15 00 02 3D 01
15 00 02 3E 00
15 00 02 3F 00
15 00 02 40 00
15 00 02 41 88
15 00 02 42 00
15 00 02 43 00
15 00 02 44 1F
15 00 02 50 01
15 00 02 51 23
15 00 02 52 45
15 00 02 53 67
15 00 02 54 89
15 00 02 55 AB
15 00 02 56 01
15 00 02 57 23
15 00 02 58 45
15 00 02 59 67
15 00 02 5A 89
15 00 02 5B AB
15 00 02 5C CD
15 00 02 5D EF
15 00 02 5E 11
15 00 02 5F 01
15 00 02 60 00
15 00 02 61 15
15 00 02 62 14
15 00 02 63 0E
15 00 02 64 0F
15 00 02 65 0C
15 00 02 66 0D
15 00 02 67 06
15 00 02 68 02
15 00 02 69 07
15 00 02 6A 02
15 00 02 6B 02
15 00 02 6C 02
15 00 02 6D 02
15 00 02 6E 02
15 00 02 6F 02
15 00 02 70 02
15 00 02 71 02
15 00 02 72 02
15 00 02 73 02
15 00 02 74 02
15 00 02 75 01
15 00 02 76 00
15 00 02 77 14
15 00 02 78 15
15 00 02 79 0E
15 00 02 7A 0F
15 00 02 7B 0C
15 00 02 7C 0D
15 00 02 7D 06
15 00 02 7E 02
15 00 02 7F 07
15 00 02 80 02
15 00 02 81 02
15 00 02 82 02
15 00 02 83 02
15 00 02 84 02
15 00 02 85 02
15 00 02 86 02
15 00 02 87 02
15 00 02 88 02
15 00 02 89 02
15 00 02 8A 02
39 00 04 FF 98 81 04
15 00 02 70 00
15 00 02 71 00
15 00 02 82 0F
15 00 02 84 0F
15 00 02 85 0D
15 00 02 32 AC
15 00 02 8C 80
15 00 02 3C F5
15 00 02 B5 07
15 00 02 31 45
15 00 02 3A 24
15 00 02 88 33
39 00 04 FF 98 81 01
15 00 02 22 0A
15 00 02 31 00
15 00 02 53 93
15 00 02 55 A2
15 00 02 50 81
15 00 02 51 85
15 00 02 62 0D
39 00 04 FF 98 81 01
15 00 02 A0 00
15 00 02 A1 1A
15 00 02 A2 28
15 00 02 A3 13
15 00 02 A4 16
15 00 02 A5 29
15 00 02 A6 1D
15 00 02 A7 1E
15 00 02 A8 84
15 00 02 A9 1C
15 00 02 AA 28
15 00 02 AB 75
15 00 02 AC 1A
15 00 02 AD 19
15 00 02 AE 4D
15 00 02 AF 22
15 00 02 B0 28
15 00 02 B1 54
15 00 02 B2 66
15 00 02 B3 39
15 00 02 C0 00
15 00 02 C1 1A
15 00 02 C2 28
15 00 02 C3 13
15 00 02 C4 16
15 00 02 C5 29
15 00 02 C6 1D
15 00 02 C7 1E
15 00 02 C8 84
15 00 02 C9 1C
15 00 02 CA 28
15 00 02 CB 75
15 00 02 CC 1A
15 00 02 CD 19
15 00 02 CE 4D
15 00 02 CF 22
15 00 02 D0 28
15 00 02 D1 54
15 00 02 D2 66
15 00 02 D3 39
39 00 04 FF 98 81 00
15 00 02 35 00
/* 39 00 04 FF 98 81 04 */
/* 15 00 02 2F 01 */
05 78 01 11
05 00 01 29
];
panel-exit-sequence = [
];
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <65000000>;
hactive = <720>;
vactive = <1280>;
hfront-porch = <50>;
hsync-len = <8>;
hback-porch = <50>;
vfront-porch = <30>;
vsync-len = <8>;
vback-porch = <30>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
swap-rb = <0>;
swap-rg = <0>;
swap-gb = <0>;
};
};
};
};
&dsi_in_vopl {
status = "disabled";
};
&dsi_in_vopb {
status = "okay";
};
&route_dsi {
status = "okay";
};
&mipi_dphy {
status = "okay";
};
将lcd-mipi720x1280-KLD50225HHMB.dtsi加入x30.dts文件中:
#include "lcd-mipi720x1280-KLD50225HHMB.dtsi" //5 inch mipi 720*1280
还需在x30.dts文件中加入backlight设置:
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm1 0 25000 1>;
enable-gpios = <&gpio3 6 GPIO_ACTIVE_HIGH>;
//pinctrl-names = "default";
//pinctrl-0 = <&bl_en>;
brightness-levels = <
0 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
80 81 82 83 84 85 86 87
88 89 90 91 92 93 94 95
96 97 98 99 100 101 102 103
104 105 106 107 108 109 110 111
112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127
128 129 130 131 132 133 134 135
136 137 138 139 140 141 142 143
144 145 146 147 148 149 150 151
152 153 154 155 156 157 158 159
160 161 162 163 164 165 166 167
168 169 170 171 172 173 174 175
176 177 178 179 180 181 182 183
184 185 186 187 188 189 190 191
192 193 194 195 196 197 198 199
200 201 202 203 204 205 206 207
208 209 210 211 212 213 214 215
216 217 218 219 220 221 222 223
224 225 226 227 228 229 230 231
232 233 234 235 236 237 238 239
240 241 242 243 244 245 246 247
248 249 250 251 252 253 254 255>;
default-brightness-level = <200>;
};
pwms 的第4个参数为1表示背光为负极性。
点亮之后的效果如下:
rockchip linux 5.0寸mipi液晶调试完成后的效果