fsl_rm68191.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*
  2. * Copyright 2019-2020 NXP
  3. * All rights reserved.
  4. *
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #include "fsl_display.h"
  9. #include "fsl_rm68191.h"
  10. /*******************************************************************************
  11. * Definitions
  12. ******************************************************************************/
  13. #define RM68191_DelayMs VIDEO_DelayMs
  14. typedef struct _rm68191_setting
  15. {
  16. const uint8_t *value;
  17. uint8_t len;
  18. } rm68191_setting_t;
  19. #define RM68191_MAKE_SETTING_ITEM(setting) \
  20. { \
  21. (setting), (uint8_t)sizeof(setting) \
  22. }
  23. /*******************************************************************************
  24. * Variables
  25. ******************************************************************************/
  26. static const uint8_t s_rm68191Cmd0[] = {0xF0, 0x55, 0xAA, 0x52, 0x08, 0x03};
  27. static const uint8_t s_rm68191Cmd1[] = {0x90, 0x05, 0x16, 0x09, 0x03, 0xCD, 0x00, 0x00, 0x00, 0x00};
  28. static const uint8_t s_rm68191Cmd2[] = {0x91, 0x05, 0x16, 0x0B, 0x03, 0xCF, 0x00, 0x00, 0x00, 0x00};
  29. static const uint8_t s_rm68191Cmd3[] = {0x92, 0x40, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x8F, 0x00, 0x00, 0x04, 0x08};
  30. static const uint8_t s_rm68191Cmd4[] = {0x94, 0x00, 0x08, 0x0C, 0x03, 0xD1, 0x03, 0xD2, 0x0C};
  31. static const uint8_t s_rm68191Cmd5[] = {0x95, 0x40, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13,
  32. 0x00, 0x8F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08};
  33. static const uint8_t s_rm68191Cmd6[] = {0x99, 0x00, 0x00};
  34. static const uint8_t s_rm68191Cmd7[] = {0x9A, 0x80, 0x10, 0x03, 0xD5, 0x03, 0xD7, 0x00, 0x00, 0x00, 0x00, 0x50};
  35. static const uint8_t s_rm68191Cmd8[] = {0x9B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  36. static const uint8_t s_rm68191Cmd9[] = {0x9C, 0x00, 0x00};
  37. static const uint8_t s_rm68191Cmd10[] = {0x9D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00};
  38. static const uint8_t s_rm68191Cmd11[] = {0x9E, 0x00, 0x00};
  39. static const uint8_t s_rm68191Cmd12[] = {0xA0, 0x84, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x08, 0x1F, 0x0A, 0x1F};
  40. static const uint8_t s_rm68191Cmd13[] = {0xA1, 0x1F, 0x1F, 0x1F, 0x1F, 0x0C, 0x1F, 0x0E, 0x1F, 0x1F, 0x1F};
  41. static const uint8_t s_rm68191Cmd14[] = {0xA2, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x02, 0x1F, 0x06, 0x1F};
  42. static const uint8_t s_rm68191Cmd15[] = {0xA3, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F};
  43. static const uint8_t s_rm68191Cmd16[] = {0xA4, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x07, 0x1F, 0x03, 0x1F, 0x0F};
  44. static const uint8_t s_rm68191Cmd17[] = {0xA5, 0x1F, 0x0D, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0B, 0x1F, 0x09};
  45. static const uint8_t s_rm68191Cmd18[] = {0xA6, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x01, 0x05};
  46. static const uint8_t s_rm68191Cmd19[] = {0xA7, 0x03, 0x07, 0x1F, 0x1F, 0x1F, 0x1F, 0x0B, 0x1F, 0x09, 0x1F};
  47. static const uint8_t s_rm68191Cmd20[] = {0xA8, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x1F, 0x0D, 0x1F, 0x1F, 0x1F};
  48. static const uint8_t s_rm68191Cmd21[] = {0xA9, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x05, 0x1F, 0x01, 0x1F};
  49. static const uint8_t s_rm68191Cmd22[] = {0xAA, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F};
  50. static const uint8_t s_rm68191Cmd23[] = {0xAB, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x1F, 0x04, 0x1F, 0x0C};
  51. static const uint8_t s_rm68191Cmd24[] = {0xAC, 0x1F, 0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x08, 0x1F, 0x0A};
  52. static const uint8_t s_rm68191Cmd25[] = {0xAD, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x06, 0x02};
  53. static const uint8_t s_rm68191Cmd26[] = {0xF0, 0x55, 0xAA, 0x52, 0x08, 0x02};
  54. static const uint8_t s_rm68191Cmd27[] = {0xEA, 0x7D};
  55. static const uint8_t s_rm68191Cmd28[] = {0xF0, 0x55, 0xAA, 0x52, 0x08, 0x00};
  56. static const uint8_t s_rm68191Cmd29[] = {0xBC, 0x00, 0x00, 0x00};
  57. static const uint8_t s_rm68191Cmd30[] = {0xB8, 0x01, 0xAF, 0x8F, 0x8F};
  58. static const uint8_t s_rm68191Cmd31[] = {0xF0, 0x55, 0xAA, 0x52, 0x08, 0x01};
  59. static const uint8_t s_rm68191Cmd32[] = {0xD1, 0x00, 0x00, 0x00, 0x26, 0x00, 0x5E, 0x00, 0x88,
  60. 0x00, 0xA8, 0x00, 0xDB, 0x01, 0x02, 0x01, 0x3D};
  61. static const uint8_t s_rm68191Cmd33[] = {0xD2, 0x01, 0x67, 0x01, 0xA6, 0x01, 0xD3, 0x02, 0x16,
  62. 0x02, 0x49, 0x02, 0x4B, 0x02, 0x7B, 0x02, 0xB3};
  63. static const uint8_t s_rm68191Cmd34[] = {0xD3, 0x02, 0xD9, 0x03, 0x0E, 0x03, 0x31, 0x03, 0x61,
  64. 0x03, 0x80, 0x03, 0xA5, 0x03, 0xBD, 0x03, 0xD2};
  65. static const uint8_t s_rm68191Cmd35[] = {0xD4, 0x03, 0xE5, 0x03, 0xFF};
  66. static const uint8_t s_rm68191Cmd36[] = {0xD5, 0x00, 0x00, 0x00, 0x26, 0x00, 0x5E, 0x00, 0x88,
  67. 0x00, 0xA8, 0x00, 0xDB, 0x01, 0x02, 0x01, 0x3D};
  68. static const uint8_t s_rm68191Cmd37[] = {0xD6, 0x01, 0x67, 0x01, 0xA6, 0x01, 0xD3, 0x02, 0x16,
  69. 0x02, 0x49, 0x02, 0x4B, 0x02, 0x7B, 0x02, 0xB3};
  70. static const uint8_t s_rm68191Cmd38[] = {0xD7, 0x02, 0xD9, 0x03, 0x0E, 0x03, 0x31, 0x03, 0x61,
  71. 0x03, 0x80, 0x03, 0xA5, 0x03, 0xBD, 0x03, 0xD2};
  72. static const uint8_t s_rm68191Cmd39[] = {0xD8, 0x03, 0xE5, 0x03, 0xFF};
  73. static const uint8_t s_rm68191Cmd40[] = {0xD9, 0x00, 0x00, 0x00, 0x26, 0x00, 0x5E, 0x00, 0x88,
  74. 0x00, 0xA8, 0x00, 0xDB, 0x01, 0x02, 0x01, 0x3D};
  75. static const uint8_t s_rm68191Cmd41[] = {0xDD, 0x01, 0x67, 0x01, 0xA6, 0x01, 0xD3, 0x02, 0x16,
  76. 0x02, 0x49, 0x02, 0x4B, 0x02, 0x7B, 0x02, 0xB3};
  77. static const uint8_t s_rm68191Cmd42[] = {0xDE, 0x02, 0xD9, 0x03, 0x0E, 0x03, 0x31, 0x03, 0x61,
  78. 0x03, 0x80, 0x03, 0xA5, 0x03, 0xBD, 0x03, 0xD2};
  79. static const uint8_t s_rm68191Cmd43[] = {0xDF, 0x03, 0xE5, 0x03, 0xFF};
  80. static const uint8_t s_rm68191Cmd44[] = {0xE0, 0x00, 0x00, 0x00, 0x26, 0x00, 0x5E, 0x00, 0x88,
  81. 0x00, 0xA8, 0x00, 0xDB, 0x01, 0x02, 0x01, 0x3D};
  82. static const uint8_t s_rm68191Cmd45[] = {0xE1, 0x01, 0x67, 0x01, 0xA6, 0x01, 0xD3, 0x02, 0x16,
  83. 0x02, 0x49, 0x02, 0x4B, 0x02, 0x7B, 0x02, 0xB3};
  84. static const uint8_t s_rm68191Cmd46[] = {0xE2, 0x02, 0xD9, 0x03, 0x0E, 0x03, 0x31, 0x03, 0x61,
  85. 0x03, 0x80, 0x03, 0xA5, 0x03, 0xBD, 0x03, 0xD2};
  86. static const uint8_t s_rm68191Cmd47[] = {0xE3, 0x03, 0xE5, 0x03, 0xFF};
  87. static const uint8_t s_rm68191Cmd48[] = {0xE4, 0x00, 0x00, 0x00, 0x26, 0x00, 0x5E, 0x00, 0x88,
  88. 0x00, 0xA8, 0x00, 0xDB, 0x01, 0x02, 0x01, 0x3D};
  89. static const uint8_t s_rm68191Cmd49[] = {0xE5, 0x01, 0x67, 0x01, 0xA6, 0x01, 0xD3, 0x02, 0x16,
  90. 0x02, 0x49, 0x02, 0x4B, 0x02, 0x7B, 0x02, 0xB3};
  91. static const uint8_t s_rm68191Cmd50[] = {0xE6, 0x02, 0xD9, 0x03, 0x0E, 0x03, 0x31, 0x03, 0x61,
  92. 0x03, 0x80, 0x03, 0xA5, 0x03, 0xBD, 0x03, 0xD2};
  93. static const uint8_t s_rm68191Cmd51[] = {0xE7, 0x03, 0xE5, 0x03, 0xFF};
  94. static const uint8_t s_rm68191Cmd52[] = {0xE8, 0x00, 0x00, 0x00, 0x26, 0x00, 0x5E, 0x00, 0x88,
  95. 0x00, 0xA8, 0x00, 0xDB, 0x01, 0x02, 0x01, 0x3D};
  96. static const uint8_t s_rm68191Cmd53[] = {0xE9, 0x01, 0x67, 0x01, 0xA6, 0x01, 0xD3, 0x02, 0x16,
  97. 0x02, 0x49, 0x02, 0x4B, 0x02, 0x7B, 0x02, 0xB3};
  98. static const uint8_t s_rm68191Cmd54[] = {0xEA, 0x02, 0xD9, 0x03, 0x0E, 0x03, 0x31, 0x03, 0x61,
  99. 0x03, 0x80, 0x03, 0xA5, 0x03, 0xBD, 0x03, 0xD2};
  100. static const uint8_t s_rm68191Cmd55[] = {0xEB, 0x03, 0xE5, 0x03, 0xFF};
  101. static const uint8_t s_rm68191Cmd56[] = {0xB0, 0x07, 0x07, 0x07};
  102. static const uint8_t s_rm68191Cmd57[] = {0xB1, 0x07, 0x07, 0x07};
  103. static const uint8_t s_rm68191Cmd58[] = {0xB3, 0x11, 0x11, 0x11};
  104. static const uint8_t s_rm68191Cmd59[] = {0xB4, 0x09, 0x09, 0x09};
  105. static const uint8_t s_rm68191Cmd60[] = {0xB6, 0x44, 0x44, 0x44};
  106. static const uint8_t s_rm68191Cmd61[] = {0xB7, 0x34, 0x34, 0x34};
  107. static const uint8_t s_rm68191Cmd62[] = {0xB9, 0x34, 0x34, 0x34};
  108. static const uint8_t s_rm68191Cmd63[] = {0xBA, 0x14, 0x14, 0x14};
  109. static const uint8_t s_rm68191Cmd64[] = {0xBC, 0x00, 0x98, 0x00};
  110. static const uint8_t s_rm68191Cmd65[] = {0xBD, 0x00, 0x98, 0x00};
  111. static const uint8_t s_rm68191Cmd66[] = {0xBE, 0x1D};
  112. static const uint8_t s_rm68191Cmd67[] = {0x35, 0x00};
  113. static const rm68191_setting_t s_rm68191InitSetting[] = {
  114. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd0), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd1),
  115. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd2), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd3),
  116. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd4), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd5),
  117. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd6), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd7),
  118. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd8), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd9),
  119. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd10), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd11),
  120. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd12), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd13),
  121. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd14), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd15),
  122. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd16), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd17),
  123. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd18), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd19),
  124. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd20), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd21),
  125. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd22), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd23),
  126. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd24), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd25),
  127. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd26), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd27),
  128. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd28), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd29),
  129. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd30), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd31),
  130. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd32), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd33),
  131. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd34), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd35),
  132. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd36), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd37),
  133. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd38), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd39),
  134. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd40), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd41),
  135. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd42), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd43),
  136. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd44), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd45),
  137. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd46), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd47),
  138. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd48), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd49),
  139. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd50), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd51),
  140. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd52), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd53),
  141. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd54), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd55),
  142. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd56), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd57),
  143. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd58), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd59),
  144. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd60), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd61),
  145. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd62), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd63),
  146. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd64), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd65),
  147. RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd66), RM68191_MAKE_SETTING_ITEM(s_rm68191Cmd67),
  148. };
  149. const display_operations_t rm68191_ops = {
  150. .init = RM68191_Init,
  151. .deinit = RM68191_Deinit,
  152. .start = RM68191_Start,
  153. .stop = RM68191_Stop,
  154. };
  155. /*******************************************************************************
  156. * Code
  157. ******************************************************************************/
  158. status_t RM68191_Init(display_handle_t *handle, const display_config_t *config)
  159. {
  160. uint32_t i;
  161. status_t status = kStatus_Success;
  162. const rm68191_resource_t *resource = (const rm68191_resource_t *)(handle->resource);
  163. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  164. /* Only support 540 * 960 */
  165. if (config->resolution != FSL_VIDEO_RESOLUTION(540, 960))
  166. {
  167. return kStatus_InvalidArgument;
  168. }
  169. /* Power on. */
  170. resource->pullPowerPin(true);
  171. RM68191_DelayMs(1);
  172. /* Perform reset. */
  173. resource->pullResetPin(false);
  174. RM68191_DelayMs(1);
  175. resource->pullResetPin(true);
  176. RM68191_DelayMs(5);
  177. /* Set the LCM init settings. */
  178. for (i = 0; i < ARRAY_SIZE(s_rm68191InitSetting); i++)
  179. {
  180. status = MIPI_DSI_DCS_Write(dsiDevice, s_rm68191InitSetting[i].value, (int32_t)s_rm68191InitSetting[i].len);
  181. if (kStatus_Success != status)
  182. {
  183. return status;
  184. }
  185. }
  186. /* Exit sleep mode */
  187. status = MIPI_DSI_DCS_EnterSleepMode(dsiDevice, false);
  188. if (kStatus_Success != status)
  189. {
  190. return status;
  191. }
  192. RM68191_DelayMs(200);
  193. /* Set display on. */
  194. status = MIPI_DSI_DCS_SetDisplayOn(dsiDevice, true);
  195. if (kStatus_Success != status)
  196. {
  197. return status;
  198. }
  199. RM68191_DelayMs(200);
  200. return kStatus_Success;
  201. }
  202. status_t RM68191_Deinit(display_handle_t *handle)
  203. {
  204. const rm68191_resource_t *resource = (const rm68191_resource_t *)(handle->resource);
  205. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  206. (void)MIPI_DSI_DCS_EnterSleepMode(dsiDevice, true);
  207. resource->pullResetPin(false);
  208. resource->pullPowerPin(false);
  209. return kStatus_Success;
  210. }
  211. status_t RM68191_Start(display_handle_t *handle)
  212. {
  213. const rm68191_resource_t *resource = (const rm68191_resource_t *)(handle->resource);
  214. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  215. return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, true);
  216. }
  217. status_t RM68191_Stop(display_handle_t *handle)
  218. {
  219. const rm68191_resource_t *resource = (const rm68191_resource_t *)(handle->resource);
  220. mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
  221. return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, false);
  222. }