Index: firmware/export/config-e200.h =================================================================== --- firmware/export/config-e200.h (Revision 16053) +++ firmware/export/config-e200.h (Arbeitskopie) @@ -32,6 +32,9 @@ /* define this if you have a light associated with the buttons */ #define HAVE_BUTTON_LIGHT +/* define this if the backlight thread is used for fade */ +#define HAVE_BACKLIGHT_THREAD_FADING + /* define this if you have access to the quickscreen */ #define HAVE_QUICKSCREEN Index: firmware/backlight.c =================================================================== --- firmware/backlight.c (Revision 16053) +++ firmware/backlight.c (Arbeitskopie) @@ -106,6 +106,10 @@ BUTTON_LIGHT_ON, BUTTON_LIGHT_OFF, #endif +#ifdef HAVE_BACKLIGHT_THREAD_FADING + BACKLIGHT_FADE_UP, + BACKLIGHT_FADE_DOWN, +#endif }; static void backlight_thread(void); @@ -387,12 +391,20 @@ if (backlight_timeout < 0) { backlight_timer = 0; /* Disable the timeout */ +#ifdef HAVE_BACKLIGHT_THREAD_FADING + queue_post(&backlight_queue, BACKLIGHT_FADE_DOWN, 0); +#else _backlight_off(); +#endif } else { backlight_timer = backlight_timeout; +#ifdef HAVE_BACKLIGHT_THREAD_FADING + queue_post(&backlight_queue, BACKLIGHT_FADE_UP, 0); +#else _backlight_on(); +#endif } } @@ -501,10 +513,53 @@ case BACKLIGHT_OFF: backlight_timer = 0; /* Disable the timeout */ +#ifdef HAVE_BACKLIGHT_THREAD_FADING + queue_post(&backlight_queue, BACKLIGHT_FADE_DOWN, 0); +#else _backlight_off(); +#endif break; - +#ifdef HAVE_BACKLIGHT_THREAD_FADING + case BACKLIGHT_FADE_UP: + { + bool finished = false; + if (!ev.data || TIME_AFTER(current_tick, ev.data)) + { + ev.data = current_tick + HZ/25; + finished = __backlight_fade_up(); + } + if (!finished) + { + queue_remove_from_head(&backlight_queue, BACKLIGHT_FADE_DOWN); /* cancel fade-down */ + queue_post(&backlight_queue, BACKLIGHT_FADE_UP, ev.data); + } + + break; + } + case BACKLIGHT_FADE_DOWN: + { + bool finished = false; + if (!ev.data || TIME_AFTER(current_tick, ev.data)) + { + ev.data = current_tick + HZ/25; + finished = __backlight_fade_down(); + } + if (!finished) + queue_post(&backlight_queue, BACKLIGHT_FADE_DOWN, ev.data); #ifdef HAVE_LCD_SLEEP + else + { + if (_lcd_sleep_timeout < 0) + { + _lcd_sleep_timer = 0; /* Setting == Always */ + lcd_sleep(); + } + } +#endif /* HAVE_LCD_SLEEP */ + break; + } +#endif /* HAVE_BACKLIGHT_THREAD_FADING */ +#ifdef HAVE_LCD_SLEEP case LCD_SLEEP: lcd_sleep(); break; Index: firmware/target/arm/sandisk/backlight-c200_e200.c =================================================================== --- firmware/target/arm/sandisk/backlight-c200_e200.c (Revision 16053) +++ firmware/target/arm/sandisk/backlight-c200_e200.c (Arbeitskopie) @@ -25,10 +25,12 @@ #include "as3514.h" static unsigned short backlight_brightness = DEFAULT_BRIGHTNESS_SETTING; +static unsigned short current_brightness = DEFAULT_BRIGHTNESS_SETTING; void _backlight_set_brightness(int brightness) { backlight_brightness = brightness; + current_brightness = brightness; if (brightness > 0) _backlight_on(); @@ -45,11 +47,13 @@ _lcd_sleep_timer = 0; /* LCD should be awake already */ #endif pp_i2c_send(AS3514_I2C_ADDR, DCDC15, backlight_brightness); + current_brightness = backlight_brightness; } void _backlight_off(void) { pp_i2c_send(AS3514_I2C_ADDR, DCDC15, 0x0); + current_brightness = 0; #ifdef HAVE_LCD_ENABLE lcd_enable(false); /* power off lcd */ #endif @@ -80,3 +84,30 @@ GPIO_CLEAR_BITWISE(GPIOB_OUTPUT_VAL, 0x10); /* The "menu" backlight */ #endif } + +/* returns true if fade is finished */ +bool __backlight_fade_up(void) +{ +#ifdef HAVE_LCD_ENABLE + lcd_enable(true); /* power on lcd */ +#endif + if (current_brightness < backlight_brightness) + { + pp_i2c_send(AS3514_I2C_ADDR, DCDC15, current_brightness++); + } + return current_brightness >= backlight_brightness; +} + +bool __backlight_fade_down(void) +{ + if (current_brightness > 0) + { + pp_i2c_send(AS3514_I2C_ADDR, DCDC15, current_brightness--); + } + if (current_brightness == 0) + { + _backlight_off(); + return true; + } + return false; +} Index: firmware/target/arm/sandisk/backlight-target.h =================================================================== --- firmware/target/arm/sandisk/backlight-target.h (Revision 16053) +++ firmware/target/arm/sandisk/backlight-target.h (Arbeitskopie) @@ -18,6 +18,7 @@ ****************************************************************************/ #ifndef BACKLIGHT_TARGET_H #define BACKLIGHT_TARGET_H +#include "stdbool.h" #define _backlight_init() true void _backlight_on(void); @@ -25,6 +26,10 @@ void _backlight_set_brightness(int brightness); int __backlight_is_on(void); +/* these both return true if the fade is finished */ +bool __backlight_fade_up(void); +bool __backlight_fade_down(void); + void _buttonlight_on(void); void _buttonlight_off(void); #endif