From ef12b3b5c678e4fa44d60061b0c1bc312e589ba1 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Mon, 12 Nov 2007 18:49:53 +0000 Subject: 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 --- firmware/backlight.c | 207 +++++++++++++++++++++++---------------------------- 1 file changed, 93 insertions(+), 114 deletions(-) (limited to 'firmware/backlight.c') diff --git a/firmware/backlight.c b/firmware/backlight.c index 357b446a23..78ba492942 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c @@ -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,80 +317,58 @@ static void backlight_dim(int value) backlight_switch(); } -void backlight_set_fade_in(int index) -{ - fade_in_count = backlight_fade_value[index]; -} - -void backlight_set_fade_out(int index) -{ - fade_out_count = backlight_fade_value[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) + { +#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(); + _backlight_on_normal(); } -#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 */ + _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(); + _backlight_off_normal(); } -#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) + if (_lcd_sleep_timeout < 0) { - lcd_sleep_timer = 0; /* Setting == Always */ + _lcd_sleep_timer = 0; /* Setting == Always */ lcd_sleep(); } else - lcd_sleep_timer = lcd_sleep_timeout; + _lcd_sleep_timer = _lcd_sleep_timeout; #endif } -#ifdef HAVE_REMOTE_LCD -#ifdef SIMULATOR -static void __remote_backlight_on(void) +void backlight_set_fade_in(int index) { - sim_remote_backlight(100); + fade_in_count = backlight_fade_value[index]; } -static void __remote_backlight_off(void) +void backlight_set_fade_out(int index) { - sim_remote_backlight(0); + fade_out_count = backlight_fade_value[index]; } -#endif /* SIMULATOR */ -#endif /* HAVE_REMOTE_LCD */ +#endif /* defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) */ /* 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 -- cgit v1.2.3