2 #include <linux/string.h>
7 // ---------------------------------------------------------------------------
9 // ---------------------------------------------------------------------------
11 #define FRAME_WIDTH (480)
12 #define FRAME_HEIGHT (800)
13 #define LCM_ID (0x5582)
15 // ---------------------------------------------------------------------------
17 // ---------------------------------------------------------------------------
19 static LCM_UTIL_FUNCS lcm_util
= {0};
21 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
23 #define UDELAY(n) (lcm_util.udelay(n))
24 #define MDELAY(n) (lcm_util.mdelay(n))
27 // ---------------------------------------------------------------------------
29 // ---------------------------------------------------------------------------
31 static __inline
void send_ctrl_cmd(unsigned int cmd
)
33 lcm_util
.send_cmd(cmd
);
36 static __inline
void send_data_cmd(unsigned int data
)
38 lcm_util
.send_data(data
&0xff);
41 static __inline
unsigned short read_data_cmd(void)
43 return (unsigned short)(lcm_util
.read_data());
46 static __inline
void set_lcm_register(unsigned int regIndex
,
49 send_ctrl_cmd(regIndex
);
50 send_data_cmd(regData
);
53 static void init_lcm_registers(void)
55 send_ctrl_cmd(0x1100);//sleep out
58 set_lcm_register(0xC000,0x86);//power control PWCTR1
59 set_lcm_register(0xC001,0x00);
60 set_lcm_register(0xC002,0x86);
61 set_lcm_register(0xC003,0x00);
62 set_lcm_register(0xC100,0x45);
63 set_lcm_register(0xC200,0x21);
64 set_lcm_register(0xC202,0x02);
65 set_lcm_register(0xB600,0x30);//SD_OP_SET
66 set_lcm_register(0xB602,0x30);
67 set_lcm_register(0xB100,0xA7);//wei zeng added
68 set_lcm_register(0xC700,0x8F);//vcom
69 set_lcm_register(0x3A00,0x06);//SET PIXEL_FORMAT,pre:0x55
72 set_lcm_register(0xE000,0x0E);//gamma GMACTRL1
73 set_lcm_register(0xE001,0x14);
74 set_lcm_register(0xE002,0x29);
75 set_lcm_register(0xE003,0x3A);
76 set_lcm_register(0xE004,0x1D);
77 set_lcm_register(0xE005,0x30);
78 set_lcm_register(0xE006,0x61);
79 set_lcm_register(0xE007,0x3D);
80 set_lcm_register(0xE008,0x22);
81 set_lcm_register(0xE009,0x2A);
82 set_lcm_register(0xE00A,0x87);
83 set_lcm_register(0xE00B,0x16);
84 set_lcm_register(0xE00C,0x3B);
85 set_lcm_register(0xE00D,0x4C);
86 set_lcm_register(0xE00E,0x78);
87 set_lcm_register(0xE00F,0x96);
88 set_lcm_register(0xE010,0x4A);
89 set_lcm_register(0xE011,0x4D);
91 set_lcm_register(0xE100,0x0E);//GMACTRL2
92 set_lcm_register(0xE101,0x14);
93 set_lcm_register(0xE102,0x29);
94 set_lcm_register(0xE103,0x3A);
95 set_lcm_register(0xE104,0x1D);
96 set_lcm_register(0xE105,0x30);
97 set_lcm_register(0xE106,0x61);
98 set_lcm_register(0xE107,0x3F);
99 set_lcm_register(0xE108,0x20);
100 set_lcm_register(0xE109,0x26);
101 set_lcm_register(0xE10A,0x83);
102 set_lcm_register(0xE10B,0x16);
103 set_lcm_register(0xE10C,0x3B);
104 set_lcm_register(0xE10D,0x4C);
105 set_lcm_register(0xE10E,0x78);
106 set_lcm_register(0xE10F,0x96);
107 set_lcm_register(0xE110,0x4A);
108 set_lcm_register(0xE111,0x4D);
110 set_lcm_register(0xE200,0x0E);//GMACTRL3
111 set_lcm_register(0xE201,0x14);
112 set_lcm_register(0xE202,0x29);
113 set_lcm_register(0xE203,0x3A);
114 set_lcm_register(0xE204,0x1D);
115 set_lcm_register(0xE205,0x30);
116 set_lcm_register(0xE206,0x61);
117 set_lcm_register(0xE207,0x3D);
118 set_lcm_register(0xE208,0x22);
119 set_lcm_register(0xE209,0x2A);
120 set_lcm_register(0xE20A,0x87);
121 set_lcm_register(0xE20B,0x16);
122 set_lcm_register(0xE20C,0x3B);
123 set_lcm_register(0xE20D,0x4C);
124 set_lcm_register(0xE20E,0x78);
125 set_lcm_register(0xE20F,0x96);
126 set_lcm_register(0xE210,0x4A);
127 set_lcm_register(0xE211,0x4D);
130 set_lcm_register(0xE300,0x0E);//GMACTRL4
131 set_lcm_register(0xE301,0x14);
132 set_lcm_register(0xE302,0x29);
133 set_lcm_register(0xE303,0x3A);
134 set_lcm_register(0xE304,0x1D);
135 set_lcm_register(0xE305,0x30);
136 set_lcm_register(0xE306,0x61);
137 set_lcm_register(0xE307,0x3F);
138 set_lcm_register(0xE308,0x20);
139 set_lcm_register(0xE309,0x26);
140 set_lcm_register(0xE30A,0x83);
141 set_lcm_register(0xE30B,0x16);
142 set_lcm_register(0xE30C,0x3B);
143 set_lcm_register(0xE30D,0x4C);
144 set_lcm_register(0xE30E,0x78);
145 set_lcm_register(0xE30F,0x96);
146 set_lcm_register(0xE310,0x4A);
147 set_lcm_register(0xE311,0x4D);
149 set_lcm_register(0xE400,0x0E);//GMACTRL5
150 set_lcm_register(0xE401,0x14);
151 set_lcm_register(0xE402,0x29);
152 set_lcm_register(0xE403,0x3A);
153 set_lcm_register(0xE404,0x1D);
154 set_lcm_register(0xE405,0x30);
155 set_lcm_register(0xE406,0x61);
156 set_lcm_register(0xE407,0x3D);
157 set_lcm_register(0xE408,0x22);
158 set_lcm_register(0xE409,0x2A);
159 set_lcm_register(0xE40A,0x87);
160 set_lcm_register(0xE40B,0x16);
161 set_lcm_register(0xE40C,0x3B);
162 set_lcm_register(0xE40D,0x4C);
163 set_lcm_register(0xE40E,0x78);
164 set_lcm_register(0xE40F,0x96);
165 set_lcm_register(0xE410,0x4A);
166 set_lcm_register(0xE411,0x4D);
169 set_lcm_register(0xE500,0x0E);
170 set_lcm_register(0xE501,0x14);
171 set_lcm_register(0xE502,0x29);
172 set_lcm_register(0xE503,0x3A);
173 set_lcm_register(0xE504,0x1D);
174 set_lcm_register(0xE505,0x30);
175 set_lcm_register(0xE506,0x61);
176 set_lcm_register(0xE507,0x3F);
177 set_lcm_register(0xE508,0x20);
178 set_lcm_register(0xE509,0x26);
179 set_lcm_register(0xE50A,0x83);
180 set_lcm_register(0xE50B,0x16);
181 set_lcm_register(0xE50C,0x3B);
182 set_lcm_register(0xE50D,0x4C);
183 set_lcm_register(0xE50E,0x78);
184 set_lcm_register(0xE50F,0x96);
185 set_lcm_register(0xE510,0x4A);
186 set_lcm_register(0xE511,0x4D);
188 // enable tering free
189 set_lcm_register(0x3500,0x02);
191 set_lcm_register(0x3600,0x00);
192 send_ctrl_cmd(0x2900);
194 send_ctrl_cmd(0x2C00);//wei zeng
199 // ---------------------------------------------------------------------------
200 // LCM Driver Implementations
201 // ---------------------------------------------------------------------------
203 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
205 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
209 static void lcm_get_params(LCM_PARAMS
*params
)
211 memset(params
, 0, sizeof(LCM_PARAMS
));
213 params
->type
= LCM_TYPE_DBI
;
214 params
->ctrl
= LCM_CTRL_PARALLEL_DBI
;
215 params
->width
= FRAME_WIDTH
;
216 params
->height
= FRAME_HEIGHT
;
218 params
->io_select_mode
= 1; //note:this para is different between 6573 and 6575
221 params
->dbi
.port
= 0; //DBI port must be 0 or 1 on mt6575, should not be 2
222 params
->dbi
.data_width
= LCM_DBI_DATA_WIDTH_18BITS
;
223 params
->dbi
.data_format
.color_order
= LCM_COLOR_ORDER_RGB
;
224 params
->dbi
.data_format
.trans_seq
= LCM_DBI_TRANS_SEQ_MSB_FIRST
;
225 params
->dbi
.data_format
.padding
= LCM_DBI_PADDING_ON_LSB
;
226 params
->dbi
.data_format
.format
= LCM_DBI_FORMAT_RGB666
;
227 params
->dbi
.data_format
.width
= LCM_DBI_DATA_WIDTH_18BITS
;
228 params
->dbi
.cpu_write_bits
= LCM_DBI_CPU_WRITE_16_BITS
;
229 params
->dbi
.io_driving_current
= LCM_DRIVING_CURRENT_6575_8MA
;
231 params
->dbi
.parallel
.write_setup
= 1;
232 params
->dbi
.parallel
.write_hold
= 1;
233 params
->dbi
.parallel
.write_wait
= 3;
234 params
->dbi
.parallel
.read_setup
= 4;
235 params
->dbi
.parallel
.read_hold
= 0;
236 params
->dbi
.parallel
.read_latency
= 18;
237 params
->dbi
.parallel
.wait_period
= 1;
238 params
->dbi
.parallel
.cs_high_width
= 0; //cycles of cs high level between each transfer
239 // enable tearing-free
240 params
->dbi
.te_mode
= 0;
241 //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
242 params
->dbi
.te_edge_polarity
= LCM_POLARITY_RISING
;
246 static void lcm_init(void)
253 init_lcm_registers();
257 static void lcm_suspend(void)
259 send_ctrl_cmd(0x1000);
264 static void lcm_resume(void)
266 send_ctrl_cmd(0x1100);
269 // xuecheng, do we need to write 0x2900??
270 send_ctrl_cmd(0x2900);
273 static void lcm_update(unsigned int x
, unsigned int y
,
274 unsigned int width
, unsigned int height
)
276 short x0
, y0
, x1
, y1
;
277 short h_X_start
,l_X_start
,h_X_end
,l_X_end
,h_Y_start
,l_Y_start
,h_Y_end
,l_Y_end
;
282 x1
= (short)x
+width
-1;
283 y1
= (short)y
+height
-1;
285 h_X_start
=((x0
&0x0300)>>8);
286 l_X_start
=(x0
&0x00FF);
287 h_X_end
=((x1
&0x0300)>>8);
290 h_Y_start
=((y0
&0x0300)>>8);
291 l_Y_start
=(y0
&0x00FF);
292 h_Y_end
=((y1
&0x0300)>>8);
295 send_ctrl_cmd( 0x2A00 );
296 send_data_cmd( h_X_start
);
297 send_ctrl_cmd( 0x2A01 );
298 send_data_cmd( l_X_start
);
299 send_ctrl_cmd( 0x2A02);
300 send_data_cmd( h_X_end
);
301 send_ctrl_cmd( 0x2A03);
302 send_data_cmd( l_X_end
);
303 send_ctrl_cmd( 0x2B00 );
304 send_data_cmd( h_Y_start
);
305 send_ctrl_cmd( 0x2B01 );
306 send_data_cmd( l_Y_start
);
307 send_ctrl_cmd( 0x2B02);
308 send_data_cmd( h_Y_end
);
309 send_ctrl_cmd( 0x2B03);
310 send_data_cmd( l_Y_end
);
311 send_ctrl_cmd(0x3601); //enable HSM mode
313 send_ctrl_cmd( 0x2C00 );
316 static unsigned int lcm_compare_id(void)
320 send_ctrl_cmd(0x1180);
321 id
= read_data_cmd();
323 #if defined(BUILD_UBOOT)
324 printf("%s, id1 = 0x%08x\n", __func__
, id
);
327 send_ctrl_cmd(0x1080);
328 id
|= (read_data_cmd() << 8);
330 #if defined(BUILD_UBOOT)
331 printf("%s, id2 = 0x%08x\n", __func__
, id
);
334 return (LCM_ID
== id
)?1:0;
337 LCM_DRIVER nt35582_mcu_6575_lcm_drv
=
339 .name
= "nt35582_mcu_6575",
340 .set_util_funcs
= lcm_set_util_funcs
,
341 .get_params
= lcm_get_params
,
343 .suspend
= lcm_suspend
,
344 .resume
= lcm_resume
,
345 .update
= lcm_update
,
346 .compare_id
= lcm_compare_id