diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/backlight.c | 57 | ||||
-rw-r--r-- | firmware/drivers/adc.c | 2 | ||||
-rw-r--r-- | firmware/drivers/button.c | 10 | ||||
-rw-r--r-- | firmware/export/backlight.h | 23 | ||||
-rwxr-xr-x | firmware/target/coldfire/iaudio/x5/adc-x5.c | 2 | ||||
-rwxr-xr-x | firmware/target/coldfire/iaudio/x5/button-x5.c | 16 | ||||
-rw-r--r-- | firmware/target/coldfire/iaudio/x5/pcf50606-x5.c | 2 |
7 files changed, 92 insertions, 20 deletions
diff --git a/firmware/backlight.c b/firmware/backlight.c index 6f7432c9e2..bf88cbe9bc 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c @@ -178,6 +178,9 @@ static int remote_backlight_timeout = 5*HZ; #ifdef CONFIG_CHARGING static int remote_backlight_timeout_plugged = 5*HZ; #endif +#ifdef HAS_REMOTE_BUTTON_HOLD +static int remote_backlight_on_button_hold = 0; +#endif #endif #ifdef HAVE_LCD_SLEEP @@ -461,6 +464,10 @@ static void remote_backlight_update_state(void) if (remote_backlight_timer < 0) { remote_backlight_timer = 0; /* Disable the timeout */ +#ifdef HAS_REMOTE_BUTTON_HOLD + if (remote_backlight_on_button_hold == 2 && remote_button_hold()) + return; /* Keep on if "On" */ +#endif __remote_backlight_off(); } else @@ -471,8 +478,18 @@ static void remote_backlight_update_state(void) backlight_update_state(); } else -#endif +#endif + { +#ifdef HAS_REMOTE_BUTTON_HOLD + if (remote_backlight_on_button_hold == 1 && remote_button_hold()) + { + /* Keep off if "Off". */ + remote_backlight_timer = 0; /* Disable the timeout */ + return; + } +#endif __remote_backlight_on(); + } } } #endif /* HAVE_REMOTE_LCD */ @@ -493,9 +510,15 @@ void backlight_thread(void) case REMOTE_BACKLIGHT_OFF: remote_backlight_timer = 0; /* Disable the timeout */ +#ifdef HAS_REMOTE_BUTTON_HOLD + if (remote_backlight_on_button_hold == 2 && + remote_button_hold()) + break; /* Keep on if "On" */ +#endif __remote_backlight_off(); break; -#endif +#endif /* HAVE_REMOTE_LCD */ + case BACKLIGHT_ON: backlight_update_state(); break; @@ -701,9 +724,7 @@ void backlight_hold_changed(bool hold_button) set to "Normal" */ /* Queue or freeze */ if (hold_button && backlight_on_button_hold == 1) - { backlight_off(); /* setting == Off */ - } else /* setting == On, Normal, no hold button, or anything else */ backlight_on(); } @@ -774,6 +795,34 @@ void remote_backlight_set_timeout_plugged(int index) } #endif /* CONFIG_CHARGING */ +#ifdef HAS_REMOTE_BUTTON_HOLD +/* Remote hold button change event handler. */ +void remote_backlight_hold_changed(bool rc_hold_button) +{ + /* Hold switch overrides all backlight behavior except when + set to "Normal" */ + /* Queue or freeze */ + if (rc_hold_button && remote_backlight_on_button_hold == 1) + remote_backlight_off(); /* setting == Off */ + else /* setting == On, Normal, no hold button, or anything else */ + remote_backlight_on(); + +} + +void remote_backlight_set_on_button_hold(int index) +{ + if ((unsigned)index >= 3) + /* if given a weird value, use default */ + index = 0; + + if (index == remote_backlight_on_button_hold) + return; + + remote_backlight_on_button_hold = index; + remote_backlight_hold_changed(remote_button_hold()); +} +#endif /* HAS_REMOTE_BUTTON_HOLD */ + /* return value in ticks; 0 means always on, <0 means always off */ int remote_backlight_get_current_timeout(void) { diff --git a/firmware/drivers/adc.c b/firmware/drivers/adc.c index 1ebac066e7..d00f89958a 100644 --- a/firmware/drivers/adc.c +++ b/firmware/drivers/adc.c @@ -123,6 +123,7 @@ static int channelnum[] = unsigned short adc_scan(int channel) { + int level = set_irq_level(HIGHEST_IRQ_LEVEL); unsigned char data; pcf50606_write(0x2f, 0x80 | (channelnum[channel] << 1) | 1); @@ -130,6 +131,7 @@ unsigned short adc_scan(int channel) adcdata[channel] = data; + set_irq_level(level); return data; } #else diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index f31ab33c87..5e6f6b4827 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -845,6 +845,7 @@ static int button_read(void) static int prev_data = 0xff; static int last_valid = 0xff; bool hold_button_old; + bool remote_hold_button_old; /* normal buttons */ hold_button_old = hold_button; @@ -916,12 +917,13 @@ static int button_read(void) } /* remote buttons */ + remote_hold_button_old = remote_hold_button; remote_hold_button = remote_button_hold_only(); - if (remote_hold_button && !remote_button_hold_only()) - { - remote_backlight_on(); - } +#ifndef BOOTLOADER + if (remote_hold_button != remote_hold_button_old) + remote_backlight_hold_changed(remote_hold_button); +#endif if (!remote_hold_button) { diff --git a/firmware/export/backlight.h b/firmware/export/backlight.h index 62f024816f..6875768f0c 100644 --- a/firmware/export/backlight.h +++ b/firmware/export/backlight.h @@ -25,27 +25,35 @@ bool is_backlight_on(void); void backlight_on(void); void backlight_off(void); void backlight_set_timeout(int index); + #ifdef CONFIG_BACKLIGHT void backlight_init(void); + #if defined(IAUDIO_X5) && !defined(SIMULATOR) #define X5_BACKLIGHT_SHUTDOWN void x5_backlight_shutdown(void); #endif + int backlight_get_current_timeout(void); + #ifdef HAVE_BACKLIGHT_PWM_FADING void backlight_set_fade_in(int index); void backlight_set_fade_out(int index); #endif + void backlight_set_timeout_plugged(int index); extern const signed char backlight_timeout_value[]; + #ifdef HAS_BUTTON_HOLD -void backlight_set_on_button_hold(int index); void backlight_hold_changed(bool hold_button); +void backlight_set_on_button_hold(int index); #endif + #ifdef HAVE_LCD_SLEEP void lcd_set_sleep_after_backlight_off(int index); extern const signed char lcd_sleep_timeout_value[]; #endif + #else /* ndef CONFIG_BACKLIGHT */ #define backlight_init() #endif /* CONFIG_BACKLIGHT */ @@ -56,15 +64,20 @@ void remote_backlight_off(void); void remote_backlight_set_timeout(int index); void remote_backlight_set_timeout_plugged(int index); bool is_remote_backlight_on(void); + +#ifdef HAS_REMOTE_BUTTON_HOLD +void remote_backlight_hold_changed(bool rc_hold_button); +void remote_backlight_set_on_button_hold(int index); #endif +#endif /* HAVE_REMOTE_LCD */ #ifdef SIMULATOR void sim_backlight(int value); void sim_remote_backlight(int value); #endif -#endif #ifdef HAVE_BACKLIGHT_BRIGHTNESS + #ifdef IAUDIO_X5 /* PFC50506 can output 0%-100% duty cycle but D305A expects %15-100%. */ #define MIN_BRIGHTNESS_SETTING 1 /* 15/16 (93.75%) */ @@ -74,7 +87,9 @@ void sim_remote_backlight(int value); #define MIN_BRIGHTNESS_SETTING 2 /* 2/16 (12.50%) */ #define MAX_BRIGHTNESS_SETTING 15 /* 15/16 (93.75%) */ #define DEFAULT_BRIGHTNESS_SETTING 9 /* 9/16 (56.25%) */ -#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ +#endif void backlight_set_brightness(int val); -#endif +#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ + +#endif /* BACKLIGHT_H */ diff --git a/firmware/target/coldfire/iaudio/x5/adc-x5.c b/firmware/target/coldfire/iaudio/x5/adc-x5.c index e465f38494..fc45da8624 100755 --- a/firmware/target/coldfire/iaudio/x5/adc-x5.c +++ b/firmware/target/coldfire/iaudio/x5/adc-x5.c @@ -35,6 +35,7 @@ static int channelnum[] = unsigned short adc_scan(int channel) { + int level = set_irq_level(HIGHEST_IRQ_LEVEL); unsigned char data; pcf50606_write(0x2f, 0x80 | (channelnum[channel] << 1) | 1); @@ -42,6 +43,7 @@ unsigned short adc_scan(int channel) adcdata[channel] = data; + set_irq_level(level); return data; } diff --git a/firmware/target/coldfire/iaudio/x5/button-x5.c b/firmware/target/coldfire/iaudio/x5/button-x5.c index 287ee0e92b..84d1dbc7d8 100755 --- a/firmware/target/coldfire/iaudio/x5/button-x5.c +++ b/firmware/target/coldfire/iaudio/x5/button-x5.c @@ -41,7 +41,7 @@ bool button_hold(void) bool remote_button_hold(void) { - return false; /* TODO X5 */ + return adc_scan(ADC_REMOTE) < 0x17; } int button_read_device(void) @@ -51,6 +51,7 @@ int button_read_device(void) static bool hold_button = false; static bool remote_hold_button = false; bool hold_button_old; + bool remote_hold_button_old; /* normal buttons */ hold_button_old = hold_button; @@ -90,14 +91,15 @@ int button_read_device(void) } /* remote buttons */ - - /* TODO: add light handling for the remote */ - - remote_hold_button = remote_button_hold(); + remote_hold_button_old = remote_hold_button; data = adc_scan(ADC_REMOTE); - if(data < 0x17) - remote_hold_button = true; + remote_hold_button = data < 0x17; + +#ifndef BOOTLOADER + if (remote_hold_button != remote_hold_button_old) + remote_backlight_hold_changed(remote_hold_button); +#endif if(!remote_hold_button) { diff --git a/firmware/target/coldfire/iaudio/x5/pcf50606-x5.c b/firmware/target/coldfire/iaudio/x5/pcf50606-x5.c index dde20d8b7c..032c30814a 100644 --- a/firmware/target/coldfire/iaudio/x5/pcf50606-x5.c +++ b/firmware/target/coldfire/iaudio/x5/pcf50606-x5.c @@ -177,7 +177,7 @@ void pcf50606_init(void) and_l(~0x00000001, &GPIO_ENABLE); or_l(0x00000001, &GPIO_FUNCTION); or_l(0x00000100, &GPIO_INT_EN); /* GPI0 H-L */ - INTPRI5 |= 0x00000006; /* INT32 - Priority 6 */ + INTPRI5 |= (6 << 0); /* INT32 - Priority 6 */ pcf50606_write(0x39, 0x00); /* GPOOD0 = green led OFF */ pcf50606_write(0x3a, 0x00); /* GPOOD1 = red led OFF */ |