2 #include <linux/string.h>
3 #include <linux/kernel.h>
8 #include <platform/mt_gpio.h>
9 #elif defined(BUILD_UBOOT)
10 #include <asm/arch/mt_gpio.h>
12 #include <mach/mt_gpio.h>
14 // ---------------------------------------------------------------------------
16 // ---------------------------------------------------------------------------
18 #define FRAME_WIDTH (480)
19 #define FRAME_HEIGHT (854)
20 #define LCM_DSI_CMD_MODE
22 // ---------------------------------------------------------------------------
24 // ---------------------------------------------------------------------------
26 static LCM_UTIL_FUNCS lcm_util
= {0};
28 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
30 #define UDELAY(n) (lcm_util.udelay(n))
31 #define MDELAY(n) (lcm_util.mdelay(n))
33 #define REGFLAG_DELAY 0XFE
34 #define REGFLAG_END_OF_TABLE 0x00 // END OF REGISTERS MARKER
37 // ---------------------------------------------------------------------------
39 // ---------------------------------------------------------------------------
40 #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update)
41 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
42 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
43 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
44 //#define read_reg(cmd) lcm_util.DSI_dcs_read_lcm_reg(cmd)
45 #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size)
47 // ---------------------------------------------------------------------------
48 // LCM Driver Implementations
49 // ---------------------------------------------------------------------------
51 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
53 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
57 static void lcm_get_params(LCM_PARAMS
*params
)
59 memset(params
, 0, sizeof(LCM_PARAMS
));
61 params
->type
= LCM_TYPE_DSI
;
63 params
->width
= FRAME_WIDTH
;
64 params
->height
= FRAME_HEIGHT
;
66 // enable tearing-free
67 params
->dbi
.te_mode
= LCM_DBI_TE_MODE_DISABLED
;
68 params
->dbi
.te_edge_polarity
= LCM_POLARITY_RISING
;
70 #if defined(LCM_DSI_CMD_MODE)
71 params
->dsi
.mode
= CMD_MODE
;
73 params
->dsi
.mode
= SYNC_PULSE_VDO_MODE
;
77 /* Command mode setting */
78 params
->dsi
.LANE_NUM
= LCM_TWO_LANE
;
79 //The following defined the fomat for data coming from LCD engine.
80 params
->dsi
.data_format
.color_order
= LCM_COLOR_ORDER_RGB
;
81 params
->dsi
.data_format
.trans_seq
= LCM_DSI_TRANS_SEQ_MSB_FIRST
;
82 params
->dsi
.data_format
.padding
= LCM_DSI_PADDING_ON_LSB
;
83 params
->dsi
.data_format
.format
= LCM_DSI_FORMAT_RGB888
;
86 params
->dsi
.PS
=LCM_PACKED_PS_24BIT_RGB888
;
87 params
->dsi
.vertical_active_line
= FRAME_HEIGHT
;
89 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
90 params
->dsi
.pll_div1
=1; // div1=0,1,2,3;div1_real=1,2,4,4
91 params
->dsi
.pll_div2
=1; // div2=0,1,2,3;div1_real=1,2,4,4
92 params
->dsi
.fbk_div
=38; // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)
95 static void init_lcm_registers(void)
97 unsigned int data_array
[16];
98 //*************Enable CMD2 Page1 *******************//
99 data_array
[0]=0x00053902;
100 data_array
[1]=0x2555AAFF;
101 data_array
[2]=0x00000001;
102 dsi_set_cmdq(data_array
, 3, 1);
105 data_array
[0]=0x00083902;
106 data_array
[1]=0x070302F3;
107 data_array
[2]=0x0DD48845;
108 dsi_set_cmdq(data_array
, 3, 1);
111 data_array
[0]=0x00063902;
112 data_array
[1]=0x004800F4;
113 data_array
[2]=0x00004000;
114 dsi_set_cmdq(data_array
, 3, 1);
117 //*************Enable CMD2 Page0 *******************//
118 data_array
[0]=0x00063902;
119 data_array
[1]=0x52AA55F0;
120 data_array
[2]=0x00000008;
121 dsi_set_cmdq(data_array
, 3, 1);
124 data_array
[0]=0x00063902;
125 data_array
[1]=0x400C00B0;
126 data_array
[2]=0x00003C3C;
127 dsi_set_cmdq(data_array
, 3, 1);
130 data_array
[0]=0x00033902;
131 data_array
[1]=0x0000ECB1;
132 dsi_set_cmdq(data_array
, 2, 1);
135 data_array
[0]=0x08B61500;
136 dsi_set_cmdq(data_array
, 1, 1);
139 data_array
[0]=0x00033902;
140 data_array
[1]=0x007272B7;
141 dsi_set_cmdq(data_array
, 2, 1);
144 data_array
[0]=0x05BA1500;
145 dsi_set_cmdq(data_array
, 1, 1);
148 data_array
[0]=0x04BC1500; //4 dot inversion
149 //data_array[0]=0x00BC1500;
150 dsi_set_cmdq(data_array
, 1, 1);
153 data_array
[0]=0x00063902;
154 data_array
[1]=0x104101BD;
155 data_array
[2]=0x00000137;
156 dsi_set_cmdq(data_array
, 3, 1);
159 data_array
[0]=0x01CC1500;
160 dsi_set_cmdq(data_array
, 1, 1);
163 //*************Enable CMD2 Page1 *******************//
164 data_array
[0]=0x00063902;
165 data_array
[1]=0x52AA55F0;
166 data_array
[2]=0x00000108;
167 dsi_set_cmdq(data_array
, 3, 1);
170 data_array
[0]=0x00043902;
171 data_array
[1]=0x0A0A0AB0;
172 dsi_set_cmdq(data_array
, 2, 1);
175 data_array
[0]=0x00043902;
176 data_array
[1]=0x545454B6;
177 dsi_set_cmdq(data_array
, 2, 1);
180 data_array
[0]=0x00043902;
181 data_array
[1]=0x0A0A0AB1;
182 dsi_set_cmdq(data_array
, 2, 1);
185 data_array
[0]=0x00043902;
186 data_array
[1]=0x242424B7;
187 dsi_set_cmdq(data_array
, 2, 1);
190 data_array
[0]=0x00043902;
191 data_array
[1]=0x030303B2;
192 dsi_set_cmdq(data_array
, 2, 1);
195 data_array
[0]=0x00043902;
196 data_array
[1]=0x303030B8;
197 dsi_set_cmdq(data_array
, 2, 1);
200 data_array
[0]=0x00043902;
201 data_array
[1]=0x0D0D0DB3;
202 dsi_set_cmdq(data_array
, 2, 1);
205 data_array
[0]=0x00043902;
206 data_array
[1]=0x242424B9;
207 dsi_set_cmdq(data_array
, 2, 1);
210 data_array
[0]=0x00043902;
211 data_array
[1]=0x0A0A0AB4;
212 dsi_set_cmdq(data_array
, 2, 1);
215 data_array
[0]=0x00043902;
216 data_array
[1]=0x242424BA;
217 dsi_set_cmdq(data_array
, 2, 1);
220 data_array
[0]=0x00043902;
221 data_array
[1]=0x070707B5;
222 dsi_set_cmdq(data_array
, 2, 1);
225 data_array
[0]=0x00043902;
226 data_array
[1]=0x01A000BC;
227 dsi_set_cmdq(data_array
, 2, 1);
229 data_array
[0]=0x00043902;
230 data_array
[1]=0x01A000BD;
231 dsi_set_cmdq(data_array
, 2, 1);
233 data_array
[0]=0x48BE1500;
234 dsi_set_cmdq(data_array
, 1, 1);
237 data_array
[0]=0x00113902;
238 data_array
[1]=0x000000D1;
239 data_array
[2]=0x00B10068;
240 data_array
[3]=0x01FD00E4;
241 data_array
[4]=0x014C012D;
242 data_array
[5]=0x00000079;
243 dsi_set_cmdq(data_array
, 6, 1);
245 data_array
[0]=0x00113902;
246 data_array
[1]=0x019B01D2;
247 data_array
[2]=0x020002D3;
248 data_array
[3]=0x0287024A;
249 data_array
[4]=0x02C00288;
250 data_array
[5]=0x000000F8;
251 dsi_set_cmdq(data_array
, 6, 1);
253 data_array
[0]=0x00113902;
254 data_array
[1]=0x031A03D3;
255 data_array
[2]=0x03630348;
256 data_array
[3]=0x03A4038C;
257 data_array
[4]=0x03E203CC;
258 data_array
[5]=0x000000EF;
259 dsi_set_cmdq(data_array
, 6, 1);
261 data_array
[0]=0x00053902;
262 data_array
[1]=0x03F403D4;
263 data_array
[2]=0x000000FF;
264 dsi_set_cmdq(data_array
, 3, 1);
267 data_array
[0]=0x00113902;
268 data_array
[1]=0x000000D5;
269 data_array
[2]=0x00B10068;
270 data_array
[3]=0x01FD00E4;
271 data_array
[4]=0x014C012D;
272 data_array
[5]=0x00000079;
273 dsi_set_cmdq(data_array
, 6, 1);
275 data_array
[0]=0x00113902;
276 data_array
[1]=0x019B01D6;
277 data_array
[2]=0x020002D3;
278 data_array
[3]=0x0287024A;
279 data_array
[4]=0x02C00288;
280 data_array
[5]=0x000000F8;
281 dsi_set_cmdq(data_array
, 6, 1);
283 data_array
[0]=0x00113902;
284 data_array
[1]=0x031A03D7;
285 data_array
[2]=0x03630348;
286 data_array
[3]=0x03A4038C;
287 data_array
[4]=0x03E203CC;
288 data_array
[5]=0x000000EF;
289 dsi_set_cmdq(data_array
, 6, 1);
291 data_array
[0]=0x00053902;
292 data_array
[1]=0x03F403D8;
293 data_array
[2]=0x000000FF;
294 dsi_set_cmdq(data_array
, 3, 1);
297 data_array
[0]=0x00113902;
298 data_array
[1]=0x000000D9;
299 data_array
[2]=0x00B10068;
300 data_array
[3]=0x01FD00E4;
301 data_array
[4]=0x014C012D;
302 data_array
[5]=0x00000079;
303 dsi_set_cmdq(data_array
, 6, 1);
305 data_array
[0]=0x00113902;
306 data_array
[1]=0x019B01DD;
307 data_array
[2]=0x020002D3;
308 data_array
[3]=0x0287024A;
309 data_array
[4]=0x02C00288;
310 data_array
[5]=0x000000F8;
311 dsi_set_cmdq(data_array
, 6, 1);
313 data_array
[0]=0x00113902;
314 data_array
[1]=0x031A03DE;
315 data_array
[2]=0x03630348;
316 data_array
[3]=0x03A4038C;
317 data_array
[4]=0x03E203CC;
318 data_array
[5]=0x000000EF;
319 dsi_set_cmdq(data_array
, 6, 1);
321 data_array
[0]=0x00053902;
322 data_array
[1]=0x03F403DF;
323 data_array
[2]=0x000000FF;
324 dsi_set_cmdq(data_array
, 3, 1);
327 data_array
[0]=0x00113902;
328 data_array
[1]=0x000000E0;
329 data_array
[2]=0x00B10068;
330 data_array
[3]=0x01FD00E4;
331 data_array
[4]=0x014C012D;
332 data_array
[5]=0x00000079;
333 dsi_set_cmdq(data_array
, 6, 1);
335 data_array
[0]=0x00113902;
336 data_array
[1]=0x019B01E1;
337 data_array
[2]=0x020002D3;
338 data_array
[3]=0x0287024A;
339 data_array
[4]=0x02C00288;
340 data_array
[5]=0x000000F8;
341 dsi_set_cmdq(data_array
, 6, 1);
343 data_array
[0]=0x00113902;
344 data_array
[1]=0x031A03E2;
345 data_array
[2]=0x03630348;
346 data_array
[3]=0x03A4038C;
347 data_array
[4]=0x03E203CC;
348 data_array
[5]=0x000000EF;
349 dsi_set_cmdq(data_array
, 6, 1);
351 data_array
[0]=0x00053902;
352 data_array
[1]=0x03F403E3;
353 data_array
[2]=0x000000FF;
354 dsi_set_cmdq(data_array
, 3, 1);
357 data_array
[0]=0x00113902;
358 data_array
[1]=0x000000E4;
359 data_array
[2]=0x00B10068;
360 data_array
[3]=0x01FD00E4;
361 data_array
[4]=0x014C012D;
362 data_array
[5]=0x00000079;
363 dsi_set_cmdq(data_array
, 6, 1);
365 data_array
[0]=0x00113902;
366 data_array
[1]=0x019B01E5;
367 data_array
[2]=0x020002D3;
368 data_array
[3]=0x0287024A;
369 data_array
[4]=0x02C00288;
370 data_array
[5]=0x000000F8;
371 dsi_set_cmdq(data_array
, 6, 1);
373 data_array
[0]=0x00113902;
374 data_array
[1]=0x031A03E6;
375 data_array
[2]=0x03630348;
376 data_array
[3]=0x03A4038C;
377 data_array
[4]=0x03E203CC;
378 data_array
[5]=0x000000EF;
379 dsi_set_cmdq(data_array
, 6, 1);
381 data_array
[0]=0x00053902;
382 data_array
[1]=0x03F403E7;
383 data_array
[2]=0x000000FF;
384 dsi_set_cmdq(data_array
, 3, 1);
387 data_array
[0]=0x00113902;
388 data_array
[1]=0x000000E8;
389 data_array
[2]=0x00B10068;
390 data_array
[3]=0x01FD00E4;
391 data_array
[4]=0x014C012D;
392 data_array
[5]=0x00000079;
393 dsi_set_cmdq(data_array
, 6, 1);
395 data_array
[0]=0x00113902;
396 data_array
[1]=0x019B01E9;
397 data_array
[2]=0x020002D3;
398 data_array
[3]=0x0287024A;
399 data_array
[4]=0x02C00288;
400 data_array
[5]=0x000000F8;
401 dsi_set_cmdq(data_array
, 6, 1);
403 data_array
[0]=0x00113902;
404 data_array
[1]=0x031A03EA;
405 data_array
[2]=0x03630348;
406 data_array
[3]=0x03A4038C;
407 data_array
[4]=0x03E203CC;
408 data_array
[5]=0x000000EF;
409 dsi_set_cmdq(data_array
, 6, 1);
411 data_array
[0]=0x00053902;
412 data_array
[1]=0x03F403EB;
413 data_array
[2]=0x000000FF;
414 dsi_set_cmdq(data_array
, 3, 1);
416 data_array
[0]=0x773A1500;//Data Type
417 dsi_set_cmdq(data_array
, 1, 1);
420 // data_array[0] = 0x00351500;// TE ON
421 // dsi_set_cmdq(&data_array, 1, 1);
424 data_array
[0] = 0x00110500; // Sleep Out
425 dsi_set_cmdq(data_array
, 1, 1);
428 data_array
[0] = 0x00290500; // Display On
429 dsi_set_cmdq(data_array
, 1, 1);
432 data_array
[0] = 0x002C0500; // Display On
433 dsi_set_cmdq(data_array
, 1, 1);
436 //******************* ENABLE PAGE0 **************//
437 data_array
[0]=0x00063902;
438 data_array
[1]=0x52AA55F0;
439 data_array
[2]=0x00000008;
440 dsi_set_cmdq(data_array
, 3, 1);
444 //{0x44, 2, {((FRAME_HEIGHT/2)>>8), ((FRAME_HEIGHT/2)&0xFF)}},
445 data_array
[0] = 0x00033902;
446 data_array
[1] = (((FRAME_HEIGHT
/2)&0xFF) << 16) | (((FRAME_HEIGHT
/2)>>8) << 8) | 0x44;
447 dsi_set_cmdq(data_array
, 2, 1);
449 data_array
[0] = 0x00351500;// TE ON
450 dsi_set_cmdq(data_array
, 1, 1);
453 data_array
[0]= 0x00033902;
454 data_array
[1]= 0x0000E8B1;
455 dsi_set_cmdq(data_array
, 2, 1);
458 data_array
[0]= 0x00023902;
459 data_array
[1]= 0x0051;
460 dsi_set_cmdq(data_array
, 2, 1);
463 //data_array[0]= 0x00033902;
464 //data_array[1]= 0x640044;
465 //dsi_set_cmdq(&data_array, 2, 1);
468 data_array
[0]= 0x00023902;
469 data_array
[1]= 0x2453;
470 dsi_set_cmdq(data_array
, 2, 1);
473 data_array
[0] = 0x01551500; // SET CABC UI MODE
474 dsi_set_cmdq(data_array
, 1, 1);
477 data_array
[0]= 0x00023902;
478 data_array
[1]= 0x705e;
479 dsi_set_cmdq(data_array
, 2, 1);
482 data_array
[0]= 0x00033902;
483 data_array
[1]= 0x000301E0;
484 dsi_set_cmdq(data_array
, 2, 1);
489 static void lcm_init(void)
496 init_lcm_registers();
500 static void lcm_suspend(void)
502 //push_table(lcm_sleep_mode_in_setting, sizeof(lcm_sleep_mode_in_setting) / sizeof(struct LCM_setting_table), 1);
506 unsigned int data_array
[2];
509 //below BTA for can not sleep in
510 // data_array[0]=0x00000504; // BTA
511 // dsi_set_cmdq(&data_array, 1, 1);
513 data_array
[0] = 0x00280500; // Display Off
514 dsi_set_cmdq(data_array
, 1, 1);
516 data_array
[0] = 0x00100500; // Sleep In
517 dsi_set_cmdq(data_array
, 1, 1);
523 static void lcm_resume(void)
525 unsigned int data_array
[16];
527 data_array
[0]=0x00110500;
528 dsi_set_cmdq(data_array
, 1, 1);
531 data_array
[0]=0x00290500;
532 dsi_set_cmdq(data_array
, 1, 1);
536 static void lcm_update(unsigned int x
, unsigned int y
,
537 unsigned int width
, unsigned int height
)
541 unsigned int x1
= x0
+ width
- 1;
542 unsigned int y1
= y0
+ height
- 1;
544 unsigned char x0_MSB
= ((x0
>>8)&0xFF);
545 unsigned char x0_LSB
= (x0
&0xFF);
546 unsigned char x1_MSB
= ((x1
>>8)&0xFF);
547 unsigned char x1_LSB
= (x1
&0xFF);
548 unsigned char y0_MSB
= ((y0
>>8)&0xFF);
549 unsigned char y0_LSB
= (y0
&0xFF);
550 unsigned char y1_MSB
= ((y1
>>8)&0xFF);
551 unsigned char y1_LSB
= (y1
&0xFF);
553 unsigned int data_array
[16];
555 data_array
[0]= 0x00053902;
556 data_array
[1]= (x1_MSB
<<24)|(x0_LSB
<<16)|(x0_MSB
<<8)|0x2a;
557 data_array
[2]= (x1_LSB
);
558 dsi_set_cmdq(data_array
, 3, 1);
560 data_array
[0]= 0x00053902;
561 data_array
[1]= (y1_MSB
<<24)|(y0_LSB
<<16)|(y0_MSB
<<8)|0x2b;
562 data_array
[2]= (y1_LSB
);
563 dsi_set_cmdq(data_array
, 3, 1);
565 data_array
[0]= 0x00290508;//HW bug, so need send one HS packet
566 dsi_set_cmdq(data_array
, 1, 1);
568 data_array
[0]= 0x002c3909;
569 dsi_set_cmdq(data_array
, 1, 0);
574 static unsigned int lcm_compare_id(void)
589 array
[0] = 0x00083700;// read id return two byte,version and id
590 dsi_set_cmdq(array
, 1, 1);
592 read_reg_v2(0x04,buffer
, 3);
594 id0
= buffer
[0]; //should be 0x00
595 id1
= buffer
[1];//should be 0x80
596 id2
= buffer
[2];//should be 0x00
604 LCM_DRIVER nt35510_fwvga_lcm_drv
=
606 .name
= "nt35510_fwvga",
607 .set_util_funcs
= lcm_set_util_funcs
,
608 .compare_id
= lcm_compare_id
,
609 .get_params
= lcm_get_params
,
611 .suspend
= lcm_suspend
,
612 .resume
= lcm_resume
,
613 #if defined(LCM_DSI_CMD_MODE)
614 .update
= lcm_update
,