diff options
-rw-r--r-- | apps/features.txt | 2 | ||||
-rw-r--r-- | apps/menus/display_menu.c | 6 | ||||
-rw-r--r-- | apps/settings.c | 3 | ||||
-rw-r--r-- | apps/settings.h | 3 | ||||
-rw-r--r-- | apps/settings_list.c | 3 | ||||
-rw-r--r-- | firmware/export/backlight.h | 3 | ||||
-rw-r--r-- | firmware/export/config-gigabeat-s.h | 3 | ||||
-rw-r--r-- | firmware/target/arm/imx31/gigabeat-s/backlight-imx31.c | 122 |
8 files changed, 115 insertions, 30 deletions
diff --git a/apps/features.txt b/apps/features.txt index 4f394d5eef..0ddccced3c 100644 --- a/apps/features.txt +++ b/apps/features.txt | |||
@@ -24,6 +24,8 @@ backlight_brightness | |||
24 | backlight_fade_pwm | 24 | backlight_fade_pwm |
25 | #elif defined(USE_BACKLIGHT_SW_FADING) | 25 | #elif defined(USE_BACKLIGHT_SW_FADING) |
26 | backlight_fade_sw | 26 | backlight_fade_sw |
27 | #elif defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL) | ||
28 | backlight_fade_custom_bool | ||
27 | #endif | 29 | #endif |
28 | 30 | ||
29 | #if BATTERY_TYPES_COUNT > 1 | 31 | #if BATTERY_TYPES_COUNT > 1 |
diff --git a/apps/menus/display_menu.c b/apps/menus/display_menu.c index 744a9e9354..488b0ff570 100644 --- a/apps/menus/display_menu.c +++ b/apps/menus/display_menu.c | |||
@@ -92,7 +92,8 @@ MENUITEM_SETTING(backlight_on_button_hold, | |||
92 | #endif | 92 | #endif |
93 | MENUITEM_SETTING(caption_backlight, &global_settings.caption_backlight, NULL); | 93 | MENUITEM_SETTING(caption_backlight, &global_settings.caption_backlight, NULL); |
94 | #if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) || \ | 94 | #if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) || \ |
95 | defined(USE_BACKLIGHT_SW_FADING) | 95 | defined(USE_BACKLIGHT_SW_FADING) || \ |
96 | defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL) | ||
96 | MENUITEM_SETTING(backlight_fade_in, &global_settings.backlight_fade_in, NULL); | 97 | MENUITEM_SETTING(backlight_fade_in, &global_settings.backlight_fade_in, NULL); |
97 | MENUITEM_SETTING(backlight_fade_out, &global_settings.backlight_fade_out, NULL); | 98 | MENUITEM_SETTING(backlight_fade_out, &global_settings.backlight_fade_out, NULL); |
98 | #endif | 99 | #endif |
@@ -132,7 +133,8 @@ MAKE_MENU(lcd_settings,ID2P(LANG_LCD_MENU), | |||
132 | # endif | 133 | # endif |
133 | ,&caption_backlight | 134 | ,&caption_backlight |
134 | #if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) || \ | 135 | #if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) || \ |
135 | defined(USE_BACKLIGHT_SW_FADING) | 136 | defined(USE_BACKLIGHT_SW_FADING) || \ |
137 | defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL) | ||
136 | ,&backlight_fade_in, &backlight_fade_out | 138 | ,&backlight_fade_in, &backlight_fade_out |
137 | #endif | 139 | #endif |
138 | ,&bl_filter_first_keypress | 140 | ,&bl_filter_first_keypress |
diff --git a/apps/settings.c b/apps/settings.c index 2cab26a4a1..609cb3f93f 100644 --- a/apps/settings.c +++ b/apps/settings.c | |||
@@ -769,7 +769,8 @@ void settings_apply(bool read_disk) | |||
769 | backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged); | 769 | backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged); |
770 | #endif | 770 | #endif |
771 | #if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) \ | 771 | #if (defined(HAVE_BACKLIGHT_PWM_FADING) && !defined(SIMULATOR)) \ |
772 | || defined(USE_BACKLIGHT_SW_FADING) | 772 | || defined(USE_BACKLIGHT_SW_FADING) \ |
773 | || defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL) | ||
773 | backlight_set_fade_in(global_settings.backlight_fade_in); | 774 | backlight_set_fade_in(global_settings.backlight_fade_in); |
774 | backlight_set_fade_out(global_settings.backlight_fade_out); | 775 | backlight_set_fade_out(global_settings.backlight_fade_out); |
775 | #endif | 776 | #endif |
diff --git a/apps/settings.h b/apps/settings.h index 56b7d3e80a..be83689368 100644 --- a/apps/settings.h +++ b/apps/settings.h | |||
@@ -424,7 +424,8 @@ struct user_settings | |||
424 | #if defined(HAVE_BACKLIGHT_PWM_FADING) | 424 | #if defined(HAVE_BACKLIGHT_PWM_FADING) |
425 | int backlight_fade_in; /* backlight fade in timing: 0..3 */ | 425 | int backlight_fade_in; /* backlight fade in timing: 0..3 */ |
426 | int backlight_fade_out; /* backlight fade in timing: 0..7 */ | 426 | int backlight_fade_out; /* backlight fade in timing: 0..7 */ |
427 | #elif defined(USE_BACKLIGHT_SW_FADING) | 427 | #elif defined(USE_BACKLIGHT_SW_FADING) \ |
428 | || defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL) | ||
428 | bool backlight_fade_in; | 429 | bool backlight_fade_in; |
429 | bool backlight_fade_out; | 430 | bool backlight_fade_out; |
430 | #endif | 431 | #endif |
diff --git a/apps/settings_list.c b/apps/settings_list.c index f4519f5975..fe379ca229 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c | |||
@@ -679,7 +679,8 @@ const struct settings_list settings[] = { | |||
679 | UNIT_MS, formatter_unit_0_is_off, getlang_unit_0_is_off, | 679 | UNIT_MS, formatter_unit_0_is_off, getlang_unit_0_is_off, |
680 | backlight_set_fade_out, 10, | 680 | backlight_set_fade_out, 10, |
681 | 0,100,200,300,500,1000,2000,3000,5000,10000), | 681 | 0,100,200,300,500,1000,2000,3000,5000,10000), |
682 | #elif defined(USE_BACKLIGHT_SW_FADING) | 682 | #elif defined(USE_BACKLIGHT_SW_FADING) \ |
683 | || defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL) | ||
683 | OFFON_SETTING(0, backlight_fade_in, LANG_BACKLIGHT_FADE_IN, | 684 | OFFON_SETTING(0, backlight_fade_in, LANG_BACKLIGHT_FADE_IN, |
684 | true, "backlight fade in", backlight_set_fade_in), | 685 | true, "backlight fade in", backlight_set_fade_in), |
685 | OFFON_SETTING(0, backlight_fade_out, LANG_BACKLIGHT_FADE_OUT, | 686 | OFFON_SETTING(0, backlight_fade_out, LANG_BACKLIGHT_FADE_OUT, |
diff --git a/firmware/export/backlight.h b/firmware/export/backlight.h index 506a9f6b03..cb081a5301 100644 --- a/firmware/export/backlight.h +++ b/firmware/export/backlight.h | |||
@@ -38,7 +38,8 @@ int backlight_get_current_timeout(void); | |||
38 | void backlight_set_fade_in(int value); | 38 | void backlight_set_fade_in(int value); |
39 | void backlight_set_fade_out(int value); | 39 | void backlight_set_fade_out(int value); |
40 | #endif | 40 | #endif |
41 | #ifdef USE_BACKLIGHT_SW_FADING | 41 | #if defined(USE_BACKLIGHT_SW_FADING) \ |
42 | || defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL) | ||
42 | void backlight_set_fade_in(bool value); | 43 | void backlight_set_fade_in(bool value); |
43 | void backlight_set_fade_out(bool value); | 44 | void backlight_set_fade_out(bool value); |
44 | #endif | 45 | #endif |
diff --git a/firmware/export/config-gigabeat-s.h b/firmware/export/config-gigabeat-s.h index e6fa6c9fc6..4359c90279 100644 --- a/firmware/export/config-gigabeat-s.h +++ b/firmware/export/config-gigabeat-s.h | |||
@@ -94,6 +94,9 @@ | |||
94 | 94 | ||
95 | #ifndef SIMULATOR | 95 | #ifndef SIMULATOR |
96 | 96 | ||
97 | /* Implementation-defined fading type with bool settings */ | ||
98 | #define USE_BACKLIGHT_CUSTOM_FADING_BOOL | ||
99 | |||
97 | /* The LCD on a Gigabeat is 240x320 - it is portrait */ | 100 | /* The LCD on a Gigabeat is 240x320 - it is portrait */ |
98 | #define HAVE_PORTRAIT_LCD | 101 | #define HAVE_PORTRAIT_LCD |
99 | 102 | ||
diff --git a/firmware/target/arm/imx31/gigabeat-s/backlight-imx31.c b/firmware/target/arm/imx31/gigabeat-s/backlight-imx31.c index 535c0a0051..7e40b95437 100644 --- a/firmware/target/arm/imx31/gigabeat-s/backlight-imx31.c +++ b/firmware/target/arm/imx31/gigabeat-s/backlight-imx31.c | |||
@@ -65,50 +65,124 @@ static const struct | |||
65 | }; | 65 | }; |
66 | #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ | 66 | #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ |
67 | 67 | ||
68 | /* Bits always combined with ramping bits */ | ||
69 | #define MC13783_LED_CONTROL0_BITS \ | ||
70 | (MC13783_LEDEN | MC13783_BOOSTEN | MC13783_ABMODE_MONCH_LEDMD1234 | \ | ||
71 | MC13783_ABREF_400MV) | ||
72 | |||
73 | static struct mutex backlight_mutex; /* Block brightness change while | ||
74 | * setting up fading */ | ||
75 | static bool backlight_on_status = true; /* Is on or off? */ | ||
76 | static uint32_t backlight_pwm_bits; /* Final PWM setting for fade-in */ | ||
77 | |||
78 | /* Backlight ramping settings */ | ||
79 | static uint32_t led_ramp_mask = MC13783_LEDMDRAMPDOWN | MC13783_LEDMDRAMPUP; | ||
80 | |||
68 | bool _backlight_init(void) | 81 | bool _backlight_init(void) |
69 | { | 82 | { |
70 | mc13783_write(MC13783_LED_CONTROL0, | 83 | mutex_init(&backlight_mutex); |
71 | MC13783_LEDEN | | 84 | |
72 | MC13783_LEDMDRAMPUP | | 85 | /* Set default LED register value */ |
73 | MC13783_LEDMDRAMPDOWN | | 86 | mc13783_write(MC13783_LED_CONTROL0, MC13783_LED_CONTROL0_BITS); |
74 | MC13783_BOOSTEN | | 87 | |
75 | MC13783_ABMODE_MONCH_LEDMD1234 | | 88 | /* Our PWM and I-Level is different than retailos (but same apparent |
76 | MC13783_ABREF_400MV); | 89 | * brightness), so init to our default. */ |
90 | _backlight_set_brightness(DEFAULT_BRIGHTNESS_SETTING); | ||
77 | return true; | 91 | return true; |
78 | } | 92 | } |
79 | 93 | ||
94 | void backlight_set_fade_out(bool value) | ||
95 | { | ||
96 | if (value) | ||
97 | led_ramp_mask |= MC13783_LEDMDRAMPDOWN; | ||
98 | else | ||
99 | led_ramp_mask &= ~MC13783_LEDMDRAMPDOWN; | ||
100 | } | ||
101 | |||
102 | void backlight_set_fade_in(bool value) | ||
103 | { | ||
104 | if (value) | ||
105 | led_ramp_mask |= MC13783_LEDMDRAMPUP; | ||
106 | else | ||
107 | led_ramp_mask &= ~MC13783_LEDMDRAMPUP; | ||
108 | } | ||
109 | |||
80 | void _backlight_on(void) | 110 | void _backlight_on(void) |
81 | { | 111 | { |
82 | /* LEDEN=1 */ | 112 | static const char regs[2] = |
83 | mc13783_set(MC13783_LED_CONTROL0, MC13783_LEDEN); | 113 | { |
114 | MC13783_LED_CONTROL0, | ||
115 | MC13783_LED_CONTROL2 | ||
116 | }; | ||
117 | |||
118 | uint32_t data[2]; | ||
119 | |||
120 | mutex_lock(&backlight_mutex); | ||
121 | |||
122 | /* Set/clear LEDRAMPUP bit, clear LEDRAMPDOWN bit */ | ||
123 | data[0] = MC13783_LED_CONTROL0_BITS; | ||
124 | |||
125 | if (!backlight_on_status) | ||
126 | data[0] |= led_ramp_mask & MC13783_LEDMDRAMPUP; | ||
127 | |||
128 | backlight_on_status = true; | ||
129 | |||
130 | /* Specify final PWM setting */ | ||
131 | data[1] = mc13783_read(MC13783_LED_CONTROL2); | ||
132 | |||
133 | if (data[1] != MC13783_DATA_ERROR) | ||
134 | { | ||
135 | data[1] &= ~MC13783_LEDMDDC; | ||
136 | data[1] |= backlight_pwm_bits; | ||
137 | |||
138 | /* Write regs within 30us of each other (requires single xfer) */ | ||
139 | mc13783_write_regset(regs, data, 2); | ||
140 | } | ||
141 | |||
142 | mutex_unlock(&backlight_mutex); | ||
84 | } | 143 | } |
85 | 144 | ||
86 | void _backlight_off(void) | 145 | void _backlight_off(void) |
87 | { | 146 | { |
88 | /* LEDEN=0 */ | 147 | uint32_t ctrl0 = MC13783_LED_CONTROL0_BITS; |
89 | mc13783_clear(MC13783_LED_CONTROL0, MC13783_LEDEN); | 148 | |
149 | mutex_lock(&backlight_mutex); | ||
150 | |||
151 | if (backlight_on_status) | ||
152 | ctrl0 |= led_ramp_mask & MC13783_LEDMDRAMPDOWN; | ||
153 | |||
154 | backlight_on_status = false; | ||
155 | |||
156 | /* Set/clear LEDRAMPDOWN bit, clear LEDRAMPUP bit */ | ||
157 | mc13783_write(MC13783_LED_CONTROL0, ctrl0); | ||
158 | |||
159 | /* Wait 100us - 500ms */ | ||
160 | sleep(HZ/100); | ||
161 | |||
162 | /* Write final PWM setting */ | ||
163 | mc13783_write_masked(MC13783_LED_CONTROL2, MC13783_LEDMDDCw(0), | ||
164 | MC13783_LEDMDDC); | ||
165 | |||
166 | mutex_unlock(&backlight_mutex); | ||
90 | } | 167 | } |
91 | 168 | ||
92 | #ifdef HAVE_BACKLIGHT_BRIGHTNESS | 169 | #ifdef HAVE_BACKLIGHT_BRIGHTNESS |
93 | /* Assumes that the backlight has been initialized */ | 170 | /* Assumes that the backlight has been initialized - parameter should |
171 | * already be range-checked in public interface. */ | ||
94 | void _backlight_set_brightness(int brightness) | 172 | void _backlight_set_brightness(int brightness) |
95 | { | 173 | { |
96 | uint32_t data, md, pwm; | 174 | uint32_t md; |
97 | |||
98 | if ((unsigned)brightness >= ARRAYLEN(led_md_pwm_table)) | ||
99 | brightness = DEFAULT_BRIGHTNESS_SETTING; | ||
100 | |||
101 | data = mc13783_read(MC13783_LED_CONTROL2); | ||
102 | 175 | ||
103 | if (data == (uint32_t)-1) | 176 | mutex_lock(&backlight_mutex); |
104 | return; | ||
105 | 177 | ||
106 | md = led_md_pwm_table[brightness].md; | 178 | md = led_md_pwm_table[brightness].md; |
107 | pwm = led_md_pwm_table[brightness].pwm; | 179 | backlight_pwm_bits = backlight_on_status ? |
180 | MC13783_LEDMDDCw(led_md_pwm_table[brightness].pwm) : 0; | ||
108 | 181 | ||
109 | data &= ~(MC13783_LEDMD | MC13783_LEDMDDC); | 182 | mc13783_write_masked(MC13783_LED_CONTROL2, |
110 | data |= MC13783_LEDMDw(md) | MC13783_LEDMDDCw(pwm); | 183 | MC13783_LEDMDw(md) | backlight_pwm_bits, |
184 | MC13783_LEDMD | MC13783_LEDMDDC); | ||
111 | 185 | ||
112 | mc13783_write(MC13783_LED_CONTROL2, data); | 186 | mutex_unlock(&backlight_mutex); |
113 | } | 187 | } |
114 | #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ | 188 | #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ |