diff options
Diffstat (limited to 'firmware/backlight.c')
-rw-r--r-- | firmware/backlight.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/firmware/backlight.c b/firmware/backlight.c index 4a00f86f39..74cdee1205 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c | |||
@@ -39,6 +39,11 @@ | |||
39 | #include "backlight-target.h" | 39 | #include "backlight-target.h" |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | #if !defined(BOOTLOADER) | ||
43 | /* The whole driver should be built */ | ||
44 | #define BACKLIGHT_FULL_INIT | ||
45 | #endif | ||
46 | |||
42 | #ifdef SIMULATOR | 47 | #ifdef SIMULATOR |
43 | /* TODO: find a better way to do it but we need a kernel thread somewhere to | 48 | /* TODO: find a better way to do it but we need a kernel thread somewhere to |
44 | handle this */ | 49 | handle this */ |
@@ -85,7 +90,7 @@ static inline void _remote_backlight_off(void) | |||
85 | 90 | ||
86 | #endif /* SIMULATOR */ | 91 | #endif /* SIMULATOR */ |
87 | 92 | ||
88 | #if defined(HAVE_BACKLIGHT) && !defined(BOOTLOADER) | 93 | #if defined(HAVE_BACKLIGHT) && defined(BACKLIGHT_FULL_INIT) |
89 | 94 | ||
90 | enum { | 95 | enum { |
91 | BACKLIGHT_ON, | 96 | BACKLIGHT_ON, |
@@ -104,12 +109,18 @@ enum { | |||
104 | BUTTON_LIGHT_ON, | 109 | BUTTON_LIGHT_ON, |
105 | BUTTON_LIGHT_OFF, | 110 | BUTTON_LIGHT_OFF, |
106 | #endif | 111 | #endif |
112 | #ifdef BACKLIGHT_DRIVER_CLOSE | ||
113 | BACKLIGHT_QUIT, | ||
114 | #endif | ||
107 | }; | 115 | }; |
108 | 116 | ||
109 | static void backlight_thread(void); | 117 | static void backlight_thread(void); |
110 | static long backlight_stack[DEFAULT_STACK_SIZE/sizeof(long)]; | 118 | static long backlight_stack[DEFAULT_STACK_SIZE/sizeof(long)]; |
111 | static const char backlight_thread_name[] = "backlight"; | 119 | static const char backlight_thread_name[] = "backlight"; |
112 | static struct event_queue backlight_queue; | 120 | static struct event_queue backlight_queue; |
121 | #ifdef BACKLIGHT_DRIVER_CLOSE | ||
122 | static struct thread_entry *backlight_thread_p = NULL; | ||
123 | #endif | ||
113 | 124 | ||
114 | static int backlight_timer SHAREDBSS_ATTR; | 125 | static int backlight_timer SHAREDBSS_ATTR; |
115 | static int backlight_timeout SHAREDBSS_ATTR; | 126 | static int backlight_timeout SHAREDBSS_ATTR; |
@@ -158,7 +169,7 @@ void buttonlight_set_timeout(int value) | |||
158 | buttonlight_update_state(); | 169 | buttonlight_update_state(); |
159 | } | 170 | } |
160 | 171 | ||
161 | #endif | 172 | #endif /* HAVE_BUTTON_LIGHT */ |
162 | 173 | ||
163 | #ifdef HAVE_REMOTE_LCD | 174 | #ifdef HAVE_REMOTE_LCD |
164 | static int remote_backlight_timer; | 175 | static int remote_backlight_timer; |
@@ -170,7 +181,7 @@ static int remote_backlight_timeout_plugged = 5*HZ; | |||
170 | #ifdef HAS_REMOTE_BUTTON_HOLD | 181 | #ifdef HAS_REMOTE_BUTTON_HOLD |
171 | static int remote_backlight_on_button_hold = 0; | 182 | static int remote_backlight_on_button_hold = 0; |
172 | #endif | 183 | #endif |
173 | #endif | 184 | #endif /* HAVE_REMOTE_LCD */ |
174 | 185 | ||
175 | #ifdef HAVE_LCD_SLEEP | 186 | #ifdef HAVE_LCD_SLEEP |
176 | const signed char lcd_sleep_timeout_value[10] = | 187 | const signed char lcd_sleep_timeout_value[10] = |
@@ -494,6 +505,12 @@ void backlight_thread(void) | |||
494 | case SYS_USB_DISCONNECTED: | 505 | case SYS_USB_DISCONNECTED: |
495 | usb_acknowledge(SYS_USB_DISCONNECTED_ACK); | 506 | usb_acknowledge(SYS_USB_DISCONNECTED_ACK); |
496 | break; | 507 | break; |
508 | |||
509 | #ifdef BACKLIGHT_DRIVER_CLOSE | ||
510 | /* Get out of here */ | ||
511 | case BACKLIGHT_QUIT: | ||
512 | return; | ||
513 | #endif | ||
497 | } | 514 | } |
498 | if (locked) | 515 | if (locked) |
499 | continue; | 516 | continue; |
@@ -613,7 +630,9 @@ void backlight_init(void) | |||
613 | /* Leave all lights as set by the bootloader here. The settings load will | 630 | /* Leave all lights as set by the bootloader here. The settings load will |
614 | * call the appropriate backlight_set_*() functions, only changing light | 631 | * call the appropriate backlight_set_*() functions, only changing light |
615 | * status if necessary. */ | 632 | * status if necessary. */ |
616 | 633 | #ifdef BACKLIGHT_DRIVER_CLOSE | |
634 | backlight_thread_p = | ||
635 | #endif | ||
617 | create_thread(backlight_thread, backlight_stack, | 636 | create_thread(backlight_thread, backlight_stack, |
618 | sizeof(backlight_stack), 0, backlight_thread_name | 637 | sizeof(backlight_stack), 0, backlight_thread_name |
619 | IF_PRIO(, PRIORITY_USER_INTERFACE) | 638 | IF_PRIO(, PRIORITY_USER_INTERFACE) |
@@ -621,6 +640,22 @@ void backlight_init(void) | |||
621 | tick_add_task(backlight_tick); | 640 | tick_add_task(backlight_tick); |
622 | } | 641 | } |
623 | 642 | ||
643 | #ifdef BACKLIGHT_DRIVER_CLOSE | ||
644 | void backlight_close(void) | ||
645 | { | ||
646 | struct thread_entry *thread = backlight_thread_p; | ||
647 | |||
648 | /* Wait for thread to exit */ | ||
649 | if (thread == NULL) | ||
650 | return; | ||
651 | |||
652 | backlight_thread_p = NULL; | ||
653 | |||
654 | queue_post(&backlight_queue, BACKLIGHT_QUIT, 0); | ||
655 | thread_wait(thread); | ||
656 | } | ||
657 | #endif /* BACKLIGHT_DRIVER_CLOSE */ | ||
658 | |||
624 | void backlight_on(void) | 659 | void backlight_on(void) |
625 | { | 660 | { |
626 | queue_remove_from_head(&backlight_queue, BACKLIGHT_ON); | 661 | queue_remove_from_head(&backlight_queue, BACKLIGHT_ON); |
@@ -788,10 +823,10 @@ void buttonlight_set_brightness(int val) | |||
788 | } | 823 | } |
789 | #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ | 824 | #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ |
790 | 825 | ||
791 | #else /* !defined(HAVE_BACKLIGHT) || defined(BOOTLOADER) | 826 | #else /* !defined(HAVE_BACKLIGHT) || !defined(BACKLIGHT_FULL_INIT) |
792 | -- no backlight, empty dummy functions */ | 827 | -- no backlight, empty dummy functions */ |
793 | 828 | ||
794 | #if defined(BOOTLOADER) && defined(HAVE_BACKLIGHT) | 829 | #if defined(HAVE_BACKLIGHT) && !defined(BACKLIGHT_FULL_INIT) |
795 | void backlight_init(void) | 830 | void backlight_init(void) |
796 | { | 831 | { |
797 | (void)_backlight_init(); | 832 | (void)_backlight_init(); |
@@ -826,4 +861,4 @@ void backlight_set_brightness(int val) { (void)val; } | |||
826 | #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS | 861 | #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS |
827 | void buttonlight_set_brightness(int val) { (void)val; } | 862 | void buttonlight_set_brightness(int val) { (void)val; } |
828 | #endif | 863 | #endif |
829 | #endif /* defined(HAVE_BACKLIGHT) && !defined(BOOTLOADER) */ | 864 | #endif /* defined(HAVE_BACKLIGHT) && defined(BACKLIGHT_FULL_INIT) */ |