fsl_rm68200.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. /*
  2. * Copyright 2019-2021 NXP
  3. * All rights reserved.
  4. *
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #include "fsl_display.h"
  9. #include "fsl_rm68200.h"
  10. /*******************************************************************************
  11. * Definitions
  12. ******************************************************************************/
  13. #define RM68200_DelayMs VIDEO_DelayMs
  14. /*******************************************************************************
  15. * Variables
  16. ******************************************************************************/
  17. uint8_t RM68200_DDB_START[5] = {0x00, 0x00, 0x00, 0x00, 0xff};
  18. static const uint8_t lcmInitPage0Setting[][2] = {
  19. {0xFE, 0x01}, {0x24, 0xC0}, {0x25, 0x53}, {0x26, 0x00}, {0x2B, 0xE5}, {0x27, 0x0A},
  20. {0x29, 0x0A}, {0x16, 0x52}, {0x2F, 0x53}, {0x34, 0x5A}, {0x1B, 0x00}, {0x12, 0x0A},
  21. {0x1A, 0x06}, {0x46, 0x56}, {0x52, 0xA0}, {0x53, 0x00}, {0x54, 0xA0}, {0x55, 0x00},
  22. };
  23. static const uint8_t lcmInitSetting[][2] = {
  24. {0xFE, 0x03},
  25. {0x00, 0x05},
  26. {0x02, 0x0B},
  27. {0x03, 0x0F},
  28. {0x04, 0x7D},
  29. {0x05, 0x00},
  30. {0x06, 0x50},
  31. {0x07, 0x05},
  32. {0x08, 0x16},
  33. {0x09, 0x0D},
  34. {0x0A, 0x11},
  35. {0x0B, 0x7D},
  36. {0x0C, 0x00},
  37. {0x0D, 0x50},
  38. {0x0E, 0x07},
  39. {0x0F, 0x08},
  40. {0x10, 0x01},
  41. {0x11, 0x02},
  42. {0x12, 0x00},
  43. {0x13, 0x7D},
  44. {0x14, 0x00},
  45. {0x15, 0x85},
  46. {0x16, 0x08},
  47. {0x17, 0x03},
  48. {0x18, 0x04},
  49. {0x19, 0x05},
  50. {0x1A, 0x06},
  51. {0x1B, 0x00},
  52. {0x1C, 0x7D},
  53. {0x1D, 0x00},
  54. {0x1E, 0x85},
  55. {0x1F, 0x08},
  56. {0x20, 0x00},
  57. {0x21, 0x00},
  58. {0x22, 0x00},
  59. {0x23, 0x00},
  60. {0x24, 0x00},
  61. {0x25, 0x00},
  62. {0x26, 0x00},
  63. {0x27, 0x00},
  64. {0x28, 0x00},
  65. {0x29, 0x00},
  66. {0x2A, 0x07},
  67. {0x2B, 0x08},
  68. {0x2D, 0x01},
  69. {0x2F, 0x02},
  70. {0x30, 0x00},
  71. {0x31, 0x40},
  72. {0x32, 0x05},
  73. {0x33, 0x08},
  74. {0x34, 0x54},
  75. {0x35, 0x7D},
  76. {0x36, 0x00},
  77. {0x37, 0x03},
  78. {0x38, 0x04},
  79. {0x39, 0x05},
  80. {0x3A, 0x06},
  81. {0x3B, 0x00},
  82. {0x3D, 0x40},
  83. {0x3F, 0x05},
  84. {0x40, 0x08},
  85. {0x41, 0x54},
  86. {0x42, 0x7D},
  87. {0x43, 0x00},
  88. {0x44, 0x00},
  89. {0x45, 0x00},
  90. {0x46, 0x00},
  91. {0x47, 0x00},
  92. {0x48, 0x00},
  93. {0x49, 0x00},
  94. {0x4A, 0x00},
  95. {0x4B, 0x00},
  96. {0x4C, 0x00},
  97. {0x4D, 0x00},
  98. {0x4E, 0x00},
  99. {0x4F, 0x00},
  100. {0x50, 0x00},
  101. {0x51, 0x00},
  102. {0x52, 0x00},
  103. {0x53, 0x00},
  104. {0x54, 0x00},
  105. {0x55, 0x00},
  106. {0x56, 0x00},
  107. {0x58, 0x00},
  108. {0x59, 0x00},
  109. {0x5A, 0x00},
  110. {0x5B, 0x00},
  111. {0x5C, 0x00},
  112. {0x5D, 0x00},
  113. {0x5E, 0x00},
  114. {0x5F, 0x00},
  115. {0x60, 0x00},
  116. {0x61, 0x00},
  117. {0x62, 0x00},
  118. {0x63, 0x00},
  119. {0x64, 0x00},
  120. {0x65, 0x00},
  121. {0x66, 0x00},
  122. {0x67, 0x00},
  123. {0x68, 0x00},
  124. {0x69, 0x00},
  125. {0x6A, 0x00},
  126. {0x6B, 0x00},
  127. {0x6C, 0x00},
  128. {0x6D, 0x00},
  129. {0x6E, 0x00},
  130. {0x6F, 0x00},
  131. {0x70, 0x00},
  132. {0x71, 0x00},
  133. {0x72, 0x20},
  134. {0x73, 0x00},
  135. {0x74, 0x08},
  136. {0x75, 0x08},
  137. {0x76, 0x08},
  138. {0x77, 0x08},
  139. {0x78, 0x08},
  140. {0x79, 0x08},
  141. {0x7A, 0x00},
  142. {0x7B, 0x00},
  143. {0x7C, 0x00},
  144. {0x7D, 0x00},
  145. {0x7E, 0xBF},
  146. {0x7F, 0x02},
  147. {0x80, 0x06},
  148. {0x81, 0x14},
  149. {0x82, 0x10},
  150. {0x83, 0x16},
  151. {0x84, 0x12},
  152. {0x85, 0x08},
  153. {0x86, 0x3F},
  154. {0x87, 0x3F},
  155. {0x88, 0x3F},
  156. {0x89, 0x3F},
  157. {0x8A, 0x3F},
  158. {0x8B, 0x0C},
  159. {0x8C, 0x0A},
  160. {0x8D, 0x0E},
  161. {0x8E, 0x3F},
  162. {0x8F, 0x3F},
  163. {0x90, 0x00},
  164. {0x91, 0x04},
  165. {0x92, 0x3F},
  166. {0x93, 0x3F},
  167. {0x94, 0x3F},
  168. {0x95, 0x3F},
  169. {0x96, 0x05},
  170. {0x97, 0x01},
  171. {0x98, 0x3F},
  172. {0x99, 0x3F},
  173. {0x9A, 0x0F},
  174. {0x9B, 0x0B},
  175. {0x9C, 0x0D},
  176. {0x9D, 0x3F},
  177. {0x9E, 0x3F},
  178. {0x9F, 0x3F},
  179. {0xA0, 0x3F},
  180. {0xA2, 0x3F},
  181. {0xA3, 0x09},
  182. {0xA4, 0x13},
  183. {0xA5, 0x17},
  184. {0xA6, 0x11},
  185. {0xA7, 0x15},
  186. {0xA9, 0x07},
  187. {0xAA, 0x03},
  188. {0xAB, 0x3F},
  189. {0xAC, 0x3F},
  190. {0xAD, 0x05},
  191. {0xAE, 0x01},
  192. {0xAF, 0x17},
  193. {0xB0, 0x13},
  194. {0xB1, 0x15},
  195. {0xB2, 0x11},
  196. {0xB3, 0x0F},
  197. {0xB4, 0x3F},
  198. {0xB5, 0x3F},
  199. {0xB6, 0x3F},
  200. {0xB7, 0x3F},
  201. {0xB8, 0x3F},
  202. {0xB9, 0x0B},
  203. {0xBA, 0x0D},
  204. {0xBB, 0x09},
  205. {0xBC, 0x3F},
  206. {0xBD, 0x3F},
  207. {0xBE, 0x07},
  208. {0xBF, 0x03},
  209. {0xC0, 0x3F},
  210. {0xC1, 0x3F},
  211. {0xC2, 0x3F},
  212. {0xC3, 0x3F},
  213. {0xC4, 0x02},
  214. {0xC5, 0x06},
  215. {0xC6, 0x3F},
  216. {0xC7, 0x3F},
  217. {0xC8, 0x08},
  218. {0xC9, 0x0C},
  219. {0xCA, 0x0A},
  220. {0xCB, 0x3F},
  221. {0xCC, 0x3F},
  222. {0xCD, 0x3F},
  223. {0xCE, 0x3F},
  224. {0xCF, 0x3F},
  225. {0xD0, 0x0E},
  226. {0xD1, 0x10},
  227. {0xD2, 0x14},
  228. {0xD3, 0x12},
  229. {0xD4, 0x16},
  230. {0xD5, 0x00},
  231. {0xD6, 0x04},
  232. {0xD7, 0x3F},
  233. {0xDC, 0x02},
  234. {0xDE, 0x12},
  235. {0xFE, 0x0E},
  236. {0x01, 0x75},
  237. /* Gamma Settings */
  238. {0xFE, 0x04},
  239. {0x60, 0x00},
  240. {0x61, 0x0C},
  241. {0x62, 0x12},
  242. {0x63, 0x0E},
  243. {0x64, 0x06},
  244. {0x65, 0x12},
  245. {0x66, 0x0E},
  246. {0x67, 0x0B},
  247. {0x68, 0x15},
  248. {0x69, 0x0B},
  249. {0x6A, 0x10},
  250. {0x6B, 0x07},
  251. {0x6C, 0x0F},
  252. {0x6D, 0x12},
  253. {0x6E, 0x0C},
  254. {0x6F, 0x00},
  255. {0x70, 0x00},
  256. {0x71, 0x0C},
  257. {0x72, 0x12},
  258. {0x73, 0x0E},
  259. {0x74, 0x06},
  260. {0x75, 0x12},
  261. {0x76, 0x0E},
  262. {0x77, 0x0B},
  263. {0x78, 0x15},
  264. {0x79, 0x0B},
  265. {0x7A, 0x10},
  266. {0x7B, 0x07},
  267. {0x7C, 0x0F},
  268. {0x7D, 0x12},
  269. {0x7E, 0x0C},
  270. {0x7F, 0x00},
  271. /* Page 0. */
  272. {0xFE, 0x00},
  273. {0x11, 0x00},
  274. };
  275. const display_operations_t rm68200_ops = {
  276. .init = RM68200_Init,
  277. .deinit = RM68200_Deinit,
  278. .start = RM68200_Start,
  279. .stop = RM68200_Stop,
  280. };
  281. /*******************************************************************************
  282. * Code
  283. ******************************************************************************/
  284. status_t RM68200_Init(display_handle_t *handle, const display_config_t *config)
  285. {
  286. uint32_t i;
  287. uint8_t param[2];
  288. status_t status = kStatus_Success;
  289. const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
  290. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  291. /* Only support 720 * 1280 */
  292. if (config->resolution != FSL_VIDEO_RESOLUTION(720, 1280))
  293. {
  294. return kStatus_InvalidArgument;
  295. }
  296. /* Power on. */
  297. resource->pullPowerPin(true);
  298. RM68200_DelayMs(1);
  299. /* Perform reset. */
  300. resource->pullResetPin(false);
  301. RM68200_DelayMs(1);
  302. resource->pullResetPin(true);
  303. RM68200_DelayMs(5);
  304. /* Set the LCM page0 init settings. */
  305. for (i = 0; i < ARRAY_SIZE(lcmInitPage0Setting); i++)
  306. {
  307. status = MIPI_DSI_GenericWrite(dsiDevice, lcmInitPage0Setting[i], 2);
  308. if (kStatus_Success != status)
  309. {
  310. return status;
  311. }
  312. }
  313. /* Data lane number selection. */
  314. param[0] = 0x5FU;
  315. param[1] = 0x10U | (config->dsiLanes - 1U);
  316. status = MIPI_DSI_GenericWrite(dsiDevice, param, 2);
  317. if (kStatus_Success != status)
  318. {
  319. return status;
  320. }
  321. /* Set the LCM init settings. */
  322. for (i = 0; i < ARRAY_SIZE(lcmInitSetting); i++)
  323. {
  324. status = MIPI_DSI_GenericWrite(dsiDevice, lcmInitSetting[i], 2);
  325. if (kStatus_Success != status)
  326. {
  327. return status;
  328. }
  329. }
  330. RM68200_DelayMs(200);
  331. param[0] = 0x29;
  332. param[1] = 0x00;
  333. status = MIPI_DSI_GenericWrite(dsiDevice, param, 2);
  334. if (kStatus_Success != status)
  335. {
  336. return status;
  337. }
  338. RM68200_DelayMs(100);
  339. param[0] = 0x2c;
  340. status = MIPI_DSI_GenericWrite(dsiDevice, param, 1);
  341. if (kStatus_Success != status)
  342. {
  343. return status;
  344. }
  345. param[0] = 0x35;
  346. param[1] = 0x00;
  347. status = MIPI_DSI_GenericWrite(dsiDevice, param, 2);
  348. if (kStatus_Success != status)
  349. {
  350. return status;
  351. }
  352. RM68200_DelayMs(200);
  353. return kStatus_Success;
  354. }
  355. status_t RM68200_Deinit(display_handle_t *handle)
  356. {
  357. const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
  358. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  359. (void)MIPI_DSI_DCS_EnterSleepMode(dsiDevice, true);
  360. resource->pullResetPin(false);
  361. resource->pullPowerPin(false);
  362. return kStatus_Success;
  363. }
  364. status_t RM68200_Start(display_handle_t *handle)
  365. {
  366. const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
  367. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  368. return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, true);
  369. }
  370. status_t RM68200_Stop(display_handle_t *handle)
  371. {
  372. const rm68200_resource_t *resource = (const rm68200_resource_t *)(handle->resource);
  373. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  374. return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, false);
  375. }