Index: firmware/backlight.c =================================================================== --- firmware/backlight.c (Revision 20779) +++ firmware/backlight.c (Arbeitskopie) @@ -149,6 +149,7 @@ static int buttonlight_timer; int _buttonlight_timeout = 5*HZ; +static void backlight_timeouts_handler(void); /* Update state of buttonlight according to timeout setting */ static void buttonlight_update_state(void) { @@ -578,7 +579,7 @@ queue_wait_w_tmo(&backlight_queue, &ev, FADE_DELAY); else #endif - queue_wait(&backlight_queue, &ev); + queue_wait_w_tmo(&backlight_queue, &ev, HZ); switch(ev.id) { /* These events must always be processed */ #ifdef _BACKLIGHT_FADE_BOOST @@ -690,22 +691,26 @@ remote_backlight_update_state(); #endif break; + case SYS_TIMEOUT: + backlight_timeouts_handler(); #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \ || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG) - case SYS_TIMEOUT: if ((_backlight_fade_step(backlight_fading_state))) backlight_fading_state = NOT_FADING; /* finished fading */ +#endif /* CONFIG_BACKLIGHT_FADING */ break; -#endif /* CONFIG_BACKLIGHT_FADING */ } } /* end while */ } -static void backlight_tick(void) +static void backlight_timeouts_handler(void) { + static long last_tick = 0; + unsigned long delta = MIN(HZ,(unsigned long)(current_tick - last_tick)); if(backlight_timer) { - if(--backlight_timer == 0) + backlight_timer -= delta; + if(backlight_timer <= 0) { backlight_off(); } @@ -713,7 +718,8 @@ #ifdef HAVE_LCD_SLEEP else if(lcd_sleep_timer) { - if(--lcd_sleep_timer == 0) + lcd_sleep_timer -= delta; + if(lcd_sleep_timer <= 0) { /* Queue on bl thread or freeze! */ queue_post(&backlight_queue, LCD_SLEEP, 0); @@ -723,7 +729,8 @@ #ifdef HAVE_REMOTE_LCD if(remote_backlight_timer) { - if(--remote_backlight_timer == 0) + remote_backlight_timer -= delta; + if(remote_backlight_timer <= 0) { remote_backlight_off(); } @@ -732,12 +739,14 @@ #ifdef HAVE_BUTTON_LIGHT if (buttonlight_timer) { - if (--buttonlight_timer == 0) + buttonlight_timer -= delta; + if (buttonlight_timer == 0) { buttonlight_off(); } } #endif /* HAVE_BUTTON_LIGHT */ + last_tick = current_tick; } void backlight_init(void) @@ -764,7 +773,6 @@ sizeof(backlight_stack), 0, backlight_thread_name IF_PRIO(, PRIORITY_USER_INTERFACE) IF_COP(, CPU)); - tick_add_task(backlight_tick); } #ifdef BACKLIGHT_DRIVER_CLOSE