1 /* drivers/video/sc8810/lcd_ili9486_rgb_spi.c
6 * Copyright (C) 2010 Spreadtrum
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <asm/arch/sprd_lcd.h>
24 #define LCD_PRINT printk
26 #define LCD_PRINT(...)
29 #define ili9486_SpiWriteCmd(cmd) \
31 spi_send_cmd((cmd & 0xFF));\
34 #define ili9486_SpiWriteData(data)\
36 spi_send_data((data & 0xFF));\
39 static int32_t ili9486_init(struct panel_spec *self)
41 uint32_t test_data[8] = {0};
45 uint32_t bottom = 854;
47 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
48 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
49 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
51 LCD_PRINT("ili9486_init\n");
53 ili9486_SpiWriteCmd(0xC0);
54 ili9486_SpiWriteData(0x15);
55 ili9486_SpiWriteData(0x15);
57 ili9486_SpiWriteCmd(0xC1);
58 ili9486_SpiWriteData(0x42);
60 ili9486_SpiWriteCmd(0xC2);
61 ili9486_SpiWriteData(0x22);
63 ili9486_SpiWriteCmd(0xC5);
64 ili9486_SpiWriteData(0x00);
65 ili9486_SpiWriteData(0x3A);
67 //Display parameter setting
68 ili9486_SpiWriteCmd(0x2A);
69 ili9486_SpiWriteData(0x00);
70 ili9486_SpiWriteData(0x00);
71 ili9486_SpiWriteData(0x01);
72 ili9486_SpiWriteData(0x3F);
74 ili9486_SpiWriteCmd(0x2B);
75 ili9486_SpiWriteData(0x00);
76 ili9486_SpiWriteData(0x00);
77 ili9486_SpiWriteData(0x01);
78 ili9486_SpiWriteData(0xDF);
80 ili9486_SpiWriteCmd(0x36);
81 ili9486_SpiWriteData(0x08);
83 ili9486_SpiWriteCmd(0x35);
84 ili9486_SpiWriteData(0x00);
86 ili9486_SpiWriteCmd(0x3A);
87 ili9486_SpiWriteData(0x66);
89 ili9486_SpiWriteCmd(0xB0);
90 ili9486_SpiWriteData(0x80);
92 ili9486_SpiWriteCmd(0xB4);
93 ili9486_SpiWriteData(0x02);
95 ili9486_SpiWriteCmd(0xB5);
96 ili9486_SpiWriteData(0x0C);
97 ili9486_SpiWriteData(0x08);
98 ili9486_SpiWriteData(0x2C);
99 ili9486_SpiWriteData(0x26);
101 ili9486_SpiWriteCmd(0xB6);
102 ili9486_SpiWriteData(0x20);//(0x32)//123,(0x20);
103 ili9486_SpiWriteData(0x42);//0x42
104 ili9486_SpiWriteData(0x3B);
106 ili9486_SpiWriteCmd(0xB7);
107 ili9486_SpiWriteData(0x07);
109 ili9486_SpiWriteCmd(0xF9);
110 ili9486_SpiWriteData(0x00);
111 ili9486_SpiWriteData(0x08);
114 ili9486_SpiWriteCmd(0xE0);
115 ili9486_SpiWriteData(0x1E);
116 ili9486_SpiWriteData(0x21);
117 ili9486_SpiWriteData(0x1F);
118 ili9486_SpiWriteData(0x0C);
119 ili9486_SpiWriteData(0x0B);
120 ili9486_SpiWriteData(0x0C);
121 ili9486_SpiWriteData(0x4E);
122 ili9486_SpiWriteData(0xB9);
123 ili9486_SpiWriteData(0x40);
124 ili9486_SpiWriteData(0x07);
125 ili9486_SpiWriteData(0x16);
126 ili9486_SpiWriteData(0x06);
127 ili9486_SpiWriteData(0x12);
128 ili9486_SpiWriteData(0x12);
129 ili9486_SpiWriteData(0x00);
131 ili9486_SpiWriteCmd(0xE1);
132 ili9486_SpiWriteData(0x1F);
133 ili9486_SpiWriteData(0x2A);
134 ili9486_SpiWriteData(0x25);
135 ili9486_SpiWriteData(0x0C);
136 ili9486_SpiWriteData(0x11);
137 ili9486_SpiWriteData(0x09);
138 ili9486_SpiWriteData(0x4C);
139 ili9486_SpiWriteData(0x42);
140 ili9486_SpiWriteData(0x35);
141 ili9486_SpiWriteData(0x08);
142 ili9486_SpiWriteData(0x09);
143 ili9486_SpiWriteData(0x02);
144 ili9486_SpiWriteData(0x26);
145 ili9486_SpiWriteData(0x23);
146 ili9486_SpiWriteData(0x00);
148 ili9486_SpiWriteCmd(0xF8);
149 ili9486_SpiWriteData(0x21);
150 ili9486_SpiWriteData(0x07);
151 ili9486_SpiWriteData(0x02);
153 ili9486_SpiWriteCmd(0xE2);
154 ili9486_SpiWriteData(0x00);
155 ili9486_SpiWriteData(0x09);
156 ili9486_SpiWriteData(0x09);
157 ili9486_SpiWriteData(0x09);
158 ili9486_SpiWriteData(0x09);
159 ili9486_SpiWriteData(0x09);
160 ili9486_SpiWriteData(0x09);
161 ili9486_SpiWriteData(0x09);
162 ili9486_SpiWriteData(0x09);
163 ili9486_SpiWriteData(0x09);
164 ili9486_SpiWriteData(0x09);
165 ili9486_SpiWriteData(0x09);
166 ili9486_SpiWriteData(0x09);
167 ili9486_SpiWriteData(0x09);
168 ili9486_SpiWriteData(0x09);
169 ili9486_SpiWriteData(0x00);
171 ili9486_SpiWriteCmd(0xE3);
172 ili9486_SpiWriteData(0x00);
173 ili9486_SpiWriteData(0x00);
174 ili9486_SpiWriteData(0x00);
176 ili9486_SpiWriteData(0x00);
177 ili9486_SpiWriteData(0x04);
178 ili9486_SpiWriteData(0x04);
179 ili9486_SpiWriteData(0x04);
180 ili9486_SpiWriteData(0x04);
181 ili9486_SpiWriteData(0x04);
182 ili9486_SpiWriteData(0x04);
183 ili9486_SpiWriteData(0x04);
184 ili9486_SpiWriteData(0x04);
185 ili9486_SpiWriteData(0x04);
186 ili9486_SpiWriteData(0x04);
187 ili9486_SpiWriteData(0x04);
188 ili9486_SpiWriteData(0x04);
189 ili9486_SpiWriteData(0x04);
190 ili9486_SpiWriteData(0x04);
191 ili9486_SpiWriteData(0x04);
192 ili9486_SpiWriteData(0x04);
193 ili9486_SpiWriteData(0x04);
194 ili9486_SpiWriteData(0x04);
195 ili9486_SpiWriteData(0x04);
196 ili9486_SpiWriteData(0x04);
197 ili9486_SpiWriteData(0x04);
198 ili9486_SpiWriteData(0x04);
199 ili9486_SpiWriteData(0x04);
200 ili9486_SpiWriteData(0x04);
201 ili9486_SpiWriteData(0x04);
202 ili9486_SpiWriteData(0x04);
203 ili9486_SpiWriteData(0x04);
204 ili9486_SpiWriteData(0x04);
205 ili9486_SpiWriteData(0x04);
206 ili9486_SpiWriteData(0x04);
207 ili9486_SpiWriteData(0x04);
208 ili9486_SpiWriteData(0x04);
209 ili9486_SpiWriteData(0x04);
210 ili9486_SpiWriteData(0x04);
211 ili9486_SpiWriteData(0x04);
212 ili9486_SpiWriteData(0x04);
213 ili9486_SpiWriteData(0x04);
214 ili9486_SpiWriteData(0x04);
215 ili9486_SpiWriteData(0x04);
216 ili9486_SpiWriteData(0x04);
217 ili9486_SpiWriteData(0x04);
218 ili9486_SpiWriteData(0x04);
219 ili9486_SpiWriteData(0x04);
220 ili9486_SpiWriteData(0x04);
221 ili9486_SpiWriteData(0x04);
222 ili9486_SpiWriteData(0x04);
223 ili9486_SpiWriteData(0x04);
224 ili9486_SpiWriteData(0x04);
225 ili9486_SpiWriteData(0x04);
226 ili9486_SpiWriteData(0x04);
227 ili9486_SpiWriteData(0x04);
228 ili9486_SpiWriteData(0x04);
229 ili9486_SpiWriteData(0x04);
230 ili9486_SpiWriteData(0x04);
231 ili9486_SpiWriteData(0x04);
232 ili9486_SpiWriteData(0x04);
233 ili9486_SpiWriteData(0x04);
234 ili9486_SpiWriteData(0x04);
235 ili9486_SpiWriteData(0x04);
236 ili9486_SpiWriteData(0x00);
238 ili9486_SpiWriteCmd(0xF4);
239 ili9486_SpiWriteData(0x00);
240 ili9486_SpiWriteData(0x00);
241 ili9486_SpiWriteData(0x08);
242 ili9486_SpiWriteData(0x91);
243 ili9486_SpiWriteData(0x04);
245 ili9486_SpiWriteCmd(0xF2);
246 ili9486_SpiWriteData(0x18);
247 ili9486_SpiWriteData(0xA3);
248 ili9486_SpiWriteData(0x12);
249 ili9486_SpiWriteData(0x02);
250 ili9486_SpiWriteData(0x82);
251 ili9486_SpiWriteData(0x32);
252 ili9486_SpiWriteData(0xFF);
253 ili9486_SpiWriteData(0x10);
254 ili9486_SpiWriteData(0x00);
256 ili9486_SpiWriteCmd(0xFC);
257 ili9486_SpiWriteData(0x00);
258 ili9486_SpiWriteData(0x00);
259 ili9486_SpiWriteData(0x83);
262 ili9486_SpiWriteCmd(0x11); // (SLPOUT)
264 LCD_DelayMS(120); // 100ms
266 ili9486_SpiWriteCmd(0x29); // (DISPON)
268 LCD_DelayMS(100); // 100ms
270 if (1) { // for test the lcd
272 ili9486_SpiWriteCmd(0x2C); //Write data
273 for (i = 0; i < 480*320/3; i++)
274 ili9486_SpiWriteData(0xff);
275 for (i = 0; i < 480*320/3; i++)
276 ili9486_SpiWriteData(0xff00);
277 for (i = 0; i < 480*320/3; i++)
278 ili9486_SpiWriteData(0xff0000);
280 ili9486_SpiWriteCmd(0x29); //Display On
281 LCD_DelayMS(120); //120ms
282 ili9486_SpiWriteCmd(0x2C); //Write data
283 LCD_DelayMS(1200); //120ms
285 LCD_PRINT("ili9486_init: end\n");
290 static int32_t ili9486_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
292 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
293 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
297 ili9486_SpiWriteCmd(0x28);
299 ili9486_SpiWriteCmd(0x10);
303 ili9486_SpiWriteCmd(0x11);
305 ili9486_SpiWriteCmd(0x29);
312 static int32_t ili9486_set_window(struct panel_spec *self,
313 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
315 uint32_t *test_data[4] = {0};
316 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
317 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
318 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
319 LCD_PRINT("zxdbg add -ili9486_read read: %x, %x, %x, %x\n",test_data[0], test_data[1], test_data[2], test_data[3]);
323 static int32_t ili9486_invalidate(struct panel_spec *self)
325 LCD_PRINT("ili9486_invalidate\n");
327 return self->ops->panel_set_window(self, 0, 0,
328 self->width - 1, self->height - 1);
333 static int32_t ili9486_invalidate_rect(struct panel_spec *self,
334 uint16_t left, uint16_t top,
335 uint16_t right, uint16_t bottom)
337 LCD_PRINT("ili9486_invalidate_rect \n");
339 return self->ops->panel_set_window(self, left, top,
343 static int32_t ili9486_read_id(struct panel_spec *self)
347 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
348 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
349 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
351 ili9486_SpiWriteCmd(0xDA); // SET password
356 //LCD_PRINT(" ili9486_read_id u-boot id = %x\n",id);
364 static struct panel_operations lcd_ili9486_rgb_spi_operations = {
365 .panel_init = ili9486_init,
366 .panel_set_window = ili9486_set_window,
367 .panel_invalidate_rect= ili9486_invalidate_rect,
368 .panel_invalidate = ili9486_invalidate,
369 .panel_enter_sleep = ili9486_enter_sleep,
370 .panel_readid = ili9486_read_id
373 static struct timing_rgb lcd_ili9486_rgb_timing = {
374 .hfp = 30,//10, /* unit: pixel */
377 .vfp = 12, // 3, /*unit: line*/
382 static struct spi_info lcd_ili9486_rgb_spi_info = {
386 static struct info_rgb lcd_ili9486_rgb_info = {
387 .cmd_bus_mode = SPRDFB_RGB_BUS_TYPE_SPI,
388 .video_bus_width = 18, /*18,16*/
389 .h_sync_pol = SPRDFB_POLARITY_NEG,
390 .v_sync_pol = SPRDFB_POLARITY_NEG,
391 .de_pol = SPRDFB_POLARITY_POS,
392 .timing = &lcd_ili9486_rgb_timing,
394 .spi = &lcd_ili9486_rgb_spi_info,
398 struct panel_spec lcd_panel_ili9486_rgb_spi = {
402 .type = LCD_MODE_RGB,
403 .direction = LCD_DIRECT_NORMAL,
405 .rgb = &lcd_ili9486_rgb_info
407 .ops = &lcd_ili9486_rgb_spi_operations,