1 /* BEGIN PN:DTS2013053103858 , Added by d00238048, 2013.05.31*/
3 #include <linux/string.h>
8 #include <platform/disp_drv_platform.h>
10 #elif defined(BUILD_UBOOT)
11 #include <asm/arch/mt_gpio.h>
13 #include <linux/delay.h>
14 #include <mach/mt_gpio.h>
16 #include <cust_gpio_usage.h>
18 #define LCD_DEBUG(fmt) dprintf(CRITICAL,fmt)
20 #define LCD_DEBUG(fmt) printk(fmt)
22 static unsigned char lcd_id_pins_value
= 0xFF;
23 const static unsigned char LCD_MODULE_ID
= 0x00;
24 // ---------------------------------------------------------------------------
26 // ---------------------------------------------------------------------------
27 #define LCM_DSI_CMD_MODE 1
28 #define FRAME_WIDTH (720)
29 #define FRAME_HEIGHT (1280)
32 #define REGFLAG_DELAY 0xFC
33 #define REGFLAG_END_OF_TABLE 0xFD // END OF REGISTERS MARKER
43 static unsigned int lcm_esd_test
= FALSE
; ///only for ESD test
45 //avoid 12.5% duty brightness value for TI backlight driver chip bug
46 static unsigned int MIN_VALUE_DUTY_ONE_EIGHT
= 29;
47 static unsigned int MAX_VALUE_DUTY_ONE_EIGHT
= 34;
48 //avoid 25% duty brightness value for TI backlight driver chip bug
49 static unsigned int MIN_VALUE_DUTY_ONE_FOUR
= 59;
50 static unsigned int MAX_VALUE_DUTY_ONE_FOUR
= 69;
51 //avoid 50% duty brightness value for TI backlight driver chip bug
52 static unsigned int MIN_VALUE_DUTY_ONE_TWO
= 123;
53 static unsigned int MAX_VALUE_DUTY_ONE_TWO
= 133;
54 // ---------------------------------------------------------------------------
56 // ---------------------------------------------------------------------------
58 const static unsigned int BL_MIN_LEVEL
=20;
59 static LCM_UTIL_FUNCS lcm_util
= {0};
61 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
63 // ---------------------------------------------------------------------------
65 // ---------------------------------------------------------------------------
67 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
68 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
69 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
70 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
71 #define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd)
72 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
74 struct LCM_setting_table
{
77 unsigned char para_list
[64];
79 //update initial param for IC nt35520 0.01
80 static struct LCM_setting_table lcm_initialization_setting_tm
[] = {
81 {0xFF, 4, {0xAA,0x55,0xA5,0x80}},
82 //f00208919 20130817 for boe flinker
86 {0xf0, 5, {0x55,0xaa,0x52,0x08,0x00}},
89 {0xbb, 2, {0x11,0x11}},
90 {0xbc, 2, {0x00,0x00}},
92 {0xb1, 2, {0x7a,0x21}},
94 {0xf0, 5, {0x55,0xaa,0x52,0x08,0x01}},
95 {0xb0, 2, {0x09,0x09}},
96 {0xb1, 2, {0x09,0x09}},
97 {0xbc, 2, {0x98,0x00}},
98 {0xbd, 2, {0x98,0x00}},
101 {0xb5, 2, {0x03,0x03}},
103 {0xb3, 2, {0x1b,0x1b}},
104 {0xb4, 2, {0x0f,0x0f}},
105 {0xb9, 2, {0x26,0x26}},
106 {0xba, 2, {0x24,0x24}},
108 {0xf0, 5, {0x55,0xaa,0x52,0x08,0x02}},
110 {0xb0, 16, {0x00,0x20,0x00,0x69,0x00,0xac,0x00,0xce,0x00,0xe7,0x01,0x11,0x01,0x30,0x01,0x61}},
111 {0xb1, 16, {0x01,0x86,0x01,0xc2,0x01,0xef,0x02,0x37,0x02,0x6f,0x02,0x71,0x02,0xa5,0x02,0xde}},
112 {0xb2, 16, {0x03,0x01,0x03,0x2E,0x03,0x4B,0x03,0x6C,0x03,0x81,0x03,0x95,0x03,0xA0,0x03,0xB2}},
113 {0xb3, 4, {0x03,0xB7,0x03,0xFF}},
115 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x06}},
117 {0xb0, 2, {0x18,0x16}},
118 {0xb1, 2, {0x12,0x10}},
119 {0xb2, 2, {0x00,0x02}},
120 {0xb3, 2, {0x31,0x31}},
121 {0xb4, 2, {0x31,0x34}},
122 {0xb5, 2, {0x34,0x31}},
123 {0xb6, 2, {0x31,0x33}},
124 {0xb7, 2, {0x33,0x33}},
125 {0xb8, 2, {0x31,0x08}},
126 {0xb9, 2, {0x2E,0x2D}},
127 {0xba, 2, {0x2D,0x2E}},
128 {0xbb, 2, {0x09,0x31}},
129 {0xbc, 2, {0x33,0x33}},
130 {0xbd, 2, {0x33,0x31}},
131 {0xbe, 2, {0x31,0x34}},
132 {0xbf, 2, {0x34,0x31}},
133 {0xc0, 2, {0x31,0x31}},
134 {0xc1, 2, {0x03,0x01}},
135 {0xc2, 2, {0x11,0x13}},
136 {0xc3, 2, {0x17,0x19}},
137 {0xe5, 2, {0x31,0x31}},
139 {0xc4, 2, {0x11,0x13}},
140 {0xc5, 2, {0x17,0x19}},
141 {0xc6, 2, {0x03,0x01}},
142 {0xc7, 2, {0x31,0x31}},
143 {0xc8, 2, {0x31,0x34}},
144 {0xc9, 2, {0x34,0x31}},
145 {0xca, 2, {0x31,0x33}},
146 {0xcb, 2, {0x33,0x33}},
147 {0xcc, 2, {0x31,0x09}},
148 {0xcd, 2, {0x2D,0x2E}},
149 {0xce, 2, {0x2E,0x2D}},
150 {0xcf, 2, {0x08,0x31}},
151 {0xd0, 2, {0x33,0x33}},
152 {0xd1, 2, {0x33,0x31}},
153 {0xd2, 2, {0x31,0x34}},
154 {0xd3, 2, {0x34,0x31}},
155 {0xd4, 2, {0x31,0x31}},
156 {0xd5, 2, {0x00,0x02}},
157 {0xd6, 2, {0x18,0x16}},
158 {0xd7, 2, {0x12,0x10}},
160 {0xd8, 5, {0x00,0x00,0x00,0x00,0x00}},
161 {0xd9, 5, {0x00,0x00,0x00,0x00,0x00}},
164 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
167 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x03}},
168 {0xb1, 2, {0x00,0x00}},
169 {0xb0, 2, {0x00,0x00}},
171 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
174 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
175 {0xb0, 2, {0x17,0x06}},
178 {0xbd, 5, {0x03,0x03,0x01,0x00,0x03}},
179 {0xb1, 2, {0x17,0x06}},
180 {0xb9, 2, {0x00,0x03}},
181 {0xb2, 2, {0x17,0x06}},
182 {0xba, 2, {0x00,0x00}},
183 {0xb3, 2, {0x17,0x06}},
184 {0xbb, 2, {0x00,0x00}},
185 {0xb4, 2, {0x17,0x06}},
186 {0xb5, 2, {0x17,0x06}},
187 {0xb6, 2, {0x17,0x06}},
188 {0xb7, 2, {0x17,0x06}},
189 {0xbc, 2, {0x00,0x03}},
199 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
205 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x03}},
206 {0xb2, 5, {0x05,0x00,0x00,0x00,0x00}},
207 {0xb3, 5, {0x05,0x00,0x00,0x00,0x00}},
208 {0xb4, 5, {0x05,0x00,0x00,0x00,0x00}},
209 {0xb5, 5, {0x05,0x00,0x00,0x00,0x00}},
211 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
217 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x03}},
218 {0xb6, 5, {0x05,0x00,0x00,0x00,0x00}},
219 {0xb7, 5, {0x05,0x00,0x00,0x00,0x00}},
220 {0xb8, 5, {0x05,0x00,0x00,0x00,0x00}},
221 {0xb9, 5, {0x05,0x00,0x00,0x00,0x00}},
223 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
224 {0xc8, 2, {0x0B,0x20}},
225 {0xc9, 2, {0x07,0x20}},
226 {0xca, 2, {0x0B,0x00}},
227 {0xcb, 2, {0x07,0x00}},
229 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x03}},
230 {0xba, 5, {0x53,0x00,0x00,0x00,0x00}},
231 {0xbb, 5, {0x53,0x00,0x00,0x00,0x00}},
232 {0xbc, 5, {0x53,0x00,0x00,0x00,0x00}},
233 {0xbd, 5, {0x53,0x00,0x00,0x00,0x00}},
235 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
236 {0xd1, 5, {0x00,0x05,0x04,0x07,0x10}},
237 {0xd2, 5, {0x00,0x05,0x08,0x07,0x10}},
238 {0xd3, 5, {0x00,0x00,0x0A,0x07,0x10}},
239 {0xd4, 5, {0x00,0x00,0x0A,0x07,0x10}},
241 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x05}},
242 {0xd0, 7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
243 {0xd5, 11, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
244 {0xd6, 11, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
245 {0xd7, 11, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
246 {0xd8, 5, {0x00,0x00,0x00,0x00,0x00}},
248 {0xf0, 5, {0x55,0xAA,0x52,0x08,0x03}},
257 {REGFLAG_DELAY
, 120, {}},
266 static struct LCM_setting_table lcm_set_window
[] = {
267 {0x2A, 4, {0x00, 0x00, (FRAME_WIDTH
>>8), (FRAME_WIDTH
&0xFF)}},
268 {0x2B, 4, {0x00, 0x00, (FRAME_HEIGHT
>>8), (FRAME_HEIGHT
&0xFF)}},
269 {REGFLAG_END_OF_TABLE
, 0x00, {}}
272 static struct LCM_setting_table lcm_sleep_out_setting
[] = {
275 {REGFLAG_DELAY
, 120, {}},
279 {REGFLAG_DELAY
, 20, {}},
280 {REGFLAG_END_OF_TABLE
, 0x00, {}}
284 static struct LCM_setting_table lcm_deep_sleep_mode_in_setting
[] = {
285 // Display off sequence
287 {REGFLAG_DELAY
, 20, {}},
291 {REGFLAG_DELAY
, 120, {}},
292 {REGFLAG_END_OF_TABLE
, 0x00, {}}
295 static void push_table(struct LCM_setting_table
*table
, unsigned int count
, unsigned char force_update
)
299 for(i
= 0; i
< count
; i
++)
307 if(table
[i
].count
<= 10)
308 mdelay(table
[i
].count
);
310 msleep(table
[i
].count
);
313 case REGFLAG_END_OF_TABLE
:
317 dsi_set_cmdq_V2(cmd
, table
[i
].count
, table
[i
].para_list
, force_update
);
322 // ---------------------------------------------------------------------------
323 // LCM Driver Implementations
324 // ---------------------------------------------------------------------------
326 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
328 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
332 static void lcm_get_params(LCM_PARAMS
*params
)
334 memset(params
, 0, sizeof(LCM_PARAMS
));
336 params
->type
= LCM_TYPE_DSI
;
338 params
->width
= FRAME_WIDTH
;
339 params
->height
= FRAME_HEIGHT
;
341 #if (LCM_DSI_CMD_MODE)
342 params
->dsi
.mode
= CMD_MODE
;
344 params
->dsi
.mode
= SYNC_PULSE_VDO_MODE
;
348 /* Command mode setting */
349 params
->dsi
.LANE_NUM
= LCM_FOUR_LANE
;
350 //The following defined the fomat for data coming from LCD engine.
351 params
->dsi
.data_format
.color_order
= LCM_COLOR_ORDER_RGB
;
352 params
->dsi
.data_format
.trans_seq
= LCM_DSI_TRANS_SEQ_MSB_FIRST
;
353 params
->dsi
.data_format
.padding
= LCM_DSI_PADDING_ON_LSB
;
354 params
->dsi
.data_format
.format
= LCM_DSI_FORMAT_RGB888
;
356 // Highly depends on LCD driver capability.
357 params
->dsi
.packet_size
=256;
360 params
->dsi
.PS
=LCM_PACKED_PS_24BIT_RGB888
;
362 params
->dsi
.vertical_sync_active
= 2;
363 params
->dsi
.vertical_backporch
= 8;
364 params
->dsi
.vertical_frontporch
= 10;
365 params
->dsi
.vertical_active_line
= FRAME_HEIGHT
;
367 params
->dsi
.horizontal_sync_active
= 10;
368 params
->dsi
.horizontal_backporch
= 20;
369 params
->dsi
.horizontal_frontporch
= 40;
370 params
->dsi
.horizontal_active_pixel
= FRAME_WIDTH
;
372 /*BEGIN PN:DTS2013013101431 modified by s00179437 , 2013-01-31*/
373 //improve clk quality
374 params
->dsi
.PLL_CLOCK
= 240; //this value must be in MTK suggested table
375 /*END PN:DTS2013013101431 modified by s00179437 , 2013-01-31*/
378 /*to prevent electric leakage*/
379 static void lcm_id_pin_handle(void)
381 mt_set_gpio_pull_select(GPIO_DISP_ID0_PIN
,GPIO_PULL_DOWN
);
382 mt_set_gpio_pull_select(GPIO_DISP_ID1_PIN
,GPIO_PULL_DOWN
);
385 static void lcm_init_tm(void)
388 lcm_util
.set_gpio_out(GPIO_LCD_BIAS_ENP_PIN
, GPIO_OUT_ONE
);
389 lcm_util
.set_gpio_out(GPIO_LCD_BIAS_ENN_PIN
, GPIO_OUT_ONE
);
392 lcm_util
.set_gpio_out(GPIO_DISP_LRSTB_PIN
, GPIO_OUT_ONE
);
394 lcm_util
.set_gpio_out(GPIO_DISP_LRSTB_PIN
, GPIO_OUT_ZERO
);
396 lcm_util
.set_gpio_out(GPIO_DISP_LRSTB_PIN
, GPIO_OUT_ONE
);
400 // when phone initial , config output high, enable backlight drv chip
401 lcm_util
.set_gpio_out(GPIO_LCD_DRV_EN_PIN
, GPIO_OUT_ONE
);
402 push_table(lcm_initialization_setting_tm
, sizeof(lcm_initialization_setting_tm
) / sizeof(struct LCM_setting_table
), 1);
404 LCD_DEBUG("uboot:tm_nt35520_lcm_init\n");
409 static void lcm_suspend(void)
411 /*BEGIN PN:DTS2013061501413 , Modified by s00179437 , 2013-6-15*/
412 //Back to MP.P7 baseline , solve LCD display abnormal On the right
413 // when phone sleep , config output low, disable backlight drv chip
414 lcm_util
.set_gpio_out(GPIO_LCD_DRV_EN_PIN
, GPIO_OUT_ZERO
);
415 /*END PN:DTS2013061501413 , Modified by s00179437 , 2013-6-15*/
416 push_table(lcm_deep_sleep_mode_in_setting
, sizeof(lcm_deep_sleep_mode_in_setting
) / sizeof(struct LCM_setting_table
), 1);
418 lcm_util
.set_gpio_out(GPIO_DISP_LRSTB_PIN
, GPIO_OUT_ZERO
);
421 lcm_util
.set_gpio_out(GPIO_LCD_BIAS_ENP_PIN
, GPIO_OUT_ZERO
);
422 lcm_util
.set_gpio_out(GPIO_LCD_BIAS_ENN_PIN
, GPIO_OUT_ZERO
);
425 LCD_DEBUG("kernel:tm_nt35520_lcm_suspend\n");
428 static void lcm_resume_tm(void)
432 lcm_util
.set_gpio_out(GPIO_LCD_BIAS_ENP_PIN
, GPIO_OUT_ONE
);
433 lcm_util
.set_gpio_out(GPIO_LCD_BIAS_ENN_PIN
, GPIO_OUT_ONE
);
437 lcm_util
.set_gpio_out(GPIO_DISP_LRSTB_PIN
, GPIO_OUT_ONE
);
439 lcm_util
.set_gpio_out(GPIO_DISP_LRSTB_PIN
, GPIO_OUT_ZERO
);
441 lcm_util
.set_gpio_out(GPIO_DISP_LRSTB_PIN
, GPIO_OUT_ONE
);
444 push_table(lcm_initialization_setting_tm
, sizeof(lcm_initialization_setting_tm
) / sizeof(struct LCM_setting_table
), 1);
445 /*BEGIN PN:DTS2013061501413 , Modified by s00179437 , 2013-6-15*/
446 //Back to MP.P7 baseline , solve LCD display abnormal On the right
447 //when sleep out, config output high ,enable backlight drv chip
448 lcm_util
.set_gpio_out(GPIO_LCD_DRV_EN_PIN
, GPIO_OUT_ONE
);
449 /*END PN:DTS2013061501413 , Modified by s00179437 , 2013-6-15*/
450 LCD_DEBUG("kernel:tm_nt35520_lcm_resume\n");
452 static void lcm_update(unsigned int x
, unsigned int y
,
453 unsigned int width
, unsigned int height
)
457 unsigned int x1
= x0
+ width
- 1;
458 unsigned int y1
= y0
+ height
- 1;
460 unsigned char x0_MSB
= ((x0
>>8)&0xFF);
461 unsigned char x0_LSB
= (x0
&0xFF);
462 unsigned char x1_MSB
= ((x1
>>8)&0xFF);
463 unsigned char x1_LSB
= (x1
&0xFF);
464 unsigned char y0_MSB
= ((y0
>>8)&0xFF);
465 unsigned char y0_LSB
= (y0
&0xFF);
466 unsigned char y1_MSB
= ((y1
>>8)&0xFF);
467 unsigned char y1_LSB
= (y1
&0xFF);
469 unsigned int data_array
[16];
471 data_array
[0]= 0x00053902;
472 data_array
[1]= (x1_MSB
<<24)|(x0_LSB
<<16)|(x0_MSB
<<8)|0x2a;
473 data_array
[2]= (x1_LSB
);
474 dsi_set_cmdq(data_array
, 3, 1);
476 data_array
[0]= 0x00053902;
477 data_array
[1]= (y1_MSB
<<24)|(y0_LSB
<<16)|(y0_MSB
<<8)|0x2b;
478 data_array
[2]= (y1_LSB
);
479 dsi_set_cmdq(data_array
, 3, 1);
480 /*BEGIN PN:DTS2013013101431 modified by s00179437 , 2013-01-31*/
481 //delete high speed packet
482 //data_array[0]=0x00290508;
483 //dsi_set_cmdq(data_array, 1, 1);
484 /*END PN:DTS2013013101431 modified by s00179437 , 2013-01-31*/
486 data_array
[0]= 0x002c3909;
487 dsi_set_cmdq(data_array
, 1, 0);
490 /*BEGIN PN:DTS2013011703806, Added by y00213338 , 2013-01-13*/
491 /******************************************************************************
492 Function: lcm_set_pwm_level_XXX
493 Description: set different values for each LCD
498 ******************************************************************************/
500 static unsigned int lcm_set_pwm_level_tm(unsigned int level
)
502 unsigned int mapped_level
= 0;
505 mapped_level
= level
;
507 else if(( 0 < level
) && ( BL_MIN_LEVEL
> level
))
509 //Some 3rd APK will set values < 20 , set value(1-19) is 8
514 //Reduce brightness for power consumption , MAX value > 350cd/cm2
515 mapped_level
= (unsigned int)((level
-8) * 7 /10);
517 /*BEGIN PN:DTS2013042409674, Added by s00179437 , 2013-04-24*/
518 if((mapped_level
>= MIN_VALUE_DUTY_ONE_EIGHT
) && (mapped_level
<= MAX_VALUE_DUTY_ONE_EIGHT
)) //12.5% duty shanshuo
520 //avoid 12.5% duty brightness value for TI backlight driver chip bug
521 mapped_level
= MIN_VALUE_DUTY_ONE_EIGHT
-1;
523 else if((mapped_level
>= MIN_VALUE_DUTY_ONE_FOUR
) && (mapped_level
<= MAX_VALUE_DUTY_ONE_FOUR
))
525 //avoid 25% duty brightness value for TI backlight driver chip bug
526 mapped_level
= MIN_VALUE_DUTY_ONE_FOUR
-1;
528 else if((mapped_level
>= MIN_VALUE_DUTY_ONE_TWO
) && (mapped_level
<= MAX_VALUE_DUTY_ONE_TWO
))
530 //avoid 50% duty brightness value for TI backlight driver chip bug
531 mapped_level
= MIN_VALUE_DUTY_ONE_TWO
-1;
535 dprintf(CRITICAL
,"uboot:tm_nt35520_lcm_set_pwm mapped_level = %d,level=%d\n",mapped_level
,level
);
537 printk("kernel:tm_nt35520_lcm_set_pwm mapped_level = %d,level=%d\n",mapped_level
,level
);
541 static unsigned int lcm_compare_id_tm(void)
543 /* BEGIN PN:SPBB-1229 ,Modified by b00214920, 2013/01/07*/
544 unsigned char module_id
= which_lcd_module_triple();
545 return ((LCD_MODULE_ID
== module_id
)? 1 : 0);
546 /* END PN:SPBB-1229 ,Modified by b00214920, 2013/01/07*/
548 LCM_DRIVER nt35520_hd720_tm_lcm_drv
=
550 .name
= "nt35520_hd720_dsi_cmd_tm",
551 .set_util_funcs
= lcm_set_util_funcs
,
552 .get_params
= lcm_get_params
,
553 .init
= lcm_init_tm
,/*tianma init fun.*/
554 .suspend
= lcm_suspend
,
555 .resume
= lcm_resume_tm
,
556 .compare_id
= lcm_compare_id_tm
,
557 #if (LCM_DSI_CMD_MODE)
558 .update
= lcm_update
,
559 // .set_backlight = lcm_setbacklight,
560 //.set_pwm_level = lcm_set_pwm_level_tm,
561 // .set_pwm = lcm_setpwm,
562 // .get_pwm = lcm_getpwm,
563 // .esd_check = lcm_esd_check,
564 // .esd_recover = lcm_esd_recover,
568 /* END PN:DTS2013053103858 , Added by d00238048, 2013.05.31*/