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/sprd_lcd.h>
23 #define LCD_PRINT printk
25 #define LCD_PRINT(...)
28 #define HX8363_SpiWriteCmd(cmd) \
30 spi_send_cmd((cmd & 0xFF));\
33 #define HX8363_SpiWriteData(data)\
35 spi_send_data((data & 0xFF));\
39 static int32_t hx8363_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;
52 LCD_PRINT("hx8363_init\n");
54 HX8363_SpiWriteCmd(0xB9); // SET password
55 HX8363_SpiWriteData(0xFF); //
56 HX8363_SpiWriteData(0x83); //
57 HX8363_SpiWriteData(0x63); //
59 HX8363_SpiWriteCmd(0xB1);
60 HX8363_SpiWriteData(0x01);
61 HX8363_SpiWriteData(0x00);
62 HX8363_SpiWriteData(0x44);
63 HX8363_SpiWriteData(0x08);
64 HX8363_SpiWriteData(0x01);
65 // HX8363_SpiWriteData(0x0E); //
66 // HX8363_SpiWriteData(0x0E); //
67 // HX8363_SpiWriteData(0x1B); //the lower ,Saturation is better
68 // HX8363_SpiWriteData(0x23); //the lower ,Saturation is better
69 HX8363_SpiWriteData(0x0F); //
70 HX8363_SpiWriteData(0x0F); //
71 HX8363_SpiWriteData(0x22); //the lower ,Saturation is better
72 HX8363_SpiWriteData(0x2A); //the lower ,Saturation is better
74 HX8363_SpiWriteData(0x3F);
75 HX8363_SpiWriteData(0x3F);
76 HX8363_SpiWriteData(0x40);
77 HX8363_SpiWriteData(0x32);
78 HX8363_SpiWriteData(0x00);
79 HX8363_SpiWriteData(0xE6);
80 HX8363_SpiWriteData(0xE6);
81 HX8363_SpiWriteData(0xE6);
82 HX8363_SpiWriteData(0xE6);
83 HX8363_SpiWriteData(0xE6);
85 HX8363_SpiWriteCmd(0xB2); // SET DISP
86 HX8363_SpiWriteData(0x08); //
87 HX8363_SpiWriteData(0x03); //
89 HX8363_SpiWriteCmd(0xB4);
90 HX8363_SpiWriteData(0x00);//Column inversion
91 HX8363_SpiWriteData(0x18);
92 HX8363_SpiWriteData(0x9C);
93 HX8363_SpiWriteData(0x08);
94 HX8363_SpiWriteData(0x18);
95 HX8363_SpiWriteData(0x04);
96 HX8363_SpiWriteData(0x82);
98 HX8363_SpiWriteCmd(0xB6); //Set_VCOM
99 HX8363_SpiWriteData(0x1B); //0x10
101 HX8363_SpiWriteCmd(0xCC); // SET Panel
102 HX8363_SpiWriteData(0x01); //
106 HX8363_SpiWriteCmd(0xE0); // SET Gamma
107 HX8363_SpiWriteData(0x00);
108 HX8363_SpiWriteData(0x05);
109 HX8363_SpiWriteData(0x07);
110 HX8363_SpiWriteData(0x0C);
111 HX8363_SpiWriteData(0x13);
112 HX8363_SpiWriteData(0x2F);
113 HX8363_SpiWriteData(0x0B);
114 HX8363_SpiWriteData(0x1D);
115 HX8363_SpiWriteData(0x86);
116 HX8363_SpiWriteData(0x0D);
117 HX8363_SpiWriteData(0x91);
118 HX8363_SpiWriteData(0x16);
119 HX8363_SpiWriteData(0x99);
120 HX8363_SpiWriteData(0x16);
121 HX8363_SpiWriteData(0x16);
122 HX8363_SpiWriteData(0x09);
123 HX8363_SpiWriteData(0x05);
124 HX8363_SpiWriteData(0x00);
125 HX8363_SpiWriteData(0x05);
126 HX8363_SpiWriteData(0x07);
127 HX8363_SpiWriteData(0x0C);
128 HX8363_SpiWriteData(0x13);
129 HX8363_SpiWriteData(0x2F);
130 HX8363_SpiWriteData(0x0B);
131 HX8363_SpiWriteData(0x1D);
132 HX8363_SpiWriteData(0x86);
133 HX8363_SpiWriteData(0x0D);
134 HX8363_SpiWriteData(0x91);
135 HX8363_SpiWriteData(0x16);
136 HX8363_SpiWriteData(0x99);
137 HX8363_SpiWriteData(0x16);
138 HX8363_SpiWriteData(0x16);
139 HX8363_SpiWriteData(0x09);
140 HX8363_SpiWriteData(0x05);
142 HX8363_SpiWriteCmd(0xC1); //COLMOD
143 HX8363_SpiWriteData(0x01); //
145 HX8363_SpiWriteData(0x07 );
146 HX8363_SpiWriteData(0x0A );
147 HX8363_SpiWriteData(0x1A );
148 HX8363_SpiWriteData(0x2F );
149 HX8363_SpiWriteData(0x3E );
150 HX8363_SpiWriteData(0x4A );
151 HX8363_SpiWriteData(0x52 );
152 HX8363_SpiWriteData(0x5A );
153 HX8363_SpiWriteData(0x62 );
154 HX8363_SpiWriteData(0x69 );
155 HX8363_SpiWriteData(0x70 );
156 HX8363_SpiWriteData(0x76 );
157 HX8363_SpiWriteData(0x7D );
158 HX8363_SpiWriteData(0x82 );
159 HX8363_SpiWriteData(0x86 );
160 HX8363_SpiWriteData(0x8C );
161 HX8363_SpiWriteData(0x93 );
162 HX8363_SpiWriteData(0x9A );
163 HX8363_SpiWriteData(0x9F );
164 HX8363_SpiWriteData(0xA4 );
165 HX8363_SpiWriteData(0xA9 );
166 HX8363_SpiWriteData(0xB0 );
167 HX8363_SpiWriteData(0xB6 );
168 HX8363_SpiWriteData(0xBB );
169 HX8363_SpiWriteData(0xC2 );
170 HX8363_SpiWriteData(0xC9 );
171 HX8363_SpiWriteData(0xCF );
172 HX8363_SpiWriteData(0xD7 );
173 HX8363_SpiWriteData(0xE0 );
174 HX8363_SpiWriteData(0xE7 );
175 HX8363_SpiWriteData(0xEF );
176 HX8363_SpiWriteData(0xF8 );
177 HX8363_SpiWriteData(0xFF );
178 HX8363_SpiWriteData(0x34 );
179 HX8363_SpiWriteData(0x1E );
180 HX8363_SpiWriteData(0x92 );
181 HX8363_SpiWriteData(0x9E );
182 HX8363_SpiWriteData(0x01 );
183 HX8363_SpiWriteData(0xE6 );
184 HX8363_SpiWriteData(0x08 );
185 HX8363_SpiWriteData(0x6F );
186 HX8363_SpiWriteData(0x02 );
188 HX8363_SpiWriteData(0x07 );
189 HX8363_SpiWriteData(0x0A );
190 HX8363_SpiWriteData(0x1A );
191 HX8363_SpiWriteData(0x2F );
192 HX8363_SpiWriteData(0x3E );
193 HX8363_SpiWriteData(0x4A );
194 HX8363_SpiWriteData(0x52 );
195 HX8363_SpiWriteData(0x5A );
196 HX8363_SpiWriteData(0x62 );
197 HX8363_SpiWriteData(0x69 );
198 HX8363_SpiWriteData(0x70 );
199 HX8363_SpiWriteData(0x76 );
200 HX8363_SpiWriteData(0x7D );
201 HX8363_SpiWriteData(0x82 );
202 HX8363_SpiWriteData(0x86 );
203 HX8363_SpiWriteData(0x8C );
204 HX8363_SpiWriteData(0x93 );
205 HX8363_SpiWriteData(0x9A );
206 HX8363_SpiWriteData(0x9F );
207 HX8363_SpiWriteData(0xA4 );
208 HX8363_SpiWriteData(0xA9 );
209 HX8363_SpiWriteData(0xB0 );
210 HX8363_SpiWriteData(0xB6 );
211 HX8363_SpiWriteData(0xBB );
212 HX8363_SpiWriteData(0xC2 );
213 HX8363_SpiWriteData(0xC9 );
214 HX8363_SpiWriteData(0xCF );
215 HX8363_SpiWriteData(0xD7 );
216 HX8363_SpiWriteData(0xE0 );
217 HX8363_SpiWriteData(0xE7 );
218 HX8363_SpiWriteData(0xEF );
219 HX8363_SpiWriteData(0xF8 );
220 HX8363_SpiWriteData(0xFF );
221 HX8363_SpiWriteData(0x34 );
222 HX8363_SpiWriteData(0x1E );
223 HX8363_SpiWriteData(0x92 );
224 HX8363_SpiWriteData(0x9E );
225 HX8363_SpiWriteData(0x01 );
226 HX8363_SpiWriteData(0xE6 );
227 HX8363_SpiWriteData(0x08 );
228 HX8363_SpiWriteData(0x6F );
229 HX8363_SpiWriteData(0x02 );
231 HX8363_SpiWriteData(0x07 );
232 HX8363_SpiWriteData(0x0A );
233 HX8363_SpiWriteData(0x1A );
234 HX8363_SpiWriteData(0x2F );
235 HX8363_SpiWriteData(0x3E );
236 HX8363_SpiWriteData(0x4A );
237 HX8363_SpiWriteData(0x52 );
238 HX8363_SpiWriteData(0x5A );
239 HX8363_SpiWriteData(0x62 );
240 HX8363_SpiWriteData(0x69 );
241 HX8363_SpiWriteData(0x70 );
242 HX8363_SpiWriteData(0x76 );
243 HX8363_SpiWriteData(0x7D );
244 HX8363_SpiWriteData(0x82 );
245 HX8363_SpiWriteData(0x86 );
246 HX8363_SpiWriteData(0x8C );
247 HX8363_SpiWriteData(0x93 );
248 HX8363_SpiWriteData(0x9A );
249 HX8363_SpiWriteData(0x9F );
250 HX8363_SpiWriteData(0xA4 );
251 HX8363_SpiWriteData(0xA9 );
252 HX8363_SpiWriteData(0xB0 );
253 HX8363_SpiWriteData(0xB6 );
254 HX8363_SpiWriteData(0xBB );
255 HX8363_SpiWriteData(0xC2 );
256 HX8363_SpiWriteData(0xC9 );
257 HX8363_SpiWriteData(0xCF );
258 HX8363_SpiWriteData(0xD7 );
259 HX8363_SpiWriteData(0xE0 );
260 HX8363_SpiWriteData(0xE7 );
261 HX8363_SpiWriteData(0xEF );
262 HX8363_SpiWriteData(0xF8 );
263 HX8363_SpiWriteData(0xFF );
264 HX8363_SpiWriteData(0x34 );
265 HX8363_SpiWriteData(0x1E );
266 HX8363_SpiWriteData(0x92 );
267 HX8363_SpiWriteData(0x9E );
268 HX8363_SpiWriteData(0x01 );
269 HX8363_SpiWriteData(0xE6 );
270 HX8363_SpiWriteData(0x08 );
271 HX8363_SpiWriteData(0x6F );
272 HX8363_SpiWriteData(0x02 );
274 HX8363_SpiWriteCmd(0x3A); //COLMOD
275 HX8363_SpiWriteData(0x77); //
277 HX8363_SpiWriteCmd(0x11);//Sleep Out
279 HX8363_SpiWriteCmd(0x35); //Tearing Effect
280 HX8363_SpiWriteData(0x00); //
281 HX8363_SpiWriteCmd(0x36);
282 HX8363_SpiWriteData(0x02);
283 HX8363_SpiWriteCmd(0x29);
285 HX8363_SpiWriteCmd(0x2C);
289 static int32_t hx8363_enter_sleep(struct panel_spec *self, uint8_t is_sleep)
291 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
292 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
296 HX8363_SpiWriteCmd(0x28);
298 HX8363_SpiWriteCmd(0x10);
302 HX8363_SpiWriteCmd(0x11);
304 HX8363_SpiWriteCmd(0x29);
314 static int32_t hx8363_set_window(struct panel_spec *self,
315 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
317 uint32_t *test_data[4] = {0};
318 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
319 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
320 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
323 LCD_PRINT("zxdbg add -hx8363_set_window: %d, %d, %d, %d\n",left, top, right, bottom);
325 HX8363_SpiWriteCmd(0x2A00);
326 HX8363_SpiWriteData((left>>8));// set left address
327 HX8363_SpiWriteData((left&0xff));
328 HX8363_SpiWriteData((right>>8));// set right address
329 HX8363_SpiWriteData((right&0xff));
331 HX8363_SpiWriteCmd(0x2B00);
332 HX8363_SpiWriteData((top>>8));// set left address
333 HX8363_SpiWriteData((top&0xff));
334 HX8363_SpiWriteData((bottom>>8));// set bottom address
335 HX8363_SpiWriteData((bottom&0xff));
337 // HX8363_SpiWriteCmd(0x2C00);
339 HX8363_SpiWriteCmd(0x2A00);
341 spi_read(test_data+1);
342 HX8363_SpiWriteCmd(0x2B00);
343 spi_read(test_data+2);
344 spi_read(test_data+3);
346 LCD_PRINT("zxdbg add -hx8363_read read: %x, %x, %x, %x\n",test_data[0], test_data[1], test_data[2], test_data[3]);
350 static int32_t hx8363_invalidate(struct panel_spec *self)
352 LCD_PRINT("hx8363_invalidate\n");
354 return self->ops->panel_set_window(self, 0, 0,
355 self->width - 1, self->height - 1);
360 static int32_t hx8363_invalidate_rect(struct panel_spec *self,
361 uint16_t left, uint16_t top,
362 uint16_t right, uint16_t bottom)
364 LCD_PRINT("hx8363_invalidate_rect \n");
366 return self->ops->panel_set_window(self, left, top,
370 static int32_t hx8363_read_id(struct panel_spec *self)
373 spi_send_cmd_t spi_send_cmd = self->info.rgb->bus_info.spi->ops->spi_send_cmd;
374 spi_send_data_t spi_send_data = self->info.rgb->bus_info.spi->ops->spi_send_data;
375 spi_read_t spi_read = self->info.rgb->bus_info.spi->ops->spi_read;
377 HX8363_SpiWriteCmd(0xB9); // SET password
378 HX8363_SpiWriteData(0xFF); //
379 HX8363_SpiWriteData(0x83); //
380 HX8363_SpiWriteData(0x63); //
382 HX8363_SpiWriteCmd(0xFE); // SET SPI READ INDEX
383 HX8363_SpiWriteData(0xF4); // GETHXID
384 HX8363_SpiWriteCmd(0xFF); // GET SPI READ
388 LCD_PRINT(" hx8363_read_id u-boot id = %x\n",id);
396 static struct panel_operations lcd_hx8363_rgb_spi_operations = {
397 .panel_init = hx8363_init,
398 .panel_set_window = hx8363_set_window,
399 .panel_invalidate_rect= hx8363_invalidate_rect,
400 .panel_invalidate = hx8363_invalidate,
401 .panel_enter_sleep = hx8363_enter_sleep,
402 .panel_readid = hx8363_read_id
405 static struct timing_rgb lcd_hx8363_rgb_timing = {
406 .hfp = 15,//10, /* unit: pixel */
409 .vfp = 8, // 3, /*unit: line*/
414 static struct spi_info lcd_hx8363_rgb_spi_info = {
418 static struct info_rgb lcd_hx8363_rgb_info = {
419 .cmd_bus_mode = SPRDFB_RGB_BUS_TYPE_SPI,
420 .video_bus_width = 24, /*18,16*/
421 .h_sync_pol = SPRDFB_POLARITY_NEG,
422 .v_sync_pol = SPRDFB_POLARITY_NEG,
423 .de_pol = SPRDFB_POLARITY_POS,
424 .timing = &lcd_hx8363_rgb_timing,
426 .spi = &lcd_hx8363_rgb_spi_info,
430 struct panel_spec lcd_panel_hx8363_rgb_spi_spec = {
434 .type = LCD_MODE_RGB,
435 .direction = LCD_DIRECT_NORMAL,
437 .rgb = &lcd_hx8363_rgb_info
439 .ops = &lcd_hx8363_rgb_spi_operations,