forked from len0rd/rockbox
Hardware controlled backlight brightness for iPod Video and Nano, retaining the software PWM fade in/ fade out. * Backlight handling cleanup, getting rid of one layer of 'lowlevelness'. * Use atomic GPIO bit manipulation for PP502x backlight handling.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15599 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
8537cbf091
commit
ef12b3b5c6
47 changed files with 530 additions and 358 deletions
|
|
@ -46,29 +46,44 @@
|
|||
handle this */
|
||||
extern void screen_dump(void);
|
||||
|
||||
static inline void __backlight_on(void)
|
||||
static inline void _backlight_on(void)
|
||||
{
|
||||
sim_backlight(100);
|
||||
}
|
||||
|
||||
static inline void __backlight_off(void)
|
||||
static inline void _backlight_off(void)
|
||||
{
|
||||
sim_backlight(0);
|
||||
}
|
||||
|
||||
#ifdef HAVE_BACKLIGHT_BRIGHTNESS
|
||||
static inline void __backlight_set_brightness(int val)
|
||||
static inline void _backlight_set_brightness(int val)
|
||||
{
|
||||
(void)val;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
|
||||
static inline void __buttonlight_set_brightness(int val)
|
||||
static inline void _buttonlight_on(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void _buttonlight_off(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void _buttonlight_set_brightness(int val)
|
||||
{
|
||||
(void)val;
|
||||
}
|
||||
#endif
|
||||
#ifdef HAVE_REMOTE_LCD
|
||||
static inline void _remote_backlight_on(void)
|
||||
{
|
||||
sim_remote_backlight(100);
|
||||
}
|
||||
|
||||
static inline void _remote_backlight_off(void)
|
||||
{
|
||||
sim_remote_backlight(0);
|
||||
}
|
||||
#endif /* HAVE_REMOTE_LCD */
|
||||
|
||||
#endif /* SIMULATOR */
|
||||
|
||||
|
|
@ -79,18 +94,24 @@ const signed char backlight_timeout_value[19] =
|
|||
-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,
|
||||
BACKLIGHT_OFF,
|
||||
#ifdef HAVE_REMOTE_LCD
|
||||
REMOTE_BACKLIGHT_ON,
|
||||
REMOTE_BACKLIGHT_OFF,
|
||||
#endif
|
||||
#if defined(_BACKLIGHT_FADE_BOOST) || defined(_BACKLIGHT_FADE_ENABLE)
|
||||
BACKLIGHT_FADE_FINISH,
|
||||
#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
|
||||
};
|
||||
|
||||
static void backlight_thread(void);
|
||||
static long backlight_stack[DEFAULT_STACK_SIZE/sizeof(long)];
|
||||
|
|
@ -109,36 +130,12 @@ static int backlight_on_button_hold = 0;
|
|||
|
||||
#ifdef HAVE_BUTTON_LIGHT
|
||||
static int buttonlight_timer;
|
||||
static int buttonlight_timeout = 5*HZ;
|
||||
|
||||
/* internal interface */
|
||||
static void _buttonlight_on(void)
|
||||
{
|
||||
#ifndef SIMULATOR
|
||||
#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
|
||||
__buttonlight_dim(false);
|
||||
#else
|
||||
__buttonlight_on();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void _buttonlight_off(void)
|
||||
{
|
||||
#ifndef SIMULATOR
|
||||
#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
|
||||
if(buttonlight_timeout>0)
|
||||
__buttonlight_dim(true);
|
||||
else
|
||||
#endif
|
||||
__buttonlight_off();
|
||||
#endif
|
||||
}
|
||||
int _buttonlight_timeout = 5*HZ;
|
||||
|
||||
/* Update state of buttonlight according to timeout setting */
|
||||
static void buttonlight_update_state(void)
|
||||
{
|
||||
buttonlight_timer = buttonlight_timeout;
|
||||
buttonlight_timer = _buttonlight_timeout;
|
||||
|
||||
/* Buttonlight == OFF in the setting? */
|
||||
if (buttonlight_timer < 0)
|
||||
|
|
@ -167,7 +164,7 @@ void buttonlight_set_timeout(int index)
|
|||
if((unsigned)index >= sizeof(backlight_timeout_value))
|
||||
/* if given a weird value, use default */
|
||||
index = 6;
|
||||
buttonlight_timeout = HZ * backlight_timeout_value[index];
|
||||
_buttonlight_timeout = HZ * backlight_timeout_value[index];
|
||||
buttonlight_update_state();
|
||||
}
|
||||
|
||||
|
|
@ -190,13 +187,13 @@ const signed char lcd_sleep_timeout_value[10] =
|
|||
{
|
||||
-1, 0, 5, 10, 15, 20, 30, 45, 60, 90
|
||||
};
|
||||
static int lcd_sleep_timer;
|
||||
static int lcd_sleep_timeout = 10*HZ;
|
||||
int _lcd_sleep_timer;
|
||||
int _lcd_sleep_timeout = 10*HZ;
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)
|
||||
/* backlight fading */
|
||||
#define BL_PWM_INTERVAL 5000 /* Cycle interval in s */
|
||||
#define BL_PWM_INTERVAL 5000 /* Cycle interval in us */
|
||||
#define BL_PWM_COUNT 100
|
||||
static const char backlight_fade_value[8] = { 0, 1, 2, 4, 6, 8, 10, 20 };
|
||||
static int fade_in_count = 1;
|
||||
|
|
@ -224,7 +221,7 @@ static void backlight_isr(void)
|
|||
|
||||
if (bl_dim_current > 0 && bl_dim_current < BL_PWM_COUNT)
|
||||
{
|
||||
__backlight_on();
|
||||
_backlight_on_isr();
|
||||
bl_pwm_counter = bl_dim_current;
|
||||
timer_period = timer_period * bl_pwm_counter / BL_PWM_COUNT;
|
||||
bl_dim_state = DIM_STATE_MAIN;
|
||||
|
|
@ -232,9 +229,9 @@ static void backlight_isr(void)
|
|||
else
|
||||
{
|
||||
if (bl_dim_current)
|
||||
__backlight_on();
|
||||
_backlight_on_isr();
|
||||
else
|
||||
__backlight_off();
|
||||
_backlight_off_isr();
|
||||
if (bl_dim_current == bl_dim_target)
|
||||
idle = true;
|
||||
}
|
||||
|
|
@ -243,7 +240,7 @@ static void backlight_isr(void)
|
|||
|
||||
/* Dim main screen */
|
||||
case DIM_STATE_MAIN:
|
||||
__backlight_off();
|
||||
_backlight_off_isr();
|
||||
bl_dim_state = DIM_STATE_START;
|
||||
timer_period = timer_period * (BL_PWM_COUNT - bl_pwm_counter) / BL_PWM_COUNT;
|
||||
break ;
|
||||
|
|
@ -263,8 +260,8 @@ static void backlight_isr(void)
|
|||
|
||||
if (idle)
|
||||
{
|
||||
#ifdef CPU_COLDFIRE
|
||||
queue_post(&backlight_queue, BACKLIGHT_UNBOOST_CPU, 0);
|
||||
#if defined(_BACKLIGHT_FADE_BOOST) || defined(_BACKLIGHT_FADE_ENABLE)
|
||||
queue_post(&backlight_queue, BACKLIGHT_FADE_FINISH, 0);
|
||||
#endif
|
||||
timer_unregister();
|
||||
bl_timer_active = false;
|
||||
|
|
@ -277,19 +274,19 @@ static void backlight_switch(void)
|
|||
{
|
||||
if (bl_dim_target > (BL_PWM_COUNT/2))
|
||||
{
|
||||
__backlight_on();
|
||||
_backlight_on_normal();
|
||||
bl_dim_current = BL_PWM_COUNT;
|
||||
}
|
||||
else
|
||||
{
|
||||
__backlight_off();
|
||||
_backlight_off_normal();
|
||||
bl_dim_current = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void backlight_release_timer(void)
|
||||
{
|
||||
#ifdef CPU_COLDFIRE
|
||||
#ifdef _BACKLIGHT_FADE_BOOST
|
||||
cpu_boost(false);
|
||||
#endif
|
||||
timer_unregister();
|
||||
|
|
@ -310,7 +307,7 @@ static void backlight_dim(int value)
|
|||
|
||||
if (timer_register(0, backlight_release_timer, 2, 0, backlight_isr))
|
||||
{
|
||||
#ifdef CPU_COLDFIRE
|
||||
#ifdef _BACKLIGHT_FADE_BOOST
|
||||
/* Prevent cpu frequency changes while dimming. */
|
||||
cpu_boost(true);
|
||||
#endif
|
||||
|
|
@ -320,6 +317,48 @@ static void backlight_dim(int value)
|
|||
backlight_switch();
|
||||
}
|
||||
|
||||
static void _backlight_on(void)
|
||||
{
|
||||
if (fade_in_count > 0)
|
||||
{
|
||||
#ifdef _BACKLIGHT_FADE_ENABLE
|
||||
_backlight_hw_enable(true);
|
||||
#endif
|
||||
backlight_dim(BL_PWM_COUNT);
|
||||
}
|
||||
else
|
||||
{
|
||||
bl_dim_target = bl_dim_current = BL_PWM_COUNT;
|
||||
_backlight_on_normal();
|
||||
}
|
||||
#ifdef HAVE_LCD_SLEEP
|
||||
_lcd_sleep_timer = 0; /* LCD should be awake already */
|
||||
#endif
|
||||
}
|
||||
|
||||
static void _backlight_off(void)
|
||||
{
|
||||
if (fade_out_count > 0)
|
||||
{
|
||||
backlight_dim(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
bl_dim_target = bl_dim_current = 0;
|
||||
_backlight_off_normal();
|
||||
}
|
||||
#ifdef HAVE_LCD_SLEEP
|
||||
/* Start LCD sleep countdown */
|
||||
if (_lcd_sleep_timeout < 0)
|
||||
{
|
||||
_lcd_sleep_timer = 0; /* Setting == Always */
|
||||
lcd_sleep();
|
||||
}
|
||||
else
|
||||
_lcd_sleep_timer = _lcd_sleep_timeout;
|
||||
#endif
|
||||
}
|
||||
|
||||
void backlight_set_fade_in(int index)
|
||||
{
|
||||
fade_in_count = backlight_fade_value[index];
|
||||
|
|
@ -331,70 +370,6 @@ void backlight_set_fade_out(int index)
|
|||
}
|
||||
#endif /* defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) */
|
||||
|
||||
static void _backlight_on(void)
|
||||
{
|
||||
#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)
|
||||
if (fade_in_count > 0)
|
||||
backlight_dim(BL_PWM_COUNT);
|
||||
else
|
||||
{
|
||||
bl_dim_target = bl_dim_current = BL_PWM_COUNT;
|
||||
__backlight_on();
|
||||
}
|
||||
#elif defined(HAVE_BACKLIGHT_SET_FADING) && !defined(SIMULATOR)
|
||||
/* call the enable from here - it takes longer than the disable */
|
||||
lcd_enable(true);
|
||||
__backlight_dim(false);
|
||||
#else
|
||||
__backlight_on();
|
||||
#endif
|
||||
#ifdef HAVE_LCD_SLEEP
|
||||
lcd_sleep_timer = 0; /* LCD should be awake already */
|
||||
#endif
|
||||
}
|
||||
|
||||
static void _backlight_off(void)
|
||||
{
|
||||
#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)
|
||||
if (fade_out_count > 0)
|
||||
backlight_dim(0);
|
||||
else
|
||||
{
|
||||
bl_dim_target = bl_dim_current = 0;
|
||||
__backlight_off();
|
||||
}
|
||||
#elif defined(HAVE_BACKLIGHT_SET_FADING) && !defined(SIMULATOR)
|
||||
__backlight_dim(true);
|
||||
#else
|
||||
__backlight_off();
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LCD_SLEEP
|
||||
/* Start LCD sleep countdown */
|
||||
if (lcd_sleep_timeout < 0)
|
||||
{
|
||||
lcd_sleep_timer = 0; /* Setting == Always */
|
||||
lcd_sleep();
|
||||
}
|
||||
else
|
||||
lcd_sleep_timer = lcd_sleep_timeout;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAVE_REMOTE_LCD
|
||||
#ifdef SIMULATOR
|
||||
static void __remote_backlight_on(void)
|
||||
{
|
||||
sim_remote_backlight(100);
|
||||
}
|
||||
|
||||
static void __remote_backlight_off(void)
|
||||
{
|
||||
sim_remote_backlight(0);
|
||||
}
|
||||
#endif /* SIMULATOR */
|
||||
#endif /* HAVE_REMOTE_LCD */
|
||||
|
||||
/* Update state of backlight according to timeout setting */
|
||||
static void backlight_update_state(void)
|
||||
{
|
||||
|
|
@ -453,12 +428,12 @@ static void remote_backlight_update_state(void)
|
|||
if (remote_backlight_timeout < 0)
|
||||
{
|
||||
remote_backlight_timer = 0; /* Disable the timeout */
|
||||
__remote_backlight_off();
|
||||
_remote_backlight_off();
|
||||
}
|
||||
else
|
||||
{
|
||||
remote_backlight_timer = remote_backlight_timeout;
|
||||
__remote_backlight_on();
|
||||
_remote_backlight_on();
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_REMOTE_LCD */
|
||||
|
|
@ -473,12 +448,16 @@ void backlight_thread(void)
|
|||
queue_wait(&backlight_queue, &ev);
|
||||
switch(ev.id)
|
||||
{ /* These events must always be processed */
|
||||
#if defined(HAVE_BACKLIGHT_PWM_FADING) && defined(CPU_COLDFIRE) \
|
||||
&& !defined(SIMULATOR)
|
||||
case BACKLIGHT_UNBOOST_CPU:
|
||||
#ifdef _BACKLIGHT_FADE_BOOST
|
||||
case BACKLIGHT_FADE_FINISH:
|
||||
cpu_boost(false);
|
||||
break;
|
||||
#endif
|
||||
#ifdef _BACKLIGHT_FADE_ENABLE
|
||||
case BACKLIGHT_FADE_FINISH:
|
||||
_backlight_hw_enable((bl_dim_current|bl_dim_target) != 0);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_REMOTE_LCD) && !defined(SIMULATOR)
|
||||
/* Here for now or else the aggressive init messes up scrolling */
|
||||
|
|
@ -519,7 +498,7 @@ void backlight_thread(void)
|
|||
|
||||
case REMOTE_BACKLIGHT_OFF:
|
||||
remote_backlight_timer = 0; /* Disable the timeout */
|
||||
__remote_backlight_off();
|
||||
_remote_backlight_off();
|
||||
break;
|
||||
#endif /* HAVE_REMOTE_LCD */
|
||||
|
||||
|
|
@ -575,10 +554,10 @@ static void backlight_tick(void)
|
|||
}
|
||||
}
|
||||
#ifdef HAVE_LCD_SLEEP
|
||||
else if(lcd_sleep_timer)
|
||||
else if(_lcd_sleep_timer)
|
||||
{
|
||||
lcd_sleep_timer--;
|
||||
if(lcd_sleep_timer == 0)
|
||||
_lcd_sleep_timer--;
|
||||
if(_lcd_sleep_timer == 0)
|
||||
{
|
||||
/* Queue on bl thread or freeze! */
|
||||
queue_post(&backlight_queue, LCD_SLEEP, 0);
|
||||
|
|
@ -613,7 +592,7 @@ void backlight_init(void)
|
|||
queue_init(&backlight_queue, true);
|
||||
|
||||
#ifndef SIMULATOR
|
||||
if (__backlight_init())
|
||||
if (_backlight_init())
|
||||
{
|
||||
# ifdef HAVE_BACKLIGHT_PWM_FADING
|
||||
/* If backlight is already on, don't fade in. */
|
||||
|
|
@ -706,17 +685,17 @@ void lcd_set_sleep_after_backlight_off(int index)
|
|||
/* if given a weird value, use default */
|
||||
index = 3;
|
||||
|
||||
lcd_sleep_timeout = HZ * lcd_sleep_timeout_value[index];
|
||||
_lcd_sleep_timeout = HZ * lcd_sleep_timeout_value[index];
|
||||
|
||||
if (backlight_timer > 0 || backlight_get_current_timeout() == 0)
|
||||
/* Timer will be set when bl turns off or bl set to on. */
|
||||
return;
|
||||
|
||||
/* Backlight is Off */
|
||||
if (lcd_sleep_timeout < 0)
|
||||
lcd_sleep_timer = 1; /* Always - sleep next tick */
|
||||
if (_lcd_sleep_timeout < 0)
|
||||
_lcd_sleep_timer = 1; /* Always - sleep next tick */
|
||||
else
|
||||
lcd_sleep_timer = lcd_sleep_timeout; /* Never, other */
|
||||
_lcd_sleep_timer = _lcd_sleep_timeout; /* Never, other */
|
||||
}
|
||||
#endif /* HAVE_LCD_SLEEP */
|
||||
|
||||
|
|
@ -796,7 +775,7 @@ void backlight_set_brightness(int val)
|
|||
else if (val > MAX_BRIGHTNESS_SETTING)
|
||||
val = MAX_BRIGHTNESS_SETTING;
|
||||
|
||||
__backlight_set_brightness(val);
|
||||
_backlight_set_brightness(val);
|
||||
}
|
||||
#endif /* HAVE_BACKLIGHT_BRIGHTNESS */
|
||||
|
||||
|
|
@ -808,7 +787,7 @@ void buttonlight_set_brightness(int val)
|
|||
else if (val > MAX_BRIGHTNESS_SETTING)
|
||||
val = MAX_BRIGHTNESS_SETTING;
|
||||
|
||||
__buttonlight_set_brightness(val);
|
||||
_buttonlight_set_brightness(val);
|
||||
}
|
||||
#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
|
||||
|
||||
|
|
@ -818,8 +797,8 @@ void buttonlight_set_brightness(int val)
|
|||
#if defined(BOOTLOADER) && defined(HAVE_BACKLIGHT)
|
||||
void backlight_init(void)
|
||||
{
|
||||
(void)__backlight_init();
|
||||
__backlight_on();
|
||||
(void)_backlight_init();
|
||||
_backlight_on();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue