1 /*
2 * Copyright 2017, 2020 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #include "fsl_display.h"
10 #include "fsl_rm67191.h"
11
12 /*******************************************************************************
13 * Definitions
14 ******************************************************************************/
15 #define RM67191_DelayMs VIDEO_DelayMs
16
17 /*******************************************************************************
18 * Variables
19 ******************************************************************************/
20 #if defined(RM67199_ENABLE) && RM67199_ENABLE
21 /* The lcmInitSetting table for RM67199 */
22 static const uint8_t lcmInitSetting[][2] = {
23 {0xFE, 0xA0}, {0x2B, 0x18}, {0xFE, 0x70}, {0x7D, 0x05}, {0x5D, 0x0A}, {0x5A, 0x79}, {0x5C, 0x00}, {0x52, 0x00},
24 {0xFE, 0xD0}, {0x40, 0x02}, {0x13, 0x40}, {0xFE, 0x40}, {0x05, 0x08}, {0x06, 0x08}, {0x08, 0x08}, {0x09, 0x08},
25 {0x0A, 0xCA}, {0x0B, 0x88}, {0x20, 0x93}, {0x21, 0x93}, {0x24, 0x02}, {0x26, 0x02}, {0x28, 0x05}, {0x2A, 0x05},
26 {0x74, 0x2F}, {0x75, 0x1E}, {0xAD, 0x00}, {0xFE, 0x60}, {0x00, 0xCC}, {0x01, 0x00}, {0x02, 0x04}, {0x03, 0x00},
27 {0x04, 0x00}, {0x05, 0x07}, {0x06, 0x00}, {0x07, 0x88}, {0x08, 0x00}, {0x09, 0xCC}, {0x0A, 0x00}, {0x0B, 0x04},
28 {0x0C, 0x00}, {0x0D, 0x00}, {0x0E, 0x05}, {0x0F, 0x00}, {0x10, 0x88}, {0x11, 0x00}, {0x12, 0xCC}, {0x13, 0x0F},
29 {0x14, 0xFF}, {0x15, 0x04}, {0x16, 0x00}, {0x17, 0x06}, {0x18, 0x00}, {0x19, 0x96}, {0x1A, 0x00}, {0x24, 0xCC},
30 {0x25, 0x00}, {0x26, 0x02}, {0x27, 0x00}, {0x28, 0x00}, {0x29, 0x06}, {0x2A, 0x06}, {0x2B, 0x82}, {0x2D, 0x00},
31 {0x2F, 0xCC}, {0x30, 0x00}, {0x31, 0x02}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x07}, {0x35, 0x06}, {0x36, 0x82},
32 {0x37, 0x00}, {0x38, 0xCC}, {0x39, 0x00}, {0x3A, 0x02}, {0x3B, 0x00}, {0x3D, 0x00}, {0x3F, 0x07}, {0x40, 0x00},
33 {0x41, 0x88}, {0x42, 0x00}, {0x43, 0xCC}, {0x44, 0x00}, {0x45, 0x02}, {0x46, 0x00}, {0x47, 0x00}, {0x48, 0x06},
34 {0x49, 0x02}, {0x4A, 0x8A}, {0x4B, 0x00}, {0x5F, 0xCA}, {0x60, 0x01}, {0x61, 0xE8}, {0x62, 0x09}, {0x63, 0x00},
35 {0x64, 0x07}, {0x65, 0x00}, {0x66, 0x30}, {0x67, 0x80}, {0x9B, 0x03}, {0xA9, 0x07}, {0xAA, 0x06}, {0xAB, 0x02},
36 {0xAC, 0x10}, {0xAD, 0x11}, {0xAE, 0x05}, {0xAF, 0x04}, {0xB0, 0x10}, {0xB1, 0x10}, {0xB2, 0x10}, {0xB3, 0x10},
37 {0xB4, 0x10}, {0xB5, 0x10}, {0xB6, 0x10}, {0xB7, 0x10}, {0xB8, 0x10}, {0xB9, 0x10}, {0xBA, 0x04}, {0xBB, 0x05},
38 {0xBC, 0x00}, {0xBD, 0x01}, {0xBE, 0x0A}, {0xBF, 0x10}, {0xC0, 0x11}, {0xFE, 0xA0}, {0x22, 0x00},
39 };
40 #else
41 static const uint8_t lcmInitSetting[][2] = {
42 {0xFE, 0x0B}, {0x28, 0x40}, {0x29, 0x4F}, {0xFE, 0x0E}, {0x4B, 0x00}, {0x4C, 0x0F}, {0x4D, 0x20}, {0x4E, 0x40},
43 {0x4F, 0x60}, {0x50, 0xA0}, {0x51, 0xC0}, {0x52, 0xE0}, {0x53, 0xFF}, {0xFE, 0x0D}, {0x18, 0x08}, {0x42, 0x00},
44 {0x08, 0x41}, {0x46, 0x02}, {0x72, 0x09}, {0xFE, 0x0A}, {0x24, 0x17}, {0x04, 0x07}, {0x1A, 0x0C}, {0x0F, 0x44},
45 {0xFE, 0x04}, {0x00, 0x0C}, {0x05, 0x08}, {0x06, 0x08}, {0x08, 0x08}, {0x09, 0x08}, {0x0A, 0xE6}, {0x0B, 0x8C},
46 {0x1A, 0x12}, {0x1E, 0xE0}, {0x29, 0x93}, {0x2A, 0x93}, {0x2F, 0x02}, {0x31, 0x02}, {0x33, 0x05}, {0x37, 0x2D},
47 {0x38, 0x2D}, {0x3A, 0x1E}, {0x3B, 0x1E}, {0x3D, 0x27}, {0x3F, 0x80}, {0x40, 0x40}, {0x41, 0xE0}, {0x4F, 0x2F},
48 {0x50, 0x1E}, {0xFE, 0x06}, {0x00, 0xCC}, {0x05, 0x05}, {0x07, 0xA2}, {0x08, 0xCC}, {0x0D, 0x03}, {0x0F, 0xA2},
49 {0x32, 0xCC}, {0x37, 0x05}, {0x39, 0x83}, {0x3A, 0xCC}, {0x41, 0x04}, {0x43, 0x83}, {0x44, 0xCC}, {0x49, 0x05},
50 {0x4B, 0xA2}, {0x4C, 0xCC}, {0x51, 0x03}, {0x53, 0xA2}, {0x75, 0xCC}, {0x7A, 0x03}, {0x7C, 0x83}, {0x7D, 0xCC},
51 {0x82, 0x02}, {0x84, 0x83}, {0x85, 0xEC}, {0x86, 0x0F}, {0x87, 0xFF}, {0x88, 0x00}, {0x8A, 0x02}, {0x8C, 0xA2},
52 {0x8D, 0xEA}, {0x8E, 0x01}, {0x8F, 0xE8}, {0xFE, 0x06}, {0x90, 0x0A}, {0x92, 0x06}, {0x93, 0xA0}, {0x94, 0xA8},
53 {0x95, 0xEC}, {0x96, 0x0F}, {0x97, 0xFF}, {0x98, 0x00}, {0x9A, 0x02}, {0x9C, 0xA2}, {0xAC, 0x04}, {0xFE, 0x06},
54 {0xB1, 0x12}, {0xB2, 0x17}, {0xB3, 0x17}, {0xB4, 0x17}, {0xB5, 0x17}, {0xB6, 0x11}, {0xB7, 0x08}, {0xB8, 0x09},
55 {0xB9, 0x06}, {0xBA, 0x07}, {0xBB, 0x17}, {0xBC, 0x17}, {0xBD, 0x17}, {0xBE, 0x17}, {0xBF, 0x17}, {0xC0, 0x17},
56 {0xC1, 0x17}, {0xC2, 0x17}, {0xC3, 0x17}, {0xC4, 0x0F}, {0xC5, 0x0E}, {0xC6, 0x00}, {0xC7, 0x01}, {0xC8, 0x10},
57 {0xFE, 0x0D}, {0x95, 0xEC}, {0x8D, 0xEE}, {0x44, 0xEC}, {0x4C, 0xEC}, {0x32, 0xEC}, {0x3A, 0xEC}, {0x7D, 0xEC},
58 {0x75, 0xEC}, {0x00, 0xEC}, {0x08, 0xEC}, {0x85, 0xEC}, {0xA6, 0x21}, {0xA7, 0x05}, {0xA9, 0x06}, {0x82, 0x06},
59 {0x41, 0x06}, {0x7A, 0x07}, {0x37, 0x07}, {0x05, 0x06}, {0x49, 0x06}, {0x0D, 0x04}, {0x51, 0x04},
60 };
61 #endif
62
63 const display_operations_t rm67191_ops = {
64 .init = RM67191_Init,
65 .deinit = RM67191_Deinit,
66 .start = RM67191_Start,
67 .stop = RM67191_Stop,
68 };
69
70 /*******************************************************************************
71 * Code
72 ******************************************************************************/
73
RM67191_Init(display_handle_t * handle,const display_config_t * config)74 status_t RM67191_Init(display_handle_t *handle, const display_config_t *config)
75 {
76 uint32_t i;
77 status_t status = kStatus_Success;
78 const rm67191_resource_t *resource = (const rm67191_resource_t *)(handle->resource);
79 mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
80
81 /* Perform reset. */
82 resource->pullResetPin(true);
83
84 RM67191_DelayMs(10);
85
86 resource->pullResetPin(false);
87
88 RM67191_DelayMs(5);
89
90 resource->pullResetPin(true);
91 RM67191_DelayMs(20);
92
93 /* Set the LCM init settings. */
94 for (i = 0; i < ARRAY_SIZE(lcmInitSetting); i++)
95 {
96 status = MIPI_DSI_GenericWrite(dsiDevice, lcmInitSetting[i], 2);
97
98 if (kStatus_Success != status)
99 {
100 return status;
101 }
102 }
103
104 /* Change to send user command. */
105 const uint8_t rm67191UserCmdEntry[] = {RM67191_WRMAUCCTR, 0x00};
106 status = MIPI_DSI_GenericWrite(dsiDevice, rm67191UserCmdEntry, (int32_t)ARRAY_SIZE(rm67191UserCmdEntry));
107 if (kStatus_Success != status)
108 {
109 return status;
110 }
111
112 #if defined(RM67199_ENABLE) && RM67199_ENABLE
113 /*!
114 * RM67199 does not need software reset.
115 * Remove MIPI DSI software reset to avoid different color issue in the panel.
116 */
117 #else
118 /* Software reset */
119 status = MIPI_DSI_DCS_SoftReset(dsiDevice);
120 if (kStatus_Success != status)
121 {
122 return status;
123 }
124
125 RM67191_DelayMs(100);
126 #endif
127
128 /* Set DSI mode */
129 const uint8_t rm67191DsiMode[] = {RM67191_SETDSIMODE, 0x03};
130 status = MIPI_DSI_GenericWrite(dsiDevice, rm67191DsiMode, (int32_t)ARRAY_SIZE(rm67191DsiMode));
131 if (kStatus_Success != status)
132 {
133 return status;
134 }
135
136 /* Brightness. */
137 const uint8_t rm67191Brightness[] = {RM67191_WRDISBV, 0xff};
138 status = MIPI_DSI_GenericWrite(dsiDevice, rm67191Brightness, (int32_t)ARRAY_SIZE(rm67191Brightness));
139 if (kStatus_Success != status)
140 {
141 return status;
142 }
143
144 /* Exit sleep mode */
145 status = MIPI_DSI_DCS_EnterSleepMode(dsiDevice, false);
146 if (kStatus_Success != status)
147 {
148 return status;
149 }
150
151 RM67191_DelayMs(120);
152
153 /* Set display on. */
154 status = MIPI_DSI_DCS_SetDisplayOn(dsiDevice, true);
155 if (kStatus_Success != status)
156 {
157 return status;
158 }
159
160 RM67191_DelayMs(100);
161
162 return kStatus_Success;
163 }
164
RM67191_Deinit(display_handle_t * handle)165 status_t RM67191_Deinit(display_handle_t *handle)
166 {
167 status_t status;
168 const rm67191_resource_t *resource = (const rm67191_resource_t *)(handle->resource);
169 mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
170
171 status = MIPI_DSI_DCS_EnterSleepMode(dsiDevice, true);
172 if (kStatus_Success != status)
173 {
174 return status;
175 }
176
177 resource->pullResetPin(false);
178
179 return kStatus_Success;
180 }
181
RM67191_Start(display_handle_t * handle)182 status_t RM67191_Start(display_handle_t *handle)
183 {
184 const rm67191_resource_t *resource = (const rm67191_resource_t *)(handle->resource);
185 mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
186
187 return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, true);
188 }
189
RM67191_Stop(display_handle_t * handle)190 status_t RM67191_Stop(display_handle_t *handle)
191 {
192 const rm67191_resource_t *resource = (const rm67191_resource_t *)(handle->resource);
193 mipi_dsi_device_t *dsiDevice = resource->dsiDevice;
194
195 return MIPI_DSI_DCS_SetDisplayOn(dsiDevice, false);
196 }
197