hx8389c_dsi_vdo.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868
  1. #ifndef BUILD_LK
  2. #include <linux/string.h>
  3. #endif
  4. #include "lcm_drv.h"
  5. #ifdef BUILD_LK
  6. #include <platform/mt_gpio.h>
  7. #else
  8. #include <mt-plat/mt_gpio.h>
  9. #include "../../../../misc/mediatek/auxadc/mt_auxadc.h"
  10. #endif
  11. // ---------------------------------------------------------------------------
  12. // Local Constantsq
  13. // ---------------------------------------------------------------------------
  14. #define AUXADC_LCM_VOLTAGE_CHANNEL 1
  15. #define FRAME_WIDTH (540)
  16. #define FRAME_HEIGHT (960)
  17. #define REGFLAG_DELAY 0XFFE
  18. #define REGFLAG_END_OF_TABLE 0xFFF // END OF REGISTERS MARKER
  19. // ---------------------------------------------------------------------------
  20. // Local Variables
  21. // ---------------------------------------------------------------------------
  22. static LCM_UTIL_FUNCS lcm_util;
  23. //static int g_which_lcm = -1;
  24. extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata);
  25. //static unsigned int lcm_compare_id(void);
  26. #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
  27. #define UDELAY(n) (lcm_util.udelay(n))
  28. #define MDELAY(n) (lcm_util.mdelay(n))
  29. // ---------------------------------------------------------------------------
  30. // Local Functions
  31. // ---------------------------------------------------------------------------
  32. #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
  33. #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
  34. #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
  35. #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
  36. #define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd)
  37. #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
  38. #define LCM_DSI_CMD_MODE (0)
  39. static struct LCM_setting_table
  40. {
  41. unsigned cmd;
  42. unsigned char count;
  43. unsigned char para_list[128];
  44. };
  45. static struct LCM_setting_table lcm_initialization_setting[] = {
  46. #if 0
  47. /*
  48. Note :
  49. Data ID will depends on the following rule.
  50. count of parameters > 1 => Data ID = 0x39
  51. count of parameters = 1 => Data ID = 0x15
  52. count of parameters = 0 => Data ID = 0x05
  53. Structure Format :
  54. {DCS command, count of parameters, {parameter list}}
  55. {REGFLAG_DELAY, milliseconds of time, {}},
  56. ...
  57. Setting ending by predefined flag
  58. {REGFLAG_END_OF_TABLE, 0x00, {}}
  59. */
  60. /* SET PASSWORD//10//F2//58 */
  61. { 0xB9, 03, {0xFF, 0x83, 0x89} },
  62. /* SET POWER HI */
  63. { 0xB1, 20, {0x7F, 0x10, 0x10, 0x32, 0x32, 0x50, 0x10, 0xF2, 0x58, 0x80,
  64. 0x20, 0x20, 0xF8, 0xAA, 0xAA, 0xA0, 0x00, 0x80, 0x30, 0x00} },
  65. { 0xB2, 10, {0x80, 0x50, 0x05, 0x07, 0x40, 0x38, 0x11, 0x64, 0x5D, 0x09} },
  66. /* SET CYC HI */
  67. { 0xB4, 11, {0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x10, 0x76, 0x10, 0x76,
  68. 0xB0} },
  69. /* SET GAMMA */
  70. { 0xD3, 35, {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x32, 0x10, 0x00,
  71. 0x00, 0x00, 0x03, 0xC6, 0x03, 0xC6, 0x00, 0x00, 0x00, 0x00,
  72. 0x35, 0x33, 0x04, 0x04, 0x37, 0x00, 0x00, 0x00, 0x05, 0x08,
  73. 0x00, 0x00, 0x0A, 0x00, 0x01} },
  74. { 0xD5, 38, {0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x18, 0x18, 0x20, 0x21,
  75. 0x24, 0x25, 0x18, 0x18, 0x18, 0x18, 0x00, 0x01, 0x04, 0x05,
  76. 0x02, 0x03, 0x06, 0x07, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
  77. 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18} },
  78. { 0xD6, 38, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x25, 0x24,
  79. 0x21, 0x20, 0x18, 0x18, 0x18, 0x18, 0x07, 0x06, 0x03, 0x02,
  80. 0x05, 0x04, 0x01, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
  81. 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18} },
  82. { 0xCC, 01, {0x02} },
  83. { 0xC7, 04, {0x00, 0x80, 0x00, 0xC0} },
  84. { 0xD2, 01, {0x33} },
  85. { 0xE0, 42, {0x00, 0x0F, 0x16, 0x35, 0x3B, 0x3F, 0x21, 0x43, 0x07, 0x0B,
  86. 0x0D, 0x18, 0x0E, 0x10, 0x12, 0x11, 0x13, 0x06, 0x10, 0x13,
  87. 0x18, 0x00, 0x0F, 0x15, 0x35, 0x3B, 0x3F, 0x21, 0x42, 0x07,
  88. 0x0B, 0x0D, 0x18, 0x0D, 0x11, 0x13, 0x11, 0x12, 0x07, 0x11,
  89. 0x12, 0x17} },
  90. { 0xB6, 03, {0x88, 0x88, 0x00} },
  91. { 0x35, 01, {0x00} },
  92. { 0x11, 00, {} },
  93. /* DISPLAY ON */
  94. { 0x29, 00, {} },
  95. /* stop loop */
  96. { REGFLAG_END_OF_TABLE, 0, {0x00} }
  97. #else
  98. {0xB9,3,{0xFF,0x83,0x89}},
  99. {0xB1,16,{0x7F,0x10,0x10,0x32,0x92,0x90,0x10,0xFA,0x58,0x80,0x20,0x20,0xF8,0xAA,0xAA,0xA3,0x00,0x80,0x30,0x00}},
  100. {0xB2,10,{0x80,0x50,0x0A,0x06,0x40,0x38,0x11,0x64,0x55,0x09}},
  101. {0xB4,11,{0x02,0x70,0x02,0x70,0x00,0x00,0x10,0x76,0x10,0x76,0x90}},
  102. {0xD3,35,{0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x32,0x10,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x09,0x09,0x13,0x00,0x00,0x00,0x0C,0x08,0x00,0x00,0x0A,0x00,0x01}},
  103. {0xD5,38,{0x18,0x18,0x18,0x18,0x18,0x18,0x01,0x00,0x03,0x02,0x19,0x19,0x19,0x19,0x21,0x20,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}},
  104. {0xD6,38,{0x18,0x18,0x18,0x18,0x18,0x18,0x02,0x03,0x00,0x01,0x19,0x19,0x18,0x18,0x20,0x21,0x19,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}},
  105. {0xC0,4,{0x30,0x15,0x00,0x03}},
  106. {0xC7,4,{0x00,0x80,0x00,0xC0}},
  107. {0xD2,1,{0x22}},
  108. {0xCC,1,{0x02}},
  109. {0xE0,42,{0x00,0x02,0x05,0x0F,0x10,0x1F,0x17,0x31,0x06,0x08,0x0A,0x14,0x10,0x15,0x17,0x16,0x16,0x09,0x13,0x14,0x17,0x00,0x02,0x05,0x0F,0x10,0x1F,0x17,0x31,0x06,0x08,0x0A,0x14,0x10,0x15,0x17,0x16,0x16,0x09,0x13,0x14,0x17}},
  110. {REGFLAG_DELAY, 5, {}},
  111. {0xB6,2,{0x48,0x48}},
  112. {0xCD,1,{0x5A}},
  113. {0x11,1,{0x00}},
  114. {REGFLAG_DELAY, 120,{}},
  115. {0x29,1,{0x00}},
  116. {REGFLAG_DELAY, 50,{}},
  117. {0x35,1,{0x00}},
  118. {REGFLAG_DELAY, 100, {}},
  119. { REGFLAG_END_OF_TABLE, 0, {0x00} }
  120. #endif
  121. };
  122. static struct LCM_setting_table lcm_sleep_in_setting[] = {
  123. // Display off sequence
  124. // Sleep Mode On
  125. { 0x10, 0, {} },
  126. { REGFLAG_DELAY, 120, {} },
  127. { REGFLAG_END_OF_TABLE, 0x00, {} }
  128. };
  129. //static struct LCM_setting_table lcm_backlight_level_setting[] = {
  130. //{0x51, 1, {0xFF}},
  131. //{REGFLAG_END_OF_TABLE, 0x00, {}}
  132. //};
  133. static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update)
  134. {
  135. unsigned int i;
  136. for(i = 0; i < count; i++)
  137. {
  138. unsigned cmd;
  139. cmd = table[i].cmd;
  140. switch (cmd)
  141. {
  142. case REGFLAG_DELAY :
  143. MDELAY(table[i].count);
  144. break;
  145. case REGFLAG_END_OF_TABLE :
  146. break;
  147. default:
  148. dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update);
  149. }
  150. }
  151. }
  152. static void init_lcm_registers(void)
  153. {
  154. #if 1
  155. push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1);
  156. #else
  157. unsigned int data_array[6];
  158. data_array[0] = 0x00053902;
  159. data_array[1] = 0x040698ff;
  160. data_array[2] = 0x00000001;
  161. dsi_set_cmdq(data_array, 3, 1);
  162. MDELAY(20);
  163. data_array[0] = 0x00023902;
  164. data_array[1] = 0x00001008;
  165. dsi_set_cmdq(data_array, 2, 1);
  166. data_array[0] = 0x00023902;
  167. data_array[1] = 0x00000121;
  168. dsi_set_cmdq(data_array, 2, 1);
  169. data_array[0] = 0x00023902;
  170. data_array[1] = 0x00000130;
  171. dsi_set_cmdq(data_array, 2, 1);
  172. data_array[0] = 0x00023902;
  173. data_array[1] = 0x00000231;
  174. dsi_set_cmdq(data_array, 2, 1);
  175. data_array[0] = 0x00023902;
  176. data_array[1] = 0x00000760;
  177. dsi_set_cmdq(data_array, 2, 1);
  178. data_array[0] = 0x00023902;
  179. data_array[1] = 0x00000061;
  180. dsi_set_cmdq(data_array, 2, 1);
  181. data_array[0] = 0x00023902;
  182. data_array[1] = 0x00000862;
  183. dsi_set_cmdq(data_array, 2, 1);
  184. data_array[0] = 0x00023902;
  185. data_array[1] = 0x00000063;
  186. dsi_set_cmdq(data_array, 2, 1);
  187. data_array[0] = 0x00023902;
  188. data_array[1] = 0x00001440;
  189. dsi_set_cmdq(data_array, 2, 1);
  190. data_array[0] = 0x00023902;
  191. data_array[1] = 0x00003341;
  192. dsi_set_cmdq(data_array, 2, 1);
  193. data_array[0] = 0x00023902;
  194. data_array[1] = 0x00000242;
  195. dsi_set_cmdq(data_array, 2, 1);
  196. data_array[0] = 0x00023902;
  197. data_array[1] = 0x00000943;
  198. dsi_set_cmdq(data_array, 2, 1);
  199. data_array[0] = 0x00023902;
  200. data_array[1] = 0x00000644;
  201. dsi_set_cmdq(data_array, 2, 1);
  202. data_array[0] = 0x00023902;
  203. data_array[1] = 0x00007850;
  204. dsi_set_cmdq(data_array, 2, 1);
  205. data_array[0] = 0x00023902;
  206. data_array[1] = 0x00007851;
  207. dsi_set_cmdq(data_array, 2, 1);
  208. data_array[0] = 0x00023902;
  209. data_array[1] = 0x00000052;
  210. dsi_set_cmdq(data_array, 2, 1);
  211. data_array[0] = 0x00023902;
  212. data_array[1] = 0x00006353;
  213. dsi_set_cmdq(data_array, 2, 1);
  214. data_array[0] = 0x00023902;
  215. data_array[1] = 0x00005057;
  216. dsi_set_cmdq(data_array, 2, 1);
  217. data_array[0] = 0x00023902;
  218. data_array[1] = 0x000000a0;
  219. dsi_set_cmdq(data_array, 2, 1);
  220. data_array[0] = 0x00023902;
  221. data_array[1] = 0x000009a1;
  222. dsi_set_cmdq(data_array, 2, 1);
  223. data_array[0] = 0x00023902;
  224. data_array[1] = 0x00000ea2;
  225. dsi_set_cmdq(data_array, 2, 1);
  226. data_array[0] = 0x00023902;
  227. data_array[1] = 0x000013a3;
  228. dsi_set_cmdq(data_array, 2, 1);
  229. data_array[0] = 0x00023902;
  230. data_array[1] = 0x00000ca4;
  231. dsi_set_cmdq(data_array, 2, 1);
  232. data_array[0] = 0x00023902;
  233. data_array[1] = 0x00001aa5;
  234. dsi_set_cmdq(data_array, 2, 1);
  235. data_array[0] = 0x00023902;
  236. data_array[1] = 0x00000aa6;
  237. dsi_set_cmdq(data_array, 2, 1);
  238. data_array[0] = 0x00023902;
  239. data_array[1] = 0x00000aa7;
  240. dsi_set_cmdq(data_array, 2, 1);
  241. data_array[0] = 0x00023902;
  242. data_array[1] = 0x000001a8;
  243. dsi_set_cmdq(data_array, 2, 1);
  244. data_array[0] = 0x00023902;
  245. data_array[1] = 0x000008a9;
  246. dsi_set_cmdq(data_array, 2, 1);
  247. data_array[0] = 0x00023902;
  248. data_array[1] = 0x000007aa;
  249. dsi_set_cmdq(data_array, 2, 1);
  250. data_array[0] = 0x00023902;
  251. data_array[1] = 0x000005ab;
  252. dsi_set_cmdq(data_array, 2, 1);
  253. data_array[0] = 0x00023902;
  254. data_array[1] = 0x000010ac;
  255. dsi_set_cmdq(data_array, 2, 1);
  256. data_array[0] = 0x00023902;
  257. data_array[1] = 0x000032ad;
  258. dsi_set_cmdq(data_array, 2, 1);
  259. data_array[0] = 0x00023902;
  260. data_array[1] = 0x00002fae;
  261. dsi_set_cmdq(data_array, 2, 1);
  262. data_array[0] = 0x00023902;
  263. data_array[1] = 0x000000af;
  264. dsi_set_cmdq(data_array, 2, 1);
  265. data_array[0] = 0x00023902;
  266. data_array[1] = 0x000000c0;
  267. dsi_set_cmdq(data_array, 2, 1);
  268. data_array[0] = 0x00023902;
  269. data_array[1] = 0x000002c1;
  270. dsi_set_cmdq(data_array, 2, 1);
  271. data_array[0] = 0x00023902;
  272. data_array[1] = 0x000012c2;
  273. dsi_set_cmdq(data_array, 2, 1);
  274. data_array[0] = 0x00023902;
  275. data_array[1] = 0x00000cc3;
  276. dsi_set_cmdq(data_array, 2, 1);
  277. data_array[0] = 0x00023902;
  278. data_array[1] = 0x000008c4;
  279. dsi_set_cmdq(data_array, 2, 1);
  280. data_array[0] = 0x00023902;
  281. data_array[1] = 0x000015c5;
  282. dsi_set_cmdq(data_array, 2, 1);
  283. data_array[0] = 0x00023902;
  284. data_array[1] = 0x000008c6;
  285. dsi_set_cmdq(data_array, 2, 1);
  286. data_array[0] = 0x00023902;
  287. data_array[1] = 0x000006c7;
  288. dsi_set_cmdq(data_array, 2, 1);
  289. data_array[0] = 0x00023902;
  290. data_array[1] = 0x000007c8;
  291. dsi_set_cmdq(data_array, 2, 1);
  292. data_array[0] = 0x00023902;
  293. data_array[1] = 0x000009c9;
  294. dsi_set_cmdq(data_array, 2, 1);
  295. data_array[0] = 0x00023902;
  296. data_array[1] = 0x000006ca;
  297. dsi_set_cmdq(data_array, 2, 1);
  298. data_array[0] = 0x00023902;
  299. data_array[1] = 0x000005cb;
  300. dsi_set_cmdq(data_array, 2, 1);
  301. data_array[0] = 0x00023902;
  302. data_array[1] = 0x00000acc;
  303. dsi_set_cmdq(data_array, 2, 1);
  304. data_array[0] = 0x00023902;
  305. data_array[1] = 0x000025cd;
  306. dsi_set_cmdq(data_array, 2, 1);
  307. data_array[0] = 0x00023902;
  308. data_array[1] = 0x00001fce;
  309. dsi_set_cmdq(data_array, 2, 1);
  310. data_array[0] = 0x00023902;
  311. data_array[1] = 0x000000cf;
  312. dsi_set_cmdq(data_array, 2, 1);
  313. data_array[0] = 0x00053902;
  314. data_array[1] = 0x040698ff;
  315. data_array[2] = 0x00000006;
  316. dsi_set_cmdq(data_array, 3, 1);
  317. MDELAY(20);
  318. data_array[0] = 0x00023902;
  319. data_array[1] = 0x00002100;
  320. dsi_set_cmdq(data_array, 2, 1);
  321. data_array[0] = 0x00023902;
  322. data_array[1] = 0x00000601;
  323. dsi_set_cmdq(data_array, 2, 1);
  324. data_array[0] = 0x00023902;
  325. data_array[1] = 0x00000002;
  326. dsi_set_cmdq(data_array, 2, 1);
  327. data_array[0] = 0x00023902;
  328. data_array[1] = 0x00000003;
  329. dsi_set_cmdq(data_array, 2, 1);
  330. data_array[0] = 0x00023902;
  331. data_array[1] = 0x00000104;
  332. dsi_set_cmdq(data_array, 2, 1);
  333. data_array[0] = 0x00023902;
  334. data_array[1] = 0x00000105;
  335. dsi_set_cmdq(data_array, 2, 1);
  336. data_array[0] = 0x00023902;
  337. data_array[1] = 0x00008006;
  338. dsi_set_cmdq(data_array, 2, 1);
  339. data_array[0] = 0x00023902;
  340. data_array[1] = 0x00000207;
  341. dsi_set_cmdq(data_array, 2, 1);
  342. data_array[0] = 0x00023902;
  343. data_array[1] = 0x00000508;
  344. dsi_set_cmdq(data_array, 2, 1);
  345. data_array[0] = 0x00023902;
  346. data_array[1] = 0x00000009;
  347. dsi_set_cmdq(data_array, 2, 1);
  348. data_array[0] = 0x00023902;
  349. data_array[1] = 0x0000000a;
  350. dsi_set_cmdq(data_array, 2, 1);
  351. data_array[0] = 0x00023902;
  352. data_array[1] = 0x0000000b;
  353. dsi_set_cmdq(data_array, 2, 1);
  354. data_array[0] = 0x00023902;
  355. data_array[1] = 0x0000010c;
  356. dsi_set_cmdq(data_array, 2, 1);
  357. data_array[0] = 0x00023902;
  358. data_array[1] = 0x0000010d;
  359. dsi_set_cmdq(data_array, 2, 1);
  360. data_array[0] = 0x00023902;
  361. data_array[1] = 0x0000000e;
  362. dsi_set_cmdq(data_array, 2, 1);
  363. data_array[0] = 0x00023902;
  364. data_array[1] = 0x0000000f;
  365. dsi_set_cmdq(data_array, 2, 1);
  366. data_array[0] = 0x00023902;
  367. data_array[1] = 0x0000f010;
  368. dsi_set_cmdq(data_array, 2, 1);
  369. data_array[0] = 0x00023902;
  370. data_array[1] = 0x0000f411;
  371. dsi_set_cmdq(data_array, 2, 1);
  372. data_array[0] = 0x00023902;
  373. data_array[1] = 0x00000012;
  374. dsi_set_cmdq(data_array, 2, 1);
  375. data_array[0] = 0x00023902;
  376. data_array[1] = 0x00000013;
  377. dsi_set_cmdq(data_array, 2, 1);
  378. data_array[0] = 0x00023902;
  379. data_array[1] = 0x00000014;
  380. dsi_set_cmdq(data_array, 2, 1);
  381. data_array[0] = 0x00023902;
  382. data_array[1] = 0x0000c015;
  383. dsi_set_cmdq(data_array, 2, 1);
  384. data_array[0] = 0x00023902;
  385. data_array[1] = 0x00000816;
  386. dsi_set_cmdq(data_array, 2, 1);
  387. data_array[0] = 0x00023902;
  388. data_array[1] = 0x00000017;
  389. dsi_set_cmdq(data_array, 2, 1);
  390. data_array[0] = 0x00023902;
  391. data_array[1] = 0x00000018;
  392. dsi_set_cmdq(data_array, 2, 1);
  393. data_array[0] = 0x00023902;
  394. data_array[1] = 0x00000019;
  395. dsi_set_cmdq(data_array, 2, 1);
  396. data_array[0] = 0x00023902;
  397. data_array[1] = 0x0000001a;
  398. dsi_set_cmdq(data_array, 2, 1);
  399. data_array[0] = 0x00023902;
  400. data_array[1] = 0x0000001b;
  401. dsi_set_cmdq(data_array, 2, 1);
  402. data_array[0] = 0x00023902;
  403. data_array[1] = 0x0000001c;
  404. dsi_set_cmdq(data_array, 2, 1);
  405. data_array[0] = 0x00023902;
  406. data_array[1] = 0x0000001d;
  407. dsi_set_cmdq(data_array, 2, 1);
  408. data_array[0] = 0x00023902;
  409. data_array[1] = 0x00000220;
  410. dsi_set_cmdq(data_array, 2, 1);
  411. data_array[0] = 0x00023902;
  412. data_array[1] = 0x00001321;
  413. dsi_set_cmdq(data_array, 2, 1);
  414. data_array[0] = 0x00023902;
  415. data_array[1] = 0x00004522;
  416. dsi_set_cmdq(data_array, 2, 1);
  417. data_array[0] = 0x00023902;
  418. data_array[1] = 0x00006723;
  419. dsi_set_cmdq(data_array, 2, 1);
  420. data_array[0] = 0x00023902;
  421. data_array[1] = 0x00000124;
  422. dsi_set_cmdq(data_array, 2, 1);
  423. data_array[0] = 0x00023902;
  424. data_array[1] = 0x00002325;
  425. dsi_set_cmdq(data_array, 2, 1);
  426. data_array[0] = 0x00023902;
  427. data_array[1] = 0x00004526;
  428. dsi_set_cmdq(data_array, 2, 1);
  429. data_array[0] = 0x00023902;
  430. data_array[1] = 0x00006727;
  431. dsi_set_cmdq(data_array, 2, 1);
  432. data_array[0] = 0x00023902;
  433. data_array[1] = 0x00001330;
  434. dsi_set_cmdq(data_array, 2, 1);
  435. data_array[0] = 0x00023902;
  436. data_array[1] = 0x00002231;
  437. dsi_set_cmdq(data_array, 2, 1);
  438. data_array[0] = 0x00023902;
  439. data_array[1] = 0x00002232;
  440. dsi_set_cmdq(data_array, 2, 1);
  441. data_array[0] = 0x00023902;
  442. data_array[1] = 0x00002233;
  443. dsi_set_cmdq(data_array, 2, 1);
  444. data_array[0] = 0x00023902;
  445. data_array[1] = 0x00002234;
  446. dsi_set_cmdq(data_array, 2, 1);
  447. data_array[0] = 0x00023902;
  448. data_array[1] = 0x0000bb35;
  449. dsi_set_cmdq(data_array, 2, 1);
  450. data_array[0] = 0x00023902;
  451. data_array[1] = 0x0000aa36;
  452. dsi_set_cmdq(data_array, 2, 1);
  453. data_array[0] = 0x00023902;
  454. data_array[1] = 0x0000dd37;
  455. dsi_set_cmdq(data_array, 2, 1);
  456. data_array[0] = 0x00023902;
  457. data_array[1] = 0x0000cc38;
  458. dsi_set_cmdq(data_array, 2, 1);
  459. data_array[0] = 0x00023902;
  460. data_array[1] = 0x00006639;
  461. dsi_set_cmdq(data_array, 2, 1);
  462. data_array[0] = 0x00023902;
  463. data_array[1] = 0x0000773a;
  464. dsi_set_cmdq(data_array, 2, 1);
  465. data_array[0] = 0x00023902;
  466. data_array[1] = 0x0000223b;
  467. dsi_set_cmdq(data_array, 2, 1);
  468. data_array[0] = 0x00023902;
  469. data_array[1] = 0x0000223c;
  470. dsi_set_cmdq(data_array, 2, 1);
  471. data_array[0] = 0x00023902;
  472. data_array[1] = 0x0000223d;
  473. dsi_set_cmdq(data_array, 2, 1);
  474. data_array[0] = 0x00023902;
  475. data_array[1] = 0x0000223e;
  476. dsi_set_cmdq(data_array, 2, 1);
  477. data_array[0] = 0x00023902;
  478. data_array[1] = 0x0000223f;
  479. dsi_set_cmdq(data_array, 2, 1);
  480. data_array[0] = 0x00023902;
  481. data_array[1] = 0x00002240;
  482. dsi_set_cmdq(data_array, 2, 1);
  483. data_array[0] = 0x00023902;
  484. data_array[1] = 0x00001052;
  485. dsi_set_cmdq(data_array, 2, 1);
  486. data_array[0] = 0x00023902;
  487. data_array[1] = 0x00001053;
  488. dsi_set_cmdq(data_array, 2, 1);
  489. data_array[0] = 0x00053902;
  490. data_array[1] = 0x040698ff;
  491. data_array[2] = 0x00000007;
  492. dsi_set_cmdq(data_array, 3, 1);
  493. MDELAY(20);
  494. data_array[0] = 0x00023902;
  495. data_array[1] = 0x00002217;
  496. dsi_set_cmdq(data_array, 2, 1);
  497. data_array[0] = 0x00023902;
  498. data_array[1] = 0x00007702;
  499. dsi_set_cmdq(data_array, 2, 1);
  500. data_array[0] = 0x00023902;
  501. data_array[1] = 0x000079e1;
  502. dsi_set_cmdq(data_array, 2, 1);
  503. data_array[0] = 0x00023902;
  504. data_array[1] = 0x00001006;
  505. dsi_set_cmdq(data_array, 2, 1);
  506. data_array[0] = 0x00053902;
  507. data_array[1] = 0x040698ff;
  508. data_array[2] = 0x00000000;
  509. dsi_set_cmdq(data_array, 3, 1);
  510. MDELAY(20);
  511. data_array[0] = 0x00023902;
  512. data_array[1] = 0x00000021;
  513. dsi_set_cmdq(data_array, 2, 1);
  514. data_array[0] = 0x00110500;
  515. dsi_set_cmdq(data_array, 1, 1);
  516. MDELAY(120);
  517. data_array[0] = 0x00290500;
  518. dsi_set_cmdq(data_array, 1, 1);
  519. MDELAY(20);
  520. #endif
  521. }
  522. // ---------------------------------------------------------------------------
  523. // LCM Driver Implementations
  524. // ---------------------------------------------------------------------------
  525. static void lcm_set_util_funcs(const LCM_UTIL_FUNCS * util)
  526. {
  527. memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
  528. }
  529. static int adc_read_vol(void)
  530. {
  531. int adc[1];
  532. int data[4] ={0,0,0,0};
  533. int sum = 0;
  534. int adc_vol=0;
  535. int num = 0;
  536. int ret =0;
  537. for(num=0;num<10;num++)
  538. {
  539. ret = IMM_GetOneChannelValue(AUXADC_LCM_VOLTAGE_CHANNEL, data, adc);
  540. sum+=(data[0]*100+data[1]);
  541. }
  542. adc_vol = sum/10;
  543. #if defined(BUILD_LK)
  544. printf("lfz st7701s test adc_vol is %d\n",adc_vol);
  545. #else
  546. printk("lfz st7701s test adc_vol is %d\n",adc_vol);
  547. #endif
  548. /*
  549. if(adc_vol < 30)
  550. {
  551. printf("lfz st7701s_fwvga_dsi_vdo_jh_hsd_4502 \n");
  552. return 0;
  553. }
  554. else if((adc_vol >= 30) && (adc_vol < 50))
  555. {
  556. printf("lfz st7701s_fwvga_dsi_vdo_zgd_hsd_h4504 \n");
  557. return 1;
  558. }
  559. else if((adc_vol >= 50) && (adc_vol < 100))
  560. {
  561. printf("lfz st7701s_fwvga_dsi_vdo_gt_cmi_h4504 \n");
  562. return 2;
  563. }
  564. else if((adc_vol >= 100) && (adc_vol < 130))
  565. {
  566. printk("lfz st7701s_fwvga_dsi_vdo_hy_cpt_h4504 \n");
  567. return 3;
  568. }
  569. */
  570. if(adc_vol < 60)
  571. {
  572. printf("lfz st7701s_fwvga_dsi_vdo_jh_hsd_4502 \n");//38
  573. return 0;
  574. }
  575. else
  576. {
  577. printf("lfz st7701s_fwvga_dsi_vdo_xinqi_hsd_4502 \n");//115
  578. return 1;
  579. }
  580. }
  581. static void lcm_get_params(LCM_PARAMS * params)
  582. {
  583. memset(params, 0, sizeof(LCM_PARAMS));
  584. params->type = LCM_TYPE_DSI;
  585. params->physical_width = 61;
  586. params->physical_height = 109;
  587. params->width = FRAME_WIDTH;
  588. params->height= FRAME_HEIGHT;
  589. // enable tearing-free
  590. //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
  591. //params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
  592. params->dsi.mode = SYNC_EVENT_VDO_MODE;//BURST_VDO_MODE; SYNC_PULSE_VDO_MODE SYNC_EVENT_VDO_MODE
  593. // DSI
  594. /* Command mode setting */
  595. params->dsi.LANE_NUM = LCM_TWO_LANE;
  596. //The following defined the fomat for data coming from LCD engine.
  597. params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
  598. params->dsi.data_format.trans_seq = LCM_DSI_TRANS_SEQ_MSB_FIRST;
  599. params->dsi.data_format.padding = LCM_DSI_PADDING_ON_LSB;
  600. params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888;
  601. params->dsi.packet_size=248;
  602. params->dsi.ssc_disable = 1;
  603. params->dsi.cont_clock= 0;
  604. params->dsi.clk_lp_per_line_enable = 1;
  605. // Video mode setting
  606. params->dsi.intermediat_buffer_num = 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage
  607. params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
  608. params->dsi.word_count=FRAME_WIDTH*3; //DSI CMD mode need set these two bellow params, different to 6577
  609. params->dsi.vertical_active_line = FRAME_HEIGHT;
  610. params->dsi.vertical_sync_active = 2;
  611. params->dsi.vertical_backporch = 5;
  612. params->dsi.vertical_frontporch = 9;
  613. params->dsi.vertical_active_line = FRAME_HEIGHT;
  614. params->dsi.horizontal_sync_active = 40;
  615. params->dsi.horizontal_backporch = 41;
  616. params->dsi.horizontal_frontporch = 50;
  617. params->dsi.horizontal_active_pixel = FRAME_WIDTH;
  618. params->dsi.esd_check_enable = 1;
  619. params->dsi.customization_esd_check_enable = 1;
  620. #if 1
  621. params->dsi.lcm_esd_check_table[0].cmd = 0x0A;
  622. params->dsi.lcm_esd_check_table[0].count = 1;
  623. params->dsi.lcm_esd_check_table[0].para_list[0] = 0x1C;
  624. #else
  625. params->dsi.lcm_esd_check_table[0].cmd = 0x0a;
  626. params->dsi.lcm_esd_check_table[0].count = 1;
  627. params->dsi.lcm_esd_check_table[0].para_list[0] = 0x1c;
  628. params->dsi.lcm_esd_check_table[1].cmd = 0x09;
  629. params->dsi.lcm_esd_check_table[1].count = 4; //3
  630. params->dsi.lcm_esd_check_table[1].para_list[0] = 0x80;
  631. params->dsi.lcm_esd_check_table[1].para_list[1] = 0x73;
  632. params->dsi.lcm_esd_check_table[1].para_list[2] = 0x04;
  633. params->dsi.lcm_esd_check_table[1].para_list[3] = 0x00; //00
  634. #endif
  635. params->dsi.PLL_CLOCK = 208;//220;//dsi clock customization: should config clock value directly
  636. }
  637. static void lcm_suspend(void)
  638. {
  639. // lcm_compare_id();
  640. // printk("lcm_suspend g_which_lcm=%d\n", g_which_lcm);
  641. push_table(lcm_sleep_in_setting, sizeof(lcm_sleep_in_setting) / sizeof(struct LCM_setting_table), 1);
  642. // SET_RESET_PIN(1);
  643. // MDELAY(10);
  644. // SET_RESET_PIN(0);
  645. }
  646. #if (LCM_DSI_CMD_MODE)
  647. static void lcm_update(unsigned int x, unsigned int y,
  648. unsigned int width, unsigned int height)
  649. {
  650. unsigned int x0 = x;
  651. unsigned int y0 = y;
  652. unsigned int x1 = x0 + width - 1;
  653. unsigned int y1 = y0 + height - 1;
  654. unsigned char x0_MSB = ((x0 >> 8) & 0xFF);
  655. unsigned char x0_LSB = (x0 & 0xFF);
  656. unsigned char x1_MSB = ((x1 >> 8) & 0xFF);
  657. unsigned char x1_LSB = (x1 & 0xFF);
  658. unsigned char y0_MSB = ((y0 >> 8) & 0xFF);
  659. unsigned char y0_LSB = (y0 & 0xFF);
  660. unsigned char y1_MSB = ((y1 >> 8) & 0xFF);
  661. unsigned char y1_LSB = (y1 & 0xFF);
  662. unsigned int data_array[16];
  663. data_array[0] = 0x00053902;
  664. data_array[1] =
  665. (x1_MSB << 24) | (x0_LSB << 16) | (x0_MSB << 8) | 0x2a;
  666. data_array[2] = (x1_LSB);
  667. dsi_set_cmdq(data_array, 3, 1);
  668. data_array[0] = 0x00053902;
  669. data_array[1] =
  670. (y1_MSB << 24) | (y0_LSB << 16) | (y0_MSB << 8) | 0x2b;
  671. data_array[2] = (y1_LSB);
  672. dsi_set_cmdq(data_array, 3, 1);
  673. data_array[0] = 0x002c3909;
  674. dsi_set_cmdq(data_array, 1, 0);
  675. }
  676. #endif
  677. extern void DSI_clk_HS_mode(char enter);
  678. static unsigned int lcm_compare_id(void)
  679. {
  680. return 1;
  681. #if 0
  682. unsigned int id=0,id1=0,id2=0;
  683. unsigned char buffer[5];
  684. unsigned int array[3];
  685. int id_adc = 0;
  686. u8 hw_id = 0;
  687. SET_RESET_PIN(1); //NOTE:should reset LCM firstly
  688. MDELAY(10);
  689. SET_RESET_PIN(0);
  690. MDELAY(50);
  691. SET_RESET_PIN(1);
  692. MDELAY(120);
  693. #ifdef BUILD_LK
  694. DSI_clk_HS_mode(0);
  695. #endif
  696. // array[0]=0x00063902;
  697. // array[1]=0x000177FF;
  698. // array[2]=0x00001000;
  699. // dsi_set_cmdq(array, 3, 1);
  700. // MDELAY(10);
  701. array[0] = 0x00053700;// set return byte number
  702. // array[0] = 0x00013700;
  703. dsi_set_cmdq(array, 1, 1);
  704. read_reg_v2(0xA1, buffer, 5);
  705. // read_reg_v2(0xDA, &buffer, 1);
  706. // id = buffer[0];
  707. id = buffer[0]<<8 |buffer[1];
  708. id1 = buffer[2]<<8 |buffer[3];
  709. id2 = buffer[4];
  710. id_adc = adc_read_vol();
  711. mt_set_gpio_mode(GPIO_DISP_ID0_PIN, GPIO_MODE_00);
  712. mt_set_gpio_dir(GPIO_DISP_ID0_PIN, GPIO_DIR_IN);
  713. hw_id = mt_get_gpio_in(GPIO_DISP_ID0_PIN);
  714. printf("yxch longli read id pin value = %d\n",hw_id);
  715. #if defined(BUILD_LK)
  716. printf("lfz lk -- st7701s_fwvga_dsi_vdo_xinqi_hsd_4502 id_adc==1 0x%x , 0x%x , 0x%x \n",id,id1,id2);
  717. #else
  718. printk("lfz kernel -- st7701s_fwvga_dsi_vdo_xinqi_hsd_4502 id_adc==1 0x%x , 0x%x , 0x%x \n",buffer[0],buffer[1],id);
  719. #endif
  720. return ((id == 0x8802) && (hw_id == 1))?1:0;
  721. #endif
  722. }
  723. static void lcm_init(void)
  724. {
  725. SET_RESET_PIN(1);
  726. MDELAY(10);
  727. SET_RESET_PIN(0);
  728. MDELAY(50);
  729. SET_RESET_PIN(1);
  730. MDELAY(100);
  731. init_lcm_registers();
  732. }
  733. static void lcm_resume(void)
  734. {
  735. //printk("lcm_resume g_which_lcm=%d\n", g_which_lcm);
  736. lcm_init();
  737. // push_table(lcm_sleep_out_setting, sizeof(lcm_sleep_out_setting) / sizeof(struct LCM_setting_table), 1);
  738. }
  739. // Get LCM Driver Hooks
  740. // ---------------------------------------------------------------------------
  741. LCM_DRIVER hx8389c_dsi_vdo_lcm_drv = {
  742. .name = "hx8389c_dsi_vdo",
  743. .set_util_funcs = lcm_set_util_funcs,
  744. .get_params = lcm_get_params,
  745. .init = lcm_init,
  746. .suspend = lcm_suspend,
  747. .resume = lcm_resume,
  748. .compare_id = lcm_compare_id,
  749. #if (LCM_DSI_CMD_MODE)
  750. .set_backlight = lcm_setbacklight,
  751. .update = lcm_update,
  752. #endif
  753. };