8寸触摸屏由深圳天显微供应,显示像素为800*1280,全彩色竖屏,驱动芯片为JD9365A,显示屏幕接口为MIPI接口。触摸屏为电容屏,I2C接口,电容屏芯片使用的是GT911芯片。
MIPI接口的屏的调试主要是把屏幕的接口时序参数写入到设备树中去。由于RK3568芯片的SDK工程中带有一个驱动10寸屏的示例,主要的工作就是对原有设备树的修改。当然为了你能成功修改设备,了解学习一些LCD显示器驱动参数的知识还是必不可少的,比如:水平同步信号宽度,垂直同步信号宽度等这些参数,这些知识可以自行学习。下面的这段代码是屏幕厂家提供的一个驱动程序示例,有了示例后对于修改设备树就有很大帮助。第4行-第12行就是屏幕的一些显示时序参数,记录把这些参数改到设备树中即可。第27行以后是屏幕上电后要对内部寄存器进行的一些初始化操作,对于MIPI屏接口,要把这些初始化操作改成使用MIPI命令来写入。关于MIPI的初始化命令这里做个简单的介绍,初始化命令由命令类型(0x15写入双字节数据,0x39写入多字节数据,0x05写入单字节数据),延时(1个字节),数据长度(写入的数据长度),数据内容(写入的数据内容)。对于下图中第27行{0xE0,1,{0x00}},转化成MIPI的初始化命令就是15 0A 02 E0 00。
// Width - 800
// Height - 1280
params->dsi.vertical_sync_active=4
params->dsi.vertical_backporch=28
params->dsi.vertical_frontporch=30
params->dsi.horizontal_sync_active=20
params->dsi.horizontal_backporch=20
params->dsi.horizontal_frontporch=40
params->dsi.PLL_CLOCK=220Mbps
params->PCLK=71Mhz
LCD_nReset=1;
Delayms(20);
LCD_nReset=0;
Delayms(50);
LCD_nReset=1;
Delayms(120);
{REGFLAG_DELAY,10,{}},
//JD9365DA-H3+BOE8.0IPS(TV080WXQ-N88)_4line_20211012
//0xE0寄存器地址, 0x01数据个数, 0x00寄存器写入数据
{0xE0,1,{0x00}},
{0xE1,1,{0x93}},
{0xE2,1,{0x65}},
{0xE3,1,{0xF8}},
{0x80,1,{0x03}},
{0xE0,1,{0x01}},
{0x00,1,{0x00}},
{0x01,1,{0x72}},
{0x03,1,{0x00}},
{0x04,1,{0x80}},
{0x17,1,{0x00}},
{0x18,1,{0xAF}},
{0x19,1,{0x00}},
{0x1A,1,{0x00}},
{0x1B,1,{0xAF}},
{0x1C,1,{0x00}},
{0x24,1,{0xFE}},
{0x37,1,{0x19}},
{0x38,1,{0x05}},
{0x39,1,{0x00}},
{0x3A,1,{0x01}},
{0x3B,1,{0x01}},
{0x3C,1,{0x70}},
{0x3D,1,{0xFF}},
{0x3E,1,{0xFF}},
{0x3F,1,{0xFF}},
{0x40,1,{0x06}},
{0x41,1,{0xA0}},
{0x43,1,{0x1E}},
{0x44,1,{0x10}},
{0x45,1,{0x28}},
{0x4B,1,{0x04}},
{0x55,1,{0x02}},
{0x56,1,{0x01}},
{0x57,1,{0xA9}},
{0x58,1,{0x0A}},
{0x59,1,{0x0A}},
{0x5A,1,{0x37}},
{0x5B,1,{0x1A}},
{0x5D,1,{0x7F}},
{0x5E,1,{0x6A}},
{0x5F,1,{0x5B}},
{0x60,1,{0x50}},
{0x61,1,{0x4D}},
{0x62,1,{0x3F}},
{0x63,1,{0x44}},
{0x64,1,{0x2E}},
{0x65,1,{0x49}},
{0x66,1,{0x48}},
{0x67,1,{0x48}},
{0x68,1,{0x66}},
{0x69,1,{0x54}},
{0x6A,1,{0x5A}},
{0x6B,1,{0x4C}},
{0x6C,1,{0x44}},
{0x6D,1,{0x37}},
{0x6E,1,{0x23}},
{0x6F,1,{0x10}},
{0x70,1,{0x7F}},
{0x71,1,{0x6A}},
{0x72,1,{0x5B}},
{0x73,1,{0x50}},
{0x74,1,{0x4D}},
{0x75,1,{0x3F}},
{0x76,1,{0x44}},
{0x77,1,{0x2E}},
{0x78,1,{0x49}},
{0x79,1,{0x48}},
{0x7A,1,{0x48}},
{0x7B,1,{0x66}},
{0x7C,1,{0x54}},
{0x7D,1,{0x5A}},
{0x7E,1,{0x4C}},
{0x7F,1,{0x44}},
{0x80,1,{0x37}},
{0x81,1,{0x23}},
{0x82,1,{0x10}},
{0xE0,1,{0x02}},
{0x00,1,{0x4B}},
{0x01,1,{0x4B}},
{0x02,1,{0x49}},
{0x03,1,{0x49}},
{0x04,1,{0x47}},
{0x05,1,{0x47}},
{0x06,1,{0x45}},
{0x07,1,{0x45}},
{0x08,1,{0x41}},
{0x09,1,{0x1F}},
{0x0A,1,{0x1F}},
{0x0B,1,{0x1F}},
{0x0C,1,{0x1F}},
{0x0D,1,{0x1F}},
{0x0E,1,{0x1F}},
{0x0F,1,{0x5F}},
{0x10,1,{0x5F}},
{0x11,1,{0x57}},
{0x12,1,{0x77}},
{0x13,1,{0x35}},
{0x14,1,{0x1F}},
{0x15,1,{0x1F}},
{0x16,1,{0x4A}},
{0x17,1,{0x4A}},
{0x18,1,{0x48}},
{0x19,1,{0x48}},
{0x1A,1,{0x46}},
{0x1B,1,{0x46}},
{0x1C,1,{0x44}},
{0x1D,1,{0x44}},
{0x1E,1,{0x40}},
{0x1F,1,{0x1F}},
{0x20,1,{0x1F}},
{0x21,1,{0x1F}},
{0x22,1,{0x1F}},
{0x23,1,{0x1F}},
{0x24,1,{0x1F}},
{0x25,1,{0x5F}},
{0x26,1,{0x5F}},
{0x27,1,{0x57}},
{0x28,1,{0x77}},
{0x29,1,{0x35}},
{0x2A,1,{0x1F}},
{0x2B,1,{0x1F}},
{0x58,1,{0x40}},
{0x59,1,{0x00}},
{0x5A,1,{0x00}},
{0x5B,1,{0x10}},
{0x5C,1,{0x02}},
{0x5D,1,{0x40}},
{0x5E,1,{0x01}},
{0x5F,1,{0x02}},
{0x60,1,{0x30}},
{0x61,1,{0x01}},
{0x62,1,{0x02}},
{0x63,1,{0x03}},
{0x64,1,{0x6B}},
{0x65,1,{0x05}},
{0x66,1,{0x0C}},
{0x67,1,{0x73}},
{0x68,1,{0x06}},
{0x69,1,{0x03}},
{0x6A,1,{0x56}},
{0x6B,1,{0x08}},
{0x6C,1,{0x00}},
{0x6D,1,{0x04}},
{0x6E,1,{0x04}},
{0x6F,1,{0x88}},
{0x70,1,{0x00}},
{0x71,1,{0x00}},
{0x72,1,{0x06}},
{0x73,1,{0x7B}},
{0x74,1,{0x00}},
{0x75,1,{0xF8}},
{0x76,1,{0x00}},
{0x77,1,{0xD5}},
{0x78,1,{0x2E}},
{0x79,1,{0x12}},
{0x7A,1,{0x03}},
{0x7B,1,{0x00}},
{0x7C,1,{0x00}},
{0x7D,1,{0x03}},
{0x7E,1,{0x7B}},
{0xE0,1,{0x04}},
{0x00,1,{0x0E}},
{0x02,1,{0xB3}},
{0x09,1,{0x60}},
{0x0E,1,{0x2A}},
{0x36,1,{0x59}},
{0xE0,1,{0x00}},
{0x51,1,{0x80}},
{0x53,1,{0x2C}},
{0x55,1,{0x00}},
{0x11,1,{0x00}},
{REGFLAG_DELAY,120,{}},
{0x29,1,{0x00}},
{REGFLAG_DELAY,5,{}},
{0x35,1,{0x00}},
{REGFLAG_END_OF_TABLE,0x00,{}}
把上面的屏幕寄存器初始化操作转化成MIPI命令序列可以借助于python脚本程序来实现,具体的实现代码如下:
## 2、使用脚本转换为设备树格式,参考其他设备格式
'''
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: 多字节数据)
'''
def gen(path):
f=open(path,'r')
lines=f.readlines()
f.close()
# {REGFLAG_DELAY, 10, {}},
# {0xE0, 1, {0x00}},
delay=0
for line in lines:
if line.find('{REGFLAG_DELAY')==0:
ds=line.split(',')
# print('=========%s'%ds[1])
# print(ds)
# print(ds[1])
delay=int(ds[1])
# print(delay)
elif line.find("{0x")==0:
ds=line.split(',')
reg=ds[0].split('0x')[1]
dat=ds[2].split('{0x')[1].split('}')[0]
# print("reg:%s delay:%2.2x data:%s"%(reg,dly,dat))
print("15 %2.2X 02 %s %s"%(delay,reg,dat))
delay=0
gen(r'C_JD9365DA-H3_BOE8.0_IPS(TV080WXQ-N88)_800x1280_2power_ZigZag_G2.2_210630_johnson.txt')
根据上面厂家提供的驱动程序示例和JD9365的数据手册中一些上电时序就可以写出RK3568的设备树,此屏幕设备树配置如下:其中enable-delay-ms,reset-delay-ms等可以查看JD9365的数据手册,有些时间参数找不到,可以使用原来设备树中的默认参数。屏幕使用的enable-gpios和reset-gpios,还有PWM背光可以根据自己的实际电路设计进行修改。屏幕的退出序列panel-exit-sequence,厂家没有提供,所以就是原来设备树的序列,没有删除保留。
&dsi0 {
status = "okay";
//rockchip,lane-rate = <1000>;
dsi0_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
reg = <0>;
backlight = <&backlight_0>;
enable-gpios = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
enable-delay-ms = <35>;
prepare-delay-ms = <6>;
reset-delay-ms = <25>;
init-delay-ms = <130>;
unprepare-delay-ms = <0>;
disable-delay-ms = <20>;
mipi-data-delay-ms = <200>;
size,width = <107>;
size,height = <172>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
dsi,format = ;
dsi,lanes = <4>;
/*JD9365A寄存器初始操作, 0x15命令类型,单字节数据, 第2个字节为延时, 第3个字节为数据长度,第4,5个字节为数据表示寄存器地址和写入的数据 */
panel-init-sequence = [
15 0A 02 E0 00
15 00 02 E1 93
15 00 02 E2 65
15 00 02 E3 F8
15 00 02 80 03
15 00 02 E0 01
15 00 02 00 00
15 00 02 01 72
15 00 02 03 00
15 00 02 04 80
15 00 02 17 00
15 00 02 18 AF
15 00 02 19 00
15 00 02 1A 00
15 00 02 1B AF
15 00 02 1C 00
15 00 02 24 FE
15 00 02 37 19
15 00 02 38 05
15 00 02 39 00
15 00 02 3A 01
15 00 02 3B 01
15 00 02 3C 70
15 00 02 3D FF
15 00 02 3E FF
15 00 02 3F FF
15 00 02 40 06
15 00 02 41 A0
15 00 02 43 1E
15 00 02 44 10
15 00 02 45 28
15 00 02 4B 04
15 00 02 55 02
15 00 02 56 01
15 00 02 57 A9
15 00 02 58 0A
15 00 02 59 0A
15 00 02 5A 37
15 00 02 5B 1A
15 00 02 5D 7F
15 00 02 5E 6A
15 00 02 5F 5B
15 00 02 60 50
15 00 02 61 4D
15 00 02 62 3F
15 00 02 63 44
15 00 02 64 2E
15 00 02 65 49
15 00 02 66 48
15 00 02 67 48
15 00 02 68 66
15 00 02 69 54
15 00 02 6A 5A
15 00 02 6B 4C
15 00 02 6C 44
15 00 02 6D 37
15 00 02 6E 23
15 00 02 6F 10
15 00 02 70 7F
15 00 02 71 6A
15 00 02 72 5B
15 00 02 73 50
15 00 02 74 4D
15 00 02 75 3F
15 00 02 76 44
15 00 02 77 2E
15 00 02 78 49
15 00 02 79 48
15 00 02 7A 48
15 00 02 7B 66
15 00 02 7C 54
15 00 02 7D 5A
15 00 02 7E 4C
15 00 02 7F 44
15 00 02 80 37
15 00 02 81 23
15 00 02 82 10
15 00 02 E0 02
15 00 02 00 4B
15 00 02 01 4B
15 00 02 02 49
15 00 02 03 49
15 00 02 04 47
15 00 02 05 47
15 00 02 06 45
15 00 02 07 45
15 00 02 08 41
15 00 02 09 1F
15 00 02 0A 1F
15 00 02 0B 1F
15 00 02 0C 1F
15 00 02 0D 1F
15 00 02 0E 1F
15 00 02 0F 5F
15 00 02 10 5F
15 00 02 11 57
15 00 02 12 77
15 00 02 13 35
15 00 02 14 1F
15 00 02 15 1F
15 00 02 16 4A
15 00 02 17 4A
15 00 02 18 48
15 00 02 19 48
15 00 02 1A 46
15 00 02 1B 46
15 00 02 1C 44
15 00 02 1D 44
15 00 02 1E 40
15 00 02 1F 1F
15 00 02 20 1F
15 00 02 21 1F
15 00 02 22 1F
15 00 02 23 1F
15 00 02 24 1F
15 00 02 25 5F
15 00 02 26 5F
15 00 02 27 57
15 00 02 28 77
15 00 02 29 35
15 00 02 2A 1F
15 00 02 2B 1F
15 00 02 58 40
15 00 02 59 00
15 00 02 5A 00
15 00 02 5B 10
15 00 02 5C 02
15 00 02 5D 40
15 00 02 5E 01
15 00 02 5F 02
15 00 02 60 30
15 00 02 61 01
15 00 02 62 02
15 00 02 63 03
15 00 02 64 6B
15 00 02 65 05
15 00 02 66 0C
15 00 02 67 73
15 00 02 68 06
15 00 02 69 03
15 00 02 6A 56
15 00 02 6B 08
15 00 02 6C 00
15 00 02 6D 04
15 00 02 6E 04
15 00 02 6F 88
15 00 02 70 00
15 00 02 71 00
15 00 02 72 06
15 00 02 73 7B
15 00 02 74 00
15 00 02 75 F8
15 00 02 76 00
15 00 02 77 D5
15 00 02 78 2E
15 00 02 79 12
15 00 02 7A 03
15 00 02 7B 00
15 00 02 7C 00
15 00 02 7D 03
15 00 02 7E 7B
15 00 02 E0 04
15 00 02 00 0E
15 00 02 02 B3
15 00 02 09 60
15 00 02 0E 2A
15 00 02 36 59
15 00 02 E0 00
15 00 02 51 80
15 00 02 53 2C
15 00 02 55 00
15 00 02 11 00
15 78 02 29 00
15 05 02 35 00
];
panel-exit-sequence = [
05 00 01 28
05 00 01 10
];
disp_timings0: display-timings {
native-mode = <&dsi0_timing0>;
dsi0_timing0: timing0 {
clock-frequency = <71000000>;//时钟频率(hactive+ hsync-len + hfront-porch + hback-porch)*(vactive + vsync-len + vfront-porch + vback-porch) * Frame rate60Hz = 70857600
hactive = <800>; //水平像素点数
vactive = <1280>; //垂直像素点数
hsync-len = <20>; //水平同步信号宽度HSYNC/thp
hback-porch = <20>; //水平同步后肩
hfront-porch = <40>;//水平同步前肩
vsync-len = <4>; //垂直同步信号宽度VSYNC/tvp
vback-porch = <28>; //垂直同步后肩
vfront-porch = <30>;//垂直同步前肩
hsync-active = <0>; //hsync激活有效电平为低电平
vsync-active = <0>; //vsync激活有效电平为低电平
de-active = <0>; //de激活有效电平为低电平
pixelclk-active = <0>; //pixelclk激活有效电平为低电平
};
};
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>;
};
};
};
};
修改好设备树后,启动RK3568 LINUX操作系统,屏幕就应该亮了,能显示出来。如果不显示,请检查一下硬件电路,用示波器测量一下enable-gpio, reset-gpio,pwm这些信号是否正常。我遇到的问题就是这些屏幕的排线容易松,导致调试了半天,原来是线松了,屏不亮。
最后放出显示的效果图:屏幕的显示效果还是不错的。
其实上面屏幕显示的调试还是挺顺利的,没有遇到太多的难题,可能是我前其他学习了关于MIPI屏调试的大量知识与文章。本以为触摸屏的调试应该很简单,就是一个I2C接口芯片,有什么难的,LINUX驱动程序中也有。结果事与愿违,还真遇到了问题。
触摸屏硬件接口就是复位信号,中断信号,I2C时钟信号,I2C数据信号,触摸屏供电信号(我的电路供电没有控制信号)。设备树相对简单了很多。如下:GT911芯片的I2C 7位器件地址为0x5D,这个要根据屏幕厂家的电路设计来确定,复位信号,中断信号根据实现的设计的电路来进行修改。下图中nterrupt-parent,interrupts,mac-x, max-y这四个节点是不被gt911驱动程序解析的,不写也可以,这里写上是当个注释来使用了。flip-x,flip-y对是触摸的点对X,Y轴镜像使用的,0为不镜像,1为镜像。一般设备树中要对屏幕的像素等信息进行设备,GT911的设备树中这些信息是通过goodix,cfg-group0来设置的。goodix,cfg-group0的这组序列可以让屏幕厂家来提供,自己有些参数很难调试出来。
&i2c1 {
status = "okay";
clock-frequency = <100000>;
goodix_ts@5d {
status = "okay";
compatible = "goodix,gt9xx";
reg = <0x5d>;
interrupt-parent=<&gpio2>;
interrupts = ;
pinctrl-names = "default";
pinctrl-0 = <&touch_gpio>;
goodix,rst-gpio = <&gpio0 RK_PB5 GPIO_ACTIVE_LOW>;
goodix,irq-gpio = <&gpio2 RK_PD6 IRQ_TYPE_LEVEL_LOW>;
max-x = <800>;
max-y = <1280>;
flip-x = <0>;
flip-y = <0>;
//config is the 800*1280
goodix,cfg-group0 =[
42 20 03 00 05 05 05 00 01 08 28 0F 50 3C 03 05 00 00 00 00 00 00
00 18 1A 1E 14 8B 2B 0E 55 57 B2 04 00 00 00 42 32 1D 00 01 00 00
00 03 00 00 00 46 1E 3C 78 94 05 02 07 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 1C 1A 18 16 14 12 10 0E 0C 0A 08 06 04 02 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 02 04 06 08 0A 0C 0F 10 12 13 16
18 1C 1D 1E 1F 20 21 22 24 26 FF FF FF FF 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 52 01];
};
};
当然你要想深入了解goodix,cfg-group0中这些参数的功能的话,可以查看GT911的数据手册,这参数是写入芯片内部寄存器0x8047开始的寄存器值,如下图GT911编程手册。有些屏幕的内部了的调
我在调试触摸屏幕的过程中遇到的问题是触摸芯片不产生中断,经过检测硬件,软件和不断调试,偶然发现在使用其他芯片设备树中GT911设备树时,芯片产生了中断,所以定位到是厂家提供的配置序列有问题。后来又与厂家沟通,让其提供新的配置序列信息后,屏幕的触摸功能就正常了。