luat_lcd_jd9261t.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. #include "luat_base.h"
  2. #include "luat_lcd.h"
  3. #include "luat_gpio.h"
  4. #include "luat_mem.h"
  5. #include "luat_rtos.h"
  6. #include "luat_i2c.h"
  7. #define LUAT_LOG_TAG "jd9261t-lcd"
  8. #include "luat_log.h"
  9. static int jd9261t_inited_init(luat_lcd_conf_t* conf)
  10. {
  11. if (!conf->buff)
  12. {
  13. conf->buff = luat_heap_opt_zalloc(LUAT_HEAP_AUTO, conf->w * conf->h * ((conf->bpp <= 16)?2:4));
  14. conf->flush_y_min = conf->h;
  15. conf->flush_y_max = 0;
  16. }
  17. if (!conf->buff_ex)
  18. conf->buff_ex = luat_heap_opt_zalloc(LUAT_HEAP_AUTO, conf->w * conf->h * ((conf->bpp <= 16)?2:4));
  19. luat_lcd_qspi_conf_t auto_flush =
  20. {
  21. .write_4line_cmd = 0xde,
  22. .vsync_reg = 0x61,
  23. .hsync_cmd = 0xde,
  24. .hsync_reg = 0x60,
  25. .write_1line_cmd = 0xde,
  26. .write_4line_data = 0,
  27. };
  28. luat_gpio_set(conf->pin_rst, Luat_GPIO_LOW);
  29. // luat_rtos_task_sleep(5);
  30. // luat_gpio_set(conf->tp_pin_rst, Luat_GPIO_HIGH);
  31. luat_rtos_task_sleep(5);
  32. luat_gpio_set(conf->pin_rst, Luat_GPIO_HIGH);
  33. // luat_gpio_set(conf->tp_pin_rst, Luat_GPIO_LOW);
  34. // luat_rtos_task_sleep(50);
  35. // luat_gpio_set(conf->tp_pin_rst, Luat_GPIO_HIGH);
  36. // luat_rtos_task_sleep(100);
  37. luat_rtos_task_sleep(150);
  38. luat_lcd_qspi_config(conf, &auto_flush); //必须在第一个命令发送前就准备好
  39. luat_lcd_set_direction(conf,conf->direction);
  40. luat_rtos_task_sleep(5);
  41. luat_gpio_set(conf->pin_pwr, Luat_GPIO_HIGH);
  42. luat_lcd_qspi_auto_flush_on_off(conf, 1);
  43. return 0;
  44. }
  45. luat_lcd_opts_t lcd_opts_jd9261t_inited = {
  46. .name = "jd9261t_inited",
  47. .sleep_cmd = 0xff, //不需要发命令
  48. .wakeup_cmd = 0xff, //不需要发命令
  49. .init_cmds_len = 0,
  50. .init_cmds = NULL,
  51. .direction0 = 0x00,
  52. .direction90 = 0x00,
  53. .direction180 = 0x03,
  54. .direction270 = 0x03,
  55. .rb_swap = 1,
  56. .no_ram_mode = 1,
  57. .user_ctrl_init = jd9261t_inited_init,
  58. };
  59. #if 0
  60. typedef struct
  61. {
  62. union
  63. {
  64. uint8_t *queue; //data超过4个字节放地址
  65. uint8_t buf[4]; //不超过4个字节的,直接放值
  66. };
  67. uint8_t delay_ms;
  68. uint8_t ignore_mask;
  69. uint8_t len;
  70. uint8_t cmd;
  71. }spi_lcd_cmd_t;
  72. #define Q_540_MASK (0)
  73. static const uint8_t data_for_cmd_b2_jd9261t[] = {0x01, 0x23, 0x62, 0x88, 0xE4, 0x1B};
  74. static const uint8_t data_for_cmd_bb_jd9261t[] = {0x0C, 0x54, 0x5A, 0x50, 0x22, 0x22};
  75. 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,
  76. 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10}; //24
  77. 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,
  78. 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01}; //23
  79. 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,
  80. 0x40, 0x33, 0x22, 0x15, 0x06, 0x7C, 0x6C, 0x5F, 0x4C, 0x3E, 0x34, 0x28, 0x2D, 0x19, 0x36, 0x38,
  81. 0x3B, 0x59, 0x47, 0x4F, 0x42, 0x40, 0x33, 0x22, 0x15, 0x06}; //42
  82. 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,
  83. 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  84. 0xFF, 0xFF, 0xFF}; //35
  85. static const uint8_t data_for_cmd_cf_jd9261t[] = {0x52, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x00}; //13
  86. 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,
  87. 0x9F, 0x9F}; //18
  88. 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,
  89. 0x9F, 0x9F}; //18
  90. 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,
  91. 0x9F, 0x9F}; //18
  92. 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,
  93. 0x9F, 0x9F}; //18
  94. 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,
  95. 0x05, 0x04, 0x6A, 0x05, 0x60, 0x60, 0x04, 0x04, 0x20, 0x00, 0x23, 0x01, 0x03, 0x00, 0x23, 0x00,
  96. 0x01, 0x04, 0x4D, 0x04, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
  97. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}; //60
  98. 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,
  99. 0x00, 0x0A, 0x3C, 0x00, 0x04, 0x04, 0x7B, 0xF4, 0xA0, 0x27, 0x00, 0x00, 0x08, 0xF4, 0x27, 0x08,
  100. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; //39
  101. 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,
  102. 0x6E}; //17
  103. 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,
  104. 0x04, 0x1C, 0x32, 0x12, 0x44, 0x3F, 0x0F, 0x00, 0x00, 0x00, 0x22, 0x19, 0x02, 0x02, 0x00, 0x00,
  105. 0x00, 0x00, 0x04, 0x03, 0x00, 0xAA, 0x04, 0x25, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x21,
  106. 0x03, 0x3F, 0x10, 0x03, 0x00, 0x01, 0x00, 0x00, 0x78, 0x12, 0x40, 0x3C, 0x94, 0x19, 0x19, 0x14,
  107. 0x29, 0x19, 0x80}; //67
  108. static const uint8_t data_for_cmd_cb1_jd9261t[] = {0x02, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, 0x00, 0x02, 0x00, 0xD0, 0xD0, 0x22}; //14
  109. 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,
  110. 0x26, 0x53, 0x35, 0x62, 0x71, 0x71, 0x26, 0x17, 0x71, 0x62, 0x35, 0x17, 0x26, 0x53, 0x35, 0x62,
  111. 0x71, 0x71, 0x26, 0x17}; //36
  112. static const uint8_t data_for_cmd_bb2_jd9261t[] = {0x00, 0x00, 0x00, 0x00, 0x68, 0x69, 0x00, 0x00};
  113. static const uint8_t data_for_cmd_c12_jd9261t[] = {0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00};
  114. static const uint8_t data_for_cmd_c22_jd9261t[] = {0x02, 0xC2, 0x50, 0x00, 0x12, 0xA2, 0x61, 0x73, 0xF7};
  115. static const uint8_t data_for_cmd_c32_jd9261t[] = {0x20, 0xFF, 0x00, 0xA0, 0x10, 0x82, 0x06, 0x01, 0x31, 0x53, 0x64, 0x75, 0x6E, 0x82};
  116. static const uint8_t data_for_cmd_c42_jd9261t[] = {0x00, 0x21, 0x07, 0x00, 0x01, 0x01, 0x08};
  117. static const uint8_t data_for_cmd_d32_jd9261t[] = {0x00, 0x11, 0x00, 0x02, 0x68, 0xAE, 0x14, 0x59, 0xCD, 0x02, 0x68, 0xAE, 0x14, 0x59, 0xCD};
  118. 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,
  119. 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0x7F}; //23
  120. static const uint8_t data_for_cmd_d13_jd9261t[] = {0x00, 0x10, 0x21, 0xFF, 0x88, 0x00, 0x87};
  121. static const spi_lcd_cmd_t cmd_list_jd9261t_all[] =
  122. {
  123. {
  124. .cmd = 0xDF,
  125. .len = 3,
  126. .buf = {0x90,0x62,0xF2},
  127. },
  128. {
  129. .cmd = 0xDE,
  130. .len = 1,
  131. .buf = {0x00},
  132. },
  133. {
  134. .cmd = 0xB2,
  135. .len = sizeof(data_for_cmd_b2_jd9261t),
  136. .queue = (uint8_t *)data_for_cmd_b2_jd9261t,
  137. },
  138. {
  139. .cmd = 0xBB,
  140. .len = sizeof(data_for_cmd_bb_jd9261t),
  141. .queue = (uint8_t *)data_for_cmd_bb_jd9261t,
  142. },
  143. {
  144. .cmd = 0xBD,
  145. .len = 2,
  146. .buf = {0x00,0x71},
  147. },
  148. {
  149. .cmd = 0xBF,
  150. .len = 2,
  151. .buf = {0x50,0x50},
  152. },
  153. {
  154. .cmd = 0xC0,
  155. .len = 4,
  156. .buf = {0x00,0xCD,0x00,0xCD},
  157. },
  158. {
  159. .cmd = 0xC1,
  160. .len = 3,
  161. .buf = {0x40,0x11,0x00},
  162. },
  163. {
  164. .cmd = 0xC3,
  165. .len = sizeof(data_for_cmd_c3_jd9261t),
  166. .queue = (uint8_t *)data_for_cmd_c3_jd9261t,
  167. },
  168. {
  169. .cmd = 0xC4,
  170. .len = 2,
  171. .buf = {0x02,0x06},
  172. },
  173. {
  174. .cmd = 0xC6,
  175. .len = sizeof(data_for_cmd_c6_jd9261t),
  176. .queue = (uint8_t *)data_for_cmd_c6_jd9261t,
  177. },
  178. {
  179. .cmd = 0xC8,
  180. .len = 3,
  181. .buf = {0x18,0x0E,0x87},
  182. },
  183. {
  184. .cmd = 0xCB,
  185. .len = sizeof(data_for_cmd_cb_jd9261t),
  186. .queue = (uint8_t *)data_for_cmd_cb_jd9261t,
  187. },
  188. {
  189. .cmd = 0xCC,
  190. .len = 1,
  191. .buf = {0x33},
  192. },
  193. {
  194. .cmd = 0xCD,
  195. .len = 4,
  196. .buf = {0x08,0x00,0x08,0x00},
  197. },
  198. {
  199. .cmd = 0xCE,
  200. .len = sizeof(data_for_cmd_ce_jd9261t),
  201. .queue = (uint8_t *)data_for_cmd_ce_jd9261t,
  202. },
  203. {
  204. .cmd = 0xCF,
  205. .len = sizeof(data_for_cmd_cf_jd9261t),
  206. .queue = (uint8_t *)data_for_cmd_cf_jd9261t,
  207. },
  208. {
  209. .cmd = 0xD0,
  210. .len = sizeof(data_for_cmd_d0_jd9261t),
  211. .queue = (uint8_t *)data_for_cmd_d0_jd9261t,
  212. },
  213. {
  214. .cmd = 0xD2,
  215. .len = sizeof(data_for_cmd_d2_jd9261t),
  216. .queue = (uint8_t *)data_for_cmd_d2_jd9261t,
  217. },
  218. {
  219. .cmd = 0xD3,
  220. .len = sizeof(data_for_cmd_d3_jd9261t),
  221. .queue = (uint8_t *)data_for_cmd_d3_jd9261t,
  222. },
  223. {
  224. .cmd = 0xD4,
  225. .len = sizeof(data_for_cmd_d4_jd9261t),
  226. .queue = (uint8_t *)data_for_cmd_d4_jd9261t,
  227. },
  228. {
  229. .cmd = 0xD5,
  230. .len = sizeof(data_for_cmd_d5_jd9261t),
  231. .queue = (uint8_t *)data_for_cmd_d5_jd9261t,
  232. },
  233. {
  234. .cmd = 0xD7,
  235. .len = sizeof(data_for_cmd_d7_jd9261t),
  236. .queue = (uint8_t *)data_for_cmd_d7_jd9261t,
  237. },
  238. {
  239. .cmd = 0xDE,
  240. .len = 1,
  241. .buf = {0x01},
  242. },
  243. {
  244. .cmd = 0xC7,
  245. .len = 3,
  246. .buf = {0x06,0x06,0x08},
  247. },
  248. {
  249. .cmd = 0xCA,
  250. .len = sizeof(data_for_cmd_ca1_jd9261t),
  251. .queue = (uint8_t *)data_for_cmd_ca1_jd9261t,
  252. .ignore_mask = (1 << Q_540_MASK),
  253. },
  254. {
  255. .cmd = 0xCB,
  256. .len = sizeof(data_for_cmd_cb1_jd9261t),
  257. .queue = (uint8_t *)data_for_cmd_cb1_jd9261t,
  258. .ignore_mask = (1 << Q_540_MASK),
  259. },
  260. {
  261. .cmd = 0xCC,
  262. .len = sizeof(data_for_cmd_cc1_jd9261t),
  263. .queue = (uint8_t *)data_for_cmd_cc1_jd9261t,
  264. .ignore_mask = (1 << Q_540_MASK),
  265. },
  266. {
  267. .cmd = 0xDE,
  268. .len = 1,
  269. .buf = {0x02},
  270. },
  271. {
  272. .cmd = 0xBB,
  273. .len = sizeof(data_for_cmd_bb2_jd9261t),
  274. .queue = (uint8_t *)data_for_cmd_bb2_jd9261t,
  275. },
  276. {
  277. .cmd = 0xC1,
  278. .len = sizeof(data_for_cmd_c12_jd9261t),
  279. .queue = (uint8_t *)data_for_cmd_c12_jd9261t,
  280. },
  281. {
  282. .cmd = 0xC2,
  283. .len = sizeof(data_for_cmd_c22_jd9261t),
  284. .queue = (uint8_t *)data_for_cmd_c22_jd9261t,
  285. },
  286. {
  287. .cmd = 0xC3,
  288. .len = sizeof(data_for_cmd_c32_jd9261t),
  289. .queue = (uint8_t *)data_for_cmd_c32_jd9261t,
  290. },
  291. {
  292. .cmd = 0xC4,
  293. .len = sizeof(data_for_cmd_c42_jd9261t),
  294. .queue = (uint8_t *)data_for_cmd_c42_jd9261t,
  295. },
  296. {
  297. .cmd = 0xC6,
  298. .len = 1,
  299. .buf = {0x4C},
  300. },
  301. {
  302. .cmd = 0xD3,
  303. .len = sizeof(data_for_cmd_d32_jd9261t),
  304. .queue = (uint8_t *)data_for_cmd_d32_jd9261t,
  305. },
  306. {
  307. .cmd = 0xE6,
  308. .len = 3,
  309. .buf = {0x10, 0x08, 0x63},
  310. },
  311. {
  312. .cmd = 0xEC,
  313. .len = sizeof(data_for_cmd_ec2_jd9261t),
  314. .queue = (uint8_t *)data_for_cmd_ec2_jd9261t,
  315. },
  316. {
  317. .cmd = 0xDE,
  318. .len = 1,
  319. .buf = {0x03},
  320. },
  321. {
  322. .cmd = 0xD0,
  323. .len = 4,
  324. .buf = {0x00, 0x45, 0x31, 0x11},
  325. },
  326. {
  327. .cmd = 0xD1,
  328. .len = sizeof(data_for_cmd_d13_jd9261t),
  329. .queue = (uint8_t *)data_for_cmd_d13_jd9261t,
  330. },
  331. {
  332. .cmd = 0xDE,
  333. .len = 1,
  334. .buf = {0x00},
  335. },
  336. // {
  337. // .cmd = 0x35,
  338. // .len = 0,
  339. // .delay_ms = 30,
  340. // },
  341. // {
  342. // .cmd = 0x3A,
  343. // .len = 1,
  344. // .buf = {0x50},
  345. // },
  346. // {
  347. // .cmd = 0x11,
  348. // .len = 0,
  349. // .delay_ms = 120,
  350. // },
  351. // {
  352. // .cmd = 0x29,
  353. // .len = 0,
  354. // .delay_ms = 120,
  355. // },
  356. };
  357. static int jd9261t_init(luat_lcd_conf_t* conf)
  358. {
  359. uint8_t ignore_mask = 0;
  360. if (540 == conf->w && 540 == conf->h)
  361. {
  362. ignore_mask |= (1 << Q_540_MASK);
  363. }
  364. else if (720 == conf->w && 720 == conf->h)
  365. {
  366. }
  367. else
  368. {
  369. LLOGE("no support");
  370. return -1;
  371. }
  372. if (!conf->buff)
  373. {
  374. conf->buff = luat_heap_opt_zalloc(LUAT_HEAP_AUTO, conf->w * conf->h * ((conf->bpp <= 16)?2:4));
  375. conf->flush_y_min = conf->h;
  376. conf->flush_y_max = 0;
  377. }
  378. luat_lcd_qspi_conf_t auto_flush =
  379. {
  380. .write_4line_cmd = 0xde,
  381. .vsync_reg = 0x61,
  382. .hsync_cmd = 0xde,
  383. .hsync_reg = 0x60,
  384. .write_1line_cmd = 0xde,
  385. .write_4line_data = 0,
  386. };
  387. luat_gpio_set(conf->pin_rst, Luat_GPIO_LOW);
  388. // luat_rtos_task_sleep(5);
  389. // luat_gpio_set(conf->tp_pin_rst, Luat_GPIO_HIGH);
  390. luat_rtos_task_sleep(5);
  391. luat_gpio_set(conf->pin_rst, Luat_GPIO_HIGH);
  392. luat_rtos_task_sleep(150);
  393. luat_lcd_qspi_config(conf, &auto_flush); //必须在第一个命令发送前就准备好
  394. for(int i = 0; i < sizeof(cmd_list_jd9261t_all)/sizeof(spi_lcd_cmd_t); i++)
  395. {
  396. if (cmd_list_jd9261t_all[i].ignore_mask & ignore_mask)
  397. {
  398. LLOGI("ignore cmd %x", cmd_list_jd9261t_all[i].cmd);
  399. }
  400. else
  401. {
  402. if (cmd_list_jd9261t_all[i].len > 4)
  403. {
  404. lcd_write_cmd_data(conf,cmd_list_jd9261t_all[i].cmd, cmd_list_jd9261t_all[i].queue, cmd_list_jd9261t_all[i].len);
  405. }
  406. else
  407. {
  408. lcd_write_cmd_data(conf,cmd_list_jd9261t_all[i].cmd, cmd_list_jd9261t_all[i].buf, cmd_list_jd9261t_all[i].len);
  409. }
  410. }
  411. }
  412. luat_lcd_set_direction(conf,conf->direction);
  413. uint8_t temp = 0x60;
  414. // lcd_write_cmd_data(conf,0xc2, &temp, 1);
  415. lcd_write_cmd_data(conf,0x35, NULL, 0);
  416. temp = 0x50;
  417. lcd_write_cmd_data(conf,0x3a, &temp, 1);
  418. lcd_write_cmd_data(conf,0x11, NULL, 0);
  419. luat_rtos_task_sleep(120);
  420. lcd_write_cmd_data(conf,0x29, NULL, 0);
  421. luat_rtos_task_sleep(120);
  422. luat_gpio_set(conf->pin_pwr, Luat_GPIO_HIGH);
  423. luat_lcd_qspi_auto_flush_on_off(conf, 1);
  424. return 0;
  425. }
  426. luat_lcd_opts_t lcd_opts_jd9261t = {
  427. .name = "jd9261t",
  428. .sleep_cmd = 0xff, //不需要发命令
  429. .wakeup_cmd = 0xff, //不需要发命令
  430. .init_cmds_len = 0,
  431. .init_cmds = NULL,
  432. .direction0 = 0x00,
  433. .direction90 = 0x00,
  434. .direction180 = 0x03,
  435. .direction270 = 0x03,
  436. .rb_swap = 1,
  437. .no_ram_mode = 1,
  438. .user_ctrl_init = jd9261t_init,
  439. };
  440. #endif