Index: apps/settings.c =================================================================== --- apps/settings.c (Revision 19145) +++ apps/settings.c (Arbeitskopie) @@ -768,7 +768,8 @@ #if CONFIG_CHARGING backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged); #endif -#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) +#if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) \ + || defined(USE_BACKLIGHT_THREAD_FADING) backlight_set_fade_in(global_settings.backlight_fade_in); backlight_set_fade_out(global_settings.backlight_fade_out); #endif Index: apps/settings.h =================================================================== --- apps/settings.h (Revision 19145) +++ apps/settings.h (Arbeitskopie) @@ -416,10 +416,14 @@ int backlight_timeout_plugged; #endif -#ifdef HAVE_BACKLIGHT_PWM_FADING +#if defined(HAVE_BACKLIGHT_PWM_FADING) int backlight_fade_in; /* backlight fade in timing: 0..3 */ int backlight_fade_out; /* backlight fade in timing: 0..7 */ #endif +#ifdef USE_BACKLIGHT_THREAD_FADING + bool backlight_fade_in; + bool backlight_fade_out; +#endif #ifdef HAVE_BACKLIGHT_BRIGHTNESS int brightness; #endif Index: apps/menus/display_menu.c =================================================================== --- apps/menus/display_menu.c (Revision 19145) +++ apps/menus/display_menu.c (Arbeitskopie) @@ -91,7 +91,8 @@ &global_settings.backlight_on_button_hold, NULL); #endif MENUITEM_SETTING(caption_backlight, &global_settings.caption_backlight, NULL); -#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) +#if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) || \ + defined(USE_BACKLIGHT_THREAD_FADING) MENUITEM_SETTING(backlight_fade_in, &global_settings.backlight_fade_in, NULL); MENUITEM_SETTING(backlight_fade_out, &global_settings.backlight_fade_out, NULL); #endif @@ -130,9 +131,10 @@ ,&backlight_on_button_hold # endif ,&caption_backlight -# if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) +#if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) || \ + defined(USE_BACKLIGHT_THREAD_FADING) ,&backlight_fade_in, &backlight_fade_out -# endif +#endif ,&bl_filter_first_keypress # ifdef HAVE_LCD_SLEEP_SETTING ,&lcd_sleep_after_backlight_off Index: apps/settings_list.c =================================================================== --- apps/settings_list.c (Revision 19145) +++ apps/settings_list.c (Arbeitskopie) @@ -680,6 +680,12 @@ backlight_set_fade_out, 10, 0,100,200,300,500,1000,2000,3000,5000,10000), #endif +#ifdef USE_BACKLIGHT_THREAD_FADING + OFFON_SETTING(0, backlight_fade_in, LANG_BACKLIGHT_FADE_IN, + true, "backlight fade in", backlight_set_fade_in), + OFFON_SETTING(0, backlight_fade_out, LANG_BACKLIGHT_FADE_OUT, + true, "backlight fade out", backlight_set_fade_out), +#endif INT_SETTING(F_PADTITLE, scroll_speed, LANG_SCROLL_SPEED, 9,"scroll speed", UNIT_INT, 0, 15, 1, NULL, NULL, lcd_scroll_speed), INT_SETTING(F_PADTITLE, scroll_delay, LANG_SCROLL_DELAY, 1000, Index: apps/features.txt =================================================================== --- apps/features.txt (Revision 19145) +++ apps/features.txt (Arbeitskopie) @@ -20,7 +20,7 @@ backlight_brightness #endif -#if defined(HAVE_BACKLIGHT_PWM_FADING) +#if defined(HAVE_BACKLIGHT_PWM_FADING) || defined(USE_BACKLIGHT_THREAD_FADING) backlight_fade #endif Index: firmware/export/config-c200.h =================================================================== --- firmware/export/config-c200.h (Revision 19145) +++ firmware/export/config-c200.h (Arbeitskopie) @@ -132,6 +132,9 @@ /** Non-simulator section **/ #ifndef SIMULATOR +/* define this if the backlight thread is used for fade, not for sim */ +#define USE_BACKLIGHT_THREAD_FADING + /* Define this if you have a PortalPlayer PP5024 */ #define CONFIG_CPU PP5022 Index: firmware/export/config-e200.h =================================================================== --- firmware/export/config-e200.h (Revision 19145) +++ firmware/export/config-e200.h (Arbeitskopie) @@ -129,6 +129,9 @@ /** Non-simulator section **/ #ifndef SIMULATOR +/* define this if the backlight thread is used for fade, not for sim */ +//#define USE_BACKLIGHT_THREAD_FADING + /* Define this if you have a PortalPlayer PP5024 */ #define CONFIG_CPU PP5024 Index: firmware/export/backlight-thread-fading.h =================================================================== --- firmware/export/backlight-thread-fading.h (Revision 0) +++ firmware/export/backlight-thread-fading.h (Revision 0) @@ -0,0 +1,38 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id:$ + * + * Copyright (C) 2007 by Will Robertson + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef BACKLIGHT_THREAD_FADING_H + +#include "config.h" +#define BACKLIGHT_THREAD_FADING_H + +/* delay supposed to be MAX_BRIGHTNESS_SETTING*2 rounded to the next multiple + * of 5, however not more than 40 */ +#define _FADE_DELAY (((MAX_BRIGHTNESS_SETTING*2+4)/5)*5) +#define FADE_DELAY (MIN(_FADE_DELAY, 40)) + +#ifdef USE_BACKLIGHT_THREAD_FADING +bool _backlight_fade_up(void); +bool _backlight_fade_down(void); +void _backlight_thread_fade_reset(int brightness); +#endif /* USE_BACKLIGHT_THREAD_FADING */ + +#endif /* _BACKLIGHT_THREAD_FADING_ */ Index: firmware/export/backlight.h =================================================================== --- firmware/export/backlight.h (Revision 19145) +++ firmware/export/backlight.h (Arbeitskopie) @@ -34,10 +34,14 @@ int backlight_get_current_timeout(void); -#ifdef HAVE_BACKLIGHT_PWM_FADING +#if defined(HAVE_BACKLIGHT_PWM_FADING) void backlight_set_fade_in(int value); void backlight_set_fade_out(int value); #endif +#ifdef USE_BACKLIGHT_THREAD_FADING +void backlight_set_fade_in(bool value); +void backlight_set_fade_out(bool value); +#endif void backlight_set_timeout_plugged(int value); Index: firmware/export/config-h300.h =================================================================== --- firmware/export/config-h300.h (Revision 19145) +++ firmware/export/config-h300.h (Arbeitskopie) @@ -114,6 +114,9 @@ #ifndef SIMULATOR +/* define this if the backlight thread is used for fade, not for sim */ +#define USE_BACKLIGHT_THREAD_FADING + /* Define this if your LCD can be enabled/disabled */ #define HAVE_LCD_ENABLE Index: firmware/backlight-thread-fading.c =================================================================== --- firmware/backlight-thread-fading.c (Revision 0) +++ firmware/backlight-thread-fading.c (Revision 0) @@ -0,0 +1,74 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2008 by Thomas Martitz + * Copyright (C) 2008 by Martin Ritter + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include "backlight-target.h" +#include "config.h" +#include "lcd.h" +#include "backlight.h" + +/* To adapt a target do: + * - export the backlight_brightness (which is the brightness you've set in the + * settings) from the backlight driver + * - create and export a function named _backlight_set_brightness_fader, + * which should do exactly the same as _backlight_set_brightness, EXCEPT + * changing the backlight_brightness var and make sure + * - make sure _backlight_set_brightness changes backlight_brightness + * - #define USE_BACKLIGHT_THREAD_FADING in config-.h + */ + + +static int current_brightness = DEFAULT_BRIGHTNESS_SETTING; + +void _backlight_thread_fade_reset(int brightness) +{ + if (brightness) + current_brightness = brightness; + else + current_brightness = backlight_brightness; +} + +/* returns true if fade is finished */ +bool _backlight_fade_up(void) +{ + if (current_brightness < backlight_brightness) + { + _backlight_set_brightness_fader(++current_brightness); + } + return (current_brightness >= backlight_brightness); +} + +/* returns true if fade is finished */ +bool _backlight_fade_down(void) +{ + if (current_brightness > MIN_BRIGHTNESS_SETTING) + { + _backlight_set_brightness_fader(--current_brightness); + return false; + } + else + { + /* backlight of at the end of the down fading */ + _backlight_off(); + return true; + } +} Index: firmware/backlight.c =================================================================== --- firmware/backlight.c (Revision 19145) +++ firmware/backlight.c (Arbeitskopie) @@ -8,6 +8,7 @@ * $Id$ * * Copyright (C) 2002 by Linus Nielsen Feltzing + * Additional work by Martin Ritter (2008) - backlight thread fading * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -46,6 +47,10 @@ #define BACKLIGHT_FULL_INIT #endif +#ifdef USE_BACKLIGHT_THREAD_FADING +#include "backlight-thread-fading.h" +#endif + #ifdef SIMULATOR /* TODO: find a better way to do it but we need a kernel thread somewhere to handle this */ @@ -221,6 +226,21 @@ } #endif /* HAVE_LCD_SLEEP */ +#ifdef USE_BACKLIGHT_THREAD_FADING +/* enum used for both, fading state and fading type selected through the settings */ +enum { + NOT_FADING = 0, + FADING_UP, + FADING_DOWN, + FADING_ALWAYS, +}; + +static int backlight_thread_fading_type = FADING_ALWAYS; +static int backlight_fading_state = NOT_FADING; +static unsigned int backlight_fade_counter = 0; +#endif + + #if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) /* backlight fading */ #define BL_PWM_INTERVAL 5 /* Cycle interval in ms */ @@ -397,6 +417,64 @@ } #endif /* defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) */ +#ifdef USE_BACKLIGHT_THREAD_FADING + +void backlight_set_fade_out(bool value) +{ + if(value) /* on */ + backlight_thread_fading_type |= FADING_DOWN; + else + backlight_thread_fading_type &= FADING_UP; +} + +void backlight_set_fade_in(bool value) +{ + if(value) /* on */ + backlight_thread_fading_type |= FADING_UP; + else + backlight_thread_fading_type &= FADING_DOWN; +} + +static void backlight_send_fade_up(void) +{ + if (backlight_thread_fading_type & FADING_UP) + { + if (backlight_fading_state == NOT_FADING) + { + /* reactivate display before fading */ +#ifdef HAVE_LCD_ENABLE + lcd_enable(true); /* power on lcd, this takes some time */ +#endif +#ifdef HAVE_LCD_SLEEP + backlight_lcd_sleep_countdown(false); /* stop counter */ +#endif + backlight_fade_counter = 0; + } + backlight_fading_state = FADING_UP; + } + else + { + _backlight_thread_fade_reset(backlight_brightness); + _backlight_on(); + } +} + +static void backlight_send_fade_down(void) +{ + if (backlight_thread_fading_type & FADING_DOWN) + { + if (backlight_fading_state == NOT_FADING) + backlight_fade_counter = 0; + backlight_fading_state = FADING_DOWN; + } + else + { + _backlight_thread_fade_reset(MIN_BRIGHTNESS_SETTING); + _backlight_off(); + } +} +#endif /* USE_BACKLIGHT_THREAD_FADING */ + /* Update state of backlight according to timeout setting */ static void backlight_update_state(void) { @@ -427,12 +505,21 @@ if (backlight_timeout < 0) { backlight_timer = 0; /* Disable the timeout */ +#ifdef USE_BACKLIGHT_THREAD_FADING + backlight_send_fade_down(); +#else _backlight_off(); +#endif + } else { backlight_timer = backlight_timeout; +#ifdef USE_BACKLIGHT_THREAD_FADING + backlight_send_fade_up(); +#else _backlight_on(); +#endif } } @@ -478,7 +565,12 @@ while(1) { - queue_wait(&backlight_queue, &ev); +#ifdef USE_BACKLIGHT_THREAD_FADING + if (backlight_fading_state) /* != NOT_FADING */ + queue_wait_w_tmo(&backlight_queue, &ev, HZ/FADE_DELAY); + else +#endif + queue_wait(&backlight_queue, &ev); switch(ev.id) { /* These events must always be processed */ #ifdef _BACKLIGHT_FADE_BOOST @@ -558,9 +650,12 @@ case BACKLIGHT_OFF: backlight_timer = 0; /* Disable the timeout */ +#ifndef USE_BACKLIGHT_THREAD_FADING _backlight_off(); +#else + backlight_send_fade_down(); +#endif /* USE_BACKLIGHT_THREAD_FADING */ break; - #ifdef HAVE_LCD_SLEEP case LCD_SLEEP: lcd_sleep(); @@ -589,6 +684,21 @@ remote_backlight_update_state(); #endif break; +#ifdef USE_BACKLIGHT_THREAD_FADING + case SYS_TIMEOUT: + switch(backlight_fading_state) + { + case FADING_UP: + if (_backlight_fade_up()) + backlight_fading_state = NOT_FADING; + break; + case FADING_DOWN: + if (_backlight_fade_down()) + backlight_fading_state = NOT_FADING; + break; + } + break; +#endif } } /* end while */ } @@ -614,7 +724,6 @@ } } #endif /* HAVE_LCD_SLEEP */ - #ifdef HAVE_REMOTE_LCD if(remote_backlight_timer) { @@ -640,7 +749,6 @@ void backlight_init(void) { queue_init(&backlight_queue, true); - #ifndef SIMULATOR if (_backlight_init()) { @@ -832,6 +940,10 @@ val = MAX_BRIGHTNESS_SETTING; _backlight_set_brightness(val); +#ifdef USE_BACKLIGHT_THREAD_FADING + /* receive backlight brightness */ + _backlight_thread_fade_reset(val); +#endif } #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ Index: firmware/SOURCES =================================================================== --- firmware/SOURCES (Revision 19145) +++ firmware/SOURCES (Arbeitskopie) @@ -96,6 +96,10 @@ #endif /* LCD_REMOTE_DEPTH */ #endif /* HAVE_REMOTE_LCD */ +#ifdef USE_BACKLIGHT_THREAD_FADING +backlight-thread-fading.c +#endif /* USE_BACKLIGHT_THREAD_FADING */ + /* Misc. */ drivers/led.c drivers/button.c Index: firmware/target/arm/sandisk/backlight-c200_e200.c =================================================================== --- firmware/target/arm/sandisk/backlight-c200_e200.c (Revision 19145) +++ firmware/target/arm/sandisk/backlight-c200_e200.c (Arbeitskopie) @@ -26,18 +26,27 @@ #include "ascodec.h" #include "as3514.h" -static unsigned short backlight_brightness = DEFAULT_BRIGHTNESS_SETTING; +#ifndef USE_BACKLIGHT_THREAD_FADING +static +#endif /* !USE_BACKLIGHT_THREAD_FADING */ + int backlight_brightness = DEFAULT_BRIGHTNESS_SETTING; void _backlight_set_brightness(int brightness) { backlight_brightness = brightness; - if (brightness > 0) _backlight_on(); else _backlight_off(); } +#ifdef USE_BACKLIGHT_THREAD_FADING +void _backlight_set_brightness_fader(int brightness) +{ + ascodec_write(AS3514_DCDC15, brightness); +} +#endif /* !USE_BACKLIGHT_THREAD_FADING */ + void _backlight_on(void) { #ifdef HAVE_LCD_SLEEP Index: firmware/target/arm/sandisk/backlight-target.h =================================================================== --- firmware/target/arm/sandisk/backlight-target.h (Revision 19145) +++ firmware/target/arm/sandisk/backlight-target.h (Arbeitskopie) @@ -21,12 +21,17 @@ #ifndef BACKLIGHT_TARGET_H #define BACKLIGHT_TARGET_H +#include "config.h" #define _backlight_init() true void _backlight_on(void); void _backlight_off(void); void _backlight_set_brightness(int brightness); -int __backlight_is_on(void); +#ifdef USE_BACKLIGHT_THREAD_FADING +extern int backlight_brightness; +void _backlight_set_brightness_fader(int brightness); +#endif /* USE_BACKLIGHT_THREAD_FADING */ + void _buttonlight_on(void); void _buttonlight_off(void); -#endif +#endif /* BACKLIGHT_TARGET_H */ Index: firmware/target/coldfire/iriver/h300/backlight-h300.c =================================================================== --- firmware/target/coldfire/iriver/h300/backlight-h300.c (Revision 19145) +++ firmware/target/coldfire/iriver/h300/backlight-h300.c (Arbeitskopie) @@ -27,6 +27,14 @@ #include "pcf50606.h" #include "lcd.h" + + +#ifndef USE_BACKLIGHT_THREAD_FADING +static +#endif /* !USE_BACKLIGHT_THREAD_FADING */ + int backlight_brightness = DEFAULT_BRIGHTNESS_SETTING; +static bool _is_backlight_on = true; /* backlight always on after boot */ + bool _backlight_init(void) { or_l(0x00020000, &GPIO1_ENABLE); @@ -38,6 +46,7 @@ void _backlight_on(void) { + _is_backlight_on = true; lcd_enable(true); sleep(HZ/100); /* lcd needs time - avoid flashing for dark screens */ or_l(0x00020000, &GPIO1_OUT); @@ -45,20 +54,33 @@ void _backlight_off(void) { + _is_backlight_on = false; and_l(~0x00020000, &GPIO1_OUT); lcd_enable(false); } + +#ifndef USE_BACKLIGHT_THREAD_FADING +static inline +#endif /* set brightness by changing the PWM */ -void _backlight_set_brightness(int val) + void _backlight_set_brightness_fader(int brightness) { + if (!_is_backlight_on && brightness >= MIN_BRIGHTNESS_SETTING) + _backlight_on(); /* disable IRQs while bitbanging */ int old_irq_level = disable_irq_save(); - pcf50606_write(0x35, (val << 1) | 0x01); /* 512Hz, Enable PWM */ + pcf50606_write(0x35, (brightness << 1) | 0x01); /* 512Hz, Enable PWM */ /* enable IRQs again */ restore_irq(old_irq_level); } +void _backlight_set_brightness(int brightness) +{ + backlight_brightness = brightness; + _backlight_set_brightness_fader(brightness); +} + void _remote_backlight_on(void) { and_l(~0x00000002, &GPIO1_OUT); Index: firmware/target/coldfire/iriver/h300/backlight-target.h =================================================================== --- firmware/target/coldfire/iriver/h300/backlight-target.h (Revision 19145) +++ firmware/target/coldfire/iriver/h300/backlight-target.h (Arbeitskopie) @@ -21,11 +21,16 @@ #ifndef BACKLIGHT_TARGET_H #define BACKLIGHT_TARGET_H +#include "config.h" + bool _backlight_init(void); /* Returns backlight current state (true=ON). */ void _backlight_on(void); void _backlight_off(void); void _backlight_set_brightness(int val); void _remote_backlight_on(void); void _remote_backlight_off(void); - -#endif +#ifdef USE_BACKLIGHT_THREAD_FADING +void _backlight_set_brightness_fader(int brightness); +extern int backlight_brightness; +#endif /* USE_BACKLIGHT_THREAD_FADING */ +#endif /* BACKLIGHT_TARGET_H */