Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | #ifdef BUILD_LK |
2 | #include <string.h> | |
3 | //Evan add | |
4 | #include <debug.h> | |
5 | #include <sys/types.h> | |
6 | #include <platform/mt_i2c.h> | |
7 | //Evan add end | |
8 | #else | |
9 | #include <linux/string.h> | |
10 | #endif | |
11 | ||
12 | #ifdef BUILD_LK | |
13 | #include <platform/mt_gpio.h> | |
14 | #include <platform/mt_pmic.h> | |
15 | #else | |
16 | #include <mach/mt_gpio.h> | |
17 | #include <mach/mt_pm_ldo.h> | |
18 | #include <mach/upmu_common.h> | |
19 | #endif | |
20 | #include "lcm_drv.h" | |
21 | ||
22 | #ifdef BUILD_LK | |
23 | #define TPS_I2C_BUS 0 | |
24 | #define TPS_I2C_ID I2C2 | |
25 | #define TPS_SLAVE_ADDR 0x74 | |
26 | #define TPS_data_size 13 //1024 | |
27 | const uint8_t e2prom_data[TPS_data_size] = {0xFA,0x3C,0x28,0x09,0x09,0x08,0x23,0x03,0x01,0x06,0x01,0x7D,0x7D}; | |
28 | #endif | |
29 | ||
30 | // --------------------------------------------------------------------------- | |
31 | // Local Constants | |
32 | // --------------------------------------------------------------------------- | |
33 | #define FRAME_WIDTH (800) | |
34 | #define FRAME_HEIGHT (1280) | |
35 | ||
36 | #define REGFLAG_DELAY 0XFE | |
37 | #define REGFLAG_END_OF_TABLE 0xFF // END OF REGISTERS MARKER | |
38 | ||
39 | #define LCM_ID 0x01 //KDT+AUO+OTA7291 | |
40 | #define LCM_DSI_CMD_MODE 0 | |
41 | ||
42 | // --------------------------------------------------------------------------- | |
43 | // Local Variables | |
44 | // --------------------------------------------------------------------------- | |
45 | static LCM_UTIL_FUNCS lcm_util = { | |
46 | .set_gpio_out = NULL, | |
47 | }; | |
48 | ||
49 | #define SET_RESET_PIN(v) (lcm_util.set_reset_pin((v))) | |
50 | #define UDELAY(n) (lcm_util.udelay(n)) | |
51 | #define MDELAY(n) (lcm_util.mdelay(n)) | |
52 | ||
53 | // --------------------------------------------------------------------------- | |
54 | // Local Functions | |
55 | // --------------------------------------------------------------------------- | |
56 | #define dsi_set_cmdq_V2(cmd, count, ppara, force_update) lcm_util.dsi_set_cmdq_V2(cmd, count, ppara, force_update) | |
57 | #define dsi_set_cmdq(pdata, queue_size, force_update) lcm_util.dsi_set_cmdq(pdata, queue_size, force_update) | |
58 | #define wrtie_cmd(cmd) lcm_util.dsi_write_cmd(cmd) | |
59 | #define write_regs(addr, pdata, byte_nums) lcm_util.dsi_write_regs(addr, pdata, byte_nums) | |
60 | #define read_reg lcm_util.dsi_read_reg() | |
61 | #define read_reg_v2(cmd, buffer, buffer_size) lcm_util.dsi_dcs_read_lcm_reg_v2(cmd, buffer, buffer_size) | |
62 | ||
63 | struct LCM_setting_table { | |
64 | unsigned cmd; | |
65 | unsigned char count; | |
66 | unsigned char para_list[64]; | |
67 | }; | |
68 | ||
69 | static struct LCM_setting_table lcm_initialization_setting[] = { | |
70 | {0xd8,1,{0x66}}, | |
71 | {0x19,18,{0x00,0x00,0xfc,0x51,0xf2,0x3f,0xff,0xf3,0x3f,0x91,0x00,0x00,0x00,0x1c,0xf8,0x1f,0x01,0xc3}}, | |
72 | {0x19,18,{0x60,0x00,0x64,0xa0,0x10,0x0a,0x1e,0x1c,0x36,0x9c,0x10,0x09,0x3a,0x1e,0x80,0x91,0x02,0x3c}}, | |
73 | }; | |
74 | ||
75 | ||
76 | #ifdef BUILD_LK | |
77 | /*----------------------------------------*/ | |
78 | /*--------------TPS65640------------------*/ | |
79 | static int tps65640_write_data(void) | |
80 | { | |
81 | printf("Evan:%s\n",__func__); | |
82 | int ret=0; | |
83 | mt_i2c i2c = {0}; | |
84 | i2c.id = TPS_I2C_ID; | |
85 | i2c.addr = TPS_SLAVE_ADDR; | |
86 | i2c.mode = ST_MODE; | |
87 | i2c.speed = 100; | |
88 | i2c.dma_en = 0; | |
89 | ||
90 | u8 buf1[TPS_data_size+1]; | |
91 | buf1[0] = 0x00; | |
92 | int i=0; | |
93 | for(i=0;i<TPS_data_size;i++) | |
94 | buf1[i+1]=e2prom_data[i]; | |
95 | ret = i2c_write(&i2c, buf1, TPS_data_size+1); | |
96 | if(!ret) | |
97 | { | |
98 | printf("--------Evan:%s step1 error---------\n",__func__); | |
99 | return ret; | |
100 | } | |
101 | ||
102 | u8 buf2[2]; | |
103 | buf2[0]=0xFF; | |
104 | buf2[1]=0x80; | |
105 | ret = i2c_write(&i2c, buf2, 2); | |
106 | if(!ret) | |
107 | { | |
108 | printf("--------Evan:%s step2 error---------\n",__func__); | |
109 | return ret; | |
110 | } | |
111 | ||
112 | return ret; | |
113 | } | |
114 | ||
115 | static int tps65640_read_data(uint8_t *data) | |
116 | { | |
117 | printf("Evan:%s\n",__func__); | |
118 | int ret=0; | |
119 | mt_i2c i2c = {0}; | |
120 | i2c.id = TPS_I2C_ID; | |
121 | i2c.addr = TPS_SLAVE_ADDR; | |
122 | i2c.mode = ST_MODE; | |
123 | i2c.speed = 100; | |
124 | i2c.dma_en = 0; | |
125 | ||
126 | u8 buf1[2]; | |
127 | buf1[0]=0xFF; | |
128 | buf1[1]=0x01; | |
129 | ret = i2c_write(&i2c, buf1, 2); | |
130 | if(!ret) | |
131 | { | |
132 | printf("--------Evan:%s step1 error---------\n",__func__); | |
133 | return ret; | |
134 | } | |
135 | ||
136 | uint8_t buf2=0x00; | |
137 | ret = i2c_write(&i2c, buf2, 1); | |
138 | if(!ret) | |
139 | { | |
140 | printf("--------Evan:%s step2-1 error---------\n",__func__); | |
141 | return ret; | |
142 | } | |
143 | ||
144 | ret=i2c_read(&i2c, data, TPS_data_size); | |
145 | if(!ret) | |
146 | { | |
147 | printf("--------Evan:%s step2-2 error---------\n",__func__); | |
148 | return ret; | |
149 | } | |
150 | return ret; | |
151 | ||
152 | } | |
153 | ||
154 | ||
155 | ||
156 | static int tps65640_e2prom_data_check(void) | |
157 | { | |
158 | printf("Evan:%s\n",__func__); | |
159 | int i=0,ret=1; | |
160 | uint8_t data[TPS_data_size]; | |
161 | //read e2prom data | |
162 | tps65640_read_data(data); | |
163 | //check e2prom data | |
164 | for(i=0;i<TPS_data_size;i++) | |
165 | if(data[i]!=e2prom_data[i]) | |
166 | { | |
167 | ret=0; | |
168 | printf("---------Evan:e2prom_data need update--------\n"); | |
169 | break; | |
170 | } | |
171 | if(ret) | |
172 | printf("---------Evan:e2prom_data is OK--------\n"); | |
173 | else | |
174 | ret=tps65640_write_data(); | |
175 | return ret; | |
176 | } | |
177 | ||
178 | static int tps65640_enable() | |
179 | { | |
180 | printf("Evan:%s\n",__func__); | |
181 | //todo:IC power on, | |
182 | } | |
183 | ||
184 | /*----------------------------------------*/ | |
185 | #endif | |
186 | ||
187 | static void lcd_power_en(unsigned char enabled) | |
188 | { | |
189 | if (enabled) { | |
190 | #ifdef BUILD_LK | |
191 | upmu_set_rg_vgp1_vosel(0x7);//3.3V | |
192 | upmu_set_rg_vgp1_en(0x1); | |
193 | upmu_set_rg_vgp3_vosel(0x3);//1.8V | |
194 | upmu_set_rg_vgp3_en(0x1); | |
195 | #else | |
196 | upmu_set_rg_vgp1_vosel(0x7);//3.3V | |
197 | upmu_set_rg_vgp1_en(0x1); | |
198 | upmu_set_rg_vgp3_vosel(0x3);//1.8V | |
199 | upmu_set_rg_vgp3_en(0x1); | |
200 | #endif | |
201 | } else { | |
202 | #ifdef BUILD_LK | |
203 | upmu_set_rg_vgp1_en(0); | |
204 | upmu_set_rg_vgp1_vosel(0); | |
205 | upmu_set_rg_vgp3_en(0); | |
206 | upmu_set_rg_vgp3_vosel(0); | |
207 | #else | |
208 | upmu_set_rg_vgp1_en(0); | |
209 | upmu_set_rg_vgp1_vosel(0); | |
210 | upmu_set_rg_vgp3_en(0); | |
211 | upmu_set_rg_vgp3_vosel(0); | |
212 | #endif | |
213 | } | |
214 | } | |
215 | ||
216 | ||
217 | static void lcd_reset(unsigned char enabled) | |
218 | { | |
219 | if (enabled) { | |
220 | mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ONE); | |
221 | } else { | |
222 | mt_set_gpio_out(GPIO_LCM_RST, GPIO_OUT_ZERO); | |
223 | } | |
224 | } | |
225 | ||
226 | // --------------------------------------------------------------------------- | |
227 | // LCM Driver Implementations | |
228 | // --------------------------------------------------------------------------- | |
229 | static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util) | |
230 | { | |
231 | memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS)); | |
232 | } | |
233 | ||
234 | ||
235 | static void lcm_get_params(LCM_PARAMS *params) | |
236 | { | |
237 | memset(params, 0, sizeof(LCM_PARAMS)); | |
238 | ||
239 | params->type = LCM_TYPE_DSI; | |
240 | params->width = FRAME_WIDTH; | |
241 | params->height = FRAME_HEIGHT; | |
242 | params->dsi.mode = SYNC_EVENT_VDO_MODE; //BURST_VDO_MODE;BURST_VDO_MODE; | |
243 | ||
244 | // DSI | |
245 | /* Command mode setting */ | |
246 | params->dsi.LANE_NUM = LCM_FOUR_LANE; | |
247 | //The following defined the fomat for data coming from LCD engine. | |
248 | params->dsi.data_format.format = LCM_DSI_FORMAT_RGB888; //LCM_DSI_FORMAT_RGB666; | |
249 | ||
250 | // Video mode setting | |
251 | params->dsi.PS = LCM_PACKED_PS_24BIT_RGB888; //LCM_PACKED_PS_18BIT_RGB666; | |
252 | ||
253 | params->dsi.vertical_sync_active = 4;//0; | |
254 | params->dsi.vertical_backporch = 8;//23; | |
255 | params->dsi.vertical_frontporch = 8; | |
256 | params->dsi.vertical_active_line = FRAME_HEIGHT; | |
257 | ||
258 | params->dsi.horizontal_sync_active = 4;//0; | |
259 | params->dsi.horizontal_backporch = 132;//160; | |
260 | params->dsi.horizontal_frontporch = 24; //100;//160; | |
261 | params->dsi.horizontal_active_pixel = FRAME_WIDTH; | |
262 | ||
263 | params->dsi.PLL_CLOCK = 260;//148; | |
264 | } | |
265 | ||
266 | ||
267 | static void push_table(struct LCM_setting_table *table, unsigned int count, unsigned char force_update) | |
268 | { | |
269 | unsigned int i; | |
270 | ||
271 | for(i = 0; i < count; i++) { | |
272 | unsigned cmd; | |
273 | cmd = table[i].cmd; | |
274 | ||
275 | switch (cmd) { | |
276 | case REGFLAG_DELAY : | |
277 | MDELAY(table[i].count); | |
278 | break; | |
279 | ||
280 | case REGFLAG_END_OF_TABLE : | |
281 | break; | |
282 | ||
283 | default: | |
284 | dsi_set_cmdq_V2(cmd, table[i].count, table[i].para_list, force_update); | |
285 | } | |
286 | } | |
287 | ||
288 | } | |
289 | ||
290 | static void lcm_init(void) | |
291 | { | |
292 | unsigned int data_array[16]; | |
293 | ||
294 | #ifdef BUILD_LK | |
295 | printf("%s, LK \n", __func__); | |
296 | #else | |
297 | printk("%s, kernel", __func__); | |
298 | #endif | |
299 | ||
300 | lcd_reset(0); | |
301 | lcd_power_en(0); | |
302 | lcd_power_en(1); | |
4b9e9796 S |
303 | MDELAY(5); |
304 | mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ONE);//iml8881 bias | |
6fa3eb70 S |
305 | MDELAY(50); |
306 | lcd_reset(1); | |
4b9e9796 | 307 | MDELAY(15); |
6fa3eb70 | 308 | lcd_reset(0); |
4b9e9796 | 309 | MDELAY(15); |
6fa3eb70 | 310 | lcd_reset(1); |
4b9e9796 | 311 | MDELAY(15); |
6fa3eb70 S |
312 | |
313 | push_table(lcm_initialization_setting, sizeof(lcm_initialization_setting) / sizeof(struct LCM_setting_table), 1); | |
314 | } | |
315 | ||
316 | ||
317 | static void lcm_suspend(void) | |
318 | { | |
319 | unsigned int data_array[16]; | |
320 | ||
321 | #ifdef BUILD_LK | |
322 | printf("%s, LK \n", __func__); | |
323 | #else | |
324 | printk("%s, kernel", __func__); | |
325 | #endif | |
326 | ||
4b9e9796 S |
327 | lcd_reset(0); |
328 | MDELAY(5); | |
6fa3eb70 | 329 | mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ZERO);//iml8881 bias |
6fa3eb70 S |
330 | lcd_power_en(0); |
331 | MDELAY(10); | |
332 | } | |
333 | ||
334 | ||
335 | static void lcm_resume(void) | |
336 | { | |
337 | unsigned int data_array[16]; | |
338 | ||
339 | #ifdef BUILD_LK | |
340 | printf("%s, LK \n", __func__); | |
341 | #else | |
342 | printk("%s, kernel", __func__); | |
343 | #endif | |
344 | ||
345 | lcm_init(); | |
346 | } | |
347 | ||
348 | static unsigned int lcm_compare_id(void) | |
349 | { | |
350 | unsigned int id1 = 0, id2 = 0, id = 0; | |
351 | ||
352 | #ifdef BUILD_LK | |
353 | printf("%s, LK \n", __func__); | |
354 | #endif | |
355 | lcd_reset(0); | |
356 | lcd_power_en(0); | |
357 | lcd_power_en(1); | |
358 | lcd_reset(1); | |
359 | MDELAY(20); | |
360 | lcd_reset(0); | |
361 | MDELAY(20); | |
362 | lcd_reset(1); | |
363 | MDELAY(20); | |
364 | ||
365 | mt_set_gpio_mode(GPIO_HALL_2_PIN, GPIO_HALL_2_PIN_M_GPIO); | |
366 | mt_set_gpio_dir(GPIO_HALL_2_PIN, GPIO_DIR_IN); | |
367 | mt_set_gpio_pull_enable(GPIO_HALL_2_PIN, GPIO_PULL_DISABLE); | |
368 | mt_set_gpio_mode(GPIO_HALL_1_PIN, GPIO_HALL_1_PIN_M_GPIO); | |
369 | mt_set_gpio_dir(GPIO_HALL_1_PIN, GPIO_DIR_IN); | |
370 | mt_set_gpio_pull_enable(GPIO_HALL_1_PIN, GPIO_PULL_DISABLE); | |
371 | MDELAY(2); | |
372 | ||
373 | id1 = mt_get_gpio_in(GPIO_HALL_1_PIN); | |
374 | id2 = mt_get_gpio_in(GPIO_HALL_2_PIN); | |
375 | id = (id1<<1)|(id2); | |
376 | #ifdef BUILD_LK | |
377 | printf("KDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); | |
378 | #else | |
379 | printk("KDT+AUO id1=%d,id2=%d,id=0x%x\n",id1,id2,id); | |
380 | #endif | |
381 | lcd_reset(0); | |
382 | lcd_power_en(0); | |
383 | MDELAY(10); | |
384 | return (LCM_ID == id)?1:0; | |
385 | } | |
386 | ||
387 | LCM_DRIVER ota7291_wxga_dsi_vdo_lcm_drv = | |
388 | { | |
389 | .name = "ota7291_wxga_dsi_vdo", | |
390 | .set_util_funcs = lcm_set_util_funcs, | |
391 | .get_params = lcm_get_params, | |
392 | .init = lcm_init, | |
393 | .suspend = lcm_suspend, | |
394 | .resume = lcm_resume, | |
395 | .compare_id = lcm_compare_id, | |
396 | }; | |
397 | ||
398 |