驱动一个mipi接口的屏幕


Chapter0 驱动一个mipi接口的屏幕

原文链接:https://blog.csdn.net/weixin_45281309/article/details/134298744

Mipi屏幕的驱动
mipi屏幕驱动步骤:
电路设计、确定时序、上电验证

一、电路设计

原理图:这里主要是R4电阻的确定,根据MP3302数据手册和屏幕的数据手册得到屏幕背光led的额定电流,用MP3302DJ这颗IC做恒流驱动。
在这里插入图片描述
PCB:唯一注意的地方就是mipi需要做100Ω的差分等长布线,预留测时序的接口P1。
在这里插入图片描述

二、时序确定

mipi接口的屏幕在初始化时需要根据厂家给的时序进行改写到设备树中,具体改写过程不做赘述,参考链接:
Mipi屏幕驱动1
Mipi屏幕驱动2

通常厂家给的格式如下:(伪代码)

SSD_SEND(0x01,0xE0,0xAB,0xBA);
SSD_SEND(0x01,0xE1,0xBA,0xAB);
SSD_SEND(0x01,0xB1,0x10,0x01,0x47,0xFF);
SSD_SEND(0x01,0xB2,0x0C,0x14,0x04,0x50,0x50,0x14);
SSD_SEND(0x01,0xB3,0x56,0x53,0x00);
SSD_SEND(0x01,0xB4,0x33,0x30,0x04);
SSD_SEND(0x01,0xB6,0xB0,0x00,0x00,0x10,0x00,0x10,0x00);
SSD_SEND(0x01,0xB8,0x05,0x12,0x29,0x49,0x48);
SSD_SEND(0x01,0xB9,0x7C,0x65,0x55,0x49,0x46,0x36,0x3B,0x24,0x3D,0x3C,0x3D,0x5C,0x4C,0x55,0x47,0x46,0x39,0x26,0x06,0x7C,0x65,0x55,0x49,0x46,0x36,0x3B,0x24,0x3D,0x3C,0x3D,0x5C,0x4C,0x55,0x47,0x46,0x39,0x26,0x06);
SSD_SEND(0x01,0xC0,0xFF,0x87,0x12,0x34,0x44,0x44,0x44,0x44,0x98,0x04,0x98,0x04,0x0F,0x00,0x00,0xC1);
SSD_SEND(0x01,0xC1,0x54,0x94,0x02,0x85,0x9F,0x00,0x7F,0x00,0x54,0x00);
SSD_SEND(0x01,0xC2,0x17,0x09,0x08,0x89,0x08,0x11,0x22,0x20,0x44,0xFF,0x18,0x00);
SSD_SEND(0x01,0xC3,0x86,0x46,0x05,0x05,0x1C,0x1C,0x1D,0x1D,0x02,0x1F,0x1F,0x1E,0x1E,0x0F,0x0F,0x0D,0x0D,0x13,0x13,0x11,0x11,0x00);
SSD_SEND(0x01,0xC4,0x07,0x07,0x04,0x04,0x1C,0x1C,0x1D,0x1D,0x02,0x1F,0x1F,0x1E,0x1E,0x0E,0x0E,0x0C,0x0C,0x12,0x12,0x10,0x10,0x00);
SSD_SEND(0x01,0xC6,0x2A,0x2A);
SSD_SEND(0x01,0xC8,0x21,0x00,0x31,0x42,0x34,0x16);
SSD_SEND(0x01,0xCA,0xCB,0x43);
SSD_SEND(0x01,0xCD,0x0E,0x4B,0x4B,0x20,0x19,0x6B,0x06,0xB3);
SSD_SEND(0x01,0xD2,0xE3,0x2B,0x38,0x00);
SSD_SEND(0x01,0xD4,0x00,0x01,0x00,0x0E,0x04,0x44,0x08,0x10,0x00,0x00,0x00);
SSD_SEND(0x01,0xE6,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);
SSD_SEND(0x01,0xF0,0x12,0x03,0x20,0x00,0xFF);
SSD_SEND(0x01,0xF3,0x00);

DCS_Short_Write_NP(0x11);
Delay(750);//delay 150ms
DCS_Short_Write_NP(0x29);
Delay(100);//delay 20ms

目前的改写都是需要自己一一改写,本文借助Chatgpt写了一个自动转换的代码,实际上是一个文本处理程序,为了节省时间,仅实现多余三个参数的情况,1个参数和2个参数还有延时的情况需要自己添加。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void convert(const char *input) {
    const char *ptr = input;
    int arg_count = 0;

    // Look for "SSD_SEND(" in the input
    ptr = strstr(input, "SSD_SEND(");

    if (ptr != NULL) {
        // Move the pointer to the end of "SSD_SEND("
        ptr += 8;

        // Print the initial part (39 00)
        printf("39 00 ");

        // Count the number of arguments
        while (*ptr != '\0' && *ptr != ')') {
            if (*ptr == '0' && *(ptr + 1) == 'x') {
                // Skip "0x" and the hexadecimal digits
                ptr += 2;
                while ((*ptr >= '0' && *ptr <= '9') || (*ptr >= 'A' && *ptr <= 'F')) {
                    ptr++;
                }
                arg_count++;
            }
            ptr++;
        }

        // Print the argument count as a hexadecimal character
        printf("%02X", arg_count-1);

        // Print a space
        printf(" ");
    } else {
        printf("SSD_SEND not found in input.");
        return;
    }

    // Parse and print the arguments
    ptr = strstr(input, "0x");
    int first = 1;
    while (ptr != NULL) {
        if (!first) {
            // Convert the hexadecimal string to an integer
            int value = (int)strtol(ptr, (char **)&ptr, 16);
            // Print the value as a hexadecimal character
            printf("%02X ", value);
        } else {
            first = 0;
            // Skip "0x" and the hexadecimal digits
            ptr += 2;
            while ((*ptr >= '0' && *ptr <= '9') || (*ptr >= 'A' && *ptr <= 'F')) {
                ptr++;
            }
        }
        // Look for the next "0x" occurrence
        ptr = strstr(ptr, "0x");
    }

    printf("\n");
}
void splitText(const char *text, char *line) {
    const char *delimiter = ";"; // 按分号分割
    const char *ptr = text;

    while (*ptr != '\0') {
        if (*ptr == ';') {
            strcat(line, ";"); // 追加分号
            strcat(line, "\n"); // 添加换行符
        } else {
            strncat(line, ptr, 1);
        }
        ptr++;
    }
}
int main() {

    const char *text = "SSD_SEND(0x01,0xE0,0xAB,0xBA);"
                       "SSD_SEND(0x01,0xE1,0xBA,0xAB);"
                       "SSD_SEND(0x01,0xB1,0x10,0x01,0x47,0xFF);"
                       "SSD_SEND(0x01,0xB2,0x0C,0x14,0x04,0x50,0x50,0x14);"
                       "SSD_SEND(0x01,0xB3,0x56,0x53,0x00);"
                       "SSD_SEND(0x01,0xB4,0x33,0x30,0x04);"
                       "SSD_SEND(0x01,0xB6,0xB0,0x00,0x00,0x10,0x00,0x10,0x00);"
                       "SSD_SEND(0x01,0xB8,0x05,0x12,0x29,0x49,0x48);"
                       "SSD_SEND(0x01,0xB9,0x7C,0x65,0x55,0x49,0x46,0x36,0x3B,0x24,0x3D,0x3C,0x3D,0x5C,0x4C,0x55,0x47,0x46,0x39,0x26,0x06,0x7C,0x65,0x55,0x49,0x46,0x36,0x3B,0x24,0x3D,0x3C,0x3D,0x5C,0x4C,0x55,0x47,0x46,0x39,0x26,0x06);"
                       "SSD_SEND(0x01,0xC0,0xFF,0x87,0x12,0x34,0x44,0x44,0x44,0x44,0x98,0x04,0x98,0x04,0x0F,0x00,0x00,0xC1);"
                       "SSD_SEND(0x01,0xC1,0x54,0x94,0x02,0x85,0x9F,0x00,0x7F,0x00,0x54,0x00);"
                       "SSD_SEND(0x01,0xC2,0x17,0x09,0x08,0x89,0x08,0x11,0x22,0x20,0x44,0xFF,0x18,0x00);"
                       "SSD_SEND(0x01,0xC3,0x86,0x46,0x05,0x05,0x1C,0x1C,0x1D,0x1D,0x02,0x1F,0x1F,0x1E,0x1E,0x0F,0x0F,0x0D,0x0D,0x13,0x13,0x11,0x11,0x00);"
                       "SSD_SEND(0x01,0xC4,0x07,0x07,0x04,0x04,0x1C,0x1C,0x1D,0x1D,0x02,0x1F,0x1F,0x1E,0x1E,0x0E,0x0E,0x0C,0x0C,0x12,0x12,0x10,0x10,0x00);"
                       "SSD_SEND(0x01,0xC6,0x2A,0x2A);"
                       "SSD_SEND(0x01,0xC8,0x21,0x00,0x31,0x42,0x34,0x16);"
                       "SSD_SEND(0x01,0xCA,0xCB,0x43);"
                       "SSD_SEND(0x01,0xCD,0x0E,0x4B,0x4B,0x20,0x19,0x6B,0x06,0xB3);"
                       "SSD_SEND(0x01,0xD2,0xE3,0x2B,0x38,0x00);"
                       "SSD_SEND(0x01,0xD4,0x00,0x01,0x00,0x0E,0x04,0x44,0x08,0x10,0x00,0x00,0x00);"
                       "SSD_SEND(0x01,0xE6,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);"
                       "SSD_SEND(0x01,0xF0,0x12,0x03,0x20,0x00,0xFF);"
                       ;

    char all[50000] = ""; // 初始化line

    splitText(text, all);

    // printf("%s", all); // 输出分割后的文本

    const char *delimiter = "\n";
    char *line = strtok(all, delimiter);

    while (line != NULL) {
        convert(line);
        line = strtok(NULL, delimiter);
    }

    return 0;
}

运行结果如下:
在这里插入图片描述
修改后的设备树节点:

&dsi {
	status = "okay";

	rockchip,lane-rate = <480>;
	panel@0 {
		compatible = "ilitek,ili9881d", "simple-panel-dsi";
		reg = <0>;
		backlight = <&backlight>;
		power-supply = <&vcc18_lcd_n>;
		prepare-delay-ms = <5>;
		reset-delay-ms = <1>;
		init-delay-ms = <80>;
		disable-delay-ms = <10>;
		unprepare-delay-ms = <5>;

		width-mm = <68>;
		height-mm = <121>;

		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 03 E0 AB BA
			39 00 03 E1 BA AB
			39 00 05 B1 10 01 47 FF
			39 00 07 B2 0C 14 04 50 50 14
			39 00 04 B3 56 53 00
			39 00 04 B4 33 30 04
			39 00 08 B6 B0 00 00 10 00 10 00
			39 00 06 B8 05 12 29 49 48
			39 00 27 B9 7C 65 55 49 46 36 3B 24 3D 3C 3D 5C 4C 55 47 46 39 26 06 7C 65 55 49 46 36 3B 24 3D 3C 3D 5C 4C 55 47 46 39 26 06
			39 00 11 C0 FF 87 12 34 44 44 44 44 98 04 98 04 0F 00 00 C1
			39 00 0B C1 54 94 02 85 9F 00 7F 00 54 00
			39 00 0D C2 17 09 08 89 08 11 22 20 44 FF 18 00
			39 00 17 C3 86 46 05 05 1C 1C 1D 1D 02 1F 1F 1E 1E 0F 0F 0D 0D 13 13 11 11 00
			39 00 17 C4 07 07 04 04 1C 1C 1D 1D 02 1F 1F 1E 1E 0E 0E 0C 0C 12 12 10 10 00
			39 00 03 C6 2A 2A
			39 00 07 C8 21 00 31 42 34 16
			39 00 03 CA CB 43
			39 00 09 CD 0E 4B 4B 20 19 6B 06 B3
			39 00 05 D2 E3 2B 38 00
			39 00 0C D4 00 01 00 0E 04 44 08 10 00 00 00
			39 00 09 E6 80 01 FF FF FF FF FF FF
			39 00 06 F0 12 03 20 00 FF
			15 00 02 F3 00
			05 FF 01 11
			05 64 01 29
		];

		display-timings {
            native-mode = <&timing0>;
            timing0: timing0 {
                clock-frequency = <78000000>;
                hactive = <800>;
                vactive = <1280>;
                hfront-porch = <80>;
                hsync-len = <20>;
                hback-porch = <80>;
                vfront-porch = <20>;
                vsync-len = <4>;
                vback-porch = <12>;
                hsync-active = <0>;
                vsync-active = <0>;
                de-active = <0>;
                pixelclk-active = <0>;
            };

		};

        
		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;
				panel_in_dsi: endpoint {
					remote-endpoint = <&dsi_out_panel>;
				};
			};
		};
	};

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@1 {
			reg = <1>;
			dsi_out_panel: endpoint {
				remote-endpoint = <&panel_in_dsi>;
			};
		};
	};
};

三、上电验证

在这里插入图片描述
在这里插入图片描述

Chapter1 ArmSoM-W3之RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI

原文链接:https://blog.csdn.net/nb124667390/article/details/130727317

一. 简介

[RK3588从入门到精通] 专栏总目录

本文是基于RK3588平台,MIPI屏调试总结。

二. 环境介绍

硬件环境:
ArmSoM-W3 RK3588开发板、MIPI-DSI显示屏( ArmSoM官方配件 )

软件版本:
OS:ArmSoM-W3 Debian11

三. MIPI屏幕调试

3.1 调试总览,调试步骤分析
步骤 ① 先将背光点亮
步骤 ② 根据屏幕的规格书配置dsi1_panel节点
步骤 ③ 打开对应的dsi节点,开机logo
步骤 ④ 编译烧写,调试屏幕
3.2 DTS配置

#include "rk3588-evb.dtsi"   //引用了dsi1_panel 节点

3.2.1 步骤 ① 背光配置:

dsi1_backlight: dsi1-backlight {
		status = "okay";
		compatible = "pwm-backlight";
		pwms = <&pwm2 0 25000 0>;
		brightness-levels = <
			  0  20  20  21  21  22  22  23
			 23  24  24  25  25  26  26  27
			 27  28  28  29  29  30  30  31
			 31  32  32  33  33  34  34  35
			 35  36  36  37  37  38  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>;
		enable-gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&dsi1_backlight_en>;
	};

3.2.2 步骤 ② 根据datasheet配置屏幕节点:
屏幕上电初始化时序的配置教程见 RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之LCD上电初始化时序

屏幕的时序参数配置教程见 RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之屏参配置

屏幕dts配置如下:

&dsi1_panel {
	power-supply = <&vcc_lcd_mipi1>;  //使用gpio模拟regulator
	reset-gpios = <&gpio2 RK_PC1 GPIO_ACTIVE_LOW>;
	backlight = <&dsi1_backlight>;
	pinctrl-names = "default";
	pinctrl-0 = <&dsi1_lcd_rst_gpio>;

	panel-init-sequence = [
			13 00 02 B0 01
			13 00 02 C0 26
			13 00 02 C1 10
			13 00 02 C2 0E
			13 00 02 C3 00
			13 00 02 C4 00
			13 00 02 C5 23
			13 00 02 C6 11
			13 00 02 C7 22
			13 00 02 C8 20
			13 00 02 C9 1E
			13 00 02 CA 1C
			13 00 02 CB 0C
			13 00 02 CC 0A
			13 00 02 CD 08
			13 00 02 CE 06
			13 00 02 CF 18
			13 00 02 D0 02
			13 00 02 D1 00
			13 00 02 D2 00
			13 00 02 D3 00
			13 00 02 D4 26
			13 00 02 D5 0F
			13 00 02 D6 0D
			13 00 02 D7 00
			13 00 02 D8 00
			13 00 02 D9 23
			13 00 02 DA 11
			13 00 02 DB 21
			13 00 02 DC 1F
			13 00 02 DD 1D
			13 00 02 DE 1B
			13 00 02 DF 0B
			13 00 02 E0 09
			13 00 02 E1 07
			13 00 02 E2 05
			13 00 02 E3 17
			13 00 02 E4 01
			13 00 02 E5 00
			13 00 02 E6 00
			13 00 02 E7 00
			13 00 02 B0 03
			13 00 02 BE 04
			13 00 02 B9 40
			13 00 02 CC 88
			13 00 02 C8 0C
			13 00 02 C9 07
			13 00 02 CD 01
			13 00 02 CA 40
			13 00 02 CE 1A
			13 00 02 CF 60
			13 00 02 D2 08
			13 00 02 D3 08
			13 00 02 DB 01
			13 00 02 D9 06
			13 00 02 D4 00
			13 00 02 D5 01
			13 00 02 D6 04
			13 00 02 D7 03
			13 00 02 C2 00
			13 00 02 C3 0E
			13 00 02 C4 00
			13 00 02 C5 0E
			13 00 02 DD 00
			13 00 02 DE 0E
			13 00 02 E6 00
			13 00 02 E7 0E
			13 00 02 C2 00
			13 00 02 C3 0E
			13 00 02 C4 00
			13 00 02 C5 0E
			13 00 02 DD 00
			13 00 02 DE 0E
			13 00 02 E6 00
			13 00 02 E7 0E
			13 00 02 B0 06
			13 00 02 C0 A5
			13 00 02 D5 1C
			13 00 02 C0 00
			13 00 02 B0 00
			13 00 02 BD 30

			13 00 02 F9 5C
			13 00 02 C2 14
			13 00 02 C4 14
			13 00 02 BF 15
			13 00 02 C0 0C


			13 00 02 B0 00
			13 00 02 B1 79
			13 00 02 BA 8F

			05 C8 01 11
			05 32 01 29
		];

		panel-exit-sequence = [
			05 00 01 28
			05 00 01 10
		];

		disp_timings1: display-timings {    
			native-mode = <&dsi1_timing0>;
			dsi1_timing0: timing0 {
				clock-frequency = <159400000>;   //根据屏幕的时序参数表配置
				hactive = <1200>;
				vactive = <1920>;
				hfront-porch = <80>;
				hsync-len = <1>;
				hback-porch = <60>;
				vfront-porch = <35>;
				vsync-len = <1>;
				vback-porch = <25>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <1>;
			};
		};
};

3.2.3 步骤 ③ 打开对应的dsi节点,开机logo

//打开背光的pwm节点
&pwm2 {
status = “okay”;
pinctrl-names = “active”;
pinctrl-0 = <&pwm2m2_pins>;
};

//在dsi1上接了一个mipi屏,这个配置开启dsi1
&dsi1 {
status = “okay”;
};

&mipi_dcphy1 {
status = “okay”;
};

//默认dsi配置vp2和vp3上面,这里配置为dsi使用vp3,可以根据屏的分辨率来确认使用vp2还是vp3,vp2支持4K,vp3只支持 2048x1536
&dsi1_in_vp2 {
status = “disabled”;
};

&dsi1_in_vp3 {
status = “okay”;
};

//配置dsi1显示开机logo
&route_dsi1 {
status = “okay”;
connect = <&vp3_out_dsi1>;
};


3.3 调试命令
查看显示信息命令:

cat /sys/kernel/debug/dri/0/summary

四. 问题总结

调试过程中遇到的问题:一开始很久没亮,测量了电源电压和波形都正常。后来换了一组板子和屏幕做对比。最后是因为屏幕的座子没焊接好,二是接MIPI屏幕的排线太长会影响数据传输。换了一根短的线之后屏幕亮起。
在这里插入图片描述
ArmSoM 产品介绍: http://wiki.armsom.org/index.php/ArmSoM-w3
ArmSoM 技术论坛: http://forum.armsom.org/

Chapter2 RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之LCD上电初始化时序

原文链接:https://blog.csdn.net/nb124667390/article/details/130727394

一. 简介

[RK3588从入门到精通] 专栏总目录
mipi屏调试一般都要在RK平台的dts中配置屏幕上电初始化时序 :panel-init-sequence和下电初始化时序:panel-exit-sequence。本文讲解如何配置屏幕的这些初始化时序。

二. 环境介绍

硬件环境:
ArmSoM-W3 RK3588开发板、MIPI-DSI显示屏( ArmSoM官方配件 )

软件版本:
OS:ArmSoM-W3 Debian11

三. 数据类型:Data Type

3.1 常见数据类型 1 :DCS Write
注意:这里的parameter并不是指数据字节个数

0x05 命令类型: 单字节数据    (DCS Short Write, no parameters)
	
0x15 命令类型: 双字节数据    (DCS Short Write, 1 parameter)
	
0x39 命令类型: 多字节数据    (DCS Long Write, n parameters n > 2)

0x05 命令类型:(DCS Short Write, no parameters)

05 95 01 11
05 95 01 29

0x15 命令类型:(DCS Short Write, 1 parameter)

15 00 02 80 77
|  |  | |  |
|  |  | |  数据
|  |  | | 寄存器地址
|  |  数据长度
|  延时
命令类型(0x05: 单字节数据 0x15: 双字节数据 0x39: 多字节数据)
	
解析:
Data Type:0x15       ( 0x15格式的数据类型 DCS Short Write, 1 parameter)
Delay:0x00           ( 延时,表示当前 Packet 发送完成之后,需要延时多少 ms,再开始发送下一条命令 )
Payload Length:0x02  ( Packet 的有效负载长度为2 Bytes,数据字节个数为2 )
Payload: 0x80 0x77    ( Payload 数据 )

0x39 命令类型是带多个参数,大于两个参数 (DCS Long Write / write_LUT Command Packet)

39 00 06 FF 77 01 00 00 10
39 00 03 C0 63 00
39 00 03 C1 11 02	

3.2 常见数据类型 2 :Generic Write
注意:这里的parameter并不是指数据字节个数

0x03 命令类型:  单字节数据 (Generic Short Write, no parameters)
	
0x13 命令类型:  双字节数据 (Generic Short Write, 1 parameter)
	
0x23 命令类型:  三字节数据 (Generic Short Write, 2 parameters)
	
0x29 命令类型:  多字节数据 (Generic Long Write, n parameters n > 2)

四. RK平台上电初始化时序配置

屏厂给的MIPI屏初始化代码:

params->dsi.vertical_sync_active=2
params->dsi.vertical_backporch=10
params->dsi.vertical_frontporch=14
params->dsi.horizontal_sync_active=24
params->dsi.horizontal_backporch=80
params->dsi.horizontal_frontporch=60
params->dsi.PLL_CLOCK=478
 
LCD_nReset=1;
Delayms(5);
LCD_nReset=0;
Delayms(20);//10
LCD_nReset=1;
Delayms(200);//120

Generic_Short_Write_1P(0xB0,0x01);	
Generic_Short_Write_1P(0xC0,0x26);	
Generic_Short_Write_1P(0xC1,0x10);	
Generic_Short_Write_1P(0xC2,0x0E);	
Generic_Short_Write_1P(0xC3,0x00);	
Generic_Short_Write_1P(0xC4,0x00);	
Generic_Short_Write_1P(0xC5,0x23);	
Generic_Short_Write_1P(0xC6,0x11);	
Generic_Short_Write_1P(0xC7,0x22);	
Generic_Short_Write_1P(0xC8,0x20);	
Generic_Short_Write_1P(0xC9,0x1E);	
Generic_Short_Write_1P(0xCA,0x1C);	
Generic_Short_Write_1P(0xCB,0x0C);	
Generic_Short_Write_1P(0xCC,0x0A);	
Generic_Short_Write_1P(0xCD,0x08);	
Generic_Short_Write_1P(0xCE,0x06);	
Generic_Short_Write_1P(0xCF,0x18);	
Generic_Short_Write_1P(0xD0,0x02);	
Generic_Short_Write_1P(0xD1,0x00);	
Generic_Short_Write_1P(0xD2,0x00);	
Generic_Short_Write_1P(0xD3,0x00);	
Generic_Short_Write_1P(0xD4,0x26);	
Generic_Short_Write_1P(0xD5,0x0F);	
Generic_Short_Write_1P(0xD6,0x0D);	
Generic_Short_Write_1P(0xD7,0x00);	
Generic_Short_Write_1P(0xD8,0x00);	
Generic_Short_Write_1P(0xD9,0x23);	
Generic_Short_Write_1P(0xDA,0x11);	
Generic_Short_Write_1P(0xDB,0x21);	
Generic_Short_Write_1P(0xDC,0x1F);	
Generic_Short_Write_1P(0xDD,0x1D);	
Generic_Short_Write_1P(0xDE,0x1B);	
Generic_Short_Write_1P(0xDF,0x0B);	
Generic_Short_Write_1P(0xE0,0x09);	
Generic_Short_Write_1P(0xE1,0x07);	
Generic_Short_Write_1P(0xE2,0x05);	
Generic_Short_Write_1P(0xE3,0x17);	
Generic_Short_Write_1P(0xE4,0x01);	
Generic_Short_Write_1P(0xE5,0x00);	
Generic_Short_Write_1P(0xE6,0x00);	
Generic_Short_Write_1P(0xE7,0x00);	
Generic_Short_Write_1P(0xB0,0x03);	
Generic_Short_Write_1P(0xBE,0x04);	
Generic_Short_Write_1P(0xB9,0x40);	
Generic_Short_Write_1P(0xCC,0x88);	
Generic_Short_Write_1P(0xC8,0x0C);	
Generic_Short_Write_1P(0xC9,0x07);	
Generic_Short_Write_1P(0xCD,0x01);	
Generic_Short_Write_1P(0xCA,0x40);	
Generic_Short_Write_1P(0xCE,0x1A);	
Generic_Short_Write_1P(0xCF,0x60);	
Generic_Short_Write_1P(0xD2,0x08);	
Generic_Short_Write_1P(0xD3,0x08);	
Generic_Short_Write_1P(0xDB,0x01);	
Generic_Short_Write_1P(0xD9,0x06);	
Generic_Short_Write_1P(0xD4,0x00);	
Generic_Short_Write_1P(0xD5,0x01);	
Generic_Short_Write_1P(0xD6,0x04);	
Generic_Short_Write_1P(0xD7,0x03);	
Generic_Short_Write_1P(0xC2,0x00);	
Generic_Short_Write_1P(0xC3,0x0E);	
Generic_Short_Write_1P(0xC4,0x00);	
Generic_Short_Write_1P(0xC5,0x0E);	
Generic_Short_Write_1P(0xDD,0x00);	
Generic_Short_Write_1P(0xDE,0x0E);	
Generic_Short_Write_1P(0xE6,0x00);	
Generic_Short_Write_1P(0xE7,0x0E);	
Generic_Short_Write_1P(0xC2,0x00);	
Generic_Short_Write_1P(0xC3,0x0E);	
Generic_Short_Write_1P(0xC4,0x00);	
Generic_Short_Write_1P(0xC5,0x0E);	
Generic_Short_Write_1P(0xDD,0x00);	
Generic_Short_Write_1P(0xDE,0x0E);	
Generic_Short_Write_1P(0xE6,0x00);	
Generic_Short_Write_1P(0xE7,0x0E);	
Generic_Short_Write_1P(0xB0,0x06);	
Generic_Short_Write_1P(0xC0,0xA5);	
Generic_Short_Write_1P(0xD5,0x1C);	
Generic_Short_Write_1P(0xC0,0x00);	
Generic_Short_Write_1P(0xB0,0x00);
Generic_Short_Write_1P(0xBD,0x30);//VCOM	  37
	
Generic_Short_Write_1P(0xF9,0x5C);	
Generic_Short_Write_1P(0xC2,0x14);	
Generic_Short_Write_1P(0xC4,0x14);	
Generic_Short_Write_1P(0xBF,0x15);	
Generic_Short_Write_1P(0xC0,0x0C);	


Generic_Short_Write_1P(0xB0,0x00);
Generic_Short_Write_1P(0xB1,0x79);
Generic_Short_Write_1P(0xBA,0x8F);//

     DCS_Short_Write_NP(0x11);	
     Delay(200);
     DCS_Short_Write_NP(0x29);
     Delay(50);

4.1 分析客户给的mipi屏初始化代码:

Generic_Short_Write_1P(0xBA,0x8F);

Generic_Short_Write_1P表示:发送Generic命令,带1个参数,数据字节个数为2(Generic Short Write, 1 parameter)
0xBA:寄存器地址
0x8F:数据10x8F

在DTS上转成RK上的mipi屏初始化格式

13 00 02 BA 8F

解析:
13 表示0x13数据类型的指令
00 表示没有延时
02 表示两个数据长度 :0xBA,0x8F
BA 表示寄存器地址0xBA
8F 表示0x8F这个数据

分析客户给的mipi屏初始化代码:

 DCS_Short_Write_NP(0x11);	
 Delay(200);
 DCS_Short_Write_NP(0x29);
 Delay(50);
 
 解析:
 DCS_Short_Write_NP表示:只发送DCS命令,不带参数,数据字节个数为1(DCS Short Write, no parameters)
 0x11:数据10x11
 Delay(200):延迟为200

在DTS上转成RK上的mipi屏初始化格式

05 C8 01 11
05 32 01 29

解析:
05 表示0x05数据类型的指令
C8 表示延时为200 转换成16进制为0xC8
01 表示1个数据长度 :0x11
11 表示数据:0x11

4.2 将屏厂的初始化代码转换成RK平台的屏幕上电初始化时序DTS配置:

panel-init-sequence = [
			13 00 02 B0 01
			13 00 02 C0 26
			13 00 02 C1 10
			13 00 02 C2 0E
			13 00 02 C3 00
			13 00 02 C4 00
			13 00 02 C5 23
			13 00 02 C6 11
			13 00 02 C7 22
			13 00 02 C8 20
			13 00 02 C9 1E
			13 00 02 CA 1C
			13 00 02 CB 0C
			13 00 02 CC 0A
			13 00 02 CD 08
			13 00 02 CE 06
			13 00 02 CF 18
			13 00 02 D0 02
			13 00 02 D1 00
			13 00 02 D2 00
			13 00 02 D3 00
			13 00 02 D4 26
			13 00 02 D5 0F
			13 00 02 D6 0D
			13 00 02 D7 00
			13 00 02 D8 00
			13 00 02 D9 23
			13 00 02 DA 11
			13 00 02 DB 21
			13 00 02 DC 1F
			13 00 02 DD 1D
			13 00 02 DE 1B
			13 00 02 DF 0B
			13 00 02 E0 09
			13 00 02 E1 07
			13 00 02 E2 05
			13 00 02 E3 17
			13 00 02 E4 01
			13 00 02 E5 00
			13 00 02 E6 00
			13 00 02 E7 00
			13 00 02 B0 03
			13 00 02 BE 04
			13 00 02 B9 40
			13 00 02 CC 88
			13 00 02 C8 0C
			13 00 02 C9 07
			13 00 02 CD 01
			13 00 02 CA 40
			13 00 02 CE 1A
			13 00 02 CF 60
			13 00 02 D2 08
			13 00 02 D3 08
			13 00 02 DB 01
			13 00 02 D9 06
			13 00 02 D4 00
			13 00 02 D5 01
			13 00 02 D6 04
			13 00 02 D7 03
			13 00 02 C2 00
			13 00 02 C3 0E
			13 00 02 C4 00
			13 00 02 C5 0E
			13 00 02 DD 00
			13 00 02 DE 0E
			13 00 02 E6 00
			13 00 02 E7 0E
			13 00 02 C2 00
			13 00 02 C3 0E
			13 00 02 C4 00
			13 00 02 C5 0E
			13 00 02 DD 00
			13 00 02 DE 0E
			13 00 02 E6 00
			13 00 02 E7 0E
			13 00 02 B0 06
			13 00 02 C0 A5
			13 00 02 D5 1C
			13 00 02 C0 00
			13 00 02 B0 00
			13 00 02 BD 30

			13 00 02 F9 5C
			13 00 02 C2 14
			13 00 02 C4 14
			13 00 02 BF 15
			13 00 02 C0 0C


			13 00 02 B0 00
			13 00 02 B1 79
			13 00 02 BA 8F

			05 C8 01 11
			05 32 01 29
		];

		panel-exit-sequence = [
			05 00 01 28
			05 00 01 10
		];

Chapter3 RK3568 Mipi屏幕时序初始化

原文链接:https://blog.csdn.net/rick123456/article/details/126680384

##1、 屏幕初始化时序厂家提供如下;
//========== JD9365+BOE10.1 initial setting ==========//
Display Resolution:800*1280
params->dsi.vertical_sync_active(VS)=4
params->dsi.vertical_backporch(VBP)=8
params->dsi.vertical_frontporch(VFP)=24
params->dsi.horizontal_sync_active(HS)=18
params->dsi.horizontal_backporch(HBP)=18
params->dsi.horizontal_frontporch(HFP)=18
params->dsi.PLL_CLOCK=405Mbps(203MHZ)

LCD_nReset=1;
Delayms(5}},
LCD_nReset=0;
Delayms(10}},
LCD_nReset=1;
Delayms(120}},

//======initial code==========//
//Page0
{0xE0,1,{0x00}},
{0xE1,1,{0x93}},
{0xE2,1,{0x65}},
{0xE3,1,{0xF8}},
{0x80,1,{0x03}},//0X03:4-LANE;0X02:3-LANE;0X01:2-LANE

//Page1
{0xE0,1,{0x01}},
{0x00,1,{0x00}},
{0x01,1,{0x6F}},
{0x03,1,{0x00}},
{0x04,1,{0xA0}},
{0x0C,1,{0x74}},

//Set Gamma Power, VGMP,VGMN,VGSP,VGSN
{0x17,1,{0x00}},
{0x18,1,{0xAF}},
{0x19,1,{0x01}},
{0x1A,1,{0x00}},
{0x1B,1,{0xAF}},
{0x1C,1,{0x01}},

//Set Gate Power
{0x1F,1,{0x3E}},
{0x20,1,{0x28}},
{0x21,1,{0x28}},
{0x22,1,{0x7E}},

{0x24,1,{0xFE}},//modify20200324

{0x35,1,{0x26}},
{0x37,1,{0x09}},

//SET RGBCYC
{0x38,1,{0x04}},
{0x39,1,{0x00}},
{0x3A,1,{0x01}},
{0x3C,1,{0x7C}},
{0x3D,1,{0xFF}},
{0x3E,1,{0xFF}},
{0x3F,1,{0x7F}},

//Set TCON
{0x40,1,{0x06}},
{0x41,1,{0xA0}},
{0x42,1,{0x81}},
{0x43,1,{0x08}},
{0x44,1,{0x0B}},
{0x45,1,{0x28}},

//--- power voltage  ----//
//{0x4A,1,{0x35}},//bist
{0x55,1,{0x02}},//modify20200730
{0x57,1,{0x69}},
{0x59,1,{0x0A}},
{0x5A,1,{0x28}},
{0x5B,1,{0x14}},

//--- Gamma  ----//
{0x5D,1,{0x7C}},              
{0x5E,1,{0x65}},      
{0x5F,1,{0x55}},    
{0x60,1,{0x47}},    
{0x61,1,{0x43}},    
{0x62,1,{0x32}},    
{0x63,1,{0x34}},    
{0x64,1,{0x1C}},    
{0x65,1,{0x33}},    
{0x66,1,{0x31}},    
{0x67,1,{0x30}},    
{0x68,1,{0x4E}},    
{0x69,1,{0x3C}},    
{0x6A,1,{0x44}},    
{0x6B,1,{0x35}},    
{0x6C,1,{0x31}},    
{0x6D,1,{0x23}},    
{0x6E,1,{0x11}},    
{0x6F,1,{0x00}},    
{0x70,1,{0x7C}},    
{0x71,1,{0x65}},    
{0x72,1,{0x55}},    
{0x73,1,{0x47}},    
{0x74,1,{0x43}},    
{0x75,1,{0x32}},    
{0x76,1,{0x34}},    
{0x77,1,{0x1C}},    
{0x78,1,{0x33}},    
{0x79,1,{0x31}},    
{0x7A,1,{0x30}},    
{0x7B,1,{0x4E}},    
{0x7C,1,{0x3C}},    
{0x7D,1,{0x44}},    
{0x7E,1,{0x35}},    
{0x7F,1,{0x31}},    
{0x80,1,{0x23}},    
{0x81,1,{0x11}},    
{0x82,1,{0x00}},   

//Page2
{0xE0,1,{0x02}},

//GIP_L Pin mapping    
{0x00,1,{0x1E}},
{0x01,1,{0x1E}},
{0x02,1,{0x41}},
{0x03,1,{0x41}},
{0x04,1,{0x43}},
{0x05,1,{0x43}},
{0x06,1,{0x1F}},
{0x07,1,{0x1F}},
{0x08,1,{0x1F}},
{0x09,1,{0x1F}},
{0x0A,1,{0x1E}},
{0x0B,1,{0x1E}},
{0x0C,1,{0x1F}},
{0x0D,1,{0x47}},
{0x0E,1,{0x47}},
{0x0F,1,{0x45}},
{0x10,1,{0x45}},
{0x11,1,{0x4B}},
{0x12,1,{0x4B}},
{0x13,1,{0x49}},
{0x14,1,{0x49}},
{0x15,1,{0x1F}},
{0x16,1,{0x1E}},
{0x17,1,{0x1E}},
{0x18,1,{0x40}},
{0x19,1,{0x40}},
{0x1A,1,{0x42}},
{0x1B,1,{0x42}},
{0x1C,1,{0x1F}},
{0x1D,1,{0x1F}},

//GIP_R Pin mapping 
{0x1E,1,{0x1F}},
{0x1F,1,{0x1F}},
{0x20,1,{0x1E}},
{0x21,1,{0x1E}},
{0x22,1,{0x1F}},
{0x23,1,{0x46}},
{0x24,1,{0x46}},
{0x25,1,{0x44}},
{0x26,1,{0x44}},
{0x27,1,{0x4A}},
{0x28,1,{0x4A}},
{0x29,1,{0x48}},
{0x2A,1,{0x48}},
{0x2B,1,{0x1F}},

//GIP_L_GS Pin mapping
{0x2C,1,{0x1F}},
{0x2D,1,{0x1F}},
{0x2E,1,{0x00}},
{0x2F,1,{0x00}},
{0x30,1,{0x00}},
{0x31,1,{0x00}},
{0x32,1,{0x1E}},
{0x33,1,{0x1E}},
{0x34,1,{0x35}},
{0x35,1,{0x1F}},
{0x36,1,{0x15}},
{0x37,1,{0x15}},
{0x38,1,{0x1F}},
{0x39,1,{0x08}},
{0x3A,1,{0x08}},
{0x3B,1,{0x0A}},
{0x3C,1,{0x0A}},
{0x3D,1,{0x04}},
{0x3E,1,{0x04}},
{0x3F,1,{0x06}},
{0x40,1,{0x06}},
{0x41,1,{0x1F}},

//GIP_R_GS Pin mapping
{0x42,1,{0x1F}},
{0x43,1,{0x1F}},
{0x44,1,{0x01}},
{0x45,1,{0x01}},
{0x46,1,{0x01}},
{0x47,1,{0x01}},
{0x48,1,{0x1E}},
{0x49,1,{0x1E}},
{0x4A,1,{0x35}},
{0x4B,1,{0x1F}},
{0x4C,1,{0x15}},
{0x4D,1,{0x15}},
{0x4E,1,{0x1F}},
{0x4F,1,{0x09}},
{0x50,1,{0x09}},
{0x51,1,{0x0B}},
{0x52,1,{0x0B}},
{0x53,1,{0x05}},
{0x54,1,{0x05}},
{0x55,1,{0x07}},
{0x56,1,{0x07}},
{0x57,1,{0x1F}},

//GIP Timing  
{0x58,1,{0x40}},
{0x5B,1,{0x30}},
{0x5C,1,{0x03}},
{0x5D,1,{0x30}},
{0x5E,1,{0x01}},
{0x5F,1,{0x02}},
{0x63,1,{0x14}},
{0x64,1,{0x6A}},
{0x67,1,{0x73}},
{0x68,1,{0x05}},
{0x69,1,{0x14}},
{0x6A,1,{0x6A}},
{0x6B,1,{0x0C}},
{0x6C,1,{0x00}},
{0x6D,1,{0x00}},
{0x6E,1,{0x00}},
{0x6F,1,{0x88}},

//Page4
{0xE0,1,{0x04}},
{0x02,1,{0x23}},//20200330 modify
{0x09,1,{0x11}},
{0x0E,1,{0x48}},
{0x36,1,{0x49}},



//SLP OUT
{0x11,0,{0x00}},  	
Delayms(120}},

//DISP ON
{0x29,0,{0x00}},   
Delayms(5}},

//TE
{0x35,0,{0x00}},  
## 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'mipi_init_sque.txt')

##3、修改设备树
&dsi0 {
	status = "okay";
	//rockchip,lane-rate = <1000>;
	dsi0_panel: panel@0 {
		status = "okay";
		compatible = "simple-panel-dsi";
		reg = <0>;
		power-supply = <&vcc3v3_lcd0_n>;
		//reset-gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>;
		backlight = <&backlight>;
		reset-delay-ms = <60>;
		enable-delay-ms = <60>;
		prepare-delay-ms = <60>;
		unprepare-delay-ms = <60>;
		disable-delay-ms = <60>;
		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 = [
				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 38
				15 00 02 0C 74
				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 35 26
				15 00 02 37 09
				15 00 02 38 04
				15 00 02 39 00
				15 00 02 3A 01
				15 00 02 3C 78
				15 00 02 3D FF
				15 00 02 3E FF
				15 00 02 3F 7F
				15 00 02 40 06
				15 00 02 41 A0
				15 00 02 42 81
				15 00 02 43 14
				15 00 02 44 23
				15 00 02 45 28
				15 00 02 55 02
				15 00 02 57 69
				15 00 02 59 0A
				15 00 02 5A 2A
				15 00 02 5B 17
				15 00 02 5D 7F
				15 00 02 5E 6A
				15 00 02 5F 5B
				15 00 02 60 4F
				15 00 02 61 4A
				15 00 02 62 3D
				15 00 02 63 41
				15 00 02 64 2A
				15 00 02 65 44
				15 00 02 66 43
				15 00 02 67 44
				15 00 02 68 62
				15 00 02 69 52
				15 00 02 6A 59
				15 00 02 6B 4C
				15 00 02 6C 48
				15 00 02 6D 3A
				15 00 02 6E 26
				15 00 02 6F 00
				15 00 02 70 7F
				15 00 02 71 6A
				15 00 02 72 5B
				15 00 02 73 4F
				15 00 02 74 4A
				15 00 02 75 3D
				15 00 02 76 41
				15 00 02 77 2A
				15 00 02 78 44
				15 00 02 79 43
				15 00 02 7A 44
				15 00 02 7B 62
				15 00 02 7C 52
				15 00 02 7D 59
				15 00 02 7E 4C
				15 00 02 7F 48
				15 00 02 80 3A
				15 00 02 81 26
				15 00 02 82 00
				15 00 02 E0 02
				15 00 02 00 42
				15 00 02 01 42
				15 00 02 02 40
				15 00 02 03 40
				15 00 02 04 5E
				15 00 02 05 5E
				15 00 02 06 5F
				15 00 02 07 5F
				15 00 02 08 5F
				15 00 02 09 57
				15 00 02 0A 57
				15 00 02 0B 77
				15 00 02 0C 77
				15 00 02 0D 47
				15 00 02 0E 47
				15 00 02 0F 45
				15 00 02 10 45
				15 00 02 11 4B
				15 00 02 12 4B
				15 00 02 13 49
				15 00 02 14 49
				15 00 02 15 5F
				15 00 02 16 41
				15 00 02 17 41
				15 00 02 18 40
				15 00 02 19 40
				15 00 02 1A 5E
				15 00 02 1B 5E
				15 00 02 1C 5F
				15 00 02 1D 5F
				15 00 02 1E 5F
				15 00 02 1F 57
				15 00 02 20 57
				15 00 02 21 77
				15 00 02 22 77
				15 00 02 23 46
				15 00 02 24 46
				15 00 02 25 44
				15 00 02 26 44
				15 00 02 27 4A
				15 00 02 28 4A
				15 00 02 29 48
				15 00 02 2A 48
				15 00 02 2B 5F
				15 00 02 2C 01
				15 00 02 2D 01
				15 00 02 2E 00
				15 00 02 2F 00
				15 00 02 30 1F
				15 00 02 31 1F
				15 00 02 32 1E
				15 00 02 33 1E
				15 00 02 34 1F
				15 00 02 35 17
				15 00 02 36 17
				15 00 02 37 37
				15 00 02 38 37
				15 00 02 39 08
				15 00 02 3A 08
				15 00 02 3B 0A
				15 00 02 3C 0A
				15 00 02 3D 04
				15 00 02 3E 04
				15 00 02 3F 06
				15 00 02 40 06
				15 00 02 41 1F
				15 00 02 42 02
				15 00 02 43 02
				15 00 02 44 00
				15 00 02 45 00
				15 00 02 46 1F
				15 00 02 47 1F
				15 00 02 48 1E
				15 00 02 49 1E
				15 00 02 4A 1F
				15 00 02 4B 17
				15 00 02 4C 17
				15 00 02 4D 37
				15 00 02 4E 37
				15 00 02 4F 09
				15 00 02 50 09
				15 00 02 51 0B
				15 00 02 52 0B
				15 00 02 53 05
				15 00 02 54 05
				15 00 02 55 07
				15 00 02 56 07
				15 00 02 57 1F
				15 00 02 58 40
				15 00 02 5B 30
				15 00 02 5C 16
				15 00 02 5D 34
				15 00 02 5E 05
				15 00 02 5F 02
				15 00 02 63 00
				15 00 02 64 6A
				15 00 02 67 73
				15 00 02 68 1D
				15 00 02 69 08
				15 00 02 6A 6A
				15 00 02 6B 08
				15 00 02 6C 00
				15 00 02 6D 00
				15 00 02 6E 00
				15 00 02 6F 88
				15 00 02 75 FF
				15 00 02 77 DD
				15 00 02 78 3F
				15 00 02 79 15
				15 00 02 7A 17
				15 00 02 7D 14
				15 00 02 7E 82
				15 00 02 E0 04
				15 00 02 00 0E
				15 00 02 02 B3
				15 00 02 09 61
				15 00 02 0E 48
				15 00 02 E0 00
				15 00 02 E6 02
				15 00 02 E7 0C
				15 00 02 11 00
				15 78 02 E0 00
				15 00 02 29 00
				15 05 02 35 00
		];
			
		disp_timings0: display-timings {
			native-mode = <&dsi0_timing0>;
			dsi0_timing0: timing0 {
				clock-frequency = <71000000>;
				hactive = <800>;
				vactive = <1280>;
				hfront-porch = <48>;
				hsync-len = <8>;
				hback-porch = <42>;
				vfront-porch = <15>;
				vsync-len = <6>;
				vback-porch = <16>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <1>;
				pixelclk-active = <0>;
				swap-rb=<0>;
				swap-rg=<1>;
				swap-gb=<1>;
			};
		};

		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;
				panel_in_dsi: endpoint {
					remote-endpoint = <&dsi_out_panel>;
				};
			};
		};
	};

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@1 {
			reg = <1>;
			dsi_out_panel: endpoint {
				remote-endpoint = <&panel_in_dsi>;
			};
		};
	};

};

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

原文链接:https://blog.csdn.net/fhqlongteng/article/details/129155747

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设备树时,芯片产生了中断,所以定位到是厂家提供的配置序列有问题。后来又与厂家沟通,让其提供新的配置序列信息后,屏幕的触摸功能就正常了。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值