summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2008-11-26 21:26:22 +0000
committerMichael Sevakis <jethead71@rockbox.org>2008-11-26 21:26:22 +0000
commit495115b84a71b900b27c55b899b68e12059434d4 (patch)
tree5514f2d3131bc20a341a020fe6382fd5df9fe532
parent5b0d74a7d3329ec3fc5818d9185aba7f29291ca7 (diff)
downloadrockbox-495115b84a71b900b27c55b899b68e12059434d4.tar.gz
rockbox-495115b84a71b900b27c55b899b68e12059434d4.zip
Add hardware backlight fading on Gigabeat S with fade up and down options in LCD Settings. USE_BACKLIGHT_CUSTOM_FADING_BOOL is used to specify the setting type needed but leave the fading code itself implementation-defined.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19237 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/features.txt2
-rw-r--r--apps/menus/display_menu.c6
-rw-r--r--apps/settings.c3
-rw-r--r--apps/settings.h3
-rw-r--r--apps/settings_list.c3
-rw-r--r--firmware/export/backlight.h3
-rw-r--r--firmware/export/config-gigabeat-s.h3
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/backlight-imx31.c122
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
24backlight_fade_pwm 24backlight_fade_pwm
25#elif defined(USE_BACKLIGHT_SW_FADING) 25#elif defined(USE_BACKLIGHT_SW_FADING)
26backlight_fade_sw 26backlight_fade_sw
27#elif defined(USE_BACKLIGHT_CUSTOM_FADING_BOOL)
28backlight_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
93MENUITEM_SETTING(caption_backlight, &global_settings.caption_backlight, NULL); 93MENUITEM_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)
96MENUITEM_SETTING(backlight_fade_in, &global_settings.backlight_fade_in, NULL); 97MENUITEM_SETTING(backlight_fade_in, &global_settings.backlight_fade_in, NULL);
97MENUITEM_SETTING(backlight_fade_out, &global_settings.backlight_fade_out, NULL); 98MENUITEM_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);
38void backlight_set_fade_in(int value); 38void backlight_set_fade_in(int value);
39void backlight_set_fade_out(int value); 39void 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)
42void backlight_set_fade_in(bool value); 43void backlight_set_fade_in(bool value);
43void backlight_set_fade_out(bool value); 44void 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
73static struct mutex backlight_mutex; /* Block brightness change while
74 * setting up fading */
75static bool backlight_on_status = true; /* Is on or off? */
76static uint32_t backlight_pwm_bits; /* Final PWM setting for fade-in */
77
78/* Backlight ramping settings */
79static uint32_t led_ramp_mask = MC13783_LEDMDRAMPDOWN | MC13783_LEDMDRAMPUP;
80
68bool _backlight_init(void) 81bool _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
94void 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
102void 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
80void _backlight_on(void) 110void _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
86void _backlight_off(void) 145void _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. */
94void _backlight_set_brightness(int brightness) 172void _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 */