Index: firmware/export/config-e200.h =================================================================== --- firmware/export/config-e200.h (revision 13963) +++ firmware/export/config-e200.h (working copy) @@ -57,6 +57,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 13963) +++ firmware/backlight.c (working copy) @@ -75,24 +75,35 @@ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 45, 60, 90 }; -#define BACKLIGHT_ON 1 -#define BACKLIGHT_OFF 2 -#define REMOTE_BACKLIGHT_ON 3 -#define REMOTE_BACKLIGHT_OFF 4 -#define BACKLIGHT_UNBOOST_CPU 5 +enum { + BACKLIGHT_ON = 1, + BACKLIGHT_OFF, +#ifdef HAVE_REMOTE_LCD + REMOTE_BACKLIGHT_ON, + REMOTE_BACKLIGHT_OFF, +#endif +#if defined(HAVE_BACKLIGHT_PWM_FADING) && defined(CPU_COLDFIRE) \ + && !defined(SIMULATOR) + BACKLIGHT_UNBOOST_CPU, +#endif #ifdef HAVE_LCD_SLEEP -#define LCD_SLEEP 6 + LCD_SLEEP, #endif #ifdef HAVE_BUTTON_LIGHT -#define BUTTON_LIGHT_ON 7 -#define BUTTON_LIGHT_OFF 8 + BUTTON_LIGHT_ON, + BUTTON_LIGHT_OFF, #endif +#ifdef HAVE_BACKLIGHT_THREAD_FADING + BACKLIGHT_FADE_UP, + BACKLIGHT_FADE_DOWN, +#endif +#ifdef X5_BACKLIGHT_SHUTDOWN + BACKLIGHT_QUIT, +#endif +}; static void backlight_thread(void); static long backlight_stack[DEFAULT_STACK_SIZE/sizeof(long)]; -#ifdef X5_BACKLIGHT_SHUTDOWN -#define BACKLIGHT_QUIT 256 -#endif static const char backlight_thread_name[] = "backlight"; static struct event_queue backlight_queue; @@ -338,6 +349,8 @@ bl_dim_target = bl_dim_current = BL_PWM_COUNT; __backlight_on(); } +#elif defined(HAVE_BACKLIGHT_THREAD_FADING) + queue_post(&backlight_queue, BACKLIGHT_FADE_UP, 0); #elif defined(HAVE_BACKLIGHT_SET_FADING) && !defined(SIMULATOR) /* call the enable from here - it takes longer than the disable */ lcd_enable(true); @@ -360,6 +373,8 @@ bl_dim_target = bl_dim_current = 0; __backlight_off(); } +#elif defined(HAVE_BACKLIGHT_THREAD_FADING) + queue_post(&backlight_queue, BACKLIGHT_FADE_DOWN, 0); #elif defined(HAVE_BACKLIGHT_SET_FADING) && !defined(SIMULATOR) __backlight_dim(true); #else @@ -370,8 +385,10 @@ /* Start LCD sleep countdown */ if (lcd_sleep_timeout < 0) { +#ifndef HAVE_BACKLIGHT_THREAD_FADING /* will sleep when fade is finished */ lcd_sleep_timer = 0; /* Setting == Always */ lcd_sleep(); +#endif } else lcd_sleep_timer = lcd_sleep_timeout; @@ -516,8 +533,49 @@ #endif _backlight_off(); break; - +#ifdef HAVE_BACKLIGHT_THREAD_FADING + case BACKLIGHT_FADE_UP: + { + bool finished = false; + if (!ev.data || TIME_AFTER(current_tick, ev.data)) + finished = __backlight_fade_up(); + if (!finished) + { + queue_remove_from_head(&backlight_queue, BACKLIGHT_FADE_UP); + queue_remove_from_head(&backlight_queue, BACKLIGHT_FADE_DOWN); + queue_post(&backlight_queue, BACKLIGHT_FADE_UP, 0); + } + // current_tick+HZ/25); + break; + } + case BACKLIGHT_FADE_DOWN: + { + bool finished = false; + if (!ev.data || TIME_AFTER(current_tick, ev.data)) + finished = __backlight_fade_down(); #ifdef HAVE_LCD_SLEEP + if (finished) + { + if (lcd_sleep_timeout < 0) + { + lcd_sleep_timer = 0; /* Setting == Always */ + lcd_sleep(); + } + } + else +#else + if (!finished) +#endif /* HAVE_LCD_SLEEP */ + { + queue_remove_from_head(&backlight_queue, BACKLIGHT_FADE_UP); + queue_remove_from_head(&backlight_queue, BACKLIGHT_FADE_DOWN); + queue_post(&backlight_queue, BACKLIGHT_FADE_DOWN, 0); + } + //current_tick+HZ/25); + break; + } +#endif /* HAVE_BACKLIGHT_THREAD_FADING */ +#ifdef HAVE_LCD_SLEEP case LCD_SLEEP: lcd_sleep(); break; Index: firmware/target/arm/sandisk/sansa-e200/backlight-target.h =================================================================== --- firmware/target/arm/sandisk/sansa-e200/backlight-target.h (revision 13963) +++ firmware/target/arm/sandisk/sansa-e200/backlight-target.h (working copy) @@ -18,13 +18,17 @@ ****************************************************************************/ #ifndef BACKLIGHT_TARGET_H #define BACKLIGHT_TARGET_H +#include "stdbool.h" #define __backlight_init() true void __backlight_on(void); void __backlight_off(void); 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 __button_backlight_on(void); void __button_backlight_off(void); #endif Index: firmware/target/arm/sandisk/sansa-e200/backlight-e200.c =================================================================== --- firmware/target/arm/sandisk/sansa-e200/backlight-e200.c (revision 13963) +++ firmware/target/arm/sandisk/sansa-e200/backlight-e200.c (working copy) @@ -23,11 +23,12 @@ #include "i2c-pp.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(); else @@ -38,11 +39,13 @@ { lcd_enable(true); /* power on lcd */ pp_i2c_send( 0x46, 0x23, backlight_brightness); + current_brightness = backlight_brightness; } void __backlight_off(void) { pp_i2c_send( 0x46, 0x23, 0x0); + current_brightness = 0; lcd_enable(false); /* power off lcd */ } @@ -56,3 +59,28 @@ { GPIOG_OUTPUT_VAL &=~ 0x80; } + +/* returns true if fade is finished */ +bool __backlight_fade_up(void) +{ + lcd_enable(true); /* power on lcd */ + if (current_brightness < backlight_brightness) + { + pp_i2c_send( 0x46, 0x23, current_brightness++); + } + return current_brightness >= backlight_brightness; +} + +bool __backlight_fade_down(void) +{ + if (current_brightness > 0) + { + pp_i2c_send( 0x46, 0x23, current_brightness--); + } + if (current_brightness == 0) + { + lcd_enable(false); /* power down the lcd */ + return true; + } + return false; +}