1 #include <linux/string.h>
5 // ---------------------------------------------------------------------------
7 // ---------------------------------------------------------------------------
9 #define FRAME_WIDTH (480)
10 #define FRAME_HEIGHT (800)
12 // ---------------------------------------------------------------------------
14 // ---------------------------------------------------------------------------
16 static LCM_UTIL_FUNCS lcm_util
= {0};
18 #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v)))
20 #define UDELAY(n) (lcm_util.udelay(n))
21 #define MDELAY(n) (lcm_util.mdelay(n))
24 // ---------------------------------------------------------------------------
26 // ---------------------------------------------------------------------------
28 #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update)
29 #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd)
30 #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums)
31 #define read_reg lcm_util.dsi_read_reg()
34 #define LCM_DSI_CMD_MODE
36 static void init_lcm_registers(void)
38 unsigned int data_array
[16];
39 #if defined(LCM_DSI_CMD_MODE)
41 data_array
[0] = 0x04B02300;
42 dsi_set_cmdq(&data_array
, 1, 1);
45 data_array
[0] = 0x00032902;
46 data_array
[1] = 0x000002B3;
47 dsi_set_cmdq(&data_array
, 2, 1);
50 data_array
[0] = 0x00032902;//DSI control
51 data_array
[1] = 0x008352B6;
52 dsi_set_cmdq(&data_array
, 2, 1);
55 data_array
[0] = 0x00052902;//MDDI
56 data_array
[1] = 0x118000B7;
57 data_array
[2] = 0x00000025;
58 dsi_set_cmdq(&data_array
, 3, 1);
61 data_array
[0] = 0x00BD2300; //resizing
62 dsi_set_cmdq(&data_array
, 1, 1);
65 data_array
[0] = 0x00032902; // panel driving setting 1
66 data_array
[1] = 0x008702C0;
67 dsi_set_cmdq(&data_array
, 2, 1);
70 data_array
[0] = 0x00102902; // panel driving setting 2
71 data_array
[1] = 0x003543C1;
72 data_array
[2] = 0x12222020;
73 data_array
[3] = 0xA5084426;
74 data_array
[4] = 0x0121580F;
75 dsi_set_cmdq(&data_array
, 5, 1);
78 data_array
[0] = 0x00072902; // V-timing setting
79 data_array
[1] = 0x060608C2;
80 data_array
[2] = 0x00040107;
81 dsi_set_cmdq(&data_array
, 3, 1);
84 data_array
[0] = 0x00032902; // outline
85 data_array
[1] = 0x000000C6;
86 dsi_set_cmdq(&data_array
, 2, 1);
89 data_array
[0] = 0x00192902; // GAMMA A
90 data_array
[1] = 0x1E1600C8;
91 data_array
[2] = 0x374D3528;
92 data_array
[3] = 0x040B1422;
93 data_array
[4] = 0x1E160000;
94 data_array
[5] = 0x374D3528;
95 data_array
[6] = 0x040B1422;
96 data_array
[7] = 0x00000000;
97 dsi_set_cmdq(&data_array
, 8, 1);
100 data_array
[0] = 0x00192902; // GAMMA B
101 data_array
[1] = 0x1E1600C9;
102 data_array
[2] = 0x374D3528;
103 data_array
[3] = 0x040B1422;
104 data_array
[4] = 0x1E160000;
105 data_array
[5] = 0x374D3528;
106 data_array
[6] = 0x040B1422;
107 data_array
[7] = 0x00000000;
108 dsi_set_cmdq(&data_array
, 8, 1);
111 data_array
[0] = 0x00192902; // GAMMA C
112 data_array
[1] = 0x1E1600CA;
113 data_array
[2] = 0x374D3528;
114 data_array
[3] = 0x040B1422;
115 data_array
[4] = 0x1E160000;
116 data_array
[5] = 0x374D3528;
117 data_array
[6] = 0x040B1422;
118 data_array
[7] = 0x00000000;
119 dsi_set_cmdq(&data_array
, 8, 1);
122 data_array
[0] = 0x00112902; // Power setting
123 data_array
[1] = 0xBD03A9D0;
124 data_array
[2] = 0x20720CA5;
125 data_array
[3] = 0x01000110;
126 data_array
[4] = 0x01030001;
127 data_array
[5] = 0x00000000;
128 dsi_set_cmdq(&data_array
, 6, 1);
131 data_array
[0] = 0x00082902; // Power setting
132 data_array
[1] = 0x230C18D1;
133 data_array
[2] = 0x50027503;
134 dsi_set_cmdq(&data_array
, 3, 1);
137 data_array
[0] = 0x33D32300;
138 dsi_set_cmdq(&data_array
, 1, 1);
141 data_array
[0] = 0x00032902;
142 data_array
[1] = 0x001B1BD5;
143 dsi_set_cmdq(&data_array
, 2, 1);
146 data_array
[0] = 0xA8D62300;
147 dsi_set_cmdq(&data_array
, 1, 1);
150 data_array
[0] = 0x00032902;
151 data_array
[1] = 0x000001DE;
152 dsi_set_cmdq(&data_array
, 2, 1);
155 data_array
[0] = 0x00052902;
156 data_array
[1] = 0x000000E0;
157 data_array
[2] = 0x00000000;
158 dsi_set_cmdq(&data_array
, 3, 1);
161 data_array
[0] = 0x00072902;
162 data_array
[1] = 0x010101E1;
163 data_array
[2] = 0x00000101;
164 dsi_set_cmdq(&data_array
, 3, 1);
167 data_array
[0] = 0x00e62300;
168 dsi_set_cmdq(&data_array
, 1, 1);
171 data_array
[0] = 0x03FA2300;
172 dsi_set_cmdq(&data_array
, 1, 1);
175 data_array
[0] = 0x00053902;
176 data_array
[1] = 0x0300002B;
177 data_array
[2] = 0x00000055;
178 dsi_set_cmdq(&data_array
, 3, 1);
181 data_array
[0] = 0x00053902;
182 data_array
[1] = 0x0100002A;
183 data_array
[2] = 0x000000DF;
184 dsi_set_cmdq(&data_array
, 3, 1);
187 data_array
[0] = 0x00361500;
188 dsi_set_cmdq(&data_array
, 1, 1);
191 data_array
[0] = 0x773A1500;
192 dsi_set_cmdq(&data_array
, 1, 1);
195 // data_array[0] = 0x03B02300;
196 // dsi_set_cmdq(&data_array, 1, 1);
198 data_array
[0] = 0x28D60500;
199 dsi_set_cmdq(&data_array
, 1, 1);
202 data_array
[0] = 0x000E2902;
203 data_array
[1] = 0x700000FD;
204 data_array
[2] = 0x34313200;
205 data_array
[3] = 0x04313230;
206 data_array
[4] = 0x00000000;
207 dsi_set_cmdq(&data_array
, 5, 1);
210 data_array
[0] = 0x00052902;
211 data_array
[1] = 0x000000FE;
212 data_array
[2] = 0x00000020;
213 dsi_set_cmdq(&data_array
, 3, 1);
216 data_array[0] = 0x00112902; // Power setting
217 data_array[1] = 0xBD03A9D0;
218 data_array[2] = 0x20720CA5;
219 data_array[3] = 0x01000110;
220 data_array[4] = 0x01030001;
221 data_array[5] = 0x00000000;
222 dsi_set_cmdq(&data_array, 6, 1);
225 data_array[0] = 0x00082902; // Power setting
226 data_array[1] = 0x230C18D1;
227 data_array[2] = 0x50027503;
228 dsi_set_cmdq(&data_array, 3, 1);
231 data_array[0] = 0x33D32300;
232 dsi_set_cmdq(&data_array, 1, 1);
236 data_array
[0] = 0x00110500;
237 dsi_set_cmdq(&data_array
, 1, 1);
241 data_array
[0] = 0x00290500;
242 dsi_set_cmdq(&data_array
, 1, 1);
245 data_array
[0] = 0x03B02300;
246 dsi_set_cmdq(&data_array
, 1, 1);
251 // ---------------------------------------------------------------------------
252 // LCM Driver Implementations
253 // ---------------------------------------------------------------------------
255 static void lcm_set_util_funcs(const LCM_UTIL_FUNCS
*util
)
257 memcpy(&lcm_util
, util
, sizeof(LCM_UTIL_FUNCS
));
261 static void lcm_get_params(LCM_PARAMS
*params
)
263 memset(params
, 0, sizeof(LCM_PARAMS
));
265 params
->type
= LCM_TYPE_DSI
;
266 #if defined(LCM_DSI_CMD_MODE)
267 params
->dsi
.mode
= CMD_MODE
;
269 params
->dsi
.mode
= SYNC_EVENT_VDO_MODE
;
271 params
->ctrl
= LCM_CTRL_PARALLEL_DBI
;
272 //params->ctrl = LCM_CTRL_NONE;
273 params
->width
= FRAME_WIDTH
;
274 params
->height
= FRAME_HEIGHT
;
277 //params->dbi.port = 0;
278 params
->dbi
.clock_freq
= LCM_DBI_CLOCK_FREQ_104M
;
279 params
->dbi
.data_width
= LCM_DBI_DATA_WIDTH_16BITS
;
280 params
->dbi
.data_format
.color_order
= LCM_COLOR_ORDER_RGB
;
281 params
->dbi
.data_format
.trans_seq
= LCM_DBI_TRANS_SEQ_MSB_FIRST
;
282 params
->dbi
.data_format
.padding
= LCM_DBI_PADDING_ON_LSB
;
283 params
->dbi
.data_format
.format
= LCM_DBI_FORMAT_RGB888
;
284 params
->dbi
.data_format
.width
= LCM_DBI_DATA_WIDTH_24BITS
;
285 params
->dbi
.cpu_write_bits
= LCM_DBI_CPU_WRITE_16_BITS
;
286 params
->dbi
.io_driving_current
= 0;
288 // enable tearing-free
289 //params->dbi.te_mode = LCM_DBI_TE_MODE_VSYNC_ONLY;
290 params
->dbi
.te_mode
= LCM_DBI_TE_MODE_DISABLED
;
291 params
->dbi
.te_edge_polarity
= LCM_POLARITY_RISING
;
294 params
->dpi
.format
= LCM_DPI_FORMAT_RGB888
;
295 params
->dpi
.rgb_order
= LCM_COLOR_ORDER_RGB
;
296 params
->dpi
.intermediat_buffer_num
= 2;
299 params
->dsi
.DSI_WMEM_CONTI
=0x3C;
300 params
->dsi
.DSI_RMEM_CONTI
=0x3E;
301 //params->dsi.LANE_NUM=LCM_ONE_LANE;
302 params
->dsi
.LANE_NUM
=LCM_TWO_LANE
;
303 params
->dsi
.VC_NUM
=0x0;
304 params
->dsi
.PS
=LCM_PACKED_PS_24BIT_RGB888
;
305 params
->dsi
.word_count
=480*3;
307 params
->dsi
.vertical_sync_active
=2;
308 params
->dsi
.vertical_backporch
=2;
309 params
->dsi
.vertical_frontporch
=2;
310 params
->dsi
.vertical_active_line
=800;
312 params
->dsi
.line_byte
=2180; // 2256 = 752*3
313 params
->dsi
.horizontal_sync_active_byte
=26;
314 params
->dsi
.horizontal_backporch_byte
=206;
315 params
->dsi
.horizontal_frontporch_byte
=206;
316 params
->dsi
.rgb_byte
=(480*3+6);
318 params
->dsi
.horizontal_sync_active_word_count
=20;
319 params
->dsi
.horizontal_backporch_word_count
=200;
320 params
->dsi
.horizontal_frontporch_word_count
=200;
322 /* params->dsi.HS_TRAIL=0x14;
323 params->dsi.HS_ZERO=0x14;
324 params->dsi.HS_PRPR=0x0A;
325 params->dsi.LPX=0x05;
327 params->dsi.TA_SACK=0x01;
328 params->dsi.TA_GET=0x37;
329 params->dsi.TA_SURE=0x16;
330 params->dsi.TA_GO=0x10;
332 params->dsi.CLK_TRAIL=0x14;
333 params->dsi.CLK_ZERO=0x14;
334 params->dsi.LPX_WAIT=0x0A;
335 params->dsi.CONT_DET=0x00;
337 params->dsi.CLK_HS_PRPR=0x0A;
339 params
->dsi
.HS_TRAIL
=0x0C;
340 params
->dsi
.HS_ZERO
=0x04;
341 params
->dsi
.HS_PRPR
=0x02;
342 params
->dsi
.LPX
=0x06;
344 params
->dsi
.TA_SACK
=0x01;
345 params
->dsi
.TA_GET
=0x1E;
346 params
->dsi
.TA_SURE
=0x09;
347 params
->dsi
.TA_GO
=0x18;
349 params
->dsi
.CLK_TRAIL
=0x01;
350 params
->dsi
.CLK_ZERO
=0x06;
351 params
->dsi
.LPX_WAIT
=0x0A;
352 params
->dsi
.CONT_DET
=0x00;
354 params
->dsi
.CLK_HS_PRPR
=0x01;
356 params
->dsi
.pll_div1
=0x1D; // fref=26MHz, fvco=fref*(div1+1) (div1=0~63, fvco=500MHZ~1GHz)
358 //params->dsi.pll_div2=4; // div2=0~15: fout=fvo/(2*div2)
359 params
->dsi
.pll_div2
=1; // div2=0~15: fout=fvo/(2*div2)
363 static void lcm_init(void)
370 init_lcm_registers();
376 static void lcm_suspend(void)
378 unsigned int data_array
[16];
380 data_array
[0]=0x00280500; // Display Off
381 dsi_set_cmdq(&data_array
, 1, 1);
383 data_array
[0] = 0x00100500; // Sleep In
384 dsi_set_cmdq(&data_array
, 1, 1);
389 static void lcm_resume(void)
391 unsigned int data_array
[16];
393 data_array
[0] = 0x00110500; // Sleep Out
394 dsi_set_cmdq(&data_array
, 1, 1);
396 data_array
[0] = 0x00290500; // Display On
397 dsi_set_cmdq(&data_array
, 1, 1);
402 static void lcm_update(unsigned int x
, unsigned int y
,
403 unsigned int width
, unsigned int height
)
407 unsigned int x1
= x0
+ width
- 1;
408 unsigned int y1
= y0
+ height
- 1;
410 unsigned char x0_MSB
= ((x0
>>8)&0xFF);
411 unsigned char x0_LSB
= (x0
&0xFF);
412 unsigned char x1_MSB
= ((x1
>>8)&0xFF);
413 unsigned char x1_LSB
= (x1
&0xFF);
414 unsigned char y0_MSB
= ((y0
>>8)&0xFF);
415 unsigned char y0_LSB
= (y0
&0xFF);
416 unsigned char y1_MSB
= ((y1
>>8)&0xFF);
417 unsigned char y1_LSB
= (y1
&0xFF);
419 unsigned int data_array
[16];
421 data_array
[0]= 0x00053902;
422 data_array
[1]= (x1_MSB
<<24)|(x0_LSB
<<16)|(x0_MSB
<<8)|0x2a;
423 data_array
[2]= (x1_LSB
);
424 data_array
[3]= 0x00053902;
425 data_array
[4]= (y1_MSB
<<24)|(y0_LSB
<<16)|(y0_MSB
<<8)|0x2b;
426 data_array
[5]= (y1_LSB
);
427 data_array
[6]= 0x002c3909;
428 // data_array[0]= 0x002c3901;
430 dsi_set_cmdq(&data_array
, 7, 0);
434 LCM_DRIVER r61408_wvga_dsi_cmd_drv
=
437 .set_util_funcs
= lcm_set_util_funcs
,
438 .get_params
= lcm_get_params
,
440 .suspend
= lcm_suspend
,
441 .resume
= lcm_resume
,
442 #if defined(LCM_DSI_CMD_MODE)
443 .update
= lcm_update
,