diff options
author | Amaury Pouly <pamaury@rockbox.org> | 2011-07-03 15:18:41 +0000 |
---|---|---|
committer | Amaury Pouly <pamaury@rockbox.org> | 2011-07-03 15:18:41 +0000 |
commit | e36b20c4a1709ae9fd3020b9f08875c8c03a0912 (patch) | |
tree | d17371221234fc16da4e9175fdd0890b7eb58b62 /firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c | |
parent | 22b6def065ab7c2ca030f405577e34104ad20011 (diff) | |
download | rockbox-e36b20c4a1709ae9fd3020b9f08875c8c03a0912.tar.gz rockbox-e36b20c4a1709ae9fd3020b9f08875c8c03a0912.zip |
imx233/fuze+: replace software i2c by hardware i2c, make some code more correct, reduce code size of lcd init sequences
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30120 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c')
-rw-r--r-- | firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c | 350 |
1 files changed, 189 insertions, 161 deletions
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c index f2fbf706d7..bc8a20d2ff 100644 --- a/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c +++ b/firmware/target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c | |||
@@ -62,7 +62,6 @@ static void setup_lcd_pins(bool use_lcdif) | |||
62 | } | 62 | } |
63 | else | 63 | else |
64 | { | 64 | { |
65 | |||
66 | __REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */ | 65 | __REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */ |
67 | imx233_enable_gpio_output_mask(1, 0x3ffffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,dotclk,enable,hsync,vsync} */ | 66 | imx233_enable_gpio_output_mask(1, 0x3ffffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,dotclk,enable,hsync,vsync} */ |
68 | imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */ | 67 | imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */ |
@@ -212,6 +211,28 @@ static uint32_t lcd_read_reg(uint32_t reg) | |||
212 | return decode_18_to_16(data_in); | 211 | return decode_18_to_16(data_in); |
213 | } | 212 | } |
214 | 213 | ||
214 | #define REG_MDELAY 0xffffffff | ||
215 | struct lcd_sequence_entry_t | ||
216 | { | ||
217 | uint32_t reg, data; | ||
218 | }; | ||
219 | |||
220 | static void lcd_send_sequence(struct lcd_sequence_entry_t *seq, unsigned count) | ||
221 | { | ||
222 | for(;count-- > 0; seq++) | ||
223 | { | ||
224 | if(seq->reg == REG_MDELAY) | ||
225 | mdelay(seq->data); | ||
226 | else | ||
227 | lcd_write_reg(seq->reg, seq->data); | ||
228 | } | ||
229 | } | ||
230 | |||
231 | #define _begin_seq() static struct lcd_sequence_entry_t __seq[] = { | ||
232 | #define _mdelay(a) {REG_MDELAY, a}, | ||
233 | #define _lcd_write_reg(a, b) {a, b}, | ||
234 | #define _end_seq() }; lcd_send_sequence(__seq, sizeof(__seq) / sizeof(__seq[0])); | ||
235 | |||
215 | static void lcd_init_seq_7783(void) | 236 | static void lcd_init_seq_7783(void) |
216 | { | 237 | { |
217 | __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; | 238 | __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; |
@@ -219,131 +240,129 @@ static void lcd_init_seq_7783(void) | |||
219 | __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; | 240 | __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; |
220 | mdelay(10); | 241 | mdelay(10); |
221 | __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; | 242 | __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; |
222 | mdelay(200); | 243 | |
223 | lcd_write_reg(1, 0x100); | 244 | _begin_seq() |
224 | lcd_write_reg(2, 0x700); | 245 | _mdelay(200) |
225 | lcd_write_reg(3, 0x1030); | 246 | _lcd_write_reg(1, 0x100) |
226 | lcd_write_reg(7, 0x121); | 247 | _lcd_write_reg(2, 0x700) |
227 | lcd_write_reg(8, 0x302); | 248 | _lcd_write_reg(3, 0x1030) |
228 | lcd_write_reg(9, 0x200); | 249 | _lcd_write_reg(7, 0x121) |
229 | lcd_write_reg(0xa, 0); | 250 | _lcd_write_reg(8, 0x302) |
230 | lcd_write_reg(0x10, 0x790); | 251 | _lcd_write_reg(9, 0x200) |
231 | lcd_write_reg(0x11, 5); | 252 | _lcd_write_reg(0xa, 0) |
232 | lcd_write_reg(0x12, 0); | 253 | _lcd_write_reg(0x10, 0x790) |
233 | lcd_write_reg(0x13, 0); | 254 | _lcd_write_reg(0x11, 5) |
234 | mdelay(100); | 255 | _lcd_write_reg(0x12, 0) |
235 | lcd_write_reg(0x10, 0x12b0); | 256 | _lcd_write_reg(0x13, 0) |
236 | mdelay(100); | 257 | _mdelay(100) |
237 | lcd_write_reg(0x11, 7); | 258 | _lcd_write_reg(0x10, 0x12b0) |
238 | mdelay(100); | 259 | _mdelay(100) |
239 | lcd_write_reg(0x12, 0x89); | 260 | _lcd_write_reg(0x11, 7) |
240 | lcd_write_reg(0x13, 0x1d00); | 261 | _mdelay(100) |
241 | lcd_write_reg(0x29, 0x2f); | 262 | _lcd_write_reg(0x12, 0x89) |
242 | mdelay(50); | 263 | _lcd_write_reg(0x13, 0x1d00) |
243 | lcd_write_reg(0x30, 0); | 264 | _lcd_write_reg(0x29, 0x2f) |
244 | lcd_write_reg(0x31, 0x505); | 265 | _mdelay(50) |
245 | lcd_write_reg(0x32, 0x205); | 266 | _lcd_write_reg(0x30, 0) |
246 | lcd_write_reg(0x35, 0x206); | 267 | _lcd_write_reg(0x31, 0x505) |
247 | lcd_write_reg(0x36, 0x408); | 268 | _lcd_write_reg(0x32, 0x205) |
248 | lcd_write_reg(0x37, 0); | 269 | _lcd_write_reg(0x35, 0x206) |
249 | lcd_write_reg(0x38, 0x504); | 270 | _lcd_write_reg(0x36, 0x408) |
250 | lcd_write_reg(0x39, 0x206); | 271 | _lcd_write_reg(0x37, 0) |
251 | lcd_write_reg(0x3c, 0x206); | 272 | _lcd_write_reg(0x38, 0x504) |
252 | lcd_write_reg(0x3d, 0x408); | 273 | _lcd_write_reg(0x39, 0x206) |
253 | lcd_write_reg(0x50, 0); /* left X ? */ | 274 | _lcd_write_reg(0x3c, 0x206) |
254 | lcd_write_reg(0x51, 0xef); /* right X ? */ | 275 | _lcd_write_reg(0x3d, 0x408) |
255 | lcd_write_reg(0x52, 0); /* top Y ? */ | 276 | _lcd_write_reg(0x50, 0) /* left X ? */ |
256 | lcd_write_reg(0x53, 0x13f); /* bottom Y ? */ | 277 | _lcd_write_reg(0x51, 0xef) /* right X ? */ |
257 | lcd_write_reg(0x20, 0); /* left X ? */ | 278 | _lcd_write_reg(0x52, 0) /* top Y ? */ |
258 | lcd_write_reg(0x21, 0); /* top Y ? */ | 279 | _lcd_write_reg(0x53, 0x13f) /* bottom Y ? */ |
259 | lcd_write_reg(0x60, 0xa700); | 280 | _lcd_write_reg(0x20, 0) /* left X ? */ |
260 | lcd_write_reg(0x61, 1); | 281 | _lcd_write_reg(0x21, 0) /* top Y ? */ |
261 | lcd_write_reg(0x90, 0x33); | 282 | _lcd_write_reg(0x60, 0xa700) |
262 | lcd_write_reg(0x2b, 0xa); | 283 | _lcd_write_reg(0x61, 1) |
263 | lcd_write_reg(9, 0); | 284 | _lcd_write_reg(0x90, 0x33) |
264 | lcd_write_reg(7, 0x133); | 285 | _lcd_write_reg(0x2b, 0xa) |
265 | mdelay(50); | 286 | _lcd_write_reg(9, 0) |
266 | lcd_write_reg(0x22, 0); | 287 | _lcd_write_reg(7, 0x133) |
288 | _mdelay(50) | ||
289 | _lcd_write_reg(0x22, 0) | ||
290 | _end_seq() | ||
267 | } | 291 | } |
268 | 292 | ||
269 | static void lcd_init_seq_9325(void) | 293 | static void lcd_init_seq_9325(void) |
270 | { | 294 | { |
271 | lcd_write_reg(0xe5, 0x78f0); | 295 | _begin_seq() |
272 | lcd_write_reg(0xe3, 0x3008); | 296 | _lcd_write_reg(0xe5, 0x78f0) |
273 | lcd_write_reg(0xe7, 0x12); | 297 | _lcd_write_reg(0xe3, 0x3008) |
274 | lcd_write_reg(0xef, 0x1231); | 298 | _lcd_write_reg(0xe7, 0x12) |
275 | lcd_write_reg(0, 1); | 299 | _lcd_write_reg(0xef, 0x1231) |
276 | lcd_write_reg(1, 0x100); | 300 | _lcd_write_reg(0, 1) |
277 | lcd_write_reg(2, 0x700); | 301 | _lcd_write_reg(1, 0x100) |
278 | lcd_write_reg(3, 0x1030); | 302 | _lcd_write_reg(2, 0x700) |
279 | lcd_write_reg(4, 0); | 303 | _lcd_write_reg(3, 0x1030) |
280 | lcd_write_reg(8, 0x207); | 304 | _lcd_write_reg(4, 0) |
281 | lcd_write_reg(9, 0); | 305 | _lcd_write_reg(8, 0x207) |
282 | lcd_write_reg(0xa, 0); | 306 | _lcd_write_reg(9, 0) |
283 | lcd_write_reg(0xc, 0); | 307 | _lcd_write_reg(0xa, 0) |
284 | lcd_write_reg(0xd, 0); | 308 | _lcd_write_reg(0xc, 0) |
285 | lcd_write_reg(0xf, 0); | 309 | _lcd_write_reg(0xd, 0) |
286 | lcd_write_reg(0x10, 0); | 310 | _lcd_write_reg(0xf, 0) |
287 | lcd_write_reg(0x11, 7); | 311 | _lcd_write_reg(0x10, 0) |
288 | lcd_write_reg(0x12, 0); | 312 | _lcd_write_reg(0x11, 7) |
289 | lcd_write_reg(0x13, 0); | 313 | _lcd_write_reg(0x12, 0) |
290 | mdelay(20); | 314 | _lcd_write_reg(0x13, 0) |
291 | lcd_write_reg(0x10, 0x1290); | 315 | _mdelay(20) |
292 | lcd_write_reg(0x11, 7); | 316 | _lcd_write_reg(0x10, 0x1290) |
293 | mdelay(50); | 317 | _lcd_write_reg(0x11, 7) |
294 | lcd_write_reg(0x12, 0x19); | 318 | _mdelay(50) |
295 | mdelay(50); | 319 | _lcd_write_reg(0x12, 0x19) |
296 | lcd_write_reg(0x13, 0x1700); | 320 | _mdelay(50) |
297 | lcd_write_reg(0x29, 0x14); | 321 | _lcd_write_reg(0x13, 0x1700) |
298 | mdelay(50); | 322 | _lcd_write_reg(0x29, 0x14) |
299 | lcd_write_reg(0x20, 0); | 323 | _mdelay(50) |
300 | lcd_write_reg(0x21, 0); | 324 | _lcd_write_reg(0x20, 0) |
301 | lcd_write_reg(0x30, 0x504); | 325 | _lcd_write_reg(0x21, 0) |
302 | lcd_write_reg(0x31, 7); | 326 | _lcd_write_reg(0x30, 0x504) |
303 | lcd_write_reg(0x32, 6); | 327 | _lcd_write_reg(0x31, 7) |
304 | lcd_write_reg(0x35, 0x106); | 328 | _lcd_write_reg(0x32, 6) |
305 | lcd_write_reg(0x36, 0x202); | 329 | _lcd_write_reg(0x35, 0x106) |
306 | lcd_write_reg(0x37, 0x504); | 330 | _lcd_write_reg(0x36, 0x202) |
307 | lcd_write_reg(0x38, 0x500); | 331 | _lcd_write_reg(0x37, 0x504) |
308 | lcd_write_reg(0x39, 0x706); | 332 | _lcd_write_reg(0x38, 0x500) |
309 | lcd_write_reg(0x3c, 0x204); | 333 | _lcd_write_reg(0x39, 0x706) |
310 | lcd_write_reg(0x3d, 0x202); | 334 | _lcd_write_reg(0x3c, 0x204) |
311 | lcd_write_reg(0x50, 0); | 335 | _lcd_write_reg(0x3d, 0x202) |
312 | lcd_write_reg(0x51, 0xef); | 336 | _lcd_write_reg(0x50, 0) |
313 | lcd_write_reg(0x52, 0); | 337 | _lcd_write_reg(0x51, 0xef) |
314 | lcd_write_reg(0x53, 0x13f); | 338 | _lcd_write_reg(0x52, 0) |
315 | lcd_write_reg(0x60, 0xa700); | 339 | _lcd_write_reg(0x53, 0x13f) |
316 | lcd_write_reg(0x61, 1); | 340 | _lcd_write_reg(0x60, 0xa700) |
317 | lcd_write_reg(0x6a, 1); | 341 | _lcd_write_reg(0x61, 1) |
318 | lcd_write_reg(0x2b, 0xd); | 342 | _lcd_write_reg(0x6a, 1) |
319 | mdelay(50); | 343 | _lcd_write_reg(0x2b, 0xd) |
320 | lcd_write_reg(0x90, 0x11); | 344 | _mdelay(50) |
321 | lcd_write_reg(0x92, 0x600); | 345 | _lcd_write_reg(0x90, 0x11) |
322 | lcd_write_reg(0x93, 3); | 346 | _lcd_write_reg(0x92, 0x600) |
323 | lcd_write_reg(0x95, 0x110); | 347 | _lcd_write_reg(0x93, 3) |
324 | lcd_write_reg(0x97, 0); | 348 | _lcd_write_reg(0x95, 0x110) |
325 | lcd_write_reg(0x98, 0); | 349 | _lcd_write_reg(0x97, 0) |
326 | lcd_write_reg(7, 0x173); | 350 | _lcd_write_reg(0x98, 0) |
327 | lcd_write_reg(0x22, 0); | 351 | _lcd_write_reg(7, 0x173) |
352 | _lcd_write_reg(0x22, 0) | ||
353 | _end_seq() | ||
328 | } | 354 | } |
329 | 355 | ||
330 | void lcd_init_device(void) | 356 | void lcd_init_device(void) |
331 | { | 357 | { |
332 | setup_lcdif(); | 358 | setup_lcdif(); |
333 | setup_lcdif_clock(); | 359 | setup_lcdif_clock(); |
334 | 360 | ||
335 | for(int i = 0; i < 10; i++) | 361 | for(int i = 0; i < 10; i++) |
336 | { | 362 | { |
337 | uint32_t kind = lcd_read_reg(0); | 363 | lcd_kind = lcd_read_reg(0); |
338 | if(kind == LCD_KIND_7783 || kind == LCD_KIND_9325) | 364 | if(lcd_kind == LCD_KIND_7783 || lcd_kind == LCD_KIND_9325) |
339 | { | ||
340 | lcd_kind = kind; | ||
341 | break; | 365 | break; |
342 | } | ||
343 | else | ||
344 | { | ||
345 | lcd_kind = LCD_KIND_OTHER; | ||
346 | } | ||
347 | } | 366 | } |
348 | mdelay(5); | 367 | mdelay(5); |
349 | switch(lcd_kind) | 368 | switch(lcd_kind) |
@@ -351,6 +370,7 @@ void lcd_init_device(void) | |||
351 | case LCD_KIND_7783: lcd_init_seq_7783(); break; | 370 | case LCD_KIND_7783: lcd_init_seq_7783(); break; |
352 | case LCD_KIND_9325: lcd_init_seq_9325(); break; | 371 | case LCD_KIND_9325: lcd_init_seq_9325(); break; |
353 | default: | 372 | default: |
373 | lcd_kind = LCD_KIND_9325; | ||
354 | lcd_init_seq_7783(); break; | 374 | lcd_init_seq_7783(); break; |
355 | } | 375 | } |
356 | } | 376 | } |
@@ -360,30 +380,34 @@ static void lcd_enable_7783(bool enable) | |||
360 | { | 380 | { |
361 | if(!enable) | 381 | if(!enable) |
362 | { | 382 | { |
363 | lcd_write_reg(7, 0x131); | 383 | _begin_seq() |
364 | mdelay(50); | 384 | _lcd_write_reg(7, 0x131) |
365 | lcd_write_reg(7, 0x20); | 385 | _mdelay(50) |
366 | mdelay(50); | 386 | _lcd_write_reg(7, 0x20) |
367 | lcd_write_reg(0x10, 0x82); | 387 | _mdelay(50) |
368 | mdelay(50); | 388 | _lcd_write_reg(0x10, 0x82) |
389 | _mdelay(50) | ||
390 | _end_seq() | ||
369 | } | 391 | } |
370 | else | 392 | else |
371 | { | 393 | { |
372 | lcd_write_reg(0x11, 5); | 394 | _begin_seq() |
373 | lcd_write_reg(0x10, 0x12b0); | 395 | _lcd_write_reg(0x11, 5) |
374 | mdelay(50); | 396 | _lcd_write_reg(0x10, 0x12b0) |
375 | lcd_write_reg(7, 0x11); | 397 | _mdelay(50) |
376 | mdelay(50); | 398 | _lcd_write_reg(7, 0x11) |
377 | lcd_write_reg(0x12, 0x89); | 399 | _mdelay(50) |
378 | mdelay(50); | 400 | _lcd_write_reg(0x12, 0x89) |
379 | lcd_write_reg(0x13, 0x1d00); | 401 | _mdelay(50) |
380 | mdelay(50); | 402 | _lcd_write_reg(0x13, 0x1d00) |
381 | lcd_write_reg(0x29, 0x2f); | 403 | _mdelay(50) |
382 | mdelay(50); | 404 | _lcd_write_reg(0x29, 0x2f) |
383 | lcd_write_reg(0x2b, 0xa); | 405 | _mdelay(50) |
384 | lcd_write_reg(7, 0x133); | 406 | _lcd_write_reg(0x2b, 0xa) |
385 | mdelay(50); | 407 | _lcd_write_reg(7, 0x133) |
386 | lcd_write_reg(0x22, 0); | 408 | _mdelay(50) |
409 | _lcd_write_reg(0x22, 0) | ||
410 | _end_seq() | ||
387 | } | 411 | } |
388 | } | 412 | } |
389 | 413 | ||
@@ -391,36 +415,40 @@ static void lcd_enable_9325(bool enable) | |||
391 | { | 415 | { |
392 | if(!enable) | 416 | if(!enable) |
393 | { | 417 | { |
394 | lcd_write_reg(7, 0x131); | 418 | _begin_seq() |
395 | mdelay(10); | 419 | _lcd_write_reg(7, 0x131) |
396 | lcd_write_reg(7, 0x130); | 420 | _mdelay(10) |
397 | mdelay(10); | 421 | _lcd_write_reg(7, 0x130) |
398 | lcd_write_reg(7, 0); | 422 | _mdelay(10) |
399 | lcd_write_reg(0x10, 0x80); | 423 | _lcd_write_reg(7, 0) |
400 | lcd_write_reg(0x11, 0); | 424 | _lcd_write_reg(0x10, 0x80) |
401 | lcd_write_reg(0x12, 0); | 425 | _lcd_write_reg(0x11, 0) |
402 | lcd_write_reg(0x13, 0); | 426 | _lcd_write_reg(0x12, 0) |
403 | mdelay(200); | 427 | _lcd_write_reg(0x13, 0) |
404 | lcd_write_reg(0x10, 0x82); | 428 | _mdelay(200) |
429 | _lcd_write_reg(0x10, 0x82) | ||
430 | _end_seq() | ||
405 | } | 431 | } |
406 | else | 432 | else |
407 | { | 433 | { |
408 | lcd_write_reg(0x10, 0x80); | 434 | _begin_seq() |
409 | lcd_write_reg(0x11, 0); | 435 | _lcd_write_reg(0x10, 0x80) |
410 | lcd_write_reg(0x12, 0); | 436 | _lcd_write_reg(0x11, 0) |
411 | lcd_write_reg(0x13, 0); | 437 | _lcd_write_reg(0x12, 0) |
412 | lcd_write_reg(7, 1); | 438 | _lcd_write_reg(0x13, 0) |
413 | mdelay(200); | 439 | _lcd_write_reg(7, 1) |
414 | lcd_write_reg(0x10, 0x1290); | 440 | _mdelay(200) |
415 | lcd_write_reg(0x11, 7); | 441 | _lcd_write_reg(0x10, 0x1290) |
416 | mdelay(50); | 442 | _lcd_write_reg(0x11, 7) |
417 | lcd_write_reg(0x12, 0x19); | 443 | _mdelay(50) |
418 | mdelay(50); | 444 | _lcd_write_reg(0x12, 0x19) |
419 | lcd_write_reg(0x13, 0x1700); | 445 | _mdelay(50) |
420 | lcd_write_reg(0x29, 0x10); | 446 | _lcd_write_reg(0x13, 0x1700) |
421 | mdelay(50); | 447 | _lcd_write_reg(0x29, 0x10) |
422 | lcd_write_reg(7, 0x133); | 448 | _mdelay(50) |
423 | lcd_write_reg(0x22, 0); | 449 | _lcd_write_reg(7, 0x133) |
450 | _lcd_write_reg(0x22, 0) | ||
451 | _end_seq() | ||
424 | } | 452 | } |
425 | } | 453 | } |
426 | 454 | ||