diff options
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/sandisk/sansa-e200/backlight-e200.c | 15 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/sansa-e200/lcd-e200.c | 79 |
2 files changed, 51 insertions, 43 deletions
diff --git a/firmware/target/arm/sandisk/sansa-e200/backlight-e200.c b/firmware/target/arm/sandisk/sansa-e200/backlight-e200.c index b608c1b9e6..29c6ab4b45 100644 --- a/firmware/target/arm/sandisk/sansa-e200/backlight-e200.c +++ b/firmware/target/arm/sandisk/sansa-e200/backlight-e200.c | |||
@@ -23,32 +23,27 @@ | |||
23 | #include "i2c-pp.h" | 23 | #include "i2c-pp.h" |
24 | 24 | ||
25 | static unsigned short backlight_brightness = DEFAULT_BRIGHTNESS_SETTING; | 25 | static unsigned short backlight_brightness = DEFAULT_BRIGHTNESS_SETTING; |
26 | static bool backlight_is_on = true; | ||
27 | |||
28 | int __backlight_is_on(void) | ||
29 | { | ||
30 | return (int)backlight_is_on; | ||
31 | } | ||
32 | 26 | ||
33 | void __backlight_set_brightness(int brightness) | 27 | void __backlight_set_brightness(int brightness) |
34 | { | 28 | { |
35 | backlight_brightness = brightness; | 29 | backlight_brightness = brightness; |
36 | pp_i2c_send( 0x46, 0x23, backlight_brightness); | 30 | |
37 | backlight_is_on = true; | 31 | if (brightness > 0) |
32 | __backlight_on(); | ||
33 | else | ||
34 | __backlight_off(); | ||
38 | } | 35 | } |
39 | 36 | ||
40 | void __backlight_on(void) | 37 | void __backlight_on(void) |
41 | { | 38 | { |
42 | lcd_enable(true); /* power on lcd */ | 39 | lcd_enable(true); /* power on lcd */ |
43 | pp_i2c_send( 0x46, 0x23, backlight_brightness); | 40 | pp_i2c_send( 0x46, 0x23, backlight_brightness); |
44 | backlight_is_on = true; | ||
45 | } | 41 | } |
46 | 42 | ||
47 | void __backlight_off(void) | 43 | void __backlight_off(void) |
48 | { | 44 | { |
49 | pp_i2c_send( 0x46, 0x23, 0x0); | 45 | pp_i2c_send( 0x46, 0x23, 0x0); |
50 | lcd_enable(false); /* power off lcd */ | 46 | lcd_enable(false); /* power off lcd */ |
51 | backlight_is_on = false; | ||
52 | } | 47 | } |
53 | 48 | ||
54 | 49 | ||
diff --git a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c index 8dc8ad95e9..86f12567b4 100644 --- a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c +++ b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c | |||
@@ -294,14 +294,20 @@ inline void lcd_init_device(void) | |||
294 | lcd_write_reg(R_DISP_CONTROL1, 0x0077); | 294 | lcd_write_reg(R_DISP_CONTROL1, 0x0077); |
295 | 295 | ||
296 | lcd_send_msg(0x70, R_RAM_WRITE_DATA); | 296 | lcd_send_msg(0x70, R_RAM_WRITE_DATA); |
297 | |||
298 | LCD_REG_6 |= 1; /* Start DMA */ | ||
297 | } | 299 | } |
298 | 300 | ||
299 | void lcd_enable(bool on) | 301 | void lcd_enable(bool on) |
300 | { | 302 | { |
301 | if(on) | 303 | if(on) |
302 | { | 304 | { |
303 | DEV_EN |= DEV_LCD; /* Enable LCD controller */ | 305 | if(!(DEV_EN & DEV_LCD)) |
304 | LCD_REG_6 |= 1; /* Enable DMA */ | 306 | { |
307 | DEV_EN |= DEV_LCD; /* Enable LCD controller */ | ||
308 | lcd_update(); /* Resync display */ | ||
309 | LCD_REG_6 |= 1; /* Restart DMA */ | ||
310 | } | ||
305 | } | 311 | } |
306 | else | 312 | else |
307 | { | 313 | { |
@@ -314,47 +320,51 @@ void lcd_enable(bool on) | |||
314 | } | 320 | } |
315 | } | 321 | } |
316 | 322 | ||
317 | inline void lcd_update_rect(int x, int y, int width, int height) | 323 | void lcd_update_rect(int x, int y, int width, int height) |
318 | { | 324 | { |
319 | (void)x; | 325 | (void)x; |
320 | (void)width; | 326 | (void)width; |
321 | 327 | ||
322 | if(__backlight_is_on()) | 328 | if(DEV_EN & DEV_LCD) |
323 | { | 329 | { |
330 | #if 0 | ||
324 | /* Turn off DMA and wait for the transfer to complete */ | 331 | /* Turn off DMA and wait for the transfer to complete */ |
325 | /* TODO: Work out the proper delay */ | 332 | /* TODO: Work out the proper delay */ |
326 | LCD_REG_6 &= ~1; | 333 | LCD_REG_6 &= ~1; |
327 | udelay(1000); | 334 | udelay(1000); |
328 | 335 | #endif | |
329 | /* Copy the Rockbox framebuffer to the second framebuffer */ | 336 | /* Copy the Rockbox framebuffer to the second framebuffer */ |
330 | /* TODO: Move the second framebuffer into uncached SDRAM */ | 337 | /* TODO: Move the second framebuffer into uncached SDRAM */ |
331 | memcpy(((char*)&lcd_driver_framebuffer)+(y * sizeof(fb_data) * LCD_WIDTH), | 338 | memcpy(((char*)&lcd_driver_framebuffer)+(y * sizeof(fb_data) * LCD_WIDTH), |
332 | ((char *)&lcd_framebuffer)+(y * sizeof(fb_data) * LCD_WIDTH), | 339 | ((char *)&lcd_framebuffer)+(y * sizeof(fb_data) * LCD_WIDTH), |
333 | ((height * sizeof(fb_data) * LCD_WIDTH))); | 340 | ((height * sizeof(fb_data) * LCD_WIDTH))); |
334 | flush_icache(); | 341 | flush_icache(); |
335 | 342 | #if 0 | |
336 | /* Restart DMA */ | 343 | /* Restart DMA */ |
337 | LCD_REG_6 |= 1; | 344 | LCD_REG_6 |= 1; |
345 | #endif | ||
338 | } | 346 | } |
339 | } | 347 | } |
340 | 348 | ||
341 | inline void lcd_update(void) | 349 | void lcd_update(void) |
342 | { | 350 | { |
343 | if(__backlight_is_on()) | 351 | if(DEV_EN & DEV_LCD) |
344 | { | 352 | { |
345 | /* TODO: It may be faster to swap the addresses of lcd_driver_framebuffer | 353 | /* TODO: It may be faster to swap the addresses of lcd_driver_framebuffer |
346 | * and lcd_framebuffer */ | 354 | * and lcd_framebuffer */ |
355 | #if 0 | ||
347 | /* Turn off DMA and wait for the transfer to complete */ | 356 | /* Turn off DMA and wait for the transfer to complete */ |
348 | LCD_REG_6 &= ~1; | 357 | LCD_REG_6 &= ~1; |
349 | udelay(1000); | 358 | udelay(1000); |
350 | 359 | #endif | |
351 | /* Copy the Rockbox framebuffer to the second framebuffer */ | 360 | /* Copy the Rockbox framebuffer to the second framebuffer */ |
352 | memcpy(lcd_driver_framebuffer, lcd_framebuffer, | 361 | memcpy(lcd_driver_framebuffer, lcd_framebuffer, |
353 | sizeof(fb_data) * LCD_WIDTH * LCD_HEIGHT); | 362 | sizeof(fb_data) * LCD_WIDTH * LCD_HEIGHT); |
354 | flush_icache(); | 363 | flush_icache(); |
355 | 364 | #if 0 | |
356 | /* Restart DMA */ | 365 | /* Restart DMA */ |
357 | LCD_REG_6 |= 1; | 366 | LCD_REG_6 |= 1; |
367 | #endif | ||
358 | } | 368 | } |
359 | } | 369 | } |
360 | 370 | ||
@@ -407,32 +417,35 @@ void lcd_yuv_blit(unsigned char * const src[3], | |||
407 | int src_x, int src_y, int stride, | 417 | int src_x, int src_y, int stride, |
408 | int x, int y, int width, int height) | 418 | int x, int y, int width, int height) |
409 | { | 419 | { |
410 | /* Caches for chroma data so it only need be recaculated every other | 420 | if(DEV_EN & DEV_LCD) |
411 | line */ | 421 | { |
412 | static unsigned char chroma_buf[LCD_HEIGHT/2*3]; /* 330 bytes */ | 422 | /* Caches for chroma data so it only need be recaculated every other |
413 | unsigned char const * yuv_src[3]; | 423 | line */ |
414 | off_t z; | 424 | static unsigned char chroma_buf[LCD_HEIGHT/2*3]; /* 330 bytes */ |
425 | unsigned char const * yuv_src[3]; | ||
426 | off_t z; | ||
415 | 427 | ||
416 | /* Sorry, but width and height must be >= 2 or else */ | 428 | /* Sorry, but width and height must be >= 2 or else */ |
417 | width &= ~1; | 429 | width &= ~1; |
418 | height >>= 1; | 430 | height >>= 1; |
419 | 431 | ||
420 | fb_data *dst = (fb_data*)lcd_driver_framebuffer + | 432 | fb_data *dst = (fb_data*)lcd_driver_framebuffer + |
421 | x * LCD_WIDTH + (LCD_WIDTH - y) - 1; | 433 | x * LCD_WIDTH + (LCD_WIDTH - y) - 1; |
422 | 434 | ||
423 | z = stride*src_y; | 435 | z = stride*src_y; |
424 | yuv_src[0] = src[0] + z + src_x; | 436 | yuv_src[0] = src[0] + z + src_x; |
425 | yuv_src[1] = src[1] + (z >> 2) + (src_x >> 1); | 437 | yuv_src[1] = src[1] + (z >> 2) + (src_x >> 1); |
426 | yuv_src[2] = src[2] + (yuv_src[1] - src[1]); | 438 | yuv_src[2] = src[2] + (yuv_src[1] - src[1]); |
427 | 439 | ||
428 | do | 440 | do |
429 | { | 441 | { |
430 | lcd_write_yuv420_lines(dst, chroma_buf, yuv_src, width, | 442 | lcd_write_yuv420_lines(dst, chroma_buf, yuv_src, width, |
431 | stride); | 443 | stride); |
432 | yuv_src[0] += stride << 1; /* Skip down two luma lines */ | 444 | yuv_src[0] += stride << 1; /* Skip down two luma lines */ |
433 | yuv_src[1] += stride >> 1; /* Skip down one chroma line */ | 445 | yuv_src[1] += stride >> 1; /* Skip down one chroma line */ |
434 | yuv_src[2] += stride >> 1; | 446 | yuv_src[2] += stride >> 1; |
435 | dst -= 2; | 447 | dst -= 2; |
448 | } | ||
449 | while (--height > 0); | ||
436 | } | 450 | } |
437 | while (--height > 0); | ||
438 | } | 451 | } |