RK3568 MIPI驱动JD9365A触摸屏调试过程

1、8寸触摸屏介绍

8寸触摸屏由深圳天显微供应,显示像素为800*1280,全彩色竖屏,驱动芯片为JD9365A,显示屏幕接口为MIPI接口。触摸屏为电容屏,I2C接口,电容屏芯片使用的是GT911芯片。

2、显示驱动调试

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 = <MIPI_DSI_FMT_RGB888>;
        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这些信号是否正常。我遇到的问题就是这些屏幕的排线容易松,导致调试了半天,原来是线松了,屏不亮。

最后放出显示的效果图:屏幕的显示效果还是不错的。

3、触摸屏驱动调试

其实上面屏幕显示的调试还是挺顺利的,没有遇到太多的难题,可能是我前其他学习了关于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 = <RK_PD6 IRQ_TYPE_LEVEL_LOW>;
        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设备树时,芯片产生了中断,所以定位到是厂家提供的配置序列有问题。后来又与厂家沟通,让其提供新的配置序列信息后,屏幕的触摸功能就正常了。

猜你喜欢

转载自blog.csdn.net/fhqlongteng/article/details/129155747