VVX07H005A10.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. /*
  2. * Allwinner SoCs display driver.
  3. *
  4. * Copyright (C) 2016 Allwinner.
  5. *
  6. * This file is licensed under the terms of the GNU General Public
  7. * License version 2. This program is licensed "as is" without any
  8. * warranty of any kind, whether express or implied.
  9. */
  10. #include "VVX07H005A10.h"
  11. #include "../disp_sys_intf.h"
  12. static void LCD_power_on(u32 sel);
  13. static void LCD_power_off(u32 sel);
  14. static void LCD_bl_open(u32 sel);
  15. static void LCD_bl_close(u32 sel);
  16. static void LCD_panel_init(u32 sel);
  17. static void LCD_panel_exit(u32 sel);
  18. static __s32 LCD_user_defined_func(__u32 sel, __u32 para1, __u32 para2, __u32 para3);
  19. // #define LCD_DEBUG
  20. #ifdef LCD_DEBUG
  21. #define DEBUG(fmt, args...) printf("[DEBUG] %s, %s, %d " fmt "\n", __FILE__, __func__, __LINE__, ## args)
  22. #else
  23. #define DEBUG(fmt, args...)
  24. #endif
  25. #define dsi_dcs_wr_0para sunxi_lcd_dsi_dcs_write_0para
  26. #define dsi_dcs_wr_1para sunxi_lcd_dsi_dcs_write_1para
  27. #define dsi_dcs_wr_2para sunxi_lcd_dsi_dcs_write_2para
  28. #define dsi_dcs_wr_3para sunxi_lcd_dsi_dcs_write_3para
  29. #define dsi_dcs_wr_4para sunxi_lcd_dsi_dcs_write_4para
  30. #define dsi_dcs_wr_5para sunxi_lcd_dsi_dcs_write_5para
  31. #define dsi_dcs_wr_6para sunxi_lcd_dsi_dcs_write_6para
  32. #define dsi_dcs_wr_longpara sunxi_lcd_dsi_dcs_write
  33. #define delayms sunxi_lcd_delay_ms
  34. static void tft7201280_init(__u32 sel, __u32 mode, __u32 lane, __u32 format)
  35. {
  36. //-----------------------Initial Code--------------------------------------//
  37. //Page0
  38. dsi_dcs_wr_1para(sel,0xE0,0x00);
  39. //--- PASSWORD ----//
  40. dsi_dcs_wr_1para(sel,0xE1,0x93);
  41. dsi_dcs_wr_1para(sel,0xE2,0x65);
  42. dsi_dcs_wr_1para(sel,0xE3,0xF8);
  43. dsi_dcs_wr_1para(sel,0x80,0x03);
  44. //--- Page1 ----//
  45. dsi_dcs_wr_1para(sel,0xE0,0x01);
  46. //Set VCOM
  47. dsi_dcs_wr_1para(sel,0x01,0x67);
  48. //Set Gamma Power, VGMP,VGMN,VGSP,VGSN
  49. dsi_dcs_wr_1para(sel,0x17,0x00);
  50. dsi_dcs_wr_1para(sel,0x18,0xBF);//4.5V, D7=4.8V
  51. dsi_dcs_wr_1para(sel,0x19,0x01);//0.0V
  52. dsi_dcs_wr_1para(sel,0x1A,0x00);
  53. dsi_dcs_wr_1para(sel,0x1B,0xBF);
  54. dsi_dcs_wr_1para(sel,0x1C,0x01);
  55. dsi_dcs_wr_1para(sel,0x0C,0x74);
  56. //Set Gate Power
  57. dsi_dcs_wr_1para(sel,0x1F,0x70); //VGH_REG=16.2V
  58. dsi_dcs_wr_1para(sel,0x20,0x2D); //VGL_REG=-12V
  59. dsi_dcs_wr_1para(sel,0x21,0x2D); //VGL_REG2=-12V
  60. dsi_dcs_wr_1para(sel,0x22,0x7E);
  61. dsi_dcs_wr_1para(sel,0x0C,0x74);
  62. dsi_dcs_wr_1para(sel,0x35,0x28); //SAP
  63. dsi_dcs_wr_1para(sel,0x37,0x19); //SS=1,BGR=1
  64. //SET RGBCYC
  65. dsi_dcs_wr_1para(sel,0x38,0x05); //JDT=101 zigzag inversion
  66. dsi_dcs_wr_1para(sel,0x39,0x00);
  67. dsi_dcs_wr_1para(sel,0x3A,0x01);
  68. dsi_dcs_wr_1para(sel,0x3C,0x7C); //SET EQ3 for TE_H
  69. dsi_dcs_wr_1para(sel,0x3D,0xFF); //SET CHGEN_ON, modify 20140806
  70. dsi_dcs_wr_1para(sel,0x3E,0xFF); //SET CHGEN_OFF, modify 20140806
  71. dsi_dcs_wr_1para(sel,0x3F,0x7F); //SET CHGEN_OFF2, modify 20140806
  72. //Set TCON
  73. dsi_dcs_wr_1para(sel,0x40,0x06); //RSO=
  74. dsi_dcs_wr_1para(sel,0x41,0xA0); //LN=640->1280 line
  75. dsi_dcs_wr_1para(sel,0x43,0x1E); //VFP=30
  76. dsi_dcs_wr_1para(sel,0x44,0x0B); //VBP=12
  77. dsi_dcs_wr_1para(sel,0x45,0x28); //HBP=40
  78. //--- power voltage ----//
  79. dsi_dcs_wr_1para(sel,0x55,0x01);
  80. dsi_dcs_wr_1para(sel,0x57,0xA9);
  81. //dsi_dcs_wr_1para(sel,0x58,0x0A);
  82. dsi_dcs_wr_1para(sel,0x59,0x0A); //VCL = -2.5V
  83. dsi_dcs_wr_1para(sel,0x5A,0x2E); //VGH = 16.2V
  84. dsi_dcs_wr_1para(sel,0x5B,0x1A); //VGL = -12V
  85. dsi_dcs_wr_1para(sel,0x5C,0x15); //pump clk
  86. //--- Gamma ----//
  87. dsi_dcs_wr_1para(sel,0x5D,0x7F);
  88. dsi_dcs_wr_1para(sel,0x5E,0x64);
  89. dsi_dcs_wr_1para(sel,0x5F,0x53);
  90. dsi_dcs_wr_1para(sel,0x60,0x47);
  91. dsi_dcs_wr_1para(sel,0x61,0x43);
  92. dsi_dcs_wr_1para(sel,0x62,0x33);
  93. dsi_dcs_wr_1para(sel,0x63,0x37);
  94. dsi_dcs_wr_1para(sel,0x64,0x21);
  95. dsi_dcs_wr_1para(sel,0x65,0x39);
  96. dsi_dcs_wr_1para(sel,0x66,0x37);
  97. dsi_dcs_wr_1para(sel,0x67,0x34);
  98. dsi_dcs_wr_1para(sel,0x68,0x50);
  99. dsi_dcs_wr_1para(sel,0x69,0x3D);
  100. dsi_dcs_wr_1para(sel,0x6A,0x44);
  101. dsi_dcs_wr_1para(sel,0x6B,0x36);
  102. dsi_dcs_wr_1para(sel,0x6C,0x34);
  103. dsi_dcs_wr_1para(sel,0x6D,0x25);
  104. dsi_dcs_wr_1para(sel,0x6E,0x15);
  105. dsi_dcs_wr_1para(sel,0x6F,0x02);
  106. dsi_dcs_wr_1para(sel,0x70,0x7F);
  107. dsi_dcs_wr_1para(sel,0x71,0x64);
  108. dsi_dcs_wr_1para(sel,0x72,0x53);
  109. dsi_dcs_wr_1para(sel,0x73,0x47);
  110. dsi_dcs_wr_1para(sel,0x74,0x43);
  111. dsi_dcs_wr_1para(sel,0x75,0x33);
  112. dsi_dcs_wr_1para(sel,0x76,0x37);
  113. dsi_dcs_wr_1para(sel,0x77,0x21);
  114. dsi_dcs_wr_1para(sel,0x78,0x39);
  115. dsi_dcs_wr_1para(sel,0x79,0x37);
  116. dsi_dcs_wr_1para(sel,0x7A,0x34);
  117. dsi_dcs_wr_1para(sel,0x7B,0x50);
  118. dsi_dcs_wr_1para(sel,0x7C,0x3D);
  119. dsi_dcs_wr_1para(sel,0x7D,0x44);
  120. dsi_dcs_wr_1para(sel,0x7E,0x36);
  121. dsi_dcs_wr_1para(sel,0x7F,0x34);
  122. dsi_dcs_wr_1para(sel,0x80,0x25);
  123. dsi_dcs_wr_1para(sel,0x81,0x15);
  124. dsi_dcs_wr_1para(sel,0x82,0x02);
  125. //Page2, for GIP
  126. dsi_dcs_wr_1para(sel,0xE0,0x02);
  127. //GIP_L Pin mapping
  128. dsi_dcs_wr_1para(sel,0x00,0x52);//RESET_EVEN
  129. dsi_dcs_wr_1para(sel,0x01,0x55);//VSSG_EVEN
  130. dsi_dcs_wr_1para(sel,0x02,0x55);//VSSG_EVEN
  131. dsi_dcs_wr_1para(sel,0x03,0x50);//STV2_ODD
  132. dsi_dcs_wr_1para(sel,0x04,0x77);//VDD2_ODD
  133. dsi_dcs_wr_1para(sel,0x05,0x57);//VDD1_ODD
  134. dsi_dcs_wr_1para(sel,0x06,0x55);//x
  135. dsi_dcs_wr_1para(sel,0x07,0x4E);//CK11
  136. dsi_dcs_wr_1para(sel,0x08,0x4C);//CK9
  137. dsi_dcs_wr_1para(sel,0x09,0x5F);//x
  138. dsi_dcs_wr_1para(sel,0x0A,0x4A);//CK7
  139. dsi_dcs_wr_1para(sel,0x0B,0x48);//CK5
  140. dsi_dcs_wr_1para(sel,0x0C,0x55);//x
  141. dsi_dcs_wr_1para(sel,0x0D,0x46);//CK3
  142. dsi_dcs_wr_1para(sel,0x0E,0x44);//CK1
  143. dsi_dcs_wr_1para(sel,0x0F,0x40);//STV1_ODD
  144. dsi_dcs_wr_1para(sel,0x10,0x55);//x
  145. dsi_dcs_wr_1para(sel,0x11,0x55);//x
  146. dsi_dcs_wr_1para(sel,0x12,0x55);//x
  147. dsi_dcs_wr_1para(sel,0x13,0x55);//x
  148. dsi_dcs_wr_1para(sel,0x14,0x55);//x
  149. dsi_dcs_wr_1para(sel,0x15,0x55);//x
  150. //GIP_R Pin mapping
  151. dsi_dcs_wr_1para(sel,0x16,0x53);//RESET__EVEN
  152. dsi_dcs_wr_1para(sel,0x17,0x55);//VSSG_EVEN
  153. dsi_dcs_wr_1para(sel,0x18,0x55);//VSSG_EVEN
  154. dsi_dcs_wr_1para(sel,0x19,0x51);//STV2_EVEN
  155. dsi_dcs_wr_1para(sel,0x1A,0x77);//VDD2_EVEN
  156. dsi_dcs_wr_1para(sel,0x1B,0x57);//VDD1_EVEN
  157. dsi_dcs_wr_1para(sel,0x1C,0x55);//x
  158. dsi_dcs_wr_1para(sel,0x1D,0x4F);//CK12
  159. dsi_dcs_wr_1para(sel,0x1E,0x4D);//CK10
  160. dsi_dcs_wr_1para(sel,0x1F,0x5F);//x
  161. dsi_dcs_wr_1para(sel,0x20,0x4B);//CK8
  162. dsi_dcs_wr_1para(sel,0x21,0x49);//CK6
  163. dsi_dcs_wr_1para(sel,0x22,0x55);//x
  164. dsi_dcs_wr_1para(sel,0x23,0x47);//CK4
  165. dsi_dcs_wr_1para(sel,0x24,0x45);//CK2
  166. dsi_dcs_wr_1para(sel,0x25,0x41);//STV1_EVEN
  167. dsi_dcs_wr_1para(sel,0x26,0x55);//x
  168. dsi_dcs_wr_1para(sel,0x27,0x55);//x
  169. dsi_dcs_wr_1para(sel,0x28,0x55);//x
  170. dsi_dcs_wr_1para(sel,0x29,0x55);//x
  171. dsi_dcs_wr_1para(sel,0x2A,0x55);//x
  172. dsi_dcs_wr_1para(sel,0x2B,0x55);//x
  173. //GIP_L_GS Pin mapping
  174. dsi_dcs_wr_1para(sel,0x2C,0x13);//RESET_EVEN
  175. dsi_dcs_wr_1para(sel,0x2D,0x15);//VSSG_EVEN
  176. dsi_dcs_wr_1para(sel,0x2E,0x15);//VSSG_EVEN
  177. dsi_dcs_wr_1para(sel,0x2F,0x01);//STV2_ODD
  178. dsi_dcs_wr_1para(sel,0x30,0x37);//VDD2_ODD
  179. dsi_dcs_wr_1para(sel,0x31,0x17);//VDD1_ODD
  180. dsi_dcs_wr_1para(sel,0x32,0x15);//x
  181. dsi_dcs_wr_1para(sel,0x33,0x0D);//CK11
  182. dsi_dcs_wr_1para(sel,0x34,0x0F);//CK9
  183. dsi_dcs_wr_1para(sel,0x35,0x15);//x
  184. dsi_dcs_wr_1para(sel,0x36,0x05);//CK7
  185. dsi_dcs_wr_1para(sel,0x37,0x07);//CK5
  186. dsi_dcs_wr_1para(sel,0x38,0x15);//x
  187. dsi_dcs_wr_1para(sel,0x39,0x09);//CK3
  188. dsi_dcs_wr_1para(sel,0x3A,0x0B);//CK1
  189. dsi_dcs_wr_1para(sel,0x3B,0x11);//STV1_ODD
  190. dsi_dcs_wr_1para(sel,0x3C,0x15);//x
  191. dsi_dcs_wr_1para(sel,0x3D,0x15);//x
  192. dsi_dcs_wr_1para(sel,0x3E,0x15);//x
  193. dsi_dcs_wr_1para(sel,0x3F,0x15);//x
  194. dsi_dcs_wr_1para(sel,0x40,0x15);//x
  195. dsi_dcs_wr_1para(sel,0x41,0x15);//x
  196. //GIP_R_GS Pin mapping
  197. dsi_dcs_wr_1para(sel,0x42,0x12);//RESET__EVEN
  198. dsi_dcs_wr_1para(sel,0x43,0x15);//VSSG_EVEN
  199. dsi_dcs_wr_1para(sel,0x44,0x15);//VSSG_EVEN
  200. dsi_dcs_wr_1para(sel,0x45,0x00);//STV2_EVEN
  201. dsi_dcs_wr_1para(sel,0x46,0x37);//VDD2_EVEN
  202. dsi_dcs_wr_1para(sel,0x47,0x17);//VDD1_EVEN
  203. dsi_dcs_wr_1para(sel,0x48,0x15);//x
  204. dsi_dcs_wr_1para(sel,0x49,0x0C);//CK12
  205. dsi_dcs_wr_1para(sel,0x4A,0x0E);//CK10
  206. dsi_dcs_wr_1para(sel,0x4B,0x15);//x
  207. dsi_dcs_wr_1para(sel,0x4C,0x04);//CK8
  208. dsi_dcs_wr_1para(sel,0x4D,0x06);//CK6
  209. dsi_dcs_wr_1para(sel,0x4E,0x15);//x
  210. dsi_dcs_wr_1para(sel,0x4F,0x08);//CK4
  211. dsi_dcs_wr_1para(sel,0x50,0x0A);//CK2
  212. dsi_dcs_wr_1para(sel,0x51,0x10);//STV1_EVEN
  213. dsi_dcs_wr_1para(sel,0x52,0x15);//x
  214. dsi_dcs_wr_1para(sel,0x53,0x15);//x
  215. dsi_dcs_wr_1para(sel,0x54,0x15);//x
  216. dsi_dcs_wr_1para(sel,0x55,0x15);//x
  217. dsi_dcs_wr_1para(sel,0x56,0x15);//x
  218. dsi_dcs_wr_1para(sel,0x57,0x15);//x
  219. //GIP Timing
  220. dsi_dcs_wr_1para(sel,0x58,0x40);
  221. dsi_dcs_wr_1para(sel,0x5B,0x10);
  222. dsi_dcs_wr_1para(sel,0x5C,0x06);//STV_S0
  223. dsi_dcs_wr_1para(sel,0x5D,0x40);
  224. dsi_dcs_wr_1para(sel,0x5E,0x00);
  225. dsi_dcs_wr_1para(sel,0x5F,0x00);
  226. dsi_dcs_wr_1para(sel,0x60,0x40);//ETV_W
  227. dsi_dcs_wr_1para(sel,0x61,0x03);
  228. dsi_dcs_wr_1para(sel,0x62,0x04);
  229. dsi_dcs_wr_1para(sel,0x63,0x6C);//CKV_ON
  230. dsi_dcs_wr_1para(sel,0x64,0x6C);//CKV_OFF
  231. dsi_dcs_wr_1para(sel,0x65,0x75);
  232. dsi_dcs_wr_1para(sel,0x66,0x08);//ETV_S0
  233. dsi_dcs_wr_1para(sel,0x67,0xB4); //ckv_num/ckv_w
  234. dsi_dcs_wr_1para(sel,0x68,0x08); //CKV_S0
  235. dsi_dcs_wr_1para(sel,0x69,0x6C);//CKV_ON
  236. dsi_dcs_wr_1para(sel,0x6A,0x6C);//CKV_OFF
  237. dsi_dcs_wr_1para(sel,0x6B,0x0C); //dummy
  238. dsi_dcs_wr_1para(sel,0x6D,0x00);//GGND1
  239. dsi_dcs_wr_1para(sel,0x6E,0x00);//GGND2
  240. dsi_dcs_wr_1para(sel,0x6F,0x88);
  241. dsi_dcs_wr_1para(sel,0x75,0xBB);//FLM_EN
  242. dsi_dcs_wr_1para(sel,0x76,0x00);
  243. dsi_dcs_wr_1para(sel,0x77,0x05);
  244. dsi_dcs_wr_1para(sel,0x78,0x2A);//FLM_OFF
  245. //Page4
  246. dsi_dcs_wr_1para(sel,0xE0,0x04);
  247. dsi_dcs_wr_1para(sel,0x09,0x11);
  248. dsi_dcs_wr_1para(sel,0x0E,0x48); //Source EQ option
  249. dsi_dcs_wr_1para(sel,0x2B,0x2B);
  250. dsi_dcs_wr_1para(sel,0x2D,0x03);//defult 0x01
  251. dsi_dcs_wr_1para(sel,0x2E,0x44);
  252. //Page5
  253. dsi_dcs_wr_1para(sel,0xE0,0x05);
  254. dsi_dcs_wr_1para(sel,0x12,0x72);//VCI GAS detect voltage
  255. //Page0
  256. dsi_dcs_wr_1para(sel,0xE0,0x00);
  257. dsi_dcs_wr_1para(sel,0xE6,0x02);//WD_Timer
  258. dsi_dcs_wr_1para(sel,0xE7,0x0C);//WD_Timer
  259. //SLP OUT
  260. dsi_dcs_wr_0para(sel,0x01);
  261. dsi_dcs_wr_0para(sel,0x11); // SLPOUT
  262. delayms(120);
  263. //DISP ON
  264. dsi_dcs_wr_0para(sel,0x01);
  265. dsi_dcs_wr_0para(sel,0x29); // DSPON
  266. delayms(5);
  267. }
  268. static void tft7201280_init_s(__u32 sel,__u32 mode,__u32 lane,__u32 format)
  269. {
  270. __u8 tmp1[15]={0x6c,0x12,0x12,0x34,0x04,0x11,0xF1,0x80,0xE5,0x95,0x23,0x80,0xc0,0xd2,0x58};
  271. __u8 tmp2[12]={0x00,0xFF,0x01,0x5A,0x01,0x5A,0x01,0x5A,0x01,0x70,0x01,0x70};
  272. __u8 tmp3[37]={0x00,0x06,0x00,0x01,0x07,0x00,0x00,0x32,0x10,0x08,0x00,0x08,0x52,0x15,0x0E,0x05,0x0E,0x32,0x10,0x00,0x00,0x00,0x37,0x33,0x0C,0x0C,0x37,0x0C,0x0C,0x47,0x08,0x00,0x00,0x00,0x0A,0x00,0x01};
  273. __u8 tmp4[44]={0x1B,0x1B,0x1A,0x1A,0x06,0x07,0x02,0x03,0x04,0x05,0x00,0x01,0x20,0x21,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x18,0x24,0x19,0x18,0x25};
  274. __u8 tmp5[44]={0x1B,0x1B,0x1A,0x1A,0x01,0x00,0x05,0x04,0x03,0x02,0x07,0x06,0x25,0x24,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x18,0x18,0x19,0x21,0x18,0x18,0x20};
  275. __u8 tmp6[42]={0x00,0x06,0x17,0x0F,0x10,0x3f,0x2C,0x37,0x0A,0x0F,0x11,0x19,0x10,0x15,0x17,0x15,0x15,0x07,0x13,0x15,0x19,0x00,0x06,0x17,0x0F,0x10,0x3F,0x2C,0x37,0x0A,0x0F,0x11,0x19,0x10,0x15,0x17,0x15,0x15,0x07,0x13,0x15,0x19};
  276. __u8 tmp7[42]={0x00,0x16,0x1E,0x0E,0x0C,0x39,0x2E,0x3B,0x09,0x0D,0x0F,0x19,0x11,0x14,0x17,0x15,0x15,0x08,0x14,0x15,0x16,0x00,0x12,0x1B,0x0E,0x0C,0x39,0x26,0x2E,0x08,0x0E,0x0F,0x18,0x10,0x14,0x17,0x15,0x16,0x08,0x14,0x15,0x16};
  277. //-----------------------Initial Code--------------------------------------//
  278. //password
  279. dsi_dcs_wr_3para(sel,0xB9,0xFF,0x83,0x94);
  280. delayms(1);
  281. //setting mipi 4-lane
  282. dsi_dcs_wr_2para(sel,0xBA,0x33,0x83);
  283. delayms(1);
  284. dsi_dcs_wr_longpara(sel,0xB1,tmp1,15);
  285. delayms(1);
  286. //set display
  287. dsi_dcs_wr_6para(sel,0xB2,0x00,0x64,0x10,0x07,0x32,0x1C);
  288. delayms(1);
  289. //setting CYC
  290. dsi_dcs_wr_longpara(sel,0xB4,tmp2,12);
  291. delayms(1);
  292. //set d3
  293. dsi_dcs_wr_longpara(sel,0xD3,tmp3,37);
  294. delayms(1);
  295. //setting SCAN RGB
  296. dsi_dcs_wr_1para(sel,0xCC,0x0B);
  297. delayms(1);
  298. //setting GIP
  299. dsi_dcs_wr_longpara(sel,0xD5,tmp4,44);
  300. delayms(1);
  301. //set D6
  302. dsi_dcs_wr_longpara(sel,0xD6,tmp5,44);
  303. delayms(1);
  304. //set VOCN option
  305. dsi_dcs_wr_4para(sel,0xC7,0x00,0xC0,0x00,0xC0);
  306. delayms(1);
  307. dsi_dcs_wr_1para(sel,0xC6,0x1D);
  308. //setting Gamma
  309. dsi_dcs_wr_longpara(sel,0xE0,tmp6,42);
  310. //dsi_dcs_wr_longpara(sel,0xE0,tmp7,42);
  311. delayms(10);
  312. //setting sleep out
  313. dsi_dcs_wr_0para(sel,0x11);
  314. delayms(20);
  315. dsi_dcs_wr_2para(sel,0xB6,0x32,0x32);
  316. //setting Display
  317. dsi_dcs_wr_0para(sel,0x29); // DSPON
  318. delayms(10);
  319. }
  320. static void LCD_cfg_panel_info(struct panel_extend_para *info)
  321. {
  322. u32 i = 0, j = 0;
  323. u32 items;
  324. u8 lcd_gamma_tbl[][2] = {
  325. /* {input value, corrected value} */
  326. {0, 0},
  327. {15, 15},
  328. {30, 30},
  329. {45, 45},
  330. {60, 60},
  331. {75, 75},
  332. {90, 90},
  333. {105, 105},
  334. {120, 120},
  335. {135, 135},
  336. {150, 150},
  337. {165, 165},
  338. {180, 180},
  339. {195, 195},
  340. {210, 210},
  341. {225, 225},
  342. {240, 240},
  343. {255, 255},
  344. };
  345. u32 lcd_cmap_tbl[2][3][4] = {
  346. {
  347. {LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
  348. {LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
  349. {LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
  350. },
  351. {
  352. {LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
  353. {LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
  354. {LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
  355. },
  356. };
  357. items = sizeof(lcd_gamma_tbl) / 2;
  358. for (i = 0; i < items - 1; i++) {
  359. u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
  360. for (j = 0; j < num; j++) {
  361. u32 value = 0;
  362. value =
  363. lcd_gamma_tbl[i][1] +
  364. ((lcd_gamma_tbl[i + 1][1] -
  365. lcd_gamma_tbl[i][1]) * j) / num;
  366. info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
  367. (value << 16) + (value << 8) + value;
  368. }
  369. }
  370. info->lcd_gamma_tbl[255] =
  371. (lcd_gamma_tbl[items - 1][1] << 16) +
  372. (lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
  373. memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
  374. }
  375. static s32 LCD_open_flow(u32 sel)
  376. {
  377. LCD_OPEN_FUNC(sel, LCD_power_on, 15); //open lcd power, and delay 10ms
  378. LCD_OPEN_FUNC(sel, LCD_panel_init, 30); //open lcd power, than delay 50ms
  379. LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 30); //open lcd controller, and delay 50ms
  380. LCD_OPEN_FUNC(sel, LCD_bl_open, 0); //open lcd backlight, and delay 0ms
  381. return 0;
  382. }
  383. static s32 LCD_close_flow(u32 sel)
  384. {
  385. LCD_CLOSE_FUNC(sel, LCD_bl_close, 0); //close lcd backlight, and delay 0ms
  386. LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 0); //close lcd controller, and delay 0ms
  387. LCD_CLOSE_FUNC(sel, LCD_panel_exit, 20); //open lcd power, than delay 20ms
  388. LCD_CLOSE_FUNC(sel, LCD_power_off, 50); //close lcd power, and delay 50ms
  389. return 0;
  390. }
  391. static void LCD_power_on(u32 sel)
  392. {
  393. sunxi_lcd_power_enable(sel, 0);//config lcd_power pin to open lcd power0
  394. sunxi_lcd_pin_cfg(sel, 1);
  395. }
  396. static void LCD_power_off(u32 sel)
  397. {
  398. sunxi_lcd_pin_cfg(sel, 0);
  399. sunxi_lcd_power_disable(sel, 0);//config lcd_power pin to close lcd power0
  400. sunxi_lcd_dsi_clk_disable(sel);
  401. }
  402. static void LCD_bl_open(u32 sel)
  403. {
  404. sunxi_lcd_pwm_enable(sel);
  405. sunxi_lcd_backlight_enable(sel);//config lcd_bl_en pin to open lcd backlight
  406. }
  407. static void LCD_bl_close(u32 sel)
  408. {
  409. sunxi_lcd_backlight_disable(sel);//config lcd_bl_en pin to close lcd backlight
  410. sunxi_lcd_pwm_disable(sel);
  411. }
  412. static void LCD_panel_init(u32 sel)
  413. {
  414. #if 0
  415. // 有的屏需要初始化,在这里添加。比如hv屏可能需要spi或则iic初始化,
  416. // dsi屏,用LP_TX模式初始化
  417. struct disp_panel_para *panel_info = malloc(sizeof(struct disp_panel_para));
  418. bsp_disp_get_panel_info(sel, panel_info);
  419. sunxi_lcd_dsi_clk_enable(sel);
  420. tft7201280_init_s(sel, panel_info->lcd_dsi_if, panel_info->lcd_dsi_lane, panel_info->lcd_dsi_format);
  421. disp_sys_free(panel_info);
  422. #else
  423. struct disp_panel_para *panel_info = malloc(sizeof(struct disp_panel_para));
  424. bsp_disp_get_panel_info(sel, panel_info);
  425. sunxi_lcd_dsi_clk_enable(sel);
  426. //tft7201280_init(sel, panel_info->lcd_dsi_if, panel_info->lcd_dsi_lane, panel_info->lcd_dsi_format);
  427. disp_sys_free(panel_info);
  428. #endif
  429. return;
  430. }
  431. static void LCD_panel_exit(u32 sel)
  432. {
  433. sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_SET_DISPLAY_OFF);
  434. sunxi_lcd_delay_ms(50);
  435. sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_ENTER_SLEEP_MODE);
  436. sunxi_lcd_delay_ms(20);
  437. }
  438. /* sel: 0:lcd0; 1:lcd1 */
  439. static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
  440. {
  441. return 0;
  442. }
  443. struct __lcd_panel VVX07H005A10_panel = {
  444. /* panel driver name, must mach the lcd_drv_name in sys_config.fex */
  445. .name = "VVX07H005A10",
  446. .func = {
  447. .cfg_panel_info = LCD_cfg_panel_info,
  448. .cfg_open_flow = LCD_open_flow,
  449. .cfg_close_flow = LCD_close_flow,
  450. .lcd_user_defined_func = LCD_user_defined_func,
  451. }
  452. ,
  453. };