nt35510_mcu_6572.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #ifdef BUILD_LK
  32. #include <stdio.h>
  33. #include <string.h>
  34. #else
  35. #include <linux/string.h>
  36. #include <linux/kernel.h>
  37. #endif
  38. #include "lcm_drv.h"
  39. // ---------------------------------------------------------------------------
  40. // Local Constants
  41. // ---------------------------------------------------------------------------
  42. //#define ESD_SUPPORT
  43. #define FRAME_WIDTH (480)
  44. #define FRAME_HEIGHT (800)
  45. #define LCM_ID (0x5510)
  46. #ifndef TRUE
  47. #define TRUE 1
  48. #endif
  49. #ifndef FALSE
  50. #define FALSE 0
  51. #endif
  52. #ifdef BUILD_LK
  53. #define LCM_PRINT printf
  54. #else
  55. #define LCM_PRINT printk
  56. #endif
  57. // ---------------------------------------------------------------------------
  58. // Local Variables
  59. // ---------------------------------------------------------------------------
  60. static LCM_UTIL_FUNCS lcm_util;
  61. #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
  62. #define UDELAY(n) (lcm_util.udelay(n))
  63. #define MDELAY(n) (lcm_util.mdelay(n))
  64. // ---------------------------------------------------------------------------
  65. // Local Functions
  66. // ---------------------------------------------------------------------------
  67. static __inline void send_ctrl_cmd(unsigned int cmd)
  68. {
  69. lcm_util.send_cmd(cmd);
  70. }
  71. static __inline void send_data_cmd(unsigned int data)
  72. {
  73. lcm_util.send_data(data & 0xFF);
  74. }
  75. static __inline unsigned int read_data_cmd(void)
  76. {
  77. return 0xFFFF & lcm_util.read_data();
  78. }
  79. static __inline void set_lcm_register(unsigned int regIndex,
  80. unsigned int regData)
  81. {
  82. send_ctrl_cmd(regIndex);
  83. send_data_cmd(regData);
  84. }
  85. static void init_lcm_registers(void)
  86. {
  87. //PAGE1
  88. set_lcm_register(0xF000, 0x55);
  89. set_lcm_register(0xF001, 0xAA);
  90. set_lcm_register(0xF002, 0x52);
  91. set_lcm_register(0xF003, 0x08);
  92. set_lcm_register(0xF004, 0x01);
  93. //AVDD Set AVDD 5.2V
  94. set_lcm_register(0xB000, 0x0D);
  95. set_lcm_register(0xB001, 0x0D);
  96. set_lcm_register(0xB002, 0x0D);
  97. //AVDD ratio
  98. set_lcm_register(0xB600, 0x34);
  99. set_lcm_register(0xB601, 0x34);
  100. set_lcm_register(0xB602, 0x34);
  101. //AVEE -5.2V
  102. set_lcm_register(0xB100, 0x0D);
  103. set_lcm_register(0xB101, 0x0D);
  104. set_lcm_register(0xB102, 0x0D);
  105. //AVEE ratio
  106. set_lcm_register(0xB700, 0x34);
  107. set_lcm_register(0xB701, 0x34);
  108. set_lcm_register(0xB702, 0x34);
  109. //VCL -2.5V
  110. set_lcm_register(0xB200, 0x00);
  111. set_lcm_register(0xB201, 0x00);
  112. set_lcm_register(0xB202, 0x00);
  113. //VCL ratio
  114. set_lcm_register(0xB800, 0x24);
  115. set_lcm_register(0xB801, 0x24);
  116. set_lcm_register(0xB802, 0x24);
  117. //VGH 15V (Free pump)
  118. set_lcm_register(0xBF00, 0x01);
  119. //VGH=15V(1V/step) Free pump
  120. set_lcm_register(0xB300, 0x0F);
  121. set_lcm_register(0xB301, 0x0F);
  122. set_lcm_register(0xB302, 0x0F);
  123. //VGH ratio
  124. set_lcm_register(0xB900, 0x34);
  125. set_lcm_register(0xB901, 0x34);
  126. set_lcm_register(0xB902, 0x34);
  127. //VGL_REG -10V
  128. set_lcm_register(0xB500, 0x08);
  129. set_lcm_register(0xB501, 0x08);
  130. set_lcm_register(0xB502, 0x08);
  131. set_lcm_register(0xC200, 0x03);
  132. //VGLX ratio
  133. set_lcm_register(0xBA00, 0x24);
  134. set_lcm_register(0xBA01, 0x24);
  135. set_lcm_register(0xBA02, 0x24);
  136. //VGMP/VGSP 4.5V/0V
  137. set_lcm_register(0xBC00, 0x00);
  138. set_lcm_register(0xBC01, 0x78);
  139. set_lcm_register(0xBC02, 0x00);
  140. //VGMN/VGSN -4.5V/0V
  141. set_lcm_register(0xBD00, 0x00);
  142. set_lcm_register(0xBD01, 0x78);
  143. set_lcm_register(0xBD02, 0x00);
  144. //VCOM
  145. set_lcm_register(0xBE00, 0x00);
  146. set_lcm_register(0xBE01, 0x64);
  147. //Gamma Setting
  148. set_lcm_register(0xD100, 0x00);
  149. set_lcm_register(0xD101, 0x33);
  150. set_lcm_register(0xD102, 0x00);
  151. set_lcm_register(0xD103, 0x34);
  152. set_lcm_register(0xD104, 0x00);
  153. set_lcm_register(0xD105, 0x3A);
  154. set_lcm_register(0xD106, 0x00);
  155. set_lcm_register(0xD107, 0x4A);
  156. set_lcm_register(0xD108, 0x00);
  157. set_lcm_register(0xD109, 0x5C);
  158. set_lcm_register(0xD10A, 0x00);
  159. set_lcm_register(0xD10B, 0x81);
  160. set_lcm_register(0xD10C, 0x00);
  161. set_lcm_register(0xD10D, 0xA6);
  162. set_lcm_register(0xD10E, 0x00);
  163. set_lcm_register(0xD10F, 0xE5);
  164. set_lcm_register(0xD110, 0x01);
  165. set_lcm_register(0xD111, 0x13);
  166. set_lcm_register(0xD112, 0x01);
  167. set_lcm_register(0xD113, 0x54);
  168. set_lcm_register(0xD114, 0x01);
  169. set_lcm_register(0xD115, 0x82);
  170. set_lcm_register(0xD116, 0x01);
  171. set_lcm_register(0xD117, 0xCA);
  172. set_lcm_register(0xD118, 0x02);
  173. set_lcm_register(0xD119, 0x00);
  174. set_lcm_register(0xD11A, 0x02);
  175. set_lcm_register(0xD11B, 0x01);
  176. set_lcm_register(0xD11C, 0x02);
  177. set_lcm_register(0xD11D, 0x34);
  178. set_lcm_register(0xD11E, 0x02);
  179. set_lcm_register(0xD11F, 0x67);
  180. set_lcm_register(0xD120, 0x02);
  181. set_lcm_register(0xD121, 0x84);
  182. set_lcm_register(0xD122, 0x02);
  183. set_lcm_register(0xD123, 0xA4);
  184. set_lcm_register(0xD124, 0x02);
  185. set_lcm_register(0xD125, 0xB7);
  186. set_lcm_register(0xD126, 0x02);
  187. set_lcm_register(0xD127, 0xCF);
  188. set_lcm_register(0xD128, 0x02);
  189. set_lcm_register(0xD129, 0xDE);
  190. set_lcm_register(0xD12A, 0x02);
  191. set_lcm_register(0xD12B, 0xF2);
  192. set_lcm_register(0xD12C, 0x02);
  193. set_lcm_register(0xD12D, 0xFE);
  194. set_lcm_register(0xD12E, 0x03);
  195. set_lcm_register(0xD12F, 0x10);
  196. set_lcm_register(0xD130, 0x03);
  197. set_lcm_register(0xD131, 0x33);
  198. set_lcm_register(0xD132, 0x03);
  199. set_lcm_register(0xD133, 0x6D);
  200. //Gamma (G+)
  201. set_lcm_register(0xD200, 0x00);
  202. set_lcm_register(0xD201, 0x33);
  203. set_lcm_register(0xD202, 0x00);
  204. set_lcm_register(0xD203, 0x34);
  205. set_lcm_register(0xD204, 0x00);
  206. set_lcm_register(0xD205, 0x3A);
  207. set_lcm_register(0xD206, 0x00);
  208. set_lcm_register(0xD207, 0x4A);
  209. set_lcm_register(0xD208, 0x00);
  210. set_lcm_register(0xD209, 0x5C);
  211. set_lcm_register(0xD20A, 0x00);
  212. set_lcm_register(0xD20B, 0x81);
  213. set_lcm_register(0xD20C, 0x00);
  214. set_lcm_register(0xD20D, 0xA6);
  215. set_lcm_register(0xD20E, 0x00);
  216. set_lcm_register(0xD20F, 0xE5);
  217. set_lcm_register(0xD210, 0x01);
  218. set_lcm_register(0xD211, 0x13);
  219. set_lcm_register(0xD212, 0x01);
  220. set_lcm_register(0xD213, 0x54);
  221. set_lcm_register(0xD214, 0x01);
  222. set_lcm_register(0xD215, 0x82);
  223. set_lcm_register(0xD216, 0x01);
  224. set_lcm_register(0xD217, 0xCA);
  225. set_lcm_register(0xD218, 0x02);
  226. set_lcm_register(0xD219, 0x00);
  227. set_lcm_register(0xD21A, 0x02);
  228. set_lcm_register(0xD21B, 0x01);
  229. set_lcm_register(0xD21C, 0x02);
  230. set_lcm_register(0xD21D, 0x34);
  231. set_lcm_register(0xD21E, 0x02);
  232. set_lcm_register(0xD21F, 0x67);
  233. set_lcm_register(0xD220, 0x02);
  234. set_lcm_register(0xD221, 0x84);
  235. set_lcm_register(0xD222, 0x02);
  236. set_lcm_register(0xD223, 0xA4);
  237. set_lcm_register(0xD224, 0x02);
  238. set_lcm_register(0xD225, 0xB7);
  239. set_lcm_register(0xD226, 0x02);
  240. set_lcm_register(0xD227, 0xCF);
  241. set_lcm_register(0xD228, 0x02);
  242. set_lcm_register(0xD229, 0xDE);
  243. set_lcm_register(0xD22A, 0x02);
  244. set_lcm_register(0xD22B, 0xF2);
  245. set_lcm_register(0xD22C, 0x02);
  246. set_lcm_register(0xD22D, 0xFE);
  247. set_lcm_register(0xD22E, 0x03);
  248. set_lcm_register(0xD22F, 0x10);
  249. set_lcm_register(0xD230, 0x03);
  250. set_lcm_register(0xD231, 0x33);
  251. set_lcm_register(0xD232, 0x03);
  252. set_lcm_register(0xD233, 0x6D);
  253. //Gamma (B+)
  254. set_lcm_register(0xD300, 0x00);
  255. set_lcm_register(0xD301, 0x33);
  256. set_lcm_register(0xD302, 0x00);
  257. set_lcm_register(0xD303, 0x34);
  258. set_lcm_register(0xD304, 0x00);
  259. set_lcm_register(0xD305, 0x3A);
  260. set_lcm_register(0xD306, 0x00);
  261. set_lcm_register(0xD307, 0x4A);
  262. set_lcm_register(0xD308, 0x00);
  263. set_lcm_register(0xD309, 0x5C);
  264. set_lcm_register(0xD30A, 0x00);
  265. set_lcm_register(0xD30B, 0x81);
  266. set_lcm_register(0xD30C, 0x00);
  267. set_lcm_register(0xD30D, 0xA6);
  268. set_lcm_register(0xD30E, 0x00);
  269. set_lcm_register(0xD30F, 0xE5);
  270. set_lcm_register(0xD310, 0x01);
  271. set_lcm_register(0xD311, 0x13);
  272. set_lcm_register(0xD312, 0x01);
  273. set_lcm_register(0xD313, 0x54);
  274. set_lcm_register(0xD314, 0x01);
  275. set_lcm_register(0xD315, 0x82);
  276. set_lcm_register(0xD316, 0x01);
  277. set_lcm_register(0xD317, 0xCA);
  278. set_lcm_register(0xD318, 0x02);
  279. set_lcm_register(0xD319, 0x00);
  280. set_lcm_register(0xD31A, 0x02);
  281. set_lcm_register(0xD31B, 0x01);
  282. set_lcm_register(0xD31C, 0x02);
  283. set_lcm_register(0xD31D, 0x34);
  284. set_lcm_register(0xD31E, 0x02);
  285. set_lcm_register(0xD31F, 0x67);
  286. set_lcm_register(0xD320, 0x02);
  287. set_lcm_register(0xD321, 0x84);
  288. set_lcm_register(0xD322, 0x02);
  289. set_lcm_register(0xD323, 0xA4);
  290. set_lcm_register(0xD324, 0x02);
  291. set_lcm_register(0xD325, 0xB7);
  292. set_lcm_register(0xD326, 0x02);
  293. set_lcm_register(0xD327, 0xCF);
  294. set_lcm_register(0xD328, 0x02);
  295. set_lcm_register(0xD329, 0xDE);
  296. set_lcm_register(0xD32A, 0x02);
  297. set_lcm_register(0xD32B, 0xF2);
  298. set_lcm_register(0xD32C, 0x02);
  299. set_lcm_register(0xD32D, 0xFE);
  300. set_lcm_register(0xD32E, 0x03);
  301. set_lcm_register(0xD32F, 0x10);
  302. set_lcm_register(0xD330, 0x03);
  303. set_lcm_register(0xD331, 0x33);
  304. set_lcm_register(0xD332, 0x03);
  305. set_lcm_register(0xD333, 0x6D);
  306. //Gamma (R-)
  307. set_lcm_register(0xD400, 0x00);
  308. set_lcm_register(0xD401, 0x33);
  309. set_lcm_register(0xD402, 0x00);
  310. set_lcm_register(0xD403, 0x34);
  311. set_lcm_register(0xD404, 0x00);
  312. set_lcm_register(0xD405, 0x3A);
  313. set_lcm_register(0xD406, 0x00);
  314. set_lcm_register(0xD407, 0x4A);
  315. set_lcm_register(0xD408, 0x00);
  316. set_lcm_register(0xD409, 0x5C);
  317. set_lcm_register(0xD40A, 0x00);
  318. set_lcm_register(0xD40B, 0x81);
  319. set_lcm_register(0xD40C, 0x00);
  320. set_lcm_register(0xD40D, 0xA6);
  321. set_lcm_register(0xD40E, 0x00);
  322. set_lcm_register(0xD40F, 0xE5);
  323. set_lcm_register(0xD410, 0x01);
  324. set_lcm_register(0xD411, 0x13);
  325. set_lcm_register(0xD412, 0x01);
  326. set_lcm_register(0xD413, 0x54);
  327. set_lcm_register(0xD414, 0x01);
  328. set_lcm_register(0xD415, 0x82);
  329. set_lcm_register(0xD416, 0x01);
  330. set_lcm_register(0xD417, 0xCA);
  331. set_lcm_register(0xD418, 0x02);
  332. set_lcm_register(0xD419, 0x00);
  333. set_lcm_register(0xD41A, 0x02);
  334. set_lcm_register(0xD41B, 0x01);
  335. set_lcm_register(0xD41C, 0x02);
  336. set_lcm_register(0xD41D, 0x34);
  337. set_lcm_register(0xD41E, 0x02);
  338. set_lcm_register(0xD41F, 0x67);
  339. set_lcm_register(0xD420, 0x02);
  340. set_lcm_register(0xD421, 0x84);
  341. set_lcm_register(0xD422, 0x02);
  342. set_lcm_register(0xD423, 0xA4);
  343. set_lcm_register(0xD424, 0x02);
  344. set_lcm_register(0xD425, 0xB7);
  345. set_lcm_register(0xD426, 0x02);
  346. set_lcm_register(0xD427, 0xCF);
  347. set_lcm_register(0xD428, 0x02);
  348. set_lcm_register(0xD429, 0xDE);
  349. set_lcm_register(0xD42A, 0x02);
  350. set_lcm_register(0xD42B, 0xF2);
  351. set_lcm_register(0xD42C, 0x02);
  352. set_lcm_register(0xD42D, 0xFE);
  353. set_lcm_register(0xD42E, 0x03);
  354. set_lcm_register(0xD42F, 0x10);
  355. set_lcm_register(0xD430, 0x03);
  356. set_lcm_register(0xD431, 0x33);
  357. set_lcm_register(0xD432, 0x03);
  358. set_lcm_register(0xD433, 0x6D);
  359. //Gamma (G+)
  360. set_lcm_register(0xD500, 0x00);
  361. set_lcm_register(0xD501, 0x33);
  362. set_lcm_register(0xD502, 0x00);
  363. set_lcm_register(0xD503, 0x34);
  364. set_lcm_register(0xD504, 0x00);
  365. set_lcm_register(0xD505, 0x3A);
  366. set_lcm_register(0xD506, 0x00);
  367. set_lcm_register(0xD507, 0x4A);
  368. set_lcm_register(0xD508, 0x00);
  369. set_lcm_register(0xD509, 0x5C);
  370. set_lcm_register(0xD50A, 0x00);
  371. set_lcm_register(0xD50B, 0x81);
  372. set_lcm_register(0xD50C, 0x00);
  373. set_lcm_register(0xD50D, 0xA6);
  374. set_lcm_register(0xD50E, 0x00);
  375. set_lcm_register(0xD50F, 0xE5);
  376. set_lcm_register(0xD510, 0x01);
  377. set_lcm_register(0xD511, 0x13);
  378. set_lcm_register(0xD512, 0x01);
  379. set_lcm_register(0xD513, 0x54);
  380. set_lcm_register(0xD514, 0x01);
  381. set_lcm_register(0xD515, 0x82);
  382. set_lcm_register(0xD516, 0x01);
  383. set_lcm_register(0xD517, 0xCA);
  384. set_lcm_register(0xD518, 0x02);
  385. set_lcm_register(0xD519, 0x00);
  386. set_lcm_register(0xD51A, 0x02);
  387. set_lcm_register(0xD51B, 0x01);
  388. set_lcm_register(0xD51C, 0x02);
  389. set_lcm_register(0xD51D, 0x34);
  390. set_lcm_register(0xD51E, 0x02);
  391. set_lcm_register(0xD51F, 0x67);
  392. set_lcm_register(0xD520, 0x02);
  393. set_lcm_register(0xD521, 0x84);
  394. set_lcm_register(0xD522, 0x02);
  395. set_lcm_register(0xD523, 0xA4);
  396. set_lcm_register(0xD524, 0x02);
  397. set_lcm_register(0xD525, 0xB7);
  398. set_lcm_register(0xD526, 0x02);
  399. set_lcm_register(0xD527, 0xCF);
  400. set_lcm_register(0xD528, 0x02);
  401. set_lcm_register(0xD529, 0xDE);
  402. set_lcm_register(0xD52A, 0x02);
  403. set_lcm_register(0xD52B, 0xF2);
  404. set_lcm_register(0xD52C, 0x02);
  405. set_lcm_register(0xD52D, 0xFE);
  406. set_lcm_register(0xD52E, 0x03);
  407. set_lcm_register(0xD52F, 0x10);
  408. set_lcm_register(0xD530, 0x03);
  409. set_lcm_register(0xD531, 0x33);
  410. set_lcm_register(0xD532, 0x03);
  411. set_lcm_register(0xD533, 0x6D);
  412. //Gamma (B+)
  413. set_lcm_register(0xD600, 0x00);
  414. set_lcm_register(0xD601, 0x33);
  415. set_lcm_register(0xD602, 0x00);
  416. set_lcm_register(0xD603, 0x34);
  417. set_lcm_register(0xD604, 0x00);
  418. set_lcm_register(0xD605, 0x3A);
  419. set_lcm_register(0xD606, 0x00);
  420. set_lcm_register(0xD607, 0x4A);
  421. set_lcm_register(0xD608, 0x00);
  422. set_lcm_register(0xD609, 0x5C);
  423. set_lcm_register(0xD60A, 0x00);
  424. set_lcm_register(0xD60B, 0x81);
  425. set_lcm_register(0xD60C, 0x00);
  426. set_lcm_register(0xD60D, 0xA6);
  427. set_lcm_register(0xD60E, 0x00);
  428. set_lcm_register(0xD60F, 0xE5);
  429. set_lcm_register(0xD610, 0x01);
  430. set_lcm_register(0xD611, 0x13);
  431. set_lcm_register(0xD612, 0x01);
  432. set_lcm_register(0xD613, 0x54);
  433. set_lcm_register(0xD614, 0x01);
  434. set_lcm_register(0xD615, 0x82);
  435. set_lcm_register(0xD616, 0x01);
  436. set_lcm_register(0xD617, 0xCA);
  437. set_lcm_register(0xD618, 0x02);
  438. set_lcm_register(0xD619, 0x00);
  439. set_lcm_register(0xD61A, 0x02);
  440. set_lcm_register(0xD61B, 0x01);
  441. set_lcm_register(0xD61C, 0x02);
  442. set_lcm_register(0xD61D, 0x34);
  443. set_lcm_register(0xD61E, 0x02);
  444. set_lcm_register(0xD61F, 0x67);
  445. set_lcm_register(0xD620, 0x02);
  446. set_lcm_register(0xD621, 0x84);
  447. set_lcm_register(0xD622, 0x02);
  448. set_lcm_register(0xD623, 0xA4);
  449. set_lcm_register(0xD624, 0x02);
  450. set_lcm_register(0xD625, 0xB7);
  451. set_lcm_register(0xD626, 0x02);
  452. set_lcm_register(0xD627, 0xCF);
  453. set_lcm_register(0xD628, 0x02);
  454. set_lcm_register(0xD629, 0xDE);
  455. set_lcm_register(0xD62A, 0x02);
  456. set_lcm_register(0xD62B, 0xF2);
  457. set_lcm_register(0xD62C, 0x02);
  458. set_lcm_register(0xD62D, 0xFE);
  459. set_lcm_register(0xD62E, 0x03);
  460. set_lcm_register(0xD62F, 0x10);
  461. set_lcm_register(0xD630, 0x03);
  462. set_lcm_register(0xD631, 0x33);
  463. set_lcm_register(0xD632, 0x03);
  464. set_lcm_register(0xD633, 0x6D);
  465. //LV2 Page 0 enable
  466. set_lcm_register(0xF000, 0x55);
  467. set_lcm_register(0xF001, 0xAA);
  468. set_lcm_register(0xF002, 0x52);
  469. set_lcm_register(0xF003, 0x08);
  470. set_lcm_register(0xF004, 0x00);
  471. //Display control
  472. set_lcm_register(0xB100, 0x40);
  473. set_lcm_register(0xB101, 0x00);
  474. set_lcm_register(0xB600, 0x05);
  475. //Gate EQ control
  476. set_lcm_register(0xB700, 0x70);
  477. set_lcm_register(0xB701, 0x70);
  478. //Source EQ control (Mode 2)
  479. set_lcm_register(0xB800, 0x01);
  480. set_lcm_register(0xB801, 0x03);
  481. set_lcm_register(0xB802, 0x03);
  482. set_lcm_register(0xB803, 0x03);
  483. //Inversion mode (2-dot)
  484. set_lcm_register(0xBC00, 0x02);
  485. set_lcm_register(0xBC01, 0x00);
  486. set_lcm_register(0xBC02, 0x00);
  487. //Frame rate (non-used)
  488. set_lcm_register(0xBD00, 0x01);
  489. set_lcm_register(0xBD01, 0x84);
  490. set_lcm_register(0xBD02, 0x14);
  491. set_lcm_register(0xBD03, 0x14);
  492. set_lcm_register(0xBD04, 0x00);
  493. set_lcm_register(0xBE00, 0x01);
  494. set_lcm_register(0xBE01, 0x84);
  495. set_lcm_register(0xBE02, 0x14);
  496. set_lcm_register(0xBE03, 0x14);
  497. set_lcm_register(0xBE04, 0x00);
  498. set_lcm_register(0xBF00, 0x01);
  499. set_lcm_register(0xBF01, 0x84);
  500. set_lcm_register(0xBF02, 0x14);
  501. set_lcm_register(0xBF03, 0x14);
  502. set_lcm_register(0xBF04, 0x00);
  503. //Timing control 4H w/ 4-delay
  504. set_lcm_register(0xC900, 0xD0);
  505. set_lcm_register(0xC901, 0x02);
  506. set_lcm_register(0xC902, 0x50);
  507. set_lcm_register(0xC903, 0x50);
  508. set_lcm_register(0xC904, 0x50);
  509. set_lcm_register(0x2A00, 0x00);
  510. set_lcm_register(0x2A01, 0x00);
  511. set_lcm_register(0x2A02, 0x01);
  512. set_lcm_register(0x2A03, 0xDF);
  513. set_lcm_register(0x2B00, 0x00);
  514. set_lcm_register(0x2B01, 0x00);
  515. set_lcm_register(0x2B02, 0x03);
  516. set_lcm_register(0x2B03, 0x1F);
  517. set_lcm_register(0x3500, 0x00);
  518. set_lcm_register(0x3A00, 0x55); // RGB565
  519. //Sleep out
  520. send_ctrl_cmd(0x1100);
  521. MDELAY(120);
  522. //Display on
  523. send_ctrl_cmd(0x2900);
  524. MDELAY(30);
  525. }
  526. // ---------------------------------------------------------------------------
  527. // LCM Driver Implementations
  528. // ---------------------------------------------------------------------------
  529. static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
  530. {
  531. memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
  532. }
  533. static void lcm_get_params(LCM_PARAMS *params)
  534. {
  535. memset(params, 0, sizeof(LCM_PARAMS));
  536. params->type = LCM_TYPE_DBI;
  537. params->ctrl = LCM_CTRL_PARALLEL_DBI;
  538. params->width = FRAME_WIDTH;
  539. params->height = FRAME_HEIGHT;
  540. params->dbi.port = 0;
  541. params->dbi.data_width = LCM_DBI_DATA_WIDTH_16BITS;
  542. params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB;
  543. params->dbi.data_format.trans_seq = LCM_DBI_TRANS_SEQ_MSB_FIRST;
  544. params->dbi.data_format.padding = LCM_DBI_PADDING_ON_LSB;
  545. params->dbi.data_format.format = LCM_DBI_FORMAT_RGB565;
  546. params->dbi.data_format.width = LCM_DBI_DATA_WIDTH_16BITS;
  547. params->dbi.cpu_write_bits = LCM_DBI_CPU_WRITE_16_BITS;
  548. params->dbi.io_driving_current = LCM_DRIVING_CURRENT_4MA;
  549. params->dbi.parallel.write_setup = 1;
  550. params->dbi.parallel.write_hold = 1;
  551. params->dbi.parallel.write_wait = 2;
  552. params->dbi.parallel.read_setup = 4;
  553. params->dbi.parallel.read_hold = 0;
  554. params->dbi.parallel.read_latency = 18;
  555. params->dbi.parallel.wait_period = 1;
  556. params->dbi.parallel.cs_high_width = 0;
  557. params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
  558. params->dbi.te_edge_polarity = LCM_POLARITY_RISING;
  559. }
  560. static unsigned int lcm_compare_id(void)
  561. {
  562. unsigned int id1, id2, id3 = 0;
  563. SET_RESET_PIN(1);
  564. SET_RESET_PIN(0);
  565. MDELAY(5);
  566. SET_RESET_PIN(1);
  567. MDELAY(20);
  568. //*************Enable CMD2 Page1 *******************//
  569. set_lcm_register(0xF000, 0x55);
  570. set_lcm_register(0xF001, 0xAA);
  571. set_lcm_register(0xF002, 0x52);
  572. set_lcm_register(0xF003, 0x08);
  573. set_lcm_register(0xF004, 0x01);
  574. MDELAY(10);
  575. send_ctrl_cmd(0xC500);
  576. id1 = read_data_cmd();
  577. send_ctrl_cmd(0xC501);
  578. id2 = read_data_cmd();
  579. send_ctrl_cmd(0xC502);
  580. id3 = read_data_cmd();
  581. LCM_PRINT("[NT] ID:0x%x, 0x%x, 0x%x, 0x%x\n", id1, id2, id3, LCM_ID);
  582. return (LCM_ID == (id1 << 8 | id2))?1:0;
  583. }
  584. static void lcm_init(void)
  585. {
  586. SET_RESET_PIN(1);
  587. SET_RESET_PIN(0);
  588. MDELAY(5);
  589. SET_RESET_PIN(1);
  590. MDELAY(20);
  591. init_lcm_registers();
  592. }
  593. static void lcm_suspend(void)
  594. {
  595. send_ctrl_cmd(0x1000);
  596. MDELAY(120);
  597. send_ctrl_cmd(0x2800);
  598. MDELAY(10);
  599. set_lcm_register(0x4F00, 0x01);
  600. MDELAY(40);
  601. }
  602. static void lcm_resume(void)
  603. {
  604. lcm_init();
  605. }
  606. static void lcm_update(unsigned int x, unsigned int y,
  607. unsigned int width, unsigned int height)
  608. {
  609. short x0, y0, x1, y1;
  610. short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
  611. x0 = (short)x;
  612. y0 = (short)y;
  613. x1 = (short)x+width-1;
  614. y1 = (short)y+height-1;
  615. h_X_start=((x0&0x0300)>>8);
  616. l_X_start=(x0&0x00FF);
  617. h_X_end=((x1&0x0300)>>8);
  618. l_X_end=(x1&0x00FF);
  619. h_Y_start=((y0&0x0300)>>8);
  620. l_Y_start=(y0&0x00FF);
  621. h_Y_end=((y1&0x0300)>>8);
  622. l_Y_end=(y1&0x00FF);
  623. send_ctrl_cmd( 0x2A00 );
  624. send_data_cmd( h_X_start);
  625. send_ctrl_cmd( 0x2A01 );
  626. send_data_cmd( l_X_start);
  627. send_ctrl_cmd( 0x2A02);
  628. send_data_cmd( h_X_end );
  629. send_ctrl_cmd( 0x2A03);
  630. send_data_cmd( l_X_end );
  631. send_ctrl_cmd( 0x2B00 );
  632. send_data_cmd( h_Y_start);
  633. send_ctrl_cmd( 0x2B01 );
  634. send_data_cmd( l_Y_start);
  635. send_ctrl_cmd( 0x2B02);
  636. send_data_cmd( h_Y_end );
  637. send_ctrl_cmd( 0x2B03);
  638. send_data_cmd( l_Y_end );
  639. send_ctrl_cmd( 0x2C00 );
  640. }
  641. void lcm_read_fb(unsigned char *buffer)
  642. {
  643. int i =0;
  644. short x0, y0, x1, y1;
  645. short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
  646. unsigned int readData;
  647. x0 = 0;
  648. y0 = 0;
  649. x1 = FRAME_WIDTH-1;
  650. y1 = FRAME_HEIGHT-1;
  651. h_X_start=((x0&0x0300)>>8);
  652. l_X_start=(x0&0x00FF);
  653. h_X_end=((x1&0x0300)>>8);
  654. l_X_end=(x1&0x00FF);
  655. h_Y_start=((y0&0x0300)>>8);
  656. l_Y_start=(y0&0x00FF);
  657. h_Y_end=((y1&0x0300)>>8);
  658. l_Y_end=(y1&0x00FF);
  659. send_ctrl_cmd( 0x2A00 );
  660. send_data_cmd( h_X_start);
  661. send_ctrl_cmd( 0x2A01 );
  662. send_data_cmd( l_X_start);
  663. send_ctrl_cmd( 0x2A02);
  664. send_data_cmd( h_X_end );
  665. send_ctrl_cmd( 0x2A03);
  666. send_data_cmd( l_X_end );
  667. send_ctrl_cmd( 0x2B00 );
  668. send_data_cmd( h_Y_start);
  669. send_ctrl_cmd( 0x2B01 );
  670. send_data_cmd( l_Y_start);
  671. send_ctrl_cmd( 0x2B02);
  672. send_data_cmd( h_Y_end );
  673. send_ctrl_cmd( 0x2B03);
  674. send_data_cmd( l_Y_end );
  675. send_ctrl_cmd( 0x2E00 );
  676. MDELAY(20);
  677. //Dummy Read
  678. readData = read_data_cmd();
  679. for (i=0; i<60; i+=3) {
  680. readData = read_data_cmd();
  681. LCM_PRINT("Read data: 0x%08x \n", readData);
  682. MDELAY(20);
  683. buffer[i] =(readData&0x00FF0000)>>16; //R
  684. buffer[i+1]=(readData&0x0000FF00)>>8; //G
  685. buffer[i+2]=(readData&0x000000FF); //B
  686. }
  687. }
  688. #ifdef ESD_SUPPORT
  689. static unsigned int lcm_esd_check(void)
  690. {
  691. unsigned int readData;
  692. unsigned int result = TRUE;
  693. send_ctrl_cmd(0x0A00);
  694. readData = read_data_cmd();
  695. if (readData == 0x009C)
  696. result = FALSE;
  697. return result;
  698. }
  699. static unsigned int lcm_esd_recover(void)
  700. {
  701. lcm_init();
  702. return TRUE;
  703. }
  704. #endif
  705. LCM_DRIVER nt35510_mcu_6572_lcm_drv = {
  706. .name = "nt35510_mcu_6572",
  707. .set_util_funcs = lcm_set_util_funcs,
  708. .get_params = lcm_get_params,
  709. .init = lcm_init,
  710. .suspend = lcm_suspend,
  711. .resume = lcm_resume,
  712. .update = lcm_update,
  713. .compare_id = lcm_compare_id,
  714. .read_fb = lcm_read_fb,
  715. #ifdef ESD_SUPPORT
  716. .esd_check = lcm_esd_check,
  717. .esd_recover = lcm_esd_recover,
  718. #endif
  719. };