1 /* drivers/video/sc8800g/sc8800g_lcd_hx8357.c
3 * Support for HX8357 LCD device
5 * Copyright (C) 2010 Spreadtrum
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #include <asm/arch/sc8810_lcd.h>
19 #define mdelay(a) udelay(a * 1000)
24 #define LCD_PRINT printk
26 #define LCD_PRINT(...)
30 static int32_t hx8357_init(struct lcd_spec *self)
32 Send_data send_cmd = self->info.mcu->ops->send_cmd;
34 Send_cmd_data send_cmd_data = self->info.mcu->ops->send_cmd_data;
36 Send_data send_data = self->info.mcu->ops->send_data;
38 LCD_PRINT("hx8357_init\n");
41 //send_cmd(0x11); // Sleep out
43 send_cmd(0x21); // Display Inversion ON
45 send_data(0x06); // Interface
49 send_data(0x57); // Set EXTC
52 send_data(0x07); // Set panel
53 #ifndef CONFIG_FB_LCD_NOFMARK
54 send_cmd(0x35); // TE on
55 send_data(0x00); //TE Mode 0
58 //send_cmd_data(0x36, 0x00); //tong test
59 //send_cmd_data(0x36, 0xc0); //tong test
65 send_data(0x00); //tong test
69 send_data(0x06); // Set RGB I/F
71 send_data(0x4D); // VCOMDC
78 send_data(0x48); // [2]0012); ,VG); =3DDVD); ,VGL=(-2DDVD); ) [3]VSPROUT=4.27V [4]VSNROUT=(-4.31)V
86 send_data(0x40); // [1]0000); =Column,0001); =1-dot,0002); =2-dot,0003); =4-dot
98 send_cmd(0xE0); // Gamma
99 send_data(0x00); // P0
100 send_data(0x06); // P1
101 send_data(0x0A); // P2
102 send_data(0x1F); // P3
103 send_data(0x29); // P4
104 send_data(0x3D); //; P5
105 send_data(0x4B); //; P6
106 send_data(0x53); //; P7
107 send_data(0x46); //; P8
108 send_data(0x40); //; P9
109 send_data(0x3A); //; P10
110 send_data(0x37); //; P11
111 send_data(0x2F); //; P12
112 send_data(0x2A); //; P13
113 send_data(0x28); //; P14
114 send_data(0x07); //; P15
116 send_data(0x00); //; N0
117 send_data(0x06); //; N1
118 send_data(0x0A); //; N2
119 send_data(0x1F); //; N3
120 send_data(0x29); //; N4
121 send_data(0x3D); //; N5
122 send_data(0x4B); //; N6
123 send_data(0x53); //; N7
124 send_data(0x46); //; N8
125 send_data(0x40); //; N9
126 send_data(0x3A); //; N10
127 send_data(0x37); //; N11
128 send_data(0x2F); //; N12
129 send_data(0x2A); //; N13
130 send_data(0x28); //; N14
131 send_data(0x07); //; N15
137 send_cmd(0x11); // Sleep out
139 send_cmd(0x29); // display on
148 static int32_t hx8357_set_window(struct lcd_spec *self,
149 uint16_t left, uint16_t top, uint16_t right, uint16_t bottom)
151 Send_data send_cmd = self->info.mcu->ops->send_cmd;
152 Send_data send_data = self->info.mcu->ops->send_data;
154 LCD_PRINT("hx8357_set_window: %d, %d, %d, %d\n",left, top, right, bottom);
156 /* set window size */
159 send_data(left >> 8);
160 send_data(left & 0xff);
161 send_data(right >> 8);
162 send_data(right & 0xff);
167 send_data(top & 0xff);
168 send_data(bottom >> 8);
169 send_data(bottom & 0xff);
176 static int32_t hx8357_invalidate(struct lcd_spec *self)
178 LCD_PRINT("hx8357_invalidate\n");
180 return self->ops->lcd_set_window(self, 0, 0,
181 self->width - 1, self->height - 1);
185 static int32_t hx8357_invalidate_rect(struct lcd_spec *self,
186 uint16_t left, uint16_t top,
187 uint16_t right, uint16_t bottom)
190 LCD_PRINT("hx8357_invalidate_rect \n");
193 //send_cmd_data(0x000b, (top >> 8));
194 //send_cmd_data(0x000c, (top & 0xff));
195 return self->ops->lcd_set_window(self, left, top,
200 static int32_t hx8357_set_direction(struct lcd_spec *self, uint16_t direction)
203 LCD_PRINT("hx8357_set_direction\n");
204 self->direction = direction;
209 static int32_t hx8357_enter_sleep(struct lcd_spec *self, uint8_t is_sleep)
211 Send_data send_cmd = self->info.mcu->ops->send_cmd;
215 send_cmd(0x10); // SLEEP
219 send_cmd(0x11); // SLPOUT
223 static uint32_t hx8357_read_id(struct lcd_spec *self)
225 Send_data send_cmd = self->info.mcu->ops->send_cmd;
226 Read_data read_data = self->info.mcu->ops->read_data;
227 Send_data send_data = self->info.mcu->ops->send_data;
229 uint32_t uICID[5] = {0};
235 for(i = 0; i < 5; i++)
237 uICID[i] = read_data();
238 printk("[tong][uboot]hx8357_read_id: uICID[%d] = 0x%x\n", i, uICID[i]);
241 if((uICID[1] == 0x01) && (uICID[2] == 0x22) && (uICID[3] == 0x15) && (uICID[4] == 0x81))
243 printk("[tong][uboot]LCD driver IC: r61581\n");
248 printk("[tong][uboot]LCD driver IC: hx8357c\n");
257 for(i = 0; i < 2; i++)
259 uICID[i] = read_data();
260 printk("[tong][uboot]hx8357_read_id: uICID[%d] = 0x%x\n", i, uICID[i]);
263 if((uICID[1] == 0x90))
265 printk("[tong][uboot]LCD driver IC: hx8357c\n");
269 printk("[tong][uboot]LCD driver IC: r61581\n");
277 printk("[tong][uboot]hx8357_read_id: 0x%x from addr:0xDA\n", uID);
282 static struct lcd_operations lcd_hx8357_operations = {
283 .lcd_init = hx8357_init,
284 .lcd_set_window = hx8357_set_window,
285 .lcd_invalidate_rect= hx8357_invalidate_rect,
286 .lcd_invalidate = hx8357_invalidate,
287 .lcd_set_direction = hx8357_set_direction,
288 .lcd_enter_sleep = hx8357_enter_sleep,
289 .lcd_readid = hx8357_read_id,
292 static struct timing_mcu lcd_hx8357_timing[] = {
294 [LCD_REGISTER_TIMING] = { // read/write register timing
302 [LCD_GRAM_TIMING] = { // read/write gram timing
313 static struct info_mcu lcd_hx8357_info = {
314 .bus_mode = LCD_BUS_8080,
316 .timing = lcd_hx8357_timing,
320 struct lcd_spec lcd_panel_hx8357 = {
323 .mode = LCD_MODE_MCU,
324 .direction = LCD_DIRECT_NORMAL,
325 .info = {.mcu = &lcd_hx8357_info},
326 .ops = &lcd_hx8357_operations,