6 #include <platform/mt_i2c.h>
9 #include <linux/string.h>
13 #include <platform/mt_gpio.h>
14 #include <platform/mt_pmic.h>
16 #include <mach/mt_gpio.h>
17 #include <mach/mt_pm_ldo.h>
18 #include <mach/upmu_common.h>
22 // ---------------------------------------------------------------------------
24 // ---------------------------------------------------------------------------
25 #define FRAME_WIDTH (800)
26 #define FRAME_HEIGHT (1280)
28 #define REGFLAG_DELAY 0XFE
29 #define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER
31 #define LCM_DSI_CMD_MODE 0
32 #define LCM_ID 0x03 //DPT+AUO+Rm72013
34 // ---------------------------------------------------------------------------
36 // ---------------------------------------------------------------------------
37 static LCM_UTIL_FUNCS lcm_util
= {
41 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
42 #define UDELAY(n) (lcm_util.udelay(n))
43 #define MDELAY(n) (lcm_util.mdelay(n))
45 // ---------------------------------------------------------------------------
47 // ---------------------------------------------------------------------------
48 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
49 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
50 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
51 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
52 #define read_reg lcm_util.dsi_read_reg()
53 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
55 struct LCM_setting_table
{
58 unsigned char para_list
[64];
61 static struct LCM_setting_table lcm_initialization_setting
[] = {
69 {0xC3,3,{0x40,0x00,0x28}},
70 {REGFLAG_DELAY
, 6, {}},
73 {REGFLAG_DELAY
, 200, {}},
74 {REGFLAG_END_OF_TABLE
, 0x00, {}}
77 static struct LCM_setting_table lcm_power_off_setting
[] = {
80 {REGFLAG_DELAY
, 5, {}},
82 {0xC3,3,{0x40,0x00,0x20}},
83 {REGFLAG_END_OF_TABLE
, 0x00, {}}
86 static void lcd_power_en(unsigned char enabled
)
90 upmu_set_rg_vgp1_vosel(0x7);//3.3V
91 upmu_set_rg_vgp1_en(0x1);
92 upmu_set_rg_vgp3_vosel(0x3);//1.8V
93 upmu_set_rg_vgp3_en(0x1);
95 upmu_set_rg_vgp1_vosel(0x7);//3.3V
96 upmu_set_rg_vgp1_en(0x1);
97 upmu_set_rg_vgp3_vosel(0x3);//1.8V
98 upmu_set_rg_vgp3_en(0x1);
102 upmu_set_rg_vgp1_en(0);
103 upmu_set_rg_vgp1_vosel(0);
104 upmu_set_rg_vgp3_en(0);
105 upmu_set_rg_vgp3_vosel(0);
107 upmu_set_rg_vgp1_en(0);
108 upmu_set_rg_vgp1_vosel(0);
109 upmu_set_rg_vgp3_en(0);
110 upmu_set_rg_vgp3_vosel(0);
116 static void lcd_reset(unsigned char enabled
)
119 mt_set_gpio_out(GPIO_LCM_RST
, GPIO_OUT_ONE
);
121 mt_set_gpio_out(GPIO_LCM_RST
, GPIO_OUT_ZERO
);
125 // ---------------------------------------------------------------------------
126 // LCM Driver Implementations
127 // ---------------------------------------------------------------------------
128 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
130 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
134 static void lcm_get_params(LCM_PARAMS
*params
)
136 memset(params
, 0, sizeof(LCM_PARAMS
));
138 params
->type
= LCM_TYPE_DSI
;
139 params
->width
= FRAME_WIDTH
;
140 params
->height
= FRAME_HEIGHT
;
141 params
->dsi
.mode
= SYNC_EVENT_VDO_MODE
; //BURST_VDO_MODE;BURST_VDO_MODE;
144 /* Command mode setting */
145 params
->dsi
.LANE_NUM
= LCM_FOUR_LANE
;
146 //The following defined the fomat for data coming from LCD engine.
147 params
->dsi
.data_format
.format
= LCM_DSI_FORMAT_RGB888
; //LCM_DSI_FORMAT_RGB666;
149 // Video mode setting
150 params
->dsi
.PS
= LCM_PACKED_PS_24BIT_RGB888
; //LCM_PACKED_PS_18BIT_RGB666;
152 params
->dsi
.vertical_sync_active
= 4;//0;
153 params
->dsi
.vertical_backporch
= 8;//23;
154 params
->dsi
.vertical_frontporch
= 8;
155 params
->dsi
.vertical_active_line
= FRAME_HEIGHT
;
157 params
->dsi
.horizontal_sync_active
= 4;//0;
158 params
->dsi
.horizontal_backporch
= 132;//160;
159 params
->dsi
.horizontal_frontporch
= 24; //100;//160;
160 params
->dsi
.horizontal_active_pixel
= FRAME_WIDTH
;
162 params
->dsi
.PLL_CLOCK
= 250;//148;
165 static void push_table(struct LCM_setting_table
*table
, unsigned int count
, unsigned char force_update
)
169 for(i
= 0; i
< count
; i
++) {
175 MDELAY(table
[i
].count
);
178 case REGFLAG_END_OF_TABLE
:
182 dsi_set_cmdq_V2(cmd
, table
[i
].count
, table
[i
].para_list
, force_update
);
188 static void lcm_init(void)
190 unsigned int data_array
[16];
193 printf("%s, LK \n", __func__
);
195 printk("%s, kernel", __func__
);
202 mt_set_gpio_out(GPIO_LCM_PWR_EN
, GPIO_OUT_ONE
);//iml8881 bias
211 push_table(lcm_initialization_setting
, sizeof(lcm_initialization_setting
) / sizeof(struct LCM_setting_table
), 1);
215 static void lcm_suspend(void)
217 unsigned int data_array
[16];
220 printf("%s, LK \n", __func__
);
222 printk("%s, kernel", __func__
);
225 push_table(lcm_power_off_setting
, sizeof(lcm_power_off_setting
) / sizeof(struct LCM_setting_table
), 1);
228 mt_set_gpio_out(GPIO_LCM_PWR_EN
, GPIO_OUT_ZERO
);//iml8881 bias
234 static void lcm_resume(void)
236 unsigned int data_array
[16];
239 printf("%s, LK \n", __func__
);
241 printk("%s, kernel", __func__
);
247 static unsigned int lcm_esd_test = FALSE;
249 static unsigned int lcm_esd_check(void)
260 lcm_esd_test = FALSE;
264 array[0] = 0x00013700;
265 dsi_set_cmdq(array, 1, 1);
266 read_reg_v2(0x0A, buffer, 1);
267 //printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]);
268 if(buffer[0] != 0x9C)
270 // printk("[LCM ERROR] [0x0A]=0x%02x\n", buffer[0]);
274 // return TRUE: need recovery
275 // return FALSE: No need recovery
287 static unsigned int lcm_esd_recover(void)
290 printf("%s, LK \n", __func__);
292 printk("%s, KERNEL \n", __func__);
298 static unsigned int lcm_compare_id(void)
300 unsigned int id1
= 0, id2
= 0, id
= 0;
303 printf("%s, LK \n", __func__
);
315 mt_set_gpio_mode(GPIO_HALL_2_PIN
, GPIO_HALL_2_PIN_M_GPIO
);
316 mt_set_gpio_dir(GPIO_HALL_2_PIN
, GPIO_DIR_IN
);
317 mt_set_gpio_pull_enable(GPIO_HALL_2_PIN
, GPIO_PULL_DISABLE
);
318 mt_set_gpio_mode(GPIO_HALL_1_PIN
, GPIO_HALL_1_PIN_M_GPIO
);
319 mt_set_gpio_dir(GPIO_HALL_1_PIN
, GPIO_DIR_IN
);
320 mt_set_gpio_pull_enable(GPIO_HALL_1_PIN
, GPIO_PULL_DISABLE
);
323 id1
= mt_get_gpio_in(GPIO_HALL_1_PIN
);
324 id2
= mt_get_gpio_in(GPIO_HALL_2_PIN
);
327 printf("DPT+AUO id1=%d,id2=%d,id=0x%x\n",id1
,id2
,id
);
329 printk("DPT+AUO id1=%d,id2=%d,id=0x%x\n",id1
,id2
,id
);
334 return (LCM_ID
== id
)?1:0;
337 LCM_DRIVER rm72013_wxga_dsi_vdo_lcm_drv
=
339 .name
= "rm72013_wxga_dsi_vdo",
340 .set_util_funcs
= lcm_set_util_funcs
,
341 .get_params
= lcm_get_params
,
343 .suspend
= lcm_suspend
,
344 .resume
= lcm_resume
,
345 //.esd_check = lcm_esd_check,
346 //.esd_recover = lcm_esd_recover,
347 .compare_id
= lcm_compare_id
,