2 #include <linux/string.h>
7 #include <platform/mt_gpio.h>
9 #elif defined(BUILD_UBOOT)
10 #include <asm/arch/mt_gpio.h>
12 #include <mach/mt_gpio.h>
15 // ---------------------------------------------------------------------------
17 // ---------------------------------------------------------------------------
18 //#include <cust_adc.h> // zhoulidong add for lcm detect
19 #define AUXADC_LCM_VOLTAGE_CHANNEL 0
20 #define AUXADC_ADC_FDD_RF_PARAMS_DYNAMIC_CUSTOM_CH_CHANNEL 1
22 #define MIN_VOLTAGE (800) // zhoulidong add for lcm detect
23 #define MAX_VOLTAGE (1000) // zhoulidong add for lcm detect
26 // ---------------------------------------------------------------------------
28 // ---------------------------------------------------------------------------
30 #define FRAME_WIDTH (480)
31 #define FRAME_HEIGHT (800)
34 #define LCM_ID_ILI9806 0x9816 //D3
45 unsigned static int lcm_esd_test
= FALSE
; ///only for ESD test
47 // ---------------------------------------------------------------------------
49 // ---------------------------------------------------------------------------
51 static LCM_UTIL_FUNCS lcm_util
;
53 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
55 #define UDELAY(n) (lcm_util.udelay(n))
56 #define MDELAY(n) (lcm_util.mdelay(n))
59 // ---------------------------------------------------------------------------
61 // ---------------------------------------------------------------------------
62 #define dsi_set_cmdq_V3(para_tbl,size,force_update) lcm_util.dsi_set_cmdq_V3(para_tbl,size,force_update)
63 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
64 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
65 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
66 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
67 #define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd)
68 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
70 #define LCM_DSI_CMD_MODE 0
72 // zhoulidong add for lcm detect ,read adc voltage
73 extern int IMM_GetOneChannelValue(int dwChannel
, int data
[4], int* rawdata
);
76 static LCM_setting_table_V3 lcm_initialization_setting
[] = {
81 {0x39, 0XFF, 3, {0XFF, 0X98, 0X16}},
82 {0x15, 0XBA, 1, {0X60}},
83 {0x15, 0XB0, 1, {0X01}},
84 {0x39, 0XBC, 18, {0X03, 0X0D, 0X63, 0X33, 0X16, 0X16, 0X1B, 0X11, 0X38, 0X00, 0X00, 0X00, 0X16, 0X16, 0X08, 0X00, 0XFF, 0XF0}},
85 {0x39, 0xBD, 8, {0X01, 0X45, 0X45, 0X67, 0X01, 0X23, 0X45, 0X67}},
86 {0x39, 0XBE, 17, {0X13, 0X22, 0X11, 0X00, 0X66, 0X77, 0x22, 0x22, 0xAA, 0XCC, 0XBB, 0XDD, 0X22, 0X22, 0X22, 0X22, 0X22}},
87 {0x39, 0xED, 2, {0X7F, 0X0F}},
88 {0x15, 0xF3, 1, {0X70}},
89 {0x15, 0xB4, 1, {0X02}},
90 {0x39, 0xC0, 3, {0X0F,0X0B, 0X0A}},
91 {0x39, 0xC1, 4, {0X17, 0x8E, 0X87, 0X20}},
92 {0x15, 0xD8, 1, {0X50}},
93 {0x15, 0xFC, 1, {0X07}},
94 {0x39, 0xE0, 16, {0X00, 0X19, 0X22, 0X0F, 0X11, 0X17, 0XC6, 0X09, 0X06, 0X0A, 0X05, 0X10, 0X0E, 0X2D, 0X2A, 0X00}},
95 {0x39, 0xE1, 16, {0X00, 0X0C, 0X1A, 0X11, 0X11, 0X16, 0X79, 0X06, 0X02, 0X07, 0X09, 0X0B, 0X0B, 0X23, 0X1C, 0X00}},
96 {0x39, 0xD5, 8, {0X10, 0X08, 0X08, 0X07, 0XCB, 0XA5, 0X01, 0X04}},
97 {0x15, 0XF7, 1, {0X8A}},
98 {0x15, 0XC7, 1, {0X55}},//61 65 70
99 {0x15, 0x11, 1, {0x00}},
102 {REGFLAG_ESCAPE_ID
,REGFLAG_DELAY_MS_V3
, 120, {}},
104 {0x39, 0xEE, 9, {0x0A,0x1B,0x5F,0x40,0x00,0x00,0X10,0x00,0x58}},
107 {REGFLAG_ESCAPE_ID
,REGFLAG_DELAY_MS_V3
, 10, {}},
112 // ---------------------------------------------------------------------------
113 // LCM Driver Implementations
114 // ---------------------------------------------------------------------------
115 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
117 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
121 static void lcm_get_params(LCM_PARAMS
*params
)
124 memset(params
, 0, sizeof(LCM_PARAMS
));
126 params
->type
= LCM_TYPE_DSI
;
128 params
->width
= FRAME_WIDTH
;
129 params
->height
= FRAME_HEIGHT
;
131 #if (LCM_DSI_CMD_MODE)
132 params
->dsi
.mode
= CMD_MODE
;
134 params
->dsi
.mode
= SYNC_PULSE_VDO_MODE
; //SYNC_PULSE_VDO_MODE;//BURST_VDO_MODE;
138 /* Command mode setting */
139 //1 Three lane or Four lane
140 params
->dsi
.LANE_NUM
= LCM_TWO_LANE
;
141 //The following defined the fomat for data coming from LCD engine.
142 params
->dsi
.data_format
.format
= LCM_DSI_FORMAT_RGB888
;
144 // Video mode setting
145 params
->dsi
.PS
=LCM_PACKED_PS_24BIT_RGB888
;
147 params
->dsi
.vertical_sync_active
=4;
148 params
->dsi
.vertical_backporch
= 16;
149 params
->dsi
.vertical_frontporch
= 10;
150 params
->dsi
.vertical_active_line
= FRAME_HEIGHT
;
153 params
->dsi
.horizontal_sync_active
= 10;///////////////20 20 4 20 14 6
154 params
->dsi
.horizontal_backporch
= 80;
155 params
->dsi
.horizontal_frontporch
= 80;
156 params
->dsi
.horizontal_active_pixel
= FRAME_WIDTH
;
160 // Bit rate calculation
162 //params->dsi.pll_select=1;
163 //params->dsi.PLL_CLOCK = LCM_DSI_6589_PLL_CLOCK_377;
164 params
->dsi
.PLL_CLOCK
=234;
165 params
->dsi
.pll_div1
=0; // div1=0,1,2,3;div1_real=1,2,4,4 ----0: 546Mbps 1:273Mbps
166 params
->dsi
.pll_div2
=0; // div2=0,1,2,3;div1_real=1,2,4,4
167 #if (LCM_DSI_CMD_MODE)
168 params
->dsi
.fbk_div
=7;
170 params
->dsi
.fbk_div
=7; // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)
172 //params->dsi.compatibility_for_nvk = 1; // this parameter would be set to 1 if DriverIC is NTK's and when force match DSI clock for NTK's
177 static void lcm_init(void)
185 dsi_set_cmdq_V3(lcm_initialization_setting
,sizeof(lcm_initialization_setting
)/sizeof(lcm_initialization_setting
[0]),1);
190 static LCM_setting_table_V3 lcm_deep_sleep_mode_in_setting
[] = {
191 // Display off sequence
193 {REGFLAG_ESCAPE_ID
,REGFLAG_DELAY_MS_V3
, 10, {}},
197 {REGFLAG_ESCAPE_ID
,REGFLAG_DELAY_MS_V3
, 120, {}},
199 static void lcm_suspend(void)
202 dsi_set_cmdq_V3(lcm_deep_sleep_mode_in_setting
, sizeof(lcm_deep_sleep_mode_in_setting
)/sizeof(lcm_deep_sleep_mode_in_setting
[0]), 1);
212 static void lcm_resume(void)
218 #if (LCM_DSI_CMD_MODE)
219 static void lcm_update(unsigned int x
, unsigned int y
,
220 unsigned int width
, unsigned int height
)
224 unsigned int x1
= x0
+ width
- 1;
225 unsigned int y1
= y0
+ height
- 1;
227 unsigned char x0_MSB
= ((x0
>>8)&0xFF);
228 unsigned char x0_LSB
= (x0
&0xFF);
229 unsigned char x1_MSB
= ((x1
>>8)&0xFF);
230 unsigned char x1_LSB
= (x1
&0xFF);
231 unsigned char y0_MSB
= ((y0
>>8)&0xFF);
232 unsigned char y0_LSB
= (y0
&0xFF);
233 unsigned char y1_MSB
= ((y1
>>8)&0xFF);
234 unsigned char y1_LSB
= (y1
&0xFF);
236 unsigned int data_array
[16];
238 data_array
[0]= 0x00053902;
239 data_array
[1]= (x1_MSB
<<24)|(x0_LSB
<<16)|(x0_MSB
<<8)|0x2a;
240 data_array
[2]= (x1_LSB
);
241 dsi_set_cmdq(data_array
, 3, 1);
243 data_array
[0]= 0x00053902;
244 data_array
[1]= (y1_MSB
<<24)|(y0_LSB
<<16)|(y0_MSB
<<8)|0x2b;
245 data_array
[2]= (y1_LSB
);
246 dsi_set_cmdq(data_array
, 3, 1);
248 data_array
[0]= 0x002c3909;
249 dsi_set_cmdq(data_array
, 1, 0);
257 // zhoulidong add for lcm detect (start)
259 static unsigned int lcm_compare_id(void)
262 char buffer
[4]={0,0,0,0};
276 dsi_set_cmdq(array
, 2, 1);
279 array
[0] = 0x00083700;
280 dsi_set_cmdq(array
, 1, 1);
283 read_reg_v2(0xD3, buffer
, 4);// NC 0x00 0x98 0x16
287 id
= (id_high
<<8) | id_low
;
291 printf("ILI9806 uboot %s \n", __func__
);
292 printf("%s id = 0x%08x \n", __func__
, id
);
295 printk("ILI9806 kernel %s \n", __func__
);
296 printk("%s id = 0x%08x \n", __func__
, id
);
301 return (LCM_ID_ILI9806
== id
)?1:0;
305 // zhoulidong add for lcm detect (start)
306 static unsigned int rgk_lcm_compare_id(void)
308 int data
[4] = {0,0,0,0};
313 #ifdef AUXADC_LCM_VOLTAGE_CHANNEL
314 res
= IMM_GetOneChannelValue(AUXADC_LCM_VOLTAGE_CHANNEL
,data
,&rawdata
);
318 printf("[adc_uboot]: get data error\n");
324 lcm_vol
= data
[0]*1000+data
[1]*10;
328 printf("[adc_uboot]: lcm_vol= %d\n",lcm_vol
);
331 if (lcm_vol
>=MIN_VOLTAGE
&&lcm_vol
<= MAX_VOLTAGE
&&lcm_compare_id())
333 if (lcm_vol
>=MIN_VOLTAGE
&&lcm_vol
<= MAX_VOLTAGE
) // remove compare_id func for mt6582 temply by xiaoanxiang 2013-09-05
342 // zhoulidong add for eds(start)
343 static unsigned int lcm_esd_check(void)
346 //printf("lcm_esd_check()\n");
348 //printk("lcm_esd_check()\n");
356 lcm_esd_test
= FALSE
;
360 array
[0] = 0x00013700;
361 dsi_set_cmdq(array
, 1, 1);
363 read_reg_v2(0x0a, buffer
, 1);
367 //printf("%s %d\n FALSE", __func__, __LINE__);
369 //printk("%s %d\n FALSE", __func__, __LINE__);
376 //printf("%s %d\n FALSE", __func__, __LINE__);
378 //printk("%s %d\n FALSE", __func__, __LINE__);
386 static unsigned int lcm_esd_recover(void)
390 printf("lcm_esd_recover()\n");
392 printk("lcm_esd_recover()\n");
399 // zhoulidong add for eds(end)
400 LCM_DRIVER ili9806c_dsi_vdo_djn_lcm_drv
=
402 .name
= "ili9806c_dsi_vdo_djn",
403 .set_util_funcs
= lcm_set_util_funcs
,
404 .get_params
= lcm_get_params
,
406 .suspend
= lcm_suspend
,
407 .resume
= lcm_resume
,
408 .compare_id
= rgk_lcm_compare_id
,
409 // .esd_check = lcm_esd_check,
410 // .esd_recover = lcm_esd_recover,
411 #if (LCM_DSI_CMD_MODE)
412 .update
= lcm_update
,