summaryrefslogtreecommitdiff
path: root/firmware/backlight.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/backlight.c')
-rw-r--r--firmware/backlight.c207
1 files changed, 93 insertions, 114 deletions
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 @@
46 handle this */ 46 handle this */
47extern void screen_dump(void); 47extern void screen_dump(void);
48 48
49static inline void __backlight_on(void) 49static inline void _backlight_on(void)
50{ 50{
51 sim_backlight(100); 51 sim_backlight(100);
52} 52}
53 53
54static inline void __backlight_off(void) 54static inline void _backlight_off(void)
55{ 55{
56 sim_backlight(0); 56 sim_backlight(0);
57} 57}
58 58
59#ifdef HAVE_BACKLIGHT_BRIGHTNESS 59static inline void _backlight_set_brightness(int val)
60static inline void __backlight_set_brightness(int val)
61{ 60{
62 (void)val; 61 (void)val;
63} 62}
64#endif
65 63
66#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS 64static inline void _buttonlight_on(void)
67static inline void __buttonlight_set_brightness(int val) 65{
66}
67
68static inline void _buttonlight_off(void)
69{
70}
71
72static inline void _buttonlight_set_brightness(int val)
68{ 73{
69 (void)val; 74 (void)val;
70} 75}
71#endif 76#ifdef HAVE_REMOTE_LCD
77static inline void _remote_backlight_on(void)
78{
79 sim_remote_backlight(100);
80}
81
82static inline void _remote_backlight_off(void)
83{
84 sim_remote_backlight(0);
85}
86#endif /* HAVE_REMOTE_LCD */
72 87
73#endif /* SIMULATOR */ 88#endif /* SIMULATOR */
74 89
@@ -79,18 +94,24 @@ const signed char backlight_timeout_value[19] =
79 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 45, 60, 90 94 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 45, 60, 90
80}; 95};
81 96
82#define BACKLIGHT_ON 1 97enum {
83#define BACKLIGHT_OFF 2 98 BACKLIGHT_ON,
84#define REMOTE_BACKLIGHT_ON 3 99 BACKLIGHT_OFF,
85#define REMOTE_BACKLIGHT_OFF 4 100#ifdef HAVE_REMOTE_LCD
86#define BACKLIGHT_UNBOOST_CPU 5 101 REMOTE_BACKLIGHT_ON,
102 REMOTE_BACKLIGHT_OFF,
103#endif
104#if defined(_BACKLIGHT_FADE_BOOST) || defined(_BACKLIGHT_FADE_ENABLE)
105 BACKLIGHT_FADE_FINISH,
106#endif
87#ifdef HAVE_LCD_SLEEP 107#ifdef HAVE_LCD_SLEEP
88#define LCD_SLEEP 6 108 LCD_SLEEP,
89#endif 109#endif
90#ifdef HAVE_BUTTON_LIGHT 110#ifdef HAVE_BUTTON_LIGHT
91#define BUTTON_LIGHT_ON 7 111 BUTTON_LIGHT_ON,
92#define BUTTON_LIGHT_OFF 8 112 BUTTON_LIGHT_OFF,
93#endif 113#endif
114};
94 115
95static void backlight_thread(void); 116static void backlight_thread(void);
96static long backlight_stack[DEFAULT_STACK_SIZE/sizeof(long)]; 117static long backlight_stack[DEFAULT_STACK_SIZE/sizeof(long)];
@@ -109,36 +130,12 @@ static int backlight_on_button_hold = 0;
109 130
110#ifdef HAVE_BUTTON_LIGHT 131#ifdef HAVE_BUTTON_LIGHT
111static int buttonlight_timer; 132static int buttonlight_timer;
112static int buttonlight_timeout = 5*HZ; 133int _buttonlight_timeout = 5*HZ;
113
114/* internal interface */
115static void _buttonlight_on(void)
116{
117#ifndef SIMULATOR
118#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
119 __buttonlight_dim(false);
120#else
121 __buttonlight_on();
122#endif
123#endif
124}
125
126void _buttonlight_off(void)
127{
128#ifndef SIMULATOR
129#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
130 if(buttonlight_timeout>0)
131 __buttonlight_dim(true);
132 else
133#endif
134 __buttonlight_off();
135#endif
136}
137 134
138/* Update state of buttonlight according to timeout setting */ 135/* Update state of buttonlight according to timeout setting */
139static void buttonlight_update_state(void) 136static void buttonlight_update_state(void)
140{ 137{
141 buttonlight_timer = buttonlight_timeout; 138 buttonlight_timer = _buttonlight_timeout;
142 139
143 /* Buttonlight == OFF in the setting? */ 140 /* Buttonlight == OFF in the setting? */
144 if (buttonlight_timer < 0) 141 if (buttonlight_timer < 0)
@@ -167,7 +164,7 @@ void buttonlight_set_timeout(int index)
167 if((unsigned)index >= sizeof(backlight_timeout_value)) 164 if((unsigned)index >= sizeof(backlight_timeout_value))
168 /* if given a weird value, use default */ 165 /* if given a weird value, use default */
169 index = 6; 166 index = 6;
170 buttonlight_timeout = HZ * backlight_timeout_value[index]; 167 _buttonlight_timeout = HZ * backlight_timeout_value[index];
171 buttonlight_update_state(); 168 buttonlight_update_state();
172} 169}
173 170
@@ -190,13 +187,13 @@ const signed char lcd_sleep_timeout_value[10] =
190{ 187{
191 -1, 0, 5, 10, 15, 20, 30, 45, 60, 90 188 -1, 0, 5, 10, 15, 20, 30, 45, 60, 90
192}; 189};
193static int lcd_sleep_timer; 190int _lcd_sleep_timer;
194static int lcd_sleep_timeout = 10*HZ; 191int _lcd_sleep_timeout = 10*HZ;
195#endif 192#endif
196 193
197#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) 194#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)
198/* backlight fading */ 195/* backlight fading */
199#define BL_PWM_INTERVAL 5000 /* Cycle interval in s */ 196#define BL_PWM_INTERVAL 5000 /* Cycle interval in us */
200#define BL_PWM_COUNT 100 197#define BL_PWM_COUNT 100
201static const char backlight_fade_value[8] = { 0, 1, 2, 4, 6, 8, 10, 20 }; 198static const char backlight_fade_value[8] = { 0, 1, 2, 4, 6, 8, 10, 20 };
202static int fade_in_count = 1; 199static int fade_in_count = 1;
@@ -224,7 +221,7 @@ static void backlight_isr(void)
224 221
225 if (bl_dim_current > 0 && bl_dim_current < BL_PWM_COUNT) 222 if (bl_dim_current > 0 && bl_dim_current < BL_PWM_COUNT)
226 { 223 {
227 __backlight_on(); 224 _backlight_on_isr();
228 bl_pwm_counter = bl_dim_current; 225 bl_pwm_counter = bl_dim_current;
229 timer_period = timer_period * bl_pwm_counter / BL_PWM_COUNT; 226 timer_period = timer_period * bl_pwm_counter / BL_PWM_COUNT;
230 bl_dim_state = DIM_STATE_MAIN; 227 bl_dim_state = DIM_STATE_MAIN;
@@ -232,9 +229,9 @@ static void backlight_isr(void)
232 else 229 else
233 { 230 {
234 if (bl_dim_current) 231 if (bl_dim_current)
235 __backlight_on(); 232 _backlight_on_isr();
236 else 233 else
237 __backlight_off(); 234 _backlight_off_isr();
238 if (bl_dim_current == bl_dim_target) 235 if (bl_dim_current == bl_dim_target)
239 idle = true; 236 idle = true;
240 } 237 }
@@ -243,7 +240,7 @@ static void backlight_isr(void)
243 240
244 /* Dim main screen */ 241 /* Dim main screen */
245 case DIM_STATE_MAIN: 242 case DIM_STATE_MAIN:
246 __backlight_off(); 243 _backlight_off_isr();
247 bl_dim_state = DIM_STATE_START; 244 bl_dim_state = DIM_STATE_START;
248 timer_period = timer_period * (BL_PWM_COUNT - bl_pwm_counter) / BL_PWM_COUNT; 245 timer_period = timer_period * (BL_PWM_COUNT - bl_pwm_counter) / BL_PWM_COUNT;
249 break ; 246 break ;
@@ -263,8 +260,8 @@ static void backlight_isr(void)
263 260
264 if (idle) 261 if (idle)
265 { 262 {
266#ifdef CPU_COLDFIRE 263#if defined(_BACKLIGHT_FADE_BOOST) || defined(_BACKLIGHT_FADE_ENABLE)
267 queue_post(&backlight_queue, BACKLIGHT_UNBOOST_CPU, 0); 264 queue_post(&backlight_queue, BACKLIGHT_FADE_FINISH, 0);
268#endif 265#endif
269 timer_unregister(); 266 timer_unregister();
270 bl_timer_active = false; 267 bl_timer_active = false;
@@ -277,19 +274,19 @@ static void backlight_switch(void)
277{ 274{
278 if (bl_dim_target > (BL_PWM_COUNT/2)) 275 if (bl_dim_target > (BL_PWM_COUNT/2))
279 { 276 {
280 __backlight_on(); 277 _backlight_on_normal();
281 bl_dim_current = BL_PWM_COUNT; 278 bl_dim_current = BL_PWM_COUNT;
282 } 279 }
283 else 280 else
284 { 281 {
285 __backlight_off(); 282 _backlight_off_normal();
286 bl_dim_current = 0; 283 bl_dim_current = 0;
287 } 284 }
288} 285}
289 286
290static void backlight_release_timer(void) 287static void backlight_release_timer(void)
291{ 288{
292#ifdef CPU_COLDFIRE 289#ifdef _BACKLIGHT_FADE_BOOST
293 cpu_boost(false); 290 cpu_boost(false);
294#endif 291#endif
295 timer_unregister(); 292 timer_unregister();
@@ -310,7 +307,7 @@ static void backlight_dim(int value)
310 307
311 if (timer_register(0, backlight_release_timer, 2, 0, backlight_isr)) 308 if (timer_register(0, backlight_release_timer, 2, 0, backlight_isr))
312 { 309 {
313#ifdef CPU_COLDFIRE 310#ifdef _BACKLIGHT_FADE_BOOST
314 /* Prevent cpu frequency changes while dimming. */ 311 /* Prevent cpu frequency changes while dimming. */
315 cpu_boost(true); 312 cpu_boost(true);
316#endif 313#endif
@@ -320,80 +317,58 @@ static void backlight_dim(int value)
320 backlight_switch(); 317 backlight_switch();
321} 318}
322 319
323void backlight_set_fade_in(int index)
324{
325 fade_in_count = backlight_fade_value[index];
326}
327
328void backlight_set_fade_out(int index)
329{
330 fade_out_count = backlight_fade_value[index];
331}
332#endif /* defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) */
333
334static void _backlight_on(void) 320static void _backlight_on(void)
335{ 321{
336#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)
337 if (fade_in_count > 0) 322 if (fade_in_count > 0)
323 {
324#ifdef _BACKLIGHT_FADE_ENABLE
325 _backlight_hw_enable(true);
326#endif
338 backlight_dim(BL_PWM_COUNT); 327 backlight_dim(BL_PWM_COUNT);
328 }
339 else 329 else
340 { 330 {
341 bl_dim_target = bl_dim_current = BL_PWM_COUNT; 331 bl_dim_target = bl_dim_current = BL_PWM_COUNT;
342 __backlight_on(); 332 _backlight_on_normal();
343 } 333 }
344#elif defined(HAVE_BACKLIGHT_SET_FADING) && !defined(SIMULATOR)
345 /* call the enable from here - it takes longer than the disable */
346 lcd_enable(true);
347 __backlight_dim(false);
348#else
349 __backlight_on();
350#endif
351#ifdef HAVE_LCD_SLEEP 334#ifdef HAVE_LCD_SLEEP
352 lcd_sleep_timer = 0; /* LCD should be awake already */ 335 _lcd_sleep_timer = 0; /* LCD should be awake already */
353#endif 336#endif
354} 337}
355 338
356static void _backlight_off(void) 339static void _backlight_off(void)
357{ 340{
358#if defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)
359 if (fade_out_count > 0) 341 if (fade_out_count > 0)
342 {
360 backlight_dim(0); 343 backlight_dim(0);
344 }
361 else 345 else
362 { 346 {
363 bl_dim_target = bl_dim_current = 0; 347 bl_dim_target = bl_dim_current = 0;
364 __backlight_off(); 348 _backlight_off_normal();
365 } 349 }
366#elif defined(HAVE_BACKLIGHT_SET_FADING) && !defined(SIMULATOR)
367 __backlight_dim(true);
368#else
369 __backlight_off();
370#endif
371
372#ifdef HAVE_LCD_SLEEP 350#ifdef HAVE_LCD_SLEEP
373 /* Start LCD sleep countdown */ 351 /* Start LCD sleep countdown */
374 if (lcd_sleep_timeout < 0) 352 if (_lcd_sleep_timeout < 0)
375 { 353 {
376 lcd_sleep_timer = 0; /* Setting == Always */ 354 _lcd_sleep_timer = 0; /* Setting == Always */
377 lcd_sleep(); 355 lcd_sleep();
378 } 356 }
379 else 357 else
380 lcd_sleep_timer = lcd_sleep_timeout; 358 _lcd_sleep_timer = _lcd_sleep_timeout;
381#endif 359#endif
382} 360}
383 361
384#ifdef HAVE_REMOTE_LCD 362void backlight_set_fade_in(int index)
385#ifdef SIMULATOR
386static void __remote_backlight_on(void)
387{ 363{
388 sim_remote_backlight(100); 364 fade_in_count = backlight_fade_value[index];
389} 365}
390 366
391static void __remote_backlight_off(void) 367void backlight_set_fade_out(int index)
392{ 368{
393 sim_remote_backlight(0); 369 fade_out_count = backlight_fade_value[index];
394} 370}
395#endif /* SIMULATOR */ 371#endif /* defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR) */
396#endif /* HAVE_REMOTE_LCD */
397 372
398/* Update state of backlight according to timeout setting */ 373/* Update state of backlight according to timeout setting */
399static void backlight_update_state(void) 374static void backlight_update_state(void)
@@ -453,12 +428,12 @@ static void remote_backlight_update_state(void)
453 if (remote_backlight_timeout < 0) 428 if (remote_backlight_timeout < 0)
454 { 429 {
455 remote_backlight_timer = 0; /* Disable the timeout */ 430 remote_backlight_timer = 0; /* Disable the timeout */
456 __remote_backlight_off(); 431 _remote_backlight_off();
457 } 432 }
458 else 433 else
459 { 434 {
460 remote_backlight_timer = remote_backlight_timeout; 435 remote_backlight_timer = remote_backlight_timeout;
461 __remote_backlight_on(); 436 _remote_backlight_on();
462 } 437 }
463} 438}
464#endif /* HAVE_REMOTE_LCD */ 439#endif /* HAVE_REMOTE_LCD */
@@ -473,12 +448,16 @@ void backlight_thread(void)
473 queue_wait(&backlight_queue, &ev); 448 queue_wait(&backlight_queue, &ev);
474 switch(ev.id) 449 switch(ev.id)
475 { /* These events must always be processed */ 450 { /* These events must always be processed */
476#if defined(HAVE_BACKLIGHT_PWM_FADING) && defined(CPU_COLDFIRE) \ 451#ifdef _BACKLIGHT_FADE_BOOST
477 && !defined(SIMULATOR) 452 case BACKLIGHT_FADE_FINISH:
478 case BACKLIGHT_UNBOOST_CPU:
479 cpu_boost(false); 453 cpu_boost(false);
480 break; 454 break;
481#endif 455#endif
456#ifdef _BACKLIGHT_FADE_ENABLE
457 case BACKLIGHT_FADE_FINISH:
458 _backlight_hw_enable((bl_dim_current|bl_dim_target) != 0);
459 break;
460#endif
482 461
483#if defined(HAVE_REMOTE_LCD) && !defined(SIMULATOR) 462#if defined(HAVE_REMOTE_LCD) && !defined(SIMULATOR)
484 /* Here for now or else the aggressive init messes up scrolling */ 463 /* Here for now or else the aggressive init messes up scrolling */
@@ -519,7 +498,7 @@ void backlight_thread(void)
519 498
520 case REMOTE_BACKLIGHT_OFF: 499 case REMOTE_BACKLIGHT_OFF:
521 remote_backlight_timer = 0; /* Disable the timeout */ 500 remote_backlight_timer = 0; /* Disable the timeout */
522 __remote_backlight_off(); 501 _remote_backlight_off();
523 break; 502 break;
524#endif /* HAVE_REMOTE_LCD */ 503#endif /* HAVE_REMOTE_LCD */
525 504
@@ -575,10 +554,10 @@ static void backlight_tick(void)
575 } 554 }
576 } 555 }
577#ifdef HAVE_LCD_SLEEP 556#ifdef HAVE_LCD_SLEEP
578 else if(lcd_sleep_timer) 557 else if(_lcd_sleep_timer)
579 { 558 {
580 lcd_sleep_timer--; 559 _lcd_sleep_timer--;
581 if(lcd_sleep_timer == 0) 560 if(_lcd_sleep_timer == 0)
582 { 561 {
583 /* Queue on bl thread or freeze! */ 562 /* Queue on bl thread or freeze! */
584 queue_post(&backlight_queue, LCD_SLEEP, 0); 563 queue_post(&backlight_queue, LCD_SLEEP, 0);
@@ -613,7 +592,7 @@ void backlight_init(void)
613 queue_init(&backlight_queue, true); 592 queue_init(&backlight_queue, true);
614 593
615#ifndef SIMULATOR 594#ifndef SIMULATOR
616 if (__backlight_init()) 595 if (_backlight_init())
617 { 596 {
618# ifdef HAVE_BACKLIGHT_PWM_FADING 597# ifdef HAVE_BACKLIGHT_PWM_FADING
619 /* If backlight is already on, don't fade in. */ 598 /* If backlight is already on, don't fade in. */
@@ -706,17 +685,17 @@ void lcd_set_sleep_after_backlight_off(int index)
706 /* if given a weird value, use default */ 685 /* if given a weird value, use default */
707 index = 3; 686 index = 3;
708 687
709 lcd_sleep_timeout = HZ * lcd_sleep_timeout_value[index]; 688 _lcd_sleep_timeout = HZ * lcd_sleep_timeout_value[index];
710 689
711 if (backlight_timer > 0 || backlight_get_current_timeout() == 0) 690 if (backlight_timer > 0 || backlight_get_current_timeout() == 0)
712 /* Timer will be set when bl turns off or bl set to on. */ 691 /* Timer will be set when bl turns off or bl set to on. */
713 return; 692 return;
714 693
715 /* Backlight is Off */ 694 /* Backlight is Off */
716 if (lcd_sleep_timeout < 0) 695 if (_lcd_sleep_timeout < 0)
717 lcd_sleep_timer = 1; /* Always - sleep next tick */ 696 _lcd_sleep_timer = 1; /* Always - sleep next tick */
718 else 697 else
719 lcd_sleep_timer = lcd_sleep_timeout; /* Never, other */ 698 _lcd_sleep_timer = _lcd_sleep_timeout; /* Never, other */
720} 699}
721#endif /* HAVE_LCD_SLEEP */ 700#endif /* HAVE_LCD_SLEEP */
722 701
@@ -796,7 +775,7 @@ void backlight_set_brightness(int val)
796 else if (val > MAX_BRIGHTNESS_SETTING) 775 else if (val > MAX_BRIGHTNESS_SETTING)
797 val = MAX_BRIGHTNESS_SETTING; 776 val = MAX_BRIGHTNESS_SETTING;
798 777
799 __backlight_set_brightness(val); 778 _backlight_set_brightness(val);
800} 779}
801#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ 780#endif /* HAVE_BACKLIGHT_BRIGHTNESS */
802 781
@@ -808,7 +787,7 @@ void buttonlight_set_brightness(int val)
808 else if (val > MAX_BRIGHTNESS_SETTING) 787 else if (val > MAX_BRIGHTNESS_SETTING)
809 val = MAX_BRIGHTNESS_SETTING; 788 val = MAX_BRIGHTNESS_SETTING;
810 789
811 __buttonlight_set_brightness(val); 790 _buttonlight_set_brightness(val);
812} 791}
813#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ 792#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */
814 793
@@ -818,8 +797,8 @@ void buttonlight_set_brightness(int val)
818#if defined(BOOTLOADER) && defined(HAVE_BACKLIGHT) 797#if defined(BOOTLOADER) && defined(HAVE_BACKLIGHT)
819void backlight_init(void) 798void backlight_init(void)
820{ 799{
821 (void)__backlight_init(); 800 (void)_backlight_init();
822 __backlight_on(); 801 _backlight_on();
823} 802}
824#endif 803#endif
825 804