Sfoglia il codice sorgente

add:支持不带初始化参数的jd9261t屏幕

alienwalker 9 mesi fa
parent
commit
052019f1b4
3 ha cambiato i file con 399 aggiunte e 0 eliminazioni
  1. 4 0
      components/lcd/luat_lcd.c
  2. 1 0
      components/lcd/luat_lcd.h
  3. 394 0
      components/lcd/luat_lcd_jd9261t.c

+ 4 - 0
components/lcd/luat_lcd.c

@@ -194,6 +194,10 @@ INIT_DONE:
 }
 
 LUAT_WEAK int luat_lcd_setup_buff_default(luat_lcd_conf_t* conf){
+	if (conf->buff) {
+		LLOGE("lcd buff已经分配过了");
+		return 0;
+	}
     conf->buff = luat_heap_opt_malloc(LUAT_HEAP_PSRAM, sizeof(luat_color_t) * conf->w * conf->h);
     if (conf->buff == NULL) {
       LLOGW("psram 分配 lcd buff失败, 尝试在sram分配");

+ 1 - 0
components/lcd/luat_lcd.h

@@ -145,6 +145,7 @@ extern luat_lcd_opts_t lcd_opts_st7796;
 extern luat_lcd_opts_t lcd_opts_nv3037;
 extern luat_lcd_opts_t lcd_opts_h050iwv;
 extern luat_lcd_opts_t lcd_opts_jd9261t_inited;
+extern luat_lcd_opts_t lcd_opts_jd9261t;
 
 static inline luat_color_t color_swap(luat_color_t color) {
     luat_color_t tmp = (color >> 8) + ((color & 0xFF) << 8);

+ 394 - 0
components/lcd/luat_lcd_jd9261t.c

@@ -55,3 +55,397 @@ luat_lcd_opts_t lcd_opts_jd9261t_inited = {
 	.no_ram_mode = 1,
 	.user_ctrl_init = jd9261t_inited_init,
 };
+
+typedef struct
+{
+	union
+	{
+		uint8_t *queue;	//data超过4个字节放地址
+		uint8_t buf[4];	//不超过4个字节的,直接放值
+	};
+	uint8_t delay_ms;
+	uint8_t ignore_mask;
+	uint8_t len;
+	uint8_t cmd;
+}spi_lcd_cmd_t;
+
+#define Q_540_MASK	(0)
+
+static const uint8_t data_for_cmd_b2_jd9261t[] = {0x01, 0x23, 0x62, 0x88, 0xE4, 0x1B};
+static const uint8_t data_for_cmd_bb_jd9261t[] = {0x0C, 0x54, 0x5A, 0x50, 0x22, 0x22};
+static const uint8_t data_for_cmd_c3_jd9261t[] = {0x0D, 0x02, 0x06, 0x00, 0x00, 0x95, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10}; //24
+static const uint8_t data_for_cmd_c6_jd9261t[] = {0x01, 0x6E, 0x00, 0x30, 0x00, 0x14, 0x16, 0x82, 0x00, 0x10, 0x00, 0x10, 0x00, 0x09, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01};	//23
+static const uint8_t data_for_cmd_cb_jd9261t[] = {0x7C, 0x6C, 0x5F, 0x4C, 0x3E, 0x34, 0x28, 0x2D, 0x19, 0x36, 0x38, 0x3B, 0x59, 0x47, 0x4F, 0x42,
+		0x40, 0x33, 0x22, 0x15, 0x06, 0x7C, 0x6C, 0x5F, 0x4C, 0x3E, 0x34, 0x28, 0x2D, 0x19, 0x36, 0x38,
+		0x3B, 0x59, 0x47, 0x4F, 0x42, 0x40, 0x33, 0x22, 0x15, 0x06};	//42
+
+static const uint8_t data_for_cmd_ce_jd9261t[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
+		0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+		0xFF, 0xFF, 0xFF};	//35
+
+static const uint8_t data_for_cmd_cf_jd9261t[] = {0x52, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x00}; //13
+static const uint8_t data_for_cmd_d0_jd9261t[] = {0x00, 0x9F, 0x9F, 0x80, 0x9B, 0x99, 0x8E, 0x8C, 0x8A, 0x88, 0x86, 0x84, 0x98, 0x97, 0x90, 0x92,
+		0x9F, 0x9F}; //18
+static const uint8_t data_for_cmd_d1_jd9261t[] = {0x00, 0x9F, 0x9F, 0x81, 0x9C, 0x9A, 0x8F, 0x8D, 0x8B, 0x89, 0x87, 0x85, 0x98, 0x97, 0x91, 0x93,
+		0x9F, 0x9F}; //18
+static const uint8_t data_for_cmd_d2_jd9261t[] = {0x00, 0x9F, 0x9F, 0x91, 0x8D, 0x8F, 0x9A, 0x9C, 0x85, 0x87, 0x89, 0x8B, 0x18, 0x17, 0x81, 0x93,
+		0x9F, 0x9F}; //18
+static const uint8_t data_for_cmd_d3_jd9261t[] = {0x00, 0x9F, 0x9F, 0x90, 0x8C, 0x8E, 0x99, 0x9B, 0x84, 0x86, 0x88, 0x8A, 0x18, 0x17, 0x80, 0x92,
+		0x9F, 0x9F}; //18
+static const uint8_t data_for_cmd_d4_jd9261t[] = {0x00, 0x60, 0x23, 0x01, 0x00, 0x03, 0x20, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x63,
+		0x05, 0x04, 0x6A, 0x05, 0x60, 0x60, 0x04, 0x04, 0x20, 0x00, 0x23, 0x01, 0x03, 0x00, 0x23, 0x00,
+		0x01, 0x04, 0x4D, 0x04, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00};	//60
+
+static const uint8_t data_for_cmd_d5_jd9261t[] = {0x01, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x07, 0x32, 0x5A,
+		0x00, 0x0A, 0x3C, 0x00, 0x04, 0x04, 0x7B, 0xF4, 0xA0, 0x27, 0x00, 0x00, 0x08, 0xF4, 0x27, 0x08,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02};	//39
+static const uint8_t data_for_cmd_d7_jd9261t[] = {0x00, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E,
+		0x6E}; //17
+static const uint8_t data_for_cmd_ca1_jd9261t[] = {0x76, 0x00, 0x00, 0x00, 0x2C, 0x00, 0xD0, 0xD0, 0x22, 0x1C, 0x1C, 0x22, 0xAB, 0xAA, 0x00, 0x00,
+		0x04, 0x1C, 0x32, 0x12, 0x44, 0x3F, 0x0F, 0x00, 0x00, 0x00, 0x22, 0x19, 0x02, 0x02, 0x00, 0x00,
+		0x00, 0x00, 0x04, 0x03, 0x00, 0xAA, 0x04, 0x25, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x21,
+		0x03, 0x3F, 0x10, 0x03, 0x00, 0x01, 0x00, 0x00, 0x78, 0x12, 0x40, 0x3C, 0x94, 0x19, 0x19, 0x14,
+		0x29, 0x19, 0x80};	//67
+static const uint8_t data_for_cmd_cb1_jd9261t[] = {0x02, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, 0x00, 0x02, 0x00, 0xD0, 0xD0, 0x22}; //14
+
+static const uint8_t data_for_cmd_cc1_jd9261t[] = {0x00, 0x00, 0xFF, 0xFF, 0x5F, 0x7F, 0x14, 0x00, 0x00, 0x00, 0x40, 0x22, 0x71, 0x62, 0x35, 0x17,
+		0x26, 0x53, 0x35, 0x62, 0x71, 0x71, 0x26, 0x17, 0x71, 0x62, 0x35, 0x17, 0x26, 0x53, 0x35, 0x62,
+		0x71, 0x71, 0x26, 0x17};	//36
+static const uint8_t data_for_cmd_bb2_jd9261t[] = {0x00, 0x00, 0x00, 0x00, 0x68, 0x69, 0x00, 0x00};
+static const uint8_t data_for_cmd_c12_jd9261t[] = {0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00};
+static const uint8_t data_for_cmd_c22_jd9261t[] = {0x02, 0xC2, 0x50, 0x00, 0x12, 0xA2, 0x61, 0x73, 0xF7};
+static const uint8_t data_for_cmd_c32_jd9261t[] = {0x20, 0xFF, 0x00, 0xA0, 0x10, 0x82, 0x06, 0x01, 0x31, 0x53, 0x64, 0x75, 0x6E, 0x82};
+static const uint8_t data_for_cmd_c42_jd9261t[] = {0x00, 0x21, 0x07, 0x00, 0x01, 0x01, 0x08};
+static const uint8_t data_for_cmd_d32_jd9261t[] = {0x00, 0x11, 0x00, 0x02, 0x68, 0xAE, 0x14, 0x59, 0xCD, 0x02, 0x68, 0xAE, 0x14, 0x59, 0xCD};
+static const uint8_t data_for_cmd_ec2_jd9261t[] = {0x03, 0x0E, 0x7E, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0x7F}; //23
+static const uint8_t data_for_cmd_d13_jd9261t[] = {0x00, 0x10, 0x21, 0xFF, 0x88, 0x00, 0x87};
+static const spi_lcd_cmd_t cmd_list_jd9261t_all[] =
+{
+		{
+				.cmd = 0xDF,
+				.len = 3,
+				.buf = {0x90,0x62,0xF2},
+		},
+		{
+				.cmd = 0xDE,
+				.len = 1,
+				.buf = {0x00},
+		},
+		{
+				.cmd = 0xB2,
+				.len = sizeof(data_for_cmd_b2_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_b2_jd9261t,
+		},
+		{
+				.cmd = 0xBB,
+				.len = sizeof(data_for_cmd_bb_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_bb_jd9261t,
+		},
+		{
+				.cmd = 0xBD,
+				.len = 2,
+				.buf = {0x00,0x71},
+		},
+		{
+				.cmd = 0xBF,
+				.len = 2,
+				.buf = {0x50,0x50},
+		},
+		{
+				.cmd = 0xC0,
+				.len = 4,
+				.buf = {0x00,0xCD,0x00,0xCD},
+		},
+		{
+				.cmd = 0xC1,
+				.len = 3,
+				.buf = {0x40,0x11,0x00},
+		},
+		{
+				.cmd = 0xC3,
+				.len = sizeof(data_for_cmd_c3_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_c3_jd9261t,
+		},
+		{
+				.cmd = 0xC4,
+				.len = 2,
+				.buf = {0x02,0x06},
+		},
+		{
+				.cmd = 0xC6,
+				.len = sizeof(data_for_cmd_c6_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_c6_jd9261t,
+		},
+		{
+				.cmd = 0xC8,
+				.len = 3,
+				.buf = {0x18,0x0E,0x87},
+		},
+		{
+				.cmd = 0xCB,
+				.len = sizeof(data_for_cmd_cb_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_cb_jd9261t,
+		},
+		{
+				.cmd = 0xCC,
+				.len = 1,
+				.buf = {0x33},
+		},
+		{
+				.cmd = 0xCD,
+				.len = 4,
+				.buf = {0x08,0x00,0x08,0x00},
+		},
+		{
+				.cmd = 0xCE,
+				.len = sizeof(data_for_cmd_ce_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_ce_jd9261t,
+		},
+		{
+				.cmd = 0xCF,
+				.len = sizeof(data_for_cmd_cf_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_cf_jd9261t,
+		},
+		{
+				.cmd = 0xD0,
+				.len = sizeof(data_for_cmd_d0_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d0_jd9261t,
+		},
+		{
+				.cmd = 0xD2,
+				.len = sizeof(data_for_cmd_d2_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d2_jd9261t,
+		},
+		{
+				.cmd = 0xD3,
+				.len = sizeof(data_for_cmd_d3_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d3_jd9261t,
+		},
+		{
+				.cmd = 0xD4,
+				.len = sizeof(data_for_cmd_d4_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d4_jd9261t,
+		},
+		{
+				.cmd = 0xD5,
+				.len = sizeof(data_for_cmd_d5_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d5_jd9261t,
+		},
+		{
+				.cmd = 0xD7,
+				.len = sizeof(data_for_cmd_d7_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d7_jd9261t,
+		},
+		{
+				.cmd = 0xDE,
+				.len = 1,
+				.buf = {0x01},
+		},
+		{
+				.cmd = 0xC7,
+				.len = 3,
+				.buf = {0x06,0x06,0x08},
+		},
+		{
+				.cmd = 0xCA,
+				.len = sizeof(data_for_cmd_ca1_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_ca1_jd9261t,
+				.ignore_mask = (1 << Q_540_MASK),
+		},
+		{
+				.cmd = 0xCB,
+				.len = sizeof(data_for_cmd_cb1_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_cb1_jd9261t,
+				.ignore_mask = (1 << Q_540_MASK),
+		},
+		{
+				.cmd = 0xCC,
+				.len = sizeof(data_for_cmd_cc1_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_cc1_jd9261t,
+				.ignore_mask = (1 << Q_540_MASK),
+		},
+		{
+				.cmd = 0xDE,
+				.len = 1,
+				.buf = {0x02},
+		},
+		{
+				.cmd = 0xBB,
+				.len = sizeof(data_for_cmd_bb2_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_bb2_jd9261t,
+		},
+		{
+				.cmd = 0xC1,
+				.len = sizeof(data_for_cmd_c12_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_c12_jd9261t,
+		},
+		{
+				.cmd = 0xC2,
+				.len = sizeof(data_for_cmd_c22_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_c22_jd9261t,
+		},
+		{
+				.cmd = 0xC3,
+				.len = sizeof(data_for_cmd_c32_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_c32_jd9261t,
+		},
+		{
+				.cmd = 0xC4,
+				.len = sizeof(data_for_cmd_c42_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_c42_jd9261t,
+		},
+		{
+				.cmd = 0xC6,
+				.len = 1,
+				.buf = {0x4C},
+		},
+		{
+				.cmd = 0xD3,
+				.len = sizeof(data_for_cmd_d32_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d32_jd9261t,
+		},
+		{
+				.cmd = 0xE6,
+				.len = 3,
+				.buf = {0x10, 0x08, 0x63},
+		},
+		{
+				.cmd = 0xEC,
+				.len = sizeof(data_for_cmd_ec2_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_ec2_jd9261t,
+		},
+		{
+				.cmd = 0xDE,
+				.len = 1,
+				.buf = {0x03},
+		},
+		{
+				.cmd = 0xD0,
+				.len = 4,
+				.buf = {0x00, 0x45, 0x31, 0x11},
+		},
+		{
+				.cmd = 0xD1,
+				.len = sizeof(data_for_cmd_d13_jd9261t),
+				.queue = (uint8_t *)data_for_cmd_d13_jd9261t,
+		},
+		{
+				.cmd = 0xDE,
+				.len = 1,
+				.buf = {0x00},
+		},
+//		{
+//				.cmd = 0x35,
+//				.len = 0,
+//				.delay_ms = 30,
+//		},
+//		{
+//				.cmd = 0x3A,
+//				.len = 1,
+//				.buf = {0x50},
+//		},
+//		{
+//				.cmd = 0x11,
+//				.len = 0,
+//				.delay_ms = 120,
+//		},
+//		{
+//				.cmd = 0x29,
+//				.len = 0,
+//				.delay_ms = 120,
+//		},
+};
+
+
+static int jd9261t_init(luat_lcd_conf_t* conf)
+{
+    uint8_t ignore_mask = 0;
+
+    if (540 == conf->w && 540 == conf->h)
+    {
+    	ignore_mask |= (1 << Q_540_MASK);
+    }
+    else if (720 == conf->w && 720 == conf->h)
+    {
+
+    }
+    else
+    {
+    	LLOGE("no support");
+    	return -1;
+    }
+    if (!conf->buff)
+    {
+    	conf->buff = luat_heap_opt_zalloc(LUAT_HEAP_AUTO, conf->w * conf->h * ((conf->bpp <= 16)?2:4));
+    	conf->flush_y_min = conf->h;
+    	conf->flush_y_max = 0;
+    }
+	luat_lcd_qspi_conf_t auto_flush =
+	{
+			.write_4line_cmd = 0xde,
+			.vsync_reg = 0x61,
+			.hsync_cmd = 0xde,
+			.hsync_reg = 0x60,
+			.write_1line_cmd = 0xde,
+	};
+    luat_gpio_set(conf->pin_rst, Luat_GPIO_LOW);
+//    luat_rtos_task_sleep(5);
+//    luat_gpio_set(conf->tp_pin_rst, Luat_GPIO_HIGH);
+    luat_rtos_task_sleep(5);
+    luat_gpio_set(conf->pin_rst, Luat_GPIO_HIGH);
+    luat_rtos_task_sleep(150);
+    luat_lcd_qspi_config(conf, &auto_flush);	//必须在第一个命令发送前就准备好
+
+	for(int i = 0; i < sizeof(cmd_list_jd9261t_all)/sizeof(spi_lcd_cmd_t); i++)
+	{
+		if (cmd_list_jd9261t_all[i].ignore_mask & ignore_mask)
+		{
+			LLOGI("ignore cmd %x", cmd_list_jd9261t_all[i].cmd);
+		}
+		else
+		{
+
+			if (cmd_list_jd9261t_all[i].len > 4)
+			{
+				lcd_write_cmd_data(conf,cmd_list_jd9261t_all[i].cmd, cmd_list_jd9261t_all[i].queue, cmd_list_jd9261t_all[i].len);
+			}
+			else
+			{
+				lcd_write_cmd_data(conf,cmd_list_jd9261t_all[i].cmd, cmd_list_jd9261t_all[i].buf, cmd_list_jd9261t_all[i].len);
+			}
+		}
+	}
+	luat_lcd_set_direction(conf,conf->direction);
+
+	uint8_t temp = 0x60;
+//	lcd_write_cmd_data(conf,0xc2, &temp, 1);
+	lcd_write_cmd_data(conf,0x35, NULL, 0);
+	temp = 0x50;
+	lcd_write_cmd_data(conf,0x3a, &temp, 1);
+	lcd_write_cmd_data(conf,0x11, NULL, 0);
+	luat_rtos_task_sleep(120);
+	lcd_write_cmd_data(conf,0x29, NULL, 0);
+	luat_rtos_task_sleep(120);
+    luat_gpio_set(conf->pin_pwr, Luat_GPIO_HIGH);
+    luat_lcd_qspi_auto_flush_on_off(conf, 1);
+    return 0;
+}
+
+luat_lcd_opts_t lcd_opts_jd9261t = {
+    .name = "jd9261t",
+    .sleep_cmd = 0xff,			//不需要发命令
+    .wakeup_cmd = 0xff,			//不需要发命令
+    .init_cmds_len = 0,
+    .init_cmds = NULL,
+    .direction0 = 0x00,
+    .direction90 = 0x00,
+    .direction180 = 0x03,
+    .direction270 = 0x03,
+	.rb_swap = 1,
+	.no_ram_mode = 1,
+	.user_ctrl_init = jd9261t_init,
+};