1 #include <linux/string.h>
6 // ---------------------------------------------------------------------------
8 // ---------------------------------------------------------------------------
10 #define FRAME_WIDTH (480)
11 #define FRAME_HEIGHT (800)
14 // ---------------------------------------------------------------------------
16 // ---------------------------------------------------------------------------
18 static LCM_UTIL_FUNCS lcm_util
= {0};
20 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
22 #define UDELAY(n) (lcm_util.udelay(n))
23 #define MDELAY(n) (lcm_util.mdelay(n))
26 // ---------------------------------------------------------------------------
28 // ---------------------------------------------------------------------------
30 static __inline
void send_ctrl_cmd(unsigned int cmd
)
32 lcm_util
.send_cmd(cmd
);
35 static __inline
void send_data_cmd(unsigned int data
)
37 lcm_util
.send_data(data
&0xff);
40 static __inline
unsigned int read_data_cmd(void)
42 return 0xFF&lcm_util
.read_data();
45 static __inline
void set_lcm_register(unsigned int regIndex
,
48 send_ctrl_cmd(regIndex
);
49 send_data_cmd(regData
);
52 static void sw_clear_panel(unsigned int color
)
54 unsigned short x0
, y0
, x1
, y1
, x
, y
;
55 unsigned short h_X_start
,l_X_start
,h_X_end
,l_X_end
,h_Y_start
,l_Y_start
,h_Y_end
,l_Y_end
;
57 x0
= (unsigned short)0;
58 y0
= (unsigned short)0;
59 x1
= (unsigned short)FRAME_WIDTH
-1;
60 y1
= (unsigned short)FRAME_HEIGHT
-1;
62 h_X_start
=((x0
&0xFF00)>>8);
63 l_X_start
=(x0
&0x00FF);
64 h_X_end
=((x1
&0xFF00)>>8);
67 h_Y_start
=((y0
&0xFF00)>>8);
68 l_Y_start
=(y0
&0x00FF);
69 h_Y_end
=((y1
&0xFF00)>>8);
73 send_data_cmd(h_X_start
);
74 send_data_cmd(l_X_start
);
75 send_data_cmd(h_X_end
);
76 send_data_cmd(l_X_end
);
79 send_data_cmd(h_Y_start
);
80 send_data_cmd(l_Y_start
);
81 send_data_cmd(h_Y_end
);
82 send_data_cmd(l_Y_end
);
87 for (y
= y0
; y
<= y1
; ++ y
) {
88 for (x
= x0
; x
<= x1
; ++ x
) {
89 lcm_util
.send_data(color
);
94 static void init_lcm_registers(void)
96 send_ctrl_cmd(0xB9); // SET password
101 send_ctrl_cmd(0xB1); //Set Power
122 send_ctrl_cmd(0xB2); // SET Display 480x800
139 send_ctrl_cmd(0xB4); // SET Display column inversion
146 send_ctrl_cmd(0xB6); // SET VCOM
178 send_ctrl_cmd(0xE0); // Set Gamma
214 send_ctrl_cmd(0xC1); // Set DGC
343 send_ctrl_cmd(0x3A); // set Interface Pixel Format
344 send_data_cmd(0x07); // 0x07=24 Bit/Pixel; 0x06=18 Bit/Pixel; 0x05=16 Bit/Pixel
346 send_ctrl_cmd(0x51);//write display brightness
347 send_data_cmd(0xff);//set brightness 0x00-0xff
350 send_ctrl_cmd(0x53);//write ctrl display
355 send_data_cmd(0x02);//still picture
358 send_ctrl_cmd(0x5e);//write CABC minumum brightness
359 send_data_cmd(0x70);//
367 // ---------------------------------------------------------------------------
368 // LCM Driver Implementations
369 // ---------------------------------------------------------------------------
371 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
373 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
377 static void lcm_get_params(LCM_PARAMS
*params
)
379 memset(params
, 0, sizeof(LCM_PARAMS
));
381 params
->type
= LCM_TYPE_DBI
;
382 params
->ctrl
= LCM_CTRL_PARALLEL_DBI
;
383 params
->width
= FRAME_WIDTH
;
384 params
->height
= FRAME_HEIGHT
;
385 params
->io_select_mode
= 1;
387 params
->dbi
.port
= 0;
388 params
->dbi
.clock_freq
= LCM_DBI_CLOCK_FREQ_104M
;
389 params
->dbi
.data_width
= LCM_DBI_DATA_WIDTH_24BITS
;
390 params
->dbi
.data_format
.color_order
= LCM_COLOR_ORDER_RGB
;
391 params
->dbi
.data_format
.trans_seq
= LCM_DBI_TRANS_SEQ_MSB_FIRST
;
392 params
->dbi
.data_format
.padding
= LCM_DBI_PADDING_ON_MSB
;
393 params
->dbi
.data_format
.format
= LCM_DBI_FORMAT_RGB888
;
394 params
->dbi
.data_format
.width
= LCM_DBI_DATA_WIDTH_24BITS
;
395 params
->dbi
.cpu_write_bits
= LCM_DBI_CPU_WRITE_32_BITS
;
396 params
->dbi
.io_driving_current
= LCM_DRIVING_CURRENT_8MA
;
398 params
->dbi
.parallel
.write_setup
= 1;
399 params
->dbi
.parallel
.write_hold
= 1;
400 params
->dbi
.parallel
.write_wait
= 3;
401 params
->dbi
.parallel
.read_setup
= 3;
402 params
->dbi
.parallel
.read_latency
= 20;
403 params
->dbi
.parallel
.wait_period
= 0;
409 static void lcm_init(void)
416 init_lcm_registers();
420 static void lcm_suspend(void)
428 static void lcm_resume(void)
434 static void lcm_update(unsigned int x
, unsigned int y
,
435 unsigned int width
, unsigned int height
)
437 unsigned short x0
, y0
, x1
, y1
;
438 unsigned short h_X_start
,l_X_start
,h_X_end
,l_X_end
,h_Y_start
,l_Y_start
,h_Y_end
,l_Y_end
;
440 x0
= (unsigned short)x
;
441 y0
= (unsigned short)y
;
442 x1
= (unsigned short)x
+width
-1;
443 y1
= (unsigned short)y
+height
-1;
445 h_X_start
=((x0
&0xFF00)>>8);
446 l_X_start
=(x0
&0x00FF);
447 h_X_end
=((x1
&0xFF00)>>8);
450 h_Y_start
=((y0
&0xFF00)>>8);
451 l_Y_start
=(y0
&0x00FF);
452 h_Y_end
=((y1
&0xFF00)>>8);
456 send_data_cmd(h_X_start
);
457 send_data_cmd(l_X_start
);
458 send_data_cmd(h_X_end
);
459 send_data_cmd(l_X_end
);
462 send_data_cmd(h_Y_start
);
463 send_data_cmd(l_Y_start
);
464 send_data_cmd(h_Y_end
);
465 send_data_cmd(l_Y_end
);
472 static void lcm_setbacklight(unsigned int level
)
474 if(level
> 255) level
= 255;
476 send_data_cmd(level
);
478 static unsigned int lcm_compare_id(void)
480 send_ctrl_cmd(0xB9); // SET password
489 return (LCM_ID
== read_data_cmd())?1:0;
492 LCM_DRIVER hx8369_6575_lcm_drv
=
494 .name
= "hx8369_6575",
495 .set_util_funcs
= lcm_set_util_funcs
,
496 .get_params
= lcm_get_params
,
498 .suspend
= lcm_suspend
,
499 .resume
= lcm_resume
,
500 .update
= lcm_update
,
501 .set_backlight
= lcm_setbacklight
,
502 .compare_id
= lcm_compare_id
,