1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Linus Nielsen Feltzing
11 * Additional work by Martin Ritter (2007) and Thomas Martitz (2008)
12 * for backlight thread fading
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
22 ****************************************************************************/
36 #include "backlight.h"
38 #include "screendump.h"
40 #ifdef HAVE_REMOTE_LCD
41 #include "lcd-remote.h"
44 #include "backlight-target.h"
46 #include "backlight-sim.h"
49 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
50 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
51 #include "backlight-sw-fading.h"
54 #if defined(HAVE_BACKLIGHT) && defined(BACKLIGHT_FULL_INIT)
56 #define BACKLIGHT_THREAD_TIMEOUT HZ
61 BACKLIGHT_TMO_CHANGED
,
62 #ifdef HAVE_REMOTE_LCD
65 REMOTE_BACKLIGHT_TMO_CHANGED
,
67 #if defined(_BACKLIGHT_FADE_BOOST) || defined(_BACKLIGHT_FADE_ENABLE)
68 BACKLIGHT_FADE_FINISH
,
73 #ifdef HAVE_BUTTON_LIGHT
76 BUTTON_LIGHT_TMO_CHANGED
,
78 #ifdef BACKLIGHT_DRIVER_CLOSE
83 static void backlight_thread(void);
84 static long backlight_stack
[DEFAULT_STACK_SIZE
/sizeof(long)];
85 static const char backlight_thread_name
[] = "backlight";
86 static struct event_queue backlight_queue
;
87 #ifdef BACKLIGHT_DRIVER_CLOSE
88 static unsigned int backlight_thread_id
= 0;
91 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
92 int backlight_brightness
= DEFAULT_BRIGHTNESS_SETTING
;
94 static int backlight_timer SHAREDBSS_ATTR
;
95 static int backlight_timeout_normal
= 5*HZ
;
97 static int backlight_timeout_plugged
= 5*HZ
;
99 #ifdef HAS_BUTTON_HOLD
100 static int backlight_on_button_hold
= 0;
102 static void backlight_timeout_handler(void);
104 #ifdef HAVE_BUTTON_LIGHT
105 static int buttonlight_timer
;
106 static int buttonlight_timeout
= 5*HZ
;
108 /* Update state of buttonlight according to timeout setting */
109 static void buttonlight_update_state(void)
111 buttonlight_timer
= buttonlight_timeout
;
113 /* Buttonlight == OFF in the setting? */
114 if (buttonlight_timer
< 0)
116 buttonlight_timer
= 0; /* Disable the timeout */
123 /* external interface */
124 void buttonlight_on(void)
126 queue_remove_from_head(&backlight_queue
, BUTTON_LIGHT_ON
);
127 queue_post(&backlight_queue
, BUTTON_LIGHT_ON
, 0);
130 void buttonlight_off(void)
132 queue_post(&backlight_queue
, BUTTON_LIGHT_OFF
, 0);
135 void buttonlight_set_timeout(int value
)
137 buttonlight_timeout
= HZ
* value
;
138 queue_post(&backlight_queue
, BUTTON_LIGHT_TMO_CHANGED
, 0);
141 int buttonlight_get_current_timeout(void)
143 return buttonlight_timeout
;
146 #endif /* HAVE_BUTTON_LIGHT */
148 #ifdef HAVE_REMOTE_LCD
149 static int remote_backlight_timer
;
150 static int remote_backlight_timeout_normal
= 5*HZ
;
152 static int remote_backlight_timeout_plugged
= 5*HZ
;
154 #ifdef HAS_REMOTE_BUTTON_HOLD
155 static int remote_backlight_on_button_hold
= 0;
157 #endif /* HAVE_REMOTE_LCD */
159 #ifdef HAVE_LCD_SLEEP
160 #ifdef HAVE_LCD_SLEEP_SETTING
161 const signed char lcd_sleep_timeout_value
[10] =
163 -1, 0, 5, 10, 15, 20, 30, 45, 60, 90
165 static int lcd_sleep_timeout
= 10*HZ
;
167 /* Target defines needed value */
168 #define lcd_sleep_timeout LCD_SLEEP_TIMEOUT
171 static int lcd_sleep_timer SHAREDDATA_ATTR
= 0;
173 static void backlight_lcd_sleep_countdown(bool start
)
177 /* Cancel the LCD sleep countdown */
182 /* Start LCD sleep countdown */
183 if (lcd_sleep_timeout
< 0)
185 lcd_sleep_timer
= 0; /* Setting == Always */
186 /* Ensure lcd_sleep() is called from backlight_thread() */
187 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_PWM)
188 queue_post(&backlight_queue
, LCD_SLEEP
, 0);
195 lcd_sleep_timer
= lcd_sleep_timeout
;
198 #endif /* HAVE_LCD_SLEEP */
200 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
201 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
202 static int backlight_fading_type
= (FADING_UP
|FADING_DOWN
);
203 static int backlight_fading_state
= NOT_FADING
;
207 /* backlight fading */
208 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_PWM)
209 #define BL_PWM_INTERVAL 5 /* Cycle interval in ms */
210 #define BL_PWM_BITS 8
211 #define BL_PWM_COUNT (1<<BL_PWM_BITS)
213 /* s15.16 fixed point variables */
214 static int32_t bl_fade_in_step
= ((BL_PWM_INTERVAL
*BL_PWM_COUNT
)<<16)/300;
215 static int32_t bl_fade_out_step
= ((BL_PWM_INTERVAL
*BL_PWM_COUNT
)<<16)/2000;
216 static int32_t bl_dim_fraction
= 0;
218 static int bl_dim_target
= 0;
219 static int bl_dim_current
= 0;
220 static enum {DIM_STATE_START
, DIM_STATE_MAIN
} bl_dim_state
= DIM_STATE_START
;
221 static bool bl_timer_active
= false;
223 static void backlight_isr(void)
225 int timer_period
= (TIMER_FREQ
*BL_PWM_INTERVAL
/1000);
228 switch (bl_dim_state
)
231 case DIM_STATE_START
:
232 bl_dim_current
= bl_dim_fraction
>> 16;
234 if (bl_dim_current
> 0 && bl_dim_current
< BL_PWM_COUNT
)
237 timer_period
= (timer_period
* bl_dim_current
) >> BL_PWM_BITS
;
238 bl_dim_state
= DIM_STATE_MAIN
;
245 _backlight_off_isr();
246 if (bl_dim_current
== bl_dim_target
)
249 if (bl_dim_current
< bl_dim_target
)
251 bl_dim_fraction
= MIN(bl_dim_fraction
+ bl_fade_in_step
,
254 else if (bl_dim_current
> bl_dim_target
)
256 bl_dim_fraction
= MAX(bl_dim_fraction
- bl_fade_out_step
, 0);
260 /* Dim main screen */
262 _backlight_off_isr();
263 timer_period
= (timer_period
* (BL_PWM_COUNT
- bl_dim_current
))
265 bl_dim_state
= DIM_STATE_START
;
270 #if defined(_BACKLIGHT_FADE_BOOST) || defined(_BACKLIGHT_FADE_ENABLE)
271 queue_post(&backlight_queue
, BACKLIGHT_FADE_FINISH
, 0);
274 bl_timer_active
= false;
276 #ifdef HAVE_LCD_SLEEP
277 if (bl_dim_current
== 0)
278 backlight_lcd_sleep_countdown(true);
282 timer_set_period(timer_period
);
285 static void backlight_switch(void)
287 if (bl_dim_target
> (BL_PWM_COUNT
/2))
289 _backlight_on_normal();
290 bl_dim_fraction
= (BL_PWM_COUNT
<<16);
294 _backlight_off_normal();
297 #ifdef HAVE_LCD_SLEEP
298 backlight_lcd_sleep_countdown(true);
303 static void backlight_release_timer(void)
305 #ifdef _BACKLIGHT_FADE_BOOST
309 bl_timer_active
= false;
313 static void backlight_dim(int value
)
315 /* protect from extraneous calls with the same target value */
316 if (value
== bl_dim_target
)
319 bl_dim_target
= value
;
324 if (timer_register(0, backlight_release_timer
, 2, 0, backlight_isr
327 #ifdef _BACKLIGHT_FADE_BOOST
328 /* Prevent cpu frequency changes while dimming. */
331 bl_timer_active
= true;
337 static void _backlight_on(void)
339 if (bl_fade_in_step
> 0)
341 #ifdef _BACKLIGHT_FADE_ENABLE
342 _backlight_hw_enable(true);
344 backlight_dim(BL_PWM_COUNT
);
348 bl_dim_target
= BL_PWM_COUNT
;
349 bl_dim_fraction
= (BL_PWM_COUNT
<<16);
350 _backlight_on_normal();
354 static void _backlight_off(void)
356 if (bl_fade_out_step
> 0)
362 bl_dim_target
= bl_dim_fraction
= 0;
363 _backlight_off_normal();
367 void backlight_set_fade_in(int value
)
370 bl_fade_in_step
= ((BL_PWM_INTERVAL
*BL_PWM_COUNT
)<<16) / value
;
375 void backlight_set_fade_out(int value
)
378 bl_fade_out_step
= ((BL_PWM_INTERVAL
*BL_PWM_COUNT
)<<16) / value
;
380 bl_fade_out_step
= 0;
383 #elif (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
384 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
386 void backlight_set_fade_out(bool value
)
389 backlight_fading_type
|= FADING_DOWN
;
391 backlight_fading_type
&= FADING_UP
;
394 void backlight_set_fade_in(bool value
)
397 backlight_fading_type
|= FADING_UP
;
399 backlight_fading_type
&= FADING_DOWN
;
402 static void backlight_setup_fade_up(void)
404 if (backlight_fading_type
& FADING_UP
)
406 if (backlight_fading_state
== NOT_FADING
)
408 /* make sure the backlight is at lowest level */
411 backlight_fading_state
= FADING_UP
;
415 backlight_fading_state
= NOT_FADING
;
416 _backlight_fade_update_state(backlight_brightness
);
418 _backlight_set_brightness(backlight_brightness
);
422 static void backlight_setup_fade_down(void)
424 if (backlight_fading_type
& FADING_DOWN
)
426 backlight_fading_state
= FADING_DOWN
;
430 backlight_fading_state
= NOT_FADING
;
431 _backlight_fade_update_state(MIN_BRIGHTNESS_SETTING
-1);
433 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
434 /* write the lowest brightness level to the hardware so that
435 * fading up is glitch free */
436 _backlight_set_brightness(MIN_BRIGHTNESS_SETTING
);
440 #endif /* CONFIG_BACKLIGHT_FADING */
442 /* Update state of backlight according to timeout setting */
443 static void backlight_update_state(void)
446 int timeout
= backlight_get_current_timeout();
448 /* Backlight == OFF in the setting? */
449 if (UNLIKELY(timeout
< 0))
451 backlight_timer
= 0; /* Disable the timeout */
452 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
453 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
454 backlight_setup_fade_down();
455 /* necessary step to issue fading down when the setting is selected */
456 queue_post(&backlight_queue
, SYS_TIMEOUT
, 0);
459 #ifdef HAVE_LCD_SLEEP
460 backlight_lcd_sleep_countdown(true); /* start sleep countdown */
466 backlight_timer
= timeout
;
468 #ifdef HAVE_LCD_SLEEP
469 backlight_lcd_sleep_countdown(false); /* wake up lcd */
472 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
473 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
474 backlight_setup_fade_up();
481 #ifdef HAVE_REMOTE_LCD
482 /* Update state of remote backlight according to timeout setting */
483 static void remote_backlight_update_state(void)
485 int timeout
= remote_backlight_get_current_timeout();
486 /* Backlight == OFF in the setting? */
489 remote_backlight_timer
= 0; /* Disable the timeout */
490 _remote_backlight_off();
494 remote_backlight_timer
= timeout
;
495 _remote_backlight_on();
498 #endif /* HAVE_REMOTE_LCD */
499 static inline void do_backlight_off(void)
502 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
503 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
504 backlight_setup_fade_down();
507 #endif /* CONFIG_BACKLIGHT_FADING */
510 void backlight_thread(void)
512 struct queue_event ev
;
517 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
518 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
519 if (backlight_fading_state
!= NOT_FADING
)
520 queue_wait_w_tmo(&backlight_queue
, &ev
, FADE_DELAY
);
523 queue_wait_w_tmo(&backlight_queue
, &ev
, BACKLIGHT_THREAD_TIMEOUT
);
525 { /* These events must always be processed */
526 #ifdef _BACKLIGHT_FADE_BOOST
527 case BACKLIGHT_FADE_FINISH
:
531 #ifdef _BACKLIGHT_FADE_ENABLE
532 case BACKLIGHT_FADE_FINISH
:
533 _backlight_hw_enable((bl_dim_current
|bl_dim_target
) != 0);
538 /* Here for now or else the aggressive init messes up scrolling */
539 #ifdef HAVE_REMOTE_LCD
540 case SYS_REMOTE_PLUGGED
:
545 case SYS_REMOTE_UNPLUGGED
:
548 #elif defined HAVE_REMOTE_LCD_AS_MAIN
549 case SYS_REMOTE_PLUGGED
:
554 case SYS_REMOTE_UNPLUGGED
:
557 #endif /* HAVE_REMOTE_LCD/ HAVE_REMOTE_LCD_AS_MAIN */
558 #endif /* !SIMULATOR */
559 case SYS_USB_CONNECTED
:
560 usb_acknowledge(SYS_USB_CONNECTED_ACK
);
563 case SYS_USB_DISCONNECTED
:
564 usb_acknowledge(SYS_USB_DISCONNECTED_ACK
);
567 #ifdef BACKLIGHT_DRIVER_CLOSE
568 /* Get out of here */
577 { /* These events are only processed if backlight isn't locked */
578 #ifdef HAVE_REMOTE_LCD
579 case REMOTE_BACKLIGHT_TMO_CHANGED
:
580 case REMOTE_BACKLIGHT_ON
:
581 remote_backlight_update_state();
584 case REMOTE_BACKLIGHT_OFF
:
585 remote_backlight_timer
= 0; /* Disable the timeout */
586 _remote_backlight_off();
588 #endif /* HAVE_REMOTE_LCD */
590 case BACKLIGHT_TMO_CHANGED
:
592 backlight_update_state();
598 #ifdef HAVE_LCD_SLEEP
603 #ifdef HAVE_BUTTON_LIGHT
604 case BUTTON_LIGHT_TMO_CHANGED
:
605 case BUTTON_LIGHT_ON
:
606 buttonlight_update_state();
609 case BUTTON_LIGHT_OFF
:
610 buttonlight_timer
= 0;
615 case SYS_POWEROFF
: /* Lock backlight on poweroff so it doesn't */
616 locked
= true; /* go off before power is actually cut. */
619 case SYS_CHARGER_CONNECTED
:
620 case SYS_CHARGER_DISCONNECTED
:
622 backlight_update_state();
623 #ifdef HAVE_REMOTE_LCD
624 remote_backlight_update_state();
628 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
629 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
630 if (backlight_fading_state
!= NOT_FADING
)
632 if ((_backlight_fade_step(backlight_fading_state
)))
633 { /* finished fading */
634 #ifdef HAVE_LCD_SLEEP
635 if (backlight_fading_state
== FADING_DOWN
)
636 { /* start sleep countdown */
637 backlight_lcd_sleep_countdown(true);
640 backlight_fading_state
= NOT_FADING
;
644 #endif /* CONFIG_BACKLIGHT_FADING */
645 backlight_timeout_handler();
651 static void backlight_timeout_handler(void)
653 if(backlight_timer
> 0)
655 backlight_timer
-= BACKLIGHT_THREAD_TIMEOUT
;
656 if(backlight_timer
<= 0)
661 #ifdef HAVE_LCD_SLEEP
662 else if(lcd_sleep_timer
> 0)
664 lcd_sleep_timer
-= BACKLIGHT_THREAD_TIMEOUT
;
665 if(lcd_sleep_timer
<= 0)
670 #endif /* HAVE_LCD_SLEEP */
671 #ifdef HAVE_REMOTE_LCD
672 if(remote_backlight_timer
> 0)
674 remote_backlight_timer
-= BACKLIGHT_THREAD_TIMEOUT
;
675 if(remote_backlight_timer
<= 0)
677 _remote_backlight_off();
680 #endif /* HAVE_REMOVE_LCD */
681 #ifdef HAVE_BUTTON_LIGHT
682 if (buttonlight_timer
> 0)
684 buttonlight_timer
-= BACKLIGHT_THREAD_TIMEOUT
;
685 if (buttonlight_timer
<= 0)
690 #endif /* HAVE_BUTTON_LIGHT */
693 void backlight_init(void)
695 queue_init(&backlight_queue
, true);
698 if (_backlight_init())
700 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_PWM)
701 /* If backlight is already on, don't fade in. */
702 bl_dim_target
= BL_PWM_COUNT
;
703 bl_dim_fraction
= (BL_PWM_COUNT
<<16);
707 /* Leave all lights as set by the bootloader here. The settings load will
708 * call the appropriate backlight_set_*() functions, only changing light
709 * status if necessary. */
710 #ifdef BACKLIGHT_DRIVER_CLOSE
711 backlight_thread_id
=
713 create_thread(backlight_thread
, backlight_stack
,
714 sizeof(backlight_stack
), 0, backlight_thread_name
715 IF_PRIO(, PRIORITY_USER_INTERFACE
)
719 #ifdef BACKLIGHT_DRIVER_CLOSE
720 void backlight_close(void)
722 unsigned int thread
= backlight_thread_id
;
724 /* Wait for thread to exit */
728 backlight_thread_id
= 0;
730 queue_post(&backlight_queue
, BACKLIGHT_QUIT
, 0);
733 #endif /* BACKLIGHT_DRIVER_CLOSE */
735 void backlight_on(void)
737 queue_remove_from_head(&backlight_queue
, BACKLIGHT_ON
);
738 queue_post(&backlight_queue
, BACKLIGHT_ON
, 0);
741 void backlight_off(void)
743 queue_post(&backlight_queue
, BACKLIGHT_OFF
, 0);
746 /* returns true when the backlight is on,
747 * and optionally when it's set to always off. */
748 bool is_backlight_on(bool ignore_always_off
)
750 int timeout
= backlight_get_current_timeout();
751 return (backlight_timer
> 0) /* countdown */
752 || (timeout
== 0) /* always on */
753 || ((timeout
< 0) && !ignore_always_off
);
756 /* return value in ticks; 0 means always on, <0 means always off */
757 int backlight_get_current_timeout(void)
759 #ifdef HAS_BUTTON_HOLD
760 if ((backlight_on_button_hold
!= 0)
761 #ifdef HAVE_REMOTE_LCD_AS_MAIN
762 && remote_button_hold()
767 return (backlight_on_button_hold
== 2) ? 0 : -1;
768 /* always on or always off */
772 if (power_input_present())
773 return backlight_timeout_plugged
;
776 return backlight_timeout_normal
;
779 void backlight_set_timeout(int value
)
781 backlight_timeout_normal
= HZ
* value
;
782 queue_post(&backlight_queue
, BACKLIGHT_TMO_CHANGED
, 0);
786 void backlight_set_timeout_plugged(int value
)
788 backlight_timeout_plugged
= HZ
* value
;
789 queue_post(&backlight_queue
, BACKLIGHT_TMO_CHANGED
, 0);
791 #endif /* CONFIG_CHARGING */
793 #ifdef HAS_BUTTON_HOLD
794 /* Hold button change event handler. */
795 void backlight_hold_changed(bool hold_button
)
797 if (!hold_button
|| (backlight_on_button_hold
> 0))
798 /* if unlocked or override in effect */
802 void backlight_set_on_button_hold(int index
)
804 if ((unsigned)index
>= 3)
805 /* if given a weird value, use default */
808 backlight_on_button_hold
= index
;
809 queue_post(&backlight_queue
, BACKLIGHT_TMO_CHANGED
, 0);
811 #endif /* HAS_BUTTON_HOLD */
813 #ifdef HAVE_LCD_SLEEP_SETTING
814 void lcd_set_sleep_after_backlight_off(int index
)
816 if ((unsigned)index
>= sizeof(lcd_sleep_timeout_value
))
817 /* if given a weird value, use default */
820 lcd_sleep_timeout
= HZ
* lcd_sleep_timeout_value
[index
];
822 if (is_backlight_on(true))
823 /* Timer will be set when bl turns off or bl set to on. */
826 /* Backlight is Off */
827 if (lcd_sleep_timeout
< 0)
828 lcd_sleep_timer
= 1; /* Always - sleep next tick */
830 lcd_sleep_timer
= lcd_sleep_timeout
; /* Never, other */
832 #endif /* HAVE_LCD_SLEEP_SETTING */
834 #ifdef HAVE_REMOTE_LCD
835 void remote_backlight_on(void)
837 queue_post(&backlight_queue
, REMOTE_BACKLIGHT_ON
, 0);
840 void remote_backlight_off(void)
842 queue_post(&backlight_queue
, REMOTE_BACKLIGHT_OFF
, 0);
845 void remote_backlight_set_timeout(int value
)
847 remote_backlight_timeout_normal
= HZ
* value
;
848 queue_post(&backlight_queue
, REMOTE_BACKLIGHT_TMO_CHANGED
, 0);
852 void remote_backlight_set_timeout_plugged(int value
)
854 remote_backlight_timeout_plugged
= HZ
* value
;
855 queue_post(&backlight_queue
, REMOTE_BACKLIGHT_TMO_CHANGED
, 0);
857 #endif /* CONFIG_CHARGING */
859 #ifdef HAS_REMOTE_BUTTON_HOLD
860 /* Remote hold button change event handler. */
861 void remote_backlight_hold_changed(bool rc_hold_button
)
863 if (!rc_hold_button
|| (remote_backlight_on_button_hold
> 0))
864 /* if unlocked or override */
865 remote_backlight_on();
868 void remote_backlight_set_on_button_hold(int index
)
870 if ((unsigned)index
>= 3)
871 /* if given a weird value, use default */
874 remote_backlight_on_button_hold
= index
;
875 queue_post(&backlight_queue
, REMOTE_BACKLIGHT_TMO_CHANGED
, 0);
877 #endif /* HAS_REMOTE_BUTTON_HOLD */
879 /* return value in ticks; 0 means always on, <0 means always off */
880 int remote_backlight_get_current_timeout(void)
882 #ifdef HAS_REMOTE_BUTTON_HOLD
883 if (remote_button_hold() && (remote_backlight_on_button_hold
!= 0))
884 return (remote_backlight_on_button_hold
== 2)
885 ? 0 : -1; /* always on or always off */
889 if (power_input_present())
890 return remote_backlight_timeout_plugged
;
893 return remote_backlight_timeout_normal
;
896 /* returns true when the backlight is on, and
897 * optionally when it's set to always off */
898 bool is_remote_backlight_on(bool ignore_always_off
)
900 int timeout
= remote_backlight_get_current_timeout();
901 return (remote_backlight_timer
> 0) /* countdown */
902 || (timeout
== 0) /* always on */
903 || ((timeout
< 0) && !ignore_always_off
);
906 #endif /* HAVE_REMOTE_LCD */
908 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
909 void backlight_set_brightness(int val
)
911 if (val
< MIN_BRIGHTNESS_SETTING
)
912 val
= MIN_BRIGHTNESS_SETTING
;
913 else if (val
> MAX_BRIGHTNESS_SETTING
)
914 val
= MAX_BRIGHTNESS_SETTING
;
916 backlight_brightness
= val
;
917 _backlight_set_brightness(val
);
918 #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \
919 || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG)
920 /* receive backlight brightness */
921 _backlight_fade_update_state(val
);
924 #endif /* HAVE_BACKLIGHT_BRIGHTNESS */
926 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
927 void buttonlight_set_brightness(int val
)
929 if (val
< MIN_BRIGHTNESS_SETTING
)
930 val
= MIN_BRIGHTNESS_SETTING
;
931 else if (val
> MAX_BRIGHTNESS_SETTING
)
932 val
= MAX_BRIGHTNESS_SETTING
;
934 _buttonlight_set_brightness(val
);
936 #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
938 #else /* !defined(HAVE_BACKLIGHT) || !defined(BACKLIGHT_FULL_INIT)
939 -- no backlight, empty dummy functions */
941 #if defined(HAVE_BACKLIGHT) && !defined(BACKLIGHT_FULL_INIT)
942 void backlight_init(void)
944 (void)_backlight_init();
949 void backlight_on(void) {}
950 void backlight_off(void) {}
951 void buttonlight_on(void) {}
952 void backlight_set_timeout(int value
) {(void)value
;}
954 bool is_backlight_on(bool ignore_always_off
)
956 (void)ignore_always_off
;
959 #ifdef HAVE_REMOTE_LCD
960 void remote_backlight_on(void) {}
961 void remote_backlight_off(void) {}
962 void remote_backlight_set_timeout(int value
) {(void)value
;}
964 bool is_remote_backlight_on(bool ignore_always_off
)
966 (void)ignore_always_off
;
969 #endif /* HAVE_REMOTE_LCD */
970 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
971 void backlight_set_brightness(int val
) { (void)val
; }
973 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
974 void buttonlight_set_brightness(int val
) { (void)val
; }
976 #endif /* defined(HAVE_BACKLIGHT) && defined(BACKLIGHT_FULL_INIT) */