2 #include <linux/delay.h>
3 #include "../../rk29_fb.h"
5 #include <mach/iomux.h>
6 #include <mach/board.h>
11 #define OUT_TYPE SCREEN_RGB
12 #define OUT_FACE OUT_P666 /*OUT_P888*/
13 #define OUT_CLK 10000000 //***27
14 #define LCDC_ACLK 150000000 //29 lcdc axi DMA ƵÂÊ
19 #define H_VD 320 //***800
24 #define V_VD 480 //***480
27 #define LCD_WIDTH 320 //need modify
28 #define LCD_HEIGHT 480
34 static struct rk29lcd_info *gLcd_info = NULL;
36 int standby(u8 enable);
39 #define TXD_PORT gLcd_info->txd_pin
40 #define CLK_PORT gLcd_info->clk_pin
41 #define CS_PORT gLcd_info->cs_pin
43 #define CS_OUT() gpio_direction_output(CS_PORT, 0)
44 #define CS_SET() gpio_set_value(CS_PORT, GPIO_HIGH)
45 #define CS_CLR() gpio_set_value(CS_PORT, GPIO_LOW)
46 #define CLK_OUT() gpio_direction_output(CLK_PORT, 0)
47 #define CLK_SET() gpio_set_value(CLK_PORT, GPIO_HIGH)
48 #define CLK_CLR() gpio_set_value(CLK_PORT, GPIO_LOW)
49 #define TXD_OUT() gpio_direction_output(TXD_PORT, 0)
50 #define TXD_SET() gpio_set_value(TXD_PORT, GPIO_HIGH)
51 #define TXD_CLR() gpio_set_value(TXD_PORT, GPIO_LOW)
54 static void screen_set_iomux(u8 enable)
59 rk29_mux_api_set(GPIOH6_IQ_SEL_NAME, 0);
60 ret = gpio_request(RK29_PIN_PH6, NULL);
63 gpio_free(RK29_PIN_PH6);
64 printk(">>>>>> lcd cs gpio_request err \n ");
68 rk29_mux_api_set(GPIOE_I2C0_SEL_NAME, 1);
70 ret = gpio_request(RK29_PIN_PE5, NULL);
73 gpio_free(RK29_PIN_PE5);
74 printk(">>>>>> lcd clk gpio_request err \n ");
78 ret = gpio_request(RK29_PIN_PE4, NULL);
81 gpio_free(RK29_PIN_PE4);
82 printk(">>>>>> lcd txd gpio_request err \n ");
88 gpio_free(RK29_PIN_PH6);
89 // rk29_mux_api_set(CXGPIO_HSADC_SEL_NAME, 1);
91 gpio_free(RK29_PIN_PE5);
92 gpio_free(RK29_PIN_PE4);
93 rk29_mux_api_set(GPIOE_I2C0_SEL_NAME, 0);
102 void spi_screenreg_set(u32 Addr, u32 Data)
104 #define DRVDelayUs(i) udelay(i*2)
122 control_bit = 0x70<<8;
123 Addr = (control_bit | Addr);
124 //printk("addr is 0x%x \n", Addr);
125 for(i = 0; i < 16; i++) //reg
127 if(Addr &(1<<(15-i)))
145 control_bit = 0x72<<8;
146 Data = (control_bit | Data);
147 //printk("data is 0x%x \n", Data);
148 for(i = 0; i < 16; i++) //data
150 if(Data &(1<<(15-i)))
168 void set_lcd_info(struct rk29fb_screen *screen, struct rk29lcd_info *lcd_info )
170 //printk("lcd_hx8357 set_lcd_info \n");
171 /* screen type & face */
172 screen->type = OUT_TYPE;
173 screen->face = OUT_FACE;
176 screen->x_res = H_VD;
177 screen->y_res = V_VD;
179 screen->width = LCD_WIDTH;
180 screen->height = LCD_HEIGHT;
183 screen->lcdc_aclk = LCDC_ACLK;
184 screen->pixclock = OUT_CLK;
185 screen->left_margin = H_BP; /*>2*/
186 screen->right_margin = H_FP; /*>2*/
187 screen->hsync_len = H_PW; /*>2*/ //***all > 326, 4<PW+BP<15,
188 screen->upper_margin = V_BP; /*>2*/
189 screen->lower_margin = V_FP; /*>2*/
190 screen->vsync_len = V_PW; /*>6*/
193 screen->pin_hsync = 0;
194 screen->pin_vsync = 0;
196 screen->pin_dclk = DCLK_POL;
199 screen->swap_rb = SWAP_RB;
202 screen->swap_delta = 0;
203 screen->swap_dumy = 0;
205 /* Operation function*/
207 screen->standby = standby;
209 gLcd_info = lcd_info;
216 gLcd_info->io_init();
218 #if 0 //***Õâ¾ä´úÂëÊDz»ÊÇд´íÁË
219 spi_screenreg_set(0x02, 0x07);
220 spi_screenreg_set(0x03, 0x5f);
221 spi_screenreg_set(0x04, 0x17);
222 spi_screenreg_set(0x05, 0x20);
223 spi_screenreg_set(0x06, 0x08);
224 spi_screenreg_set(0x07, 0x20);
225 spi_screenreg_set(0x08, 0x20);
226 spi_screenreg_set(0x09, 0x20);
227 spi_screenreg_set(0x0a, 0x20);
228 spi_screenreg_set(0x0b, 0x22);
229 spi_screenreg_set(0x0c, 0x22);
230 spi_screenreg_set(0x0d, 0x22);
231 spi_screenreg_set(0x0e, 0x10);
232 spi_screenreg_set(0x0f, 0x10);
233 spi_screenreg_set(0x10, 0x10);
235 spi_screenreg_set(0x11, 0x15);
236 spi_screenreg_set(0x12, 0xAA);
237 spi_screenreg_set(0x13, 0xFF);
238 spi_screenreg_set(0x14, 0xb0);
239 spi_screenreg_set(0x15, 0x8e);
240 spi_screenreg_set(0x16, 0xd6);
241 spi_screenreg_set(0x17, 0xfe);
242 spi_screenreg_set(0x18, 0x28);
243 spi_screenreg_set(0x19, 0x52);
244 spi_screenreg_set(0x1A, 0x7c);
246 spi_screenreg_set(0x1B, 0xe9);
247 spi_screenreg_set(0x1C, 0x42);
248 spi_screenreg_set(0x1D, 0x88);
249 spi_screenreg_set(0x1E, 0xb8);
250 spi_screenreg_set(0x1F, 0xFF);
251 spi_screenreg_set(0x20, 0xF0);
252 spi_screenreg_set(0x21, 0xF0);
253 spi_screenreg_set(0x22, 0x09);
255 spi_screenreg_set(0xff, 0x00);
256 spi_screenreg_set(0x16, 0x08);
257 spi_screenreg_set(0x01, 0x02);
258 spi_screenreg_set(0xe2, 0x00);
259 spi_screenreg_set(0xe3, 0x00);
260 spi_screenreg_set(0xf2, 0x00);
261 spi_screenreg_set(0xe4, 0x1c);
262 spi_screenreg_set(0xe5, 0x1c);
263 spi_screenreg_set(0xe6, 0x00);
264 spi_screenreg_set(0xe7, 0x1c);
266 spi_screenreg_set(0x19, 0x01);
268 spi_screenreg_set(0x2a, 0x00);
269 spi_screenreg_set(0x2b, 0x13);
270 spi_screenreg_set(0x2f, 0x01);
271 spi_screenreg_set(0x02, 0x00);
272 spi_screenreg_set(0x03, 0x00);
273 spi_screenreg_set(0x04, 0x01);
274 spi_screenreg_set(0x05, 0x3f);
275 spi_screenreg_set(0x06, 0x00);
276 spi_screenreg_set(0x07, 0x00);
278 spi_screenreg_set(0x08, 0x01);
279 spi_screenreg_set(0x09, 0xdf);
280 spi_screenreg_set(0x24, 0x91);
281 spi_screenreg_set(0x25, 0x8a);
282 spi_screenreg_set(0x29, 0x01);
283 spi_screenreg_set(0x18, 0x22);
284 spi_screenreg_set(0x1b, 0x30);
286 spi_screenreg_set(0x1d, 0x22);
288 spi_screenreg_set(0x40, 0x00);
289 spi_screenreg_set(0x41, 0x3c);
290 spi_screenreg_set(0x42, 0x38);
291 spi_screenreg_set(0x43, 0x34);
292 spi_screenreg_set(0x44, 0x2e);
293 spi_screenreg_set(0x45, 0x2f);
294 spi_screenreg_set(0x46, 0x41);
295 spi_screenreg_set(0x47, 0x7d);
296 spi_screenreg_set(0x48, 0x0b);
297 spi_screenreg_set(0x49, 0x05);
298 spi_screenreg_set(0x4a, 0x06);
299 spi_screenreg_set(0x4b, 0x12);
300 spi_screenreg_set(0x4c, 0x16);
301 spi_screenreg_set(0x50, 0x10);
302 spi_screenreg_set(0x51, 0x11);
303 spi_screenreg_set(0x52, 0x0b);
304 spi_screenreg_set(0x53, 0x07);
305 spi_screenreg_set(0x54, 0x03);
306 spi_screenreg_set(0x55, 0x3f);
307 spi_screenreg_set(0x56, 0x02);
308 spi_screenreg_set(0x57, 0x3e);
309 spi_screenreg_set(0x58, 0x09);
310 spi_screenreg_set(0x59, 0x0d);
311 spi_screenreg_set(0x5a, 0x19);
312 spi_screenreg_set(0x5b, 0x1a);
313 spi_screenreg_set(0x5c, 0x14);
314 spi_screenreg_set(0x5d, 0xc0);
315 spi_screenreg_set(0x1a, 0x05);
318 spi_screenreg_set(0x1c, 0x03);
320 spi_screenreg_set(0x1f, 0x90);
322 spi_screenreg_set(0x1f, 0xd2);
324 spi_screenreg_set(0x28, 0x04);
326 spi_screenreg_set(0x28, 0x38);
328 spi_screenreg_set(0x28, 0x3c);
330 spi_screenreg_set(0x80, 0x00);
331 spi_screenreg_set(0x81, 0x00);
332 spi_screenreg_set(0x82, 0x00);
333 spi_screenreg_set(0x83, 0x00);
335 spi_screenreg_set(0x60, 0x08);
336 spi_screenreg_set(0x31, 0x02);
337 spi_screenreg_set(0x32, 0x08 /*0x00*/);
338 spi_screenreg_set(0x17, 0x60); //***RGB666
339 spi_screenreg_set(0x2d, 0x1f);
340 spi_screenreg_set(0xe8, 0x90);
343 gLcd_info->io_deinit();
348 int standby(u8 enable) //***enable =1 means suspend, 0 means resume
352 gLcd_info->io_init();
354 //printk("---------hx8357 screen suspend--------------\n");
356 spi_screenreg_set(0x03, 0xde);
360 spi_screenreg_set(0x1f, 0x91);
361 spi_screenreg_set(0x19, 0x00);
363 spi_screenreg_set(0x28, 0x38);
365 spi_screenreg_set(0x28, 0x24);
367 spi_screenreg_set(0x28, 0x04);
372 //printk("--------- hx8357 screen resume--------------\n ");
374 spi_screenreg_set(0x03, 0x5f);
378 spi_screenreg_set(0x19, 0x01);
379 spi_screenreg_set(0x1f, 0x90);
381 spi_screenreg_set(0x1f, 0xd2);
383 spi_screenreg_set(0x28, 0x38);
385 spi_screenreg_set(0x28, 0x3c);
387 spi_screenreg_set(0x80, 0x00);
388 spi_screenreg_set(0x81, 0x00);
389 spi_screenreg_set(0x82, 0x00);
390 spi_screenreg_set(0x83, 0x00);
398 gLcd_info->io_deinit();