1 /* drivers/video/sc8810/lcd_hx8363_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/tiger_lcd.h>
24 #define LCD_PRINT printk
26 #define LCD_PRINT(...)
29 #define HX8363_SpiWriteCmd(cmd) \
31 spi_send_cmd((cmd & 0xFF));\
34 #define HX8363_SpiWriteData(data)\
36 spi_send_data((data & 0xFF));\
40 static int32_t hx8363_init(struct panel_spec *self)
42 uint32_t test_data[8] = {0};
46 uint32_t bottom = 854;
48 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
49 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
50 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
53 LCD_PRINT("hx8363_init\n");
55 HX8363_SpiWriteCmd(0xB9); // SET password
56 HX8363_SpiWriteData(0xFF); //
57 HX8363_SpiWriteData(0x83); //
58 HX8363_SpiWriteData(0x63); //
60 HX8363_SpiWriteCmd(0xB1);
61 HX8363_SpiWriteData(0x01);
62 HX8363_SpiWriteData(0x00);
63 HX8363_SpiWriteData(0x44);
64 HX8363_SpiWriteData(0x08);
65 HX8363_SpiWriteData(0x01);
66 HX8363_SpiWriteData(0x0E); //
67 HX8363_SpiWriteData(0x0E); //
68 HX8363_SpiWriteData(0x1B); //the lower ,Saturation is better
69 HX8363_SpiWriteData(0x23); //the lower ,Saturation is better
70 HX8363_SpiWriteData(0x3F);
71 HX8363_SpiWriteData(0x3F);
72 HX8363_SpiWriteData(0x40);
73 HX8363_SpiWriteData(0x32);
74 HX8363_SpiWriteData(0x00);
75 HX8363_SpiWriteData(0xE6);
76 HX8363_SpiWriteData(0xE6);
77 HX8363_SpiWriteData(0xE6);
78 HX8363_SpiWriteData(0xE6);
79 HX8363_SpiWriteData(0xE6);
81 HX8363_SpiWriteCmd(0xB2); // SET DISP
82 HX8363_SpiWriteData(0x08); //
83 HX8363_SpiWriteData(0x03); //
85 HX8363_SpiWriteCmd(0xB4);
86 HX8363_SpiWriteData(0x00);//Column inversion
87 HX8363_SpiWriteData(0x18);
88 HX8363_SpiWriteData(0x9C);
89 HX8363_SpiWriteData(0x08);
90 HX8363_SpiWriteData(0x18);
91 HX8363_SpiWriteData(0x04);
92 HX8363_SpiWriteData(0x82);
94 HX8363_SpiWriteCmd(0xB6); //Set_VCOM
95 HX8363_SpiWriteData(0x1B); //0x10
97 HX8363_SpiWriteCmd(0xCC); // SET Panel
98 HX8363_SpiWriteData(0x01); //
102 HX8363_SpiWriteCmd(0xE0); // SET Gamma
103 HX8363_SpiWriteData(0x00);
104 HX8363_SpiWriteData(0x05);
105 HX8363_SpiWriteData(0x07);
106 HX8363_SpiWriteData(0x0C);
107 HX8363_SpiWriteData(0x13);
108 HX8363_SpiWriteData(0x2F);
109 HX8363_SpiWriteData(0x0B);
110 HX8363_SpiWriteData(0x1D);
111 HX8363_SpiWriteData(0x86);
112 HX8363_SpiWriteData(0x0D);
113 HX8363_SpiWriteData(0x91);
114 HX8363_SpiWriteData(0x16);
115 HX8363_SpiWriteData(0x99);
116 HX8363_SpiWriteData(0x16);
117 HX8363_SpiWriteData(0x16);
118 HX8363_SpiWriteData(0x09);
119 HX8363_SpiWriteData(0x05);
120 HX8363_SpiWriteData(0x00);
121 HX8363_SpiWriteData(0x05);
122 HX8363_SpiWriteData(0x07);
123 HX8363_SpiWriteData(0x0C);
124 HX8363_SpiWriteData(0x13);
125 HX8363_SpiWriteData(0x2F);
126 HX8363_SpiWriteData(0x0B);
127 HX8363_SpiWriteData(0x1D);
128 HX8363_SpiWriteData(0x86);
129 HX8363_SpiWriteData(0x0D);
130 HX8363_SpiWriteData(0x91);
131 HX8363_SpiWriteData(0x16);
132 HX8363_SpiWriteData(0x99);
133 HX8363_SpiWriteData(0x16);
134 HX8363_SpiWriteData(0x16);
135 HX8363_SpiWriteData(0x09);
136 HX8363_SpiWriteData(0x05);
138 HX8363_SpiWriteCmd(0xC1); //COLMOD
139 HX8363_SpiWriteData(0x01); //
141 HX8363_SpiWriteData(0x07 );
142 HX8363_SpiWriteData(0x0A );
143 HX8363_SpiWriteData(0x1A );
144 HX8363_SpiWriteData(0x2F );
145 HX8363_SpiWriteData(0x3E );
146 HX8363_SpiWriteData(0x4A );
147 HX8363_SpiWriteData(0x52 );
148 HX8363_SpiWriteData(0x5A );
149 HX8363_SpiWriteData(0x62 );
150 HX8363_SpiWriteData(0x69 );
151 HX8363_SpiWriteData(0x70 );
152 HX8363_SpiWriteData(0x76 );
153 HX8363_SpiWriteData(0x7D );
154 HX8363_SpiWriteData(0x82 );
155 HX8363_SpiWriteData(0x86 );
156 HX8363_SpiWriteData(0x8C );
157 HX8363_SpiWriteData(0x93 );
158 HX8363_SpiWriteData(0x9A );
159 HX8363_SpiWriteData(0x9F );
160 HX8363_SpiWriteData(0xA4 );
161 HX8363_SpiWriteData(0xA9 );
162 HX8363_SpiWriteData(0xB0 );
163 HX8363_SpiWriteData(0xB6 );
164 HX8363_SpiWriteData(0xBB );
165 HX8363_SpiWriteData(0xC2 );
166 HX8363_SpiWriteData(0xC9 );
167 HX8363_SpiWriteData(0xCF );
168 HX8363_SpiWriteData(0xD7 );
169 HX8363_SpiWriteData(0xE0 );
170 HX8363_SpiWriteData(0xE7 );
171 HX8363_SpiWriteData(0xEF );
172 HX8363_SpiWriteData(0xF8 );
173 HX8363_SpiWriteData(0xFF );
174 HX8363_SpiWriteData(0x34 );
175 HX8363_SpiWriteData(0x1E );
176 HX8363_SpiWriteData(0x92 );
177 HX8363_SpiWriteData(0x9E );
178 HX8363_SpiWriteData(0x01 );
179 HX8363_SpiWriteData(0xE6 );
180 HX8363_SpiWriteData(0x08 );
181 HX8363_SpiWriteData(0x6F );
182 HX8363_SpiWriteData(0x02 );
184 HX8363_SpiWriteData(0x07 );
185 HX8363_SpiWriteData(0x0A );
186 HX8363_SpiWriteData(0x1A );
187 HX8363_SpiWriteData(0x2F );
188 HX8363_SpiWriteData(0x3E );
189 HX8363_SpiWriteData(0x4A );
190 HX8363_SpiWriteData(0x52 );
191 HX8363_SpiWriteData(0x5A );
192 HX8363_SpiWriteData(0x62 );
193 HX8363_SpiWriteData(0x69 );
194 HX8363_SpiWriteData(0x70 );
195 HX8363_SpiWriteData(0x76 );
196 HX8363_SpiWriteData(0x7D );
197 HX8363_SpiWriteData(0x82 );
198 HX8363_SpiWriteData(0x86 );
199 HX8363_SpiWriteData(0x8C );
200 HX8363_SpiWriteData(0x93 );
201 HX8363_SpiWriteData(0x9A );
202 HX8363_SpiWriteData(0x9F );
203 HX8363_SpiWriteData(0xA4 );
204 HX8363_SpiWriteData(0xA9 );
205 HX8363_SpiWriteData(0xB0 );
206 HX8363_SpiWriteData(0xB6 );
207 HX8363_SpiWriteData(0xBB );
208 HX8363_SpiWriteData(0xC2 );
209 HX8363_SpiWriteData(0xC9 );
210 HX8363_SpiWriteData(0xCF );
211 HX8363_SpiWriteData(0xD7 );
212 HX8363_SpiWriteData(0xE0 );
213 HX8363_SpiWriteData(0xE7 );
214 HX8363_SpiWriteData(0xEF );
215 HX8363_SpiWriteData(0xF8 );
216 HX8363_SpiWriteData(0xFF );
217 HX8363_SpiWriteData(0x34 );
218 HX8363_SpiWriteData(0x1E );
219 HX8363_SpiWriteData(0x92 );
220 HX8363_SpiWriteData(0x9E );
221 HX8363_SpiWriteData(0x01 );
222 HX8363_SpiWriteData(0xE6 );
223 HX8363_SpiWriteData(0x08 );
224 HX8363_SpiWriteData(0x6F );
225 HX8363_SpiWriteData(0x02 );
227 HX8363_SpiWriteData(0x07 );
228 HX8363_SpiWriteData(0x0A );
229 HX8363_SpiWriteData(0x1A );
230 HX8363_SpiWriteData(0x2F );
231 HX8363_SpiWriteData(0x3E );
232 HX8363_SpiWriteData(0x4A );
233 HX8363_SpiWriteData(0x52 );
234 HX8363_SpiWriteData(0x5A );
235 HX8363_SpiWriteData(0x62 );
236 HX8363_SpiWriteData(0x69 );
237 HX8363_SpiWriteData(0x70 );
238 HX8363_SpiWriteData(0x76 );
239 HX8363_SpiWriteData(0x7D );
240 HX8363_SpiWriteData(0x82 );
241 HX8363_SpiWriteData(0x86 );
242 HX8363_SpiWriteData(0x8C );
243 HX8363_SpiWriteData(0x93 );
244 HX8363_SpiWriteData(0x9A );
245 HX8363_SpiWriteData(0x9F );
246 HX8363_SpiWriteData(0xA4 );
247 HX8363_SpiWriteData(0xA9 );
248 HX8363_SpiWriteData(0xB0 );
249 HX8363_SpiWriteData(0xB6 );
250 HX8363_SpiWriteData(0xBB );
251 HX8363_SpiWriteData(0xC2 );
252 HX8363_SpiWriteData(0xC9 );
253 HX8363_SpiWriteData(0xCF );
254 HX8363_SpiWriteData(0xD7 );
255 HX8363_SpiWriteData(0xE0 );
256 HX8363_SpiWriteData(0xE7 );
257 HX8363_SpiWriteData(0xEF );
258 HX8363_SpiWriteData(0xF8 );
259 HX8363_SpiWriteData(0xFF );
260 HX8363_SpiWriteData(0x34 );
261 HX8363_SpiWriteData(0x1E );
262 HX8363_SpiWriteData(0x92 );
263 HX8363_SpiWriteData(0x9E );
264 HX8363_SpiWriteData(0x01 );
265 HX8363_SpiWriteData(0xE6 );
266 HX8363_SpiWriteData(0x08 );
267 HX8363_SpiWriteData(0x6F );
268 HX8363_SpiWriteData(0x02 );
270 HX8363_SpiWriteCmd(0x3A); //COLMOD
271 HX8363_SpiWriteData(0x77); //
273 HX8363_SpiWriteCmd(0x11);//Sleep Out
275 HX8363_SpiWriteCmd(0x35); //Tearing Effect
276 HX8363_SpiWriteData(0x00); //
277 HX8363_SpiWriteCmd(0x36);
278 HX8363_SpiWriteData(0x02);
279 HX8363_SpiWriteCmd(0x29);
281 HX8363_SpiWriteCmd(0x2C);
285 static int32_t hx8363_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
287 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
288 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
292 HX8363_SpiWriteCmd(0x28);
294 HX8363_SpiWriteCmd(0x10);
298 HX8363_SpiWriteCmd(0x11);
300 HX8363_SpiWriteCmd(0x29);
310 static int32_t hx8363_set_window(struct panel_spec *self,
311 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
313 uint32_t *test_data[4] = {0};
314 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
315 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
316 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
319 LCD_PRINT("zxdbg add -hx8363_set_window: %d, %d, %d, %d\n",left, top, right, bottom);
321 HX8363_SpiWriteCmd(0x2A00);
322 HX8363_SpiWriteData((left>>8));// set left address
323 HX8363_SpiWriteData((left&0xff));
324 HX8363_SpiWriteData((right>>8));// set right address
325 HX8363_SpiWriteData((right&0xff));
327 HX8363_SpiWriteCmd(0x2B00);
328 HX8363_SpiWriteData((top>>8));// set left address
329 HX8363_SpiWriteData((top&0xff));
330 HX8363_SpiWriteData((bottom>>8));// set bottom address
331 HX8363_SpiWriteData((bottom&0xff));
333 // HX8363_SpiWriteCmd(0x2C00);
335 HX8363_SpiWriteCmd(0x2A00);
337 spi_read(test_data+1);
338 HX8363_SpiWriteCmd(0x2B00);
339 spi_read(test_data+2);
340 spi_read(test_data+3);
342 LCD_PRINT("zxdbg add -hx8363_read read: %x, %x, %x, %x\n",test_data[0], test_data[1], test_data[2], test_data[3]);
346 static int32_t hx8363_invalidate(struct panel_spec *self)
348 LCD_PRINT("hx8363_invalidate\n");
350 return self->ops->panel_set_window(self, 0, 0,
351 self->width - 1, self->height - 1);
356 static int32_t hx8363_invalidate_rect(struct panel_spec *self,
357 uint16_t left, uint16_t top,
358 uint16_t right, uint16_t bottom)
360 LCD_PRINT("hx8363_invalidate_rect \n");
362 return self->ops->panel_set_window(self, left, top,
366 static int32_t hx8363_read_id(struct panel_spec *self)
370 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
371 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
372 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
374 HX8363_SpiWriteCmd(0xB9); // SET password
375 HX8363_SpiWriteData(0xFF); //
376 HX8363_SpiWriteData(0x83); //
377 HX8363_SpiWriteData(0x63); //
379 HX8363_SpiWriteCmd(0xFE); // SET SPI READ INDEX
380 HX8363_SpiWriteData(0xF4); // GETHXID
381 HX8363_SpiWriteCmd(0xFF); // GET SPI READ
385 LCD_PRINT(" hx8363_read_id u-boot id = %d\n",id);
390 static struct panel_operations lcd_hx8363_rgb_spi_operations = {
391 .panel_init = hx8363_init,
392 .panel_set_window = hx8363_set_window,
393 .panel_invalidate_rect= hx8363_invalidate_rect,
394 .panel_invalidate = hx8363_invalidate,
395 .panel_enter_sleep = hx8363_enter_sleep,
396 .panel_readid = hx8363_read_id
399 static struct timing_rgb lcd_hx8363_rgb_timing = {
400 .hfp = 10, /* unit: pixel */
403 .vfp = 3, /*unit: line*/
408 static struct spi_info lcd_hx8363_rgb_spi_info = {
412 static struct info_rgb lcd_hx8363_rgb_info = {
413 .cmd_bus_mode = SPRDFB_RGB_BUS_TYPE_SPI,
414 .video_bus_width = 24, /*18,16*/
415 .h_sync_pol = SPRDFB_POLARITY_NEG,
416 .v_sync_pol = SPRDFB_POLARITY_NEG,
417 .de_pol = SPRDFB_POLARITY_POS,
418 .timing = &lcd_hx8363_rgb_timing,
420 .spi = &lcd_hx8363_rgb_spi_info,
424 struct panel_spec lcd_panel_hx8363_rgb_spi_spec = {
427 .type = LCD_MODE_RGB,
428 .direction = LCD_DIRECT_NORMAL,
430 .rgb = &lcd_hx8363_rgb_info
432 .ops = &lcd_hx8363_rgb_spi_operations,