Index: firmware/export/config-e200.h =================================================================== --- firmware/export/config-e200.h (Revision 17138) +++ 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 17138) +++ firmware/backlight.c (Arbeitskopie) @@ -104,6 +104,9 @@ BUTTON_LIGHT_ON, BUTTON_LIGHT_OFF, #endif +#if defined(HAVE_BACKLIGHT_THREAD_FADING) && !defined(SIMULATOR) + BACKLIGHT_FADE, +#endif }; static void backlight_thread(void); @@ -362,6 +365,30 @@ } #endif /* defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) */ +#if defined(HAVE_BACKLIGHT_THREAD_FADING) && !defined(SIMULATOR) +static int backlight_fade_state = 0; /* 0=not fading, 1=fading up, 2=fading down */ +static unsigned int backlight_fade_counter = 0; + +static void _backlight_on(void) +{ + if (!backlight_fade_state) + { +#ifdef HAVE_LCD_ENABLE + lcd_enable(true); /* power on lcd, this takes some time */ +#endif + backlight_fade_counter = 0; + } + backlight_fade_state = 1; +} + +static void _backlight_off(void) +{ + if (!backlight_fade_state) + backlight_fade_counter = 0; + backlight_fade_state = 2; +} +#endif + /* Update state of backlight according to timeout setting */ static void backlight_update_state(void) { @@ -519,7 +546,20 @@ backlight_timer = 0; /* Disable the timeout */ _backlight_off(); break; - +#if defined(HAVE_BACKLIGHT_THREAD_FADING) && !defined(SIMULATOR) + case BACKLIGHT_FADE: + if (backlight_fade_state == 1) + { + if (__backlight_fade_up()) + backlight_fade_state = 0; + } + else if (backlight_fade_state == 2) + { + if (__backlight_fade_down()) + backlight_fade_state = 0; + } + break; +#endif /* defined(HAVE_BACKLIGHT_THREAD_FADING) && !defined(SIMULATOR) */ #ifdef HAVE_LCD_SLEEP case LCD_SLEEP: lcd_sleep(); @@ -573,7 +613,10 @@ } } #endif /* HAVE_LCD_SLEEP */ - +#if defined(HAVE_BACKLIGHT_THREAD_FADING) && !defined(SIMULATOR) + if (backlight_fade_state && (++backlight_fade_counter % (HZ/25) == 0)) + queue_post(&backlight_queue, BACKLIGHT_FADE, 0); +#endif #ifdef HAVE_REMOTE_LCD if(remote_backlight_timer) { Index: firmware/target/arm/sandisk/backlight-c200_e200.c =================================================================== --- firmware/target/arm/sandisk/backlight-c200_e200.c (Revision 17138) +++ firmware/target/arm/sandisk/backlight-c200_e200.c (Arbeitskopie) @@ -25,17 +25,8 @@ #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; - - if (brightness > 0) - _backlight_on(); - else - _backlight_off(); -} - void _backlight_on(void) { #ifdef HAVE_LCD_ENABLE @@ -45,11 +36,13 @@ _lcd_sleep_timer = 0; /* LCD should be awake already */ #endif pp_i2c_send(AS3514_I2C_ADDR, AS3514_DCDC15, backlight_brightness); + current_brightness = backlight_brightness; } void _backlight_off(void) { pp_i2c_send(AS3514_I2C_ADDR, AS3514_DCDC15, 0x0); + current_brightness = 0; #ifdef HAVE_LCD_ENABLE lcd_enable(false); /* power off lcd */ #endif @@ -65,6 +58,17 @@ #endif } +void _backlight_set_brightness(int brightness) +{ + backlight_brightness = brightness; + current_brightness = brightness; + + if (brightness > 0) + _backlight_on(); + else + _backlight_off(); +} + void _buttonlight_on(void) { GPIO_SET_BITWISE(GPIOG_OUTPUT_VAL, 0x80); @@ -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, AS3514_DCDC15, ++current_brightness); + } + return current_brightness >= backlight_brightness; +} + +bool __backlight_fade_down(void) +{ + if (current_brightness > 0) + { + pp_i2c_send(AS3514_I2C_ADDR, AS3514_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 17138) +++ firmware/target/arm/sandisk/backlight-target.h (Arbeitskopie) @@ -18,13 +18,21 @@ ****************************************************************************/ #ifndef BACKLIGHT_TARGET_H #define BACKLIGHT_TARGET_H +#include "stdbool.h" #define _backlight_init() true + +#ifndef HAVE_BACKLIGHT_THREAD_FADING void _backlight_on(void); void _backlight_off(void); +#endif 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