4 #include <linux/string.h>
5 #if defined(BUILD_UBOOT)
6 #include <asm/arch/mt_gpio.h>
8 #include <mach/mt_gpio.h>
14 // ---------------------------------------------------------------------------
16 // ---------------------------------------------------------------------------
18 #define FRAME_WIDTH (240)
19 #define FRAME_HEIGHT (320)
21 #define REGFLAG_DELAY 0xAB
22 #define REGFLAG_END_OF_TABLE 0xAA // END OF REGISTERS MARKER
24 // ---------------------------------------------------------------------------
26 // ---------------------------------------------------------------------------
28 static LCM_UTIL_FUNCS lcm_util
= {0};
30 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
32 #define UDELAY(n) (lcm_util.udelay(n))
33 #define MDELAY(n) (lcm_util.mdelay(n))
36 #define LCM_ID1 (0xC1)
37 #define LCM_ID2 (0x80)
39 // ---------------------------------------------------------------------------
41 // ---------------------------------------------------------------------------
43 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
44 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
45 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
46 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
47 #define read_reg(cmd) lcm_util.dsi_dcs_read_lcm_reg(cmd)
48 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
50 struct LCM_setting_table
{
53 unsigned char para_list
[64];
57 static struct LCM_setting_table lcm_sleep_out_setting
[] = {
60 {REGFLAG_DELAY
, 120, {}},
64 {REGFLAG_END_OF_TABLE
, 0x00, {}}
68 static struct LCM_setting_table lcm_deep_sleep_mode_in_setting
[] = {
69 // Display off sequence
71 {REGFLAG_DELAY
, 10, {}},
75 {REGFLAG_DELAY
, 120, {}},
77 {REGFLAG_END_OF_TABLE
, 0x00, {}}
80 static void push_table(struct LCM_setting_table
*table
, unsigned int count
, unsigned char force_update
)
84 for(i
= 0; i
< count
; i
++) {
90 MDELAY(table
[i
].count
);
93 case REGFLAG_END_OF_TABLE
:
97 dsi_set_cmdq_V2(cmd
, table
[i
].count
, table
[i
].para_list
, force_update
);
99 if (cmd
!= 0xFF && cmd
!= 0x2C && cmd
!= 0x3C) {
100 //#if defined(BUILD_UBOOT)
101 // printf("[DISP] - uboot - REG_R(0x%x) = 0x%x. \n", cmd, table[i].para_list[0]);
103 while(read_reg(cmd
) != table
[i
].para_list
[0]);
110 // ---------------------------------------------------------------------------
111 // LCM Driver Implementations
112 // ---------------------------------------------------------------------------
113 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
115 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
119 static void lcm_get_params(LCM_PARAMS
*params
)
121 memset(params
, 0, sizeof(LCM_PARAMS
));
123 params
->type
= LCM_TYPE_DSI
;
125 params
->width
= FRAME_WIDTH
;
126 params
->height
= FRAME_HEIGHT
;
128 // enable tearing-free
129 params
->dbi
.te_mode
= LCM_DBI_TE_MODE_DISABLED
;
130 params
->dbi
.te_edge_polarity
= LCM_POLARITY_RISING
;
132 params
->dsi
.mode
= CMD_MODE
;
135 /* Command mode setting */
136 params
->dsi
.LANE_NUM
= LCM_TWO_LANE
;
138 //The following defined the fomat for data coming from LCD engine.
139 params
->dsi
.data_format
.color_order
= LCM_COLOR_ORDER_RGB
;
140 params
->dsi
.data_format
.trans_seq
= LCM_DSI_TRANS_SEQ_MSB_FIRST
;
141 params
->dsi
.data_format
.padding
= LCM_DSI_PADDING_ON_LSB
;
142 params
->dsi
.data_format
.format
= LCM_DSI_FORMAT_RGB888
;
144 params
->dsi
.intermediat_buffer_num
= 0;//because DSI/DPI HW design change, this parameters should be 0 when video mode in MT658X; or memory leakage
146 params
->dsi
.PS
=LCM_PACKED_PS_24BIT_RGB888
;
148 params
->dsi
.word_count
=240*3; //DSI CMD mode need set these two bellow params, different to 6577
149 params
->dsi
.vertical_active_line
=320;
150 params
->dsi
.compatibility_for_nvk
= 0; // this parameter would be set to 1 if DriverIC is NTK's and when force match DSI clock for NTK's
152 // Bit rate calculation
153 params
->dsi
.PLL_CLOCK
= 156; //dsi clock customization: should config clock value directly
157 static void init_lcm_registers(void)
159 unsigned int data_array
[16];
162 //*************Enable TE *******************//
163 data_array
[0]= 0x00053902;
164 data_array
[1]= 0x2555aaff;
165 data_array
[2]= 0x00000001;
166 dsi_set_cmdq(data_array
, 3, 1);
168 data_array
[0]= 0x00093902;
169 data_array
[1]= 0x000201f8;
170 data_array
[2]= 0x00133320;
171 data_array
[3]= 0x00000048;
172 dsi_set_cmdq(data_array
, 4, 1);
174 //*************Enable CMD2 Page1 *******************//
175 data_array
[0]=0x00063902;
176 data_array
[1]=0x52aa55f0;
177 data_array
[2]=0x00000108;
178 dsi_set_cmdq(data_array
, 3, 1);
180 //************* AVDD: manual *******************//
181 data_array
[0]=0x00043902;
182 data_array
[1]=0x0d0d0db0;
183 dsi_set_cmdq(data_array
, 2, 1);
185 data_array
[0]=0x00043902;
186 data_array
[1]=0x343434b6;
187 dsi_set_cmdq(data_array
, 2, 1);
189 data_array
[0]=0x00043902;
190 data_array
[1]=0x0d0d0db1;
191 dsi_set_cmdq(data_array
, 2, 1);
193 data_array
[0]=0x00043902;
194 data_array
[1]=0x343434b7;
195 dsi_set_cmdq(data_array
, 2, 1);
197 data_array
[0]=0x00043902;
198 data_array
[1]=0x000000b2;
199 dsi_set_cmdq(data_array
, 2, 1);
201 data_array
[0]=0x00043902;
202 data_array
[1]=0x242424b8;
203 dsi_set_cmdq(data_array
, 2, 1);
205 data_array
[0]=0x00023902;
206 data_array
[1]=0x000001bf;
207 dsi_set_cmdq(data_array
, 2, 1);
209 data_array
[0]=0x00043902;
210 data_array
[1]=0x0f0f0fb3;
211 dsi_set_cmdq(data_array
, 2, 1);
213 data_array
[0]=0x00043902;
214 data_array
[1]=0x343434b9;
215 dsi_set_cmdq(data_array
, 2, 1);
217 data_array
[0]=0x00043902;
218 data_array
[1]=0x080808b5;
219 dsi_set_cmdq(data_array
, 2, 1);
221 data_array
[0]=0x00023902;
222 data_array
[1]=0x000003c2;
223 dsi_set_cmdq(data_array
, 2, 1);
225 data_array
[0]=0x00043902;
226 data_array
[1]=0x242424ba;
227 dsi_set_cmdq(data_array
, 2, 1);
229 data_array
[0]=0x00043902;
230 data_array
[1]=0x007800bc;
231 dsi_set_cmdq(data_array
, 2, 1);
233 data_array
[0]=0x00043902;
234 data_array
[1]=0x007800bd;
235 dsi_set_cmdq(data_array
, 2, 1);
237 data_array
[0]=0x00033902;
238 data_array
[1]=0x006400be;
239 dsi_set_cmdq(data_array
, 2, 1);
241 //*************Gamma Table *******************//
242 data_array
[0]=0x00353902;
243 data_array
[1]=0x003300D1;
244 data_array
[2]=0x003A0034;
245 data_array
[3]=0x005C004A;
246 data_array
[4]=0x00A60081;
247 data_array
[5]=0x011301E5;
248 data_array
[6]=0x01820154;
249 data_array
[7]=0x020002CA;
250 data_array
[8]=0x02340201;
251 data_array
[9]=0x02840267;
252 data_array
[10]=0x02B702A4;
253 data_array
[11]=0x02DE02CF;
254 data_array
[12]=0x03FE02F2;
255 data_array
[13]=0x03330310;
256 data_array
[14]=0x0000006D;
257 dsi_set_cmdq(data_array
, 15, 1);
259 data_array
[0]=0x00353902;
260 data_array
[1]=0x003300D2;
261 data_array
[2]=0x003A0034;
262 data_array
[3]=0x005C004A;
263 data_array
[4]=0x00A60081;
264 data_array
[5]=0x011301E5;
265 data_array
[6]=0x01820154;
266 data_array
[7]=0x020002CA;
267 data_array
[8]=0x02340201;
268 data_array
[9]=0x02840267;
269 data_array
[10]=0x02B702A4;
270 data_array
[11]=0x02DE02CF;
271 data_array
[12]=0x03FE02F2;
272 data_array
[13]=0x03330310;
273 data_array
[14]=0x0000006D;
274 dsi_set_cmdq(data_array
, 15, 1);
276 data_array
[0]=0x00353902;
277 data_array
[1]=0x003300D3;
278 data_array
[2]=0x003A0034;
279 data_array
[3]=0x005C004A;
280 data_array
[4]=0x00A60081;
281 data_array
[5]=0x011301E5;
282 data_array
[6]=0x01820154;
283 data_array
[7]=0x020002CA;
284 data_array
[8]=0x02340201;
285 data_array
[9]=0x02840267;
286 data_array
[10]=0x02B702A4;
287 data_array
[11]=0x02DE02CF;
288 data_array
[12]=0x03FE02F2;
289 data_array
[13]=0x03330310;
290 data_array
[14]=0x0000006D;
291 dsi_set_cmdq(data_array
, 15, 1);
293 data_array
[0]=0x00353902;
294 data_array
[1]=0x003300D4;
295 data_array
[2]=0x003A0034;
296 data_array
[3]=0x005C004A;
297 data_array
[4]=0x00A60081;
298 data_array
[5]=0x011301E5;
299 data_array
[6]=0x01820154;
300 data_array
[7]=0x020002CA;
301 data_array
[8]=0x02340201;
302 data_array
[9]=0x02840267;
303 data_array
[10]=0x02B702A4;
304 data_array
[11]=0x02DE02CF;
305 data_array
[12]=0x03FE02F2;
306 data_array
[13]=0x03330310;
307 data_array
[14]=0x0000006D;
308 dsi_set_cmdq(data_array
, 15, 1);
310 data_array
[0]=0x00353902;
311 data_array
[1]=0x003300D5;
312 data_array
[2]=0x003A0034;
313 data_array
[3]=0x005C004A;
314 data_array
[4]=0x00A60081;
315 data_array
[5]=0x011301E5;
316 data_array
[6]=0x01820154;
317 data_array
[7]=0x020002CA;
318 data_array
[8]=0x02340201;
319 data_array
[9]=0x02840267;
320 data_array
[10]=0x02B702A4;
321 data_array
[11]=0x02DE02CF;
322 data_array
[12]=0x03FE02F2;
323 data_array
[13]=0x03330310;
324 data_array
[14]=0x0000006D;
325 dsi_set_cmdq(data_array
, 15, 1);
327 data_array
[0]=0x00353902;
328 data_array
[1]=0x003300D6;
329 data_array
[2]=0x003A0034;
330 data_array
[3]=0x005C004A;
331 data_array
[4]=0x00A60081;
332 data_array
[5]=0x011301E5;
333 data_array
[6]=0x01820154;
334 data_array
[7]=0x020002CA;
335 data_array
[8]=0x02340201;
336 data_array
[9]=0x02840267;
337 data_array
[10]=0x02B702A4;
338 data_array
[11]=0x02DE02CF;
339 data_array
[12]=0x03FE02F2;
340 data_array
[13]=0x03330310;
341 data_array
[14]=0x0000006D;
342 dsi_set_cmdq(data_array
, 15, 1);
345 // ******************** EABLE CMD2 PAGE 0 **************//
346 data_array
[0]=0x00063902;
347 data_array
[1]=0x52aa55f0;
348 data_array
[2]=0x00000008;
349 dsi_set_cmdq(data_array
, 3, 1);
351 // ******************** EABLE DSI TE **************//
352 data_array
[0]=0x00033902;
353 data_array
[1]=0x0000fcb1;
354 dsi_set_cmdq(data_array
, 2, 1);
356 data_array
[0]=0x00023902;
357 data_array
[1]=0x000005b6;
358 dsi_set_cmdq(data_array
, 2, 1);
360 data_array
[0]=0x00033902;
361 data_array
[1]=0x007070b7;
362 dsi_set_cmdq(data_array
, 2, 1);
364 data_array
[0]=0x00053902;
365 data_array
[1]=0x030301b8;
366 data_array
[2]=0x00000003;
367 dsi_set_cmdq(data_array
, 3, 1);
369 data_array
[0]=0x00043902;
370 data_array
[1]=0x000002bc;
371 dsi_set_cmdq(data_array
, 2, 1);
373 data_array
[0]=0x00063902;
374 data_array
[1]=0x5002d0c9;
375 data_array
[2]=0x00005050;
376 dsi_set_cmdq(data_array
, 3, 1);
378 // ******************** EABLE DSI TE packet **************//
379 data_array
[0]=0x00351500;
380 dsi_set_cmdq(data_array
, 1, 1);
382 data_array
[0]=0x773a1500;
383 dsi_set_cmdq(data_array
, 1, 1);
385 data_array
[0]= 0x00053902;
386 data_array
[1]= 0x0000002a;
387 data_array
[2]= 0x000000ef;
388 dsi_set_cmdq(data_array
, 3, 1);
390 data_array
[0]= 0x00053902;
391 data_array
[1]= 0x0100002b;
392 data_array
[2]= 0x0000003f;
393 dsi_set_cmdq(data_array
, 3, 1);
395 data_array
[0] = 0x00110500;
396 dsi_set_cmdq(data_array
, 1, 1);
399 data_array
[0]= 0x00290500;
400 dsi_set_cmdq(data_array
, 1, 1);
404 static void lcm_init(void)
412 init_lcm_registers();
416 static void lcm_suspend(void)
418 unsigned int data_array
[16];
420 data_array
[0] = 0x00100500;
421 dsi_set_cmdq(data_array
, 1, 1);
424 data_array
[0] = 0x00280500;
425 dsi_set_cmdq(data_array
, 1, 1);
428 data_array
[0] = 0x014F1500;
429 dsi_set_cmdq(data_array
, 1, 1);
434 static void lcm_resume(void)
440 static void lcm_update(unsigned int x
, unsigned int y
,
441 unsigned int width
, unsigned int height
)
445 unsigned int x1
= x0
+ width
- 1;
446 unsigned int y1
= y0
+ height
- 1;
448 unsigned char x0_MSB
= ((x0
>>8)&0xFF);
449 unsigned char x0_LSB
= (x0
&0xFF);
450 unsigned char x1_MSB
= ((x1
>>8)&0xFF);
451 unsigned char x1_LSB
= (x1
&0xFF);
452 unsigned char y0_MSB
= ((y0
>>8)&0xFF);
453 unsigned char y0_LSB
= (y0
&0xFF);
454 unsigned char y1_MSB
= ((y1
>>8)&0xFF);
455 unsigned char y1_LSB
= (y1
&0xFF);
457 unsigned int data_array
[16];
460 data_array
[0]= 0x00053902;
461 data_array
[1]= (x1_MSB
<<24)|(x0_LSB
<<16)|(x0_MSB
<<8)|0x2a;
462 data_array
[2]= (x1_LSB
);
463 dsi_set_cmdq(data_array
, 3, 1);
465 data_array
[0]= 0x00053902;
466 data_array
[1]= (y1_MSB
<<24)|(y0_LSB
<<16)|(y0_MSB
<<8)|0x2b;
467 data_array
[2]= (y1_LSB
);
468 dsi_set_cmdq(data_array
, 3, 1);
470 data_array
[0]= 0x002c3909;
471 dsi_set_cmdq(data_array
, 1, 0);
475 static void lcm_setbacklight(unsigned int level
)
477 unsigned int data_array
[16];
480 #if defined(BUILD_LK)
481 printf("%s, %d\n", __func__
, level
);
482 #elif defined(BUILD_UBOOT)
483 printf("%s, %d\n", __func__
, level
);
485 printk("lcm_setbacklight = %d\n", level
);
491 data_array
[0]= 0x00023902;
492 data_array
[1] =(0x51|(level
<<8));
493 dsi_set_cmdq(data_array
, 2, 1);
497 static void lcm_setpwm(unsigned int divider
)
503 static unsigned int lcm_getpwm(unsigned int divider
)
505 // ref freq = 15MHz, B0h setting 0x80, so 80.6% * freq is pwm_clk;
506 // pwm_clk / 255 / 2(lcm_setpwm() 6th params) = pwm_duration = 23706
507 unsigned int pwm_clk
= 23706 / (1<<divider
);
514 static unsigned int lcm_compare_id(void)
516 unsigned int id
= 0, id2
= 0;
517 unsigned char buffer
[2];
518 unsigned int data_array
[16];
521 SET_RESET_PIN(1); //NOTE:should reset LCM firstly
529 data_array[0] = 0x00110500; // Sleep Out
530 dsi_set_cmdq(data_array, 1, 1);
534 //*************Enable CMD2 Page1 *******************//
535 data_array
[0]=0x00063902;
536 data_array
[1]=0x52AA55F0;
537 data_array
[2]=0x00000108;
538 dsi_set_cmdq(data_array
, 3, 1);
541 data_array
[0] = 0x00023700;// read id return two byte,version and id
542 dsi_set_cmdq(data_array
, 1, 1);
545 read_reg_v2(0xC5, buffer
, 2);
546 id
= buffer
[0]; //we only need ID
547 id2
= buffer
[1]; //we test buffer 1
549 return (LCM_ID
== id
)?1:0;
552 void lcm_read_fb(unsigned char *buffer
)
554 unsigned int array
[2];
556 array
[0] = 0x000A3700;// read size
557 dsi_set_cmdq(array
, 1, 1);
559 read_reg_v2(0x2E,buffer
,10);
560 read_reg_v2(0x3E,buffer
+10,10);
561 read_reg_v2(0x3E,buffer
+10*2,10);
562 read_reg_v2(0x3E,buffer
+10*3,10);
563 read_reg_v2(0x3E,buffer
+10*4,10);
564 read_reg_v2(0x3E,buffer
+10*5,10);
568 // ---------------------------------------------------------------------------
569 // Get LCM Driver Hooks
570 // ---------------------------------------------------------------------------
571 LCM_DRIVER nt35510_dsi_cmd_6572_qvga_drv
=
573 .name
= "nt35510_dsi_cmd_6572_qvga",
574 .set_util_funcs
= lcm_set_util_funcs
,
575 .get_params
= lcm_get_params
,
577 .suspend
= lcm_suspend
,
578 .resume
= lcm_resume
,
579 .set_backlight
= lcm_setbacklight
,
580 //.set_pwm = lcm_setpwm,
581 //.get_pwm = lcm_getpwm,
582 .compare_id
= lcm_compare_id
,
583 .update
= lcm_update
,
584 .read_fb
= lcm_read_fb
,