diff options
Diffstat (limited to 'firmware/target/arm/as3525/sansa-c200v2')
-rw-r--r-- | firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c | 106 |
1 files changed, 88 insertions, 18 deletions
diff --git a/firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c b/firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c index e094cca8fe..9c236d3653 100644 --- a/firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c +++ b/firmware/target/arm/as3525/sansa-c200v2/backlight-c200v2.c | |||
@@ -37,26 +37,75 @@ static const int brightness_table[MAX_BRIGHTNESS_SETTING+1] = { | |||
37 | 37 | ||
38 | static void _ll_backlight_on(void) | 38 | static void _ll_backlight_on(void) |
39 | { | 39 | { |
40 | GPIOA_PIN(5) = 1<<5; | 40 | if (c200v2_variant == 0) { |
41 | GPIOA_PIN(5) = 1<<5; | ||
42 | } else { | ||
43 | GPIOA_PIN(7) = 1<<7; | ||
44 | } | ||
41 | } | 45 | } |
42 | 46 | ||
43 | static void _ll_backlight_off(void) | 47 | static void _ll_backlight_off(void) |
44 | { | 48 | { |
45 | GPIOA_PIN(5) = 0; | 49 | if (c200v2_variant == 0) { |
50 | GPIOA_PIN(5) = 0; | ||
51 | } else { | ||
52 | GPIOA_PIN(7) = 0; | ||
53 | } | ||
54 | } | ||
55 | |||
56 | static void _ll_buttonlight_on(void) | ||
57 | { | ||
58 | if (c200v2_variant == 1) { | ||
59 | /* Main buttonlight is on A5 */ | ||
60 | GPIOA_PIN(5) = 1<<5; | ||
61 | } else { | ||
62 | /* Needed for buttonlight and MicroSD to work at the same time */ | ||
63 | /* Turn ROD control on, as the OF does */ | ||
64 | GPIOD_DIR |= (1<<7); | ||
65 | SD_MCI_POWER |= (1<<7); | ||
66 | GPIOD_PIN(7) = (1<<7); | ||
67 | } | ||
68 | } | ||
69 | |||
70 | static void _ll_buttonlight_off(void) | ||
71 | { | ||
72 | if (c200v2_variant == 1) { | ||
73 | /* Main buttonlight is on A5 */ | ||
74 | GPIOA_PIN(5) = 0; | ||
75 | } else { | ||
76 | /* Needed for buttonlight and MicroSD to work at the same time */ | ||
77 | /* Turn ROD control off, as the OF does */ | ||
78 | SD_MCI_POWER &= ~(1<<7); | ||
79 | GPIOD_PIN(7) = 0; | ||
80 | GPIOD_DIR &= ~(1<<7); | ||
81 | } | ||
46 | } | 82 | } |
47 | 83 | ||
48 | void _backlight_pwm(int on) | 84 | void _backlight_pwm(int on) |
49 | { | 85 | { |
50 | if (on) { | 86 | if (on) { |
51 | _ll_backlight_on(); | 87 | if (backlight_is_on) |
88 | _ll_backlight_on(); | ||
89 | |||
90 | if (buttonlight_is_on) | ||
91 | _ll_buttonlight_on(); | ||
52 | } else { | 92 | } else { |
53 | _ll_backlight_off(); | 93 | if (backlight_is_on) |
94 | _ll_backlight_off(); | ||
95 | |||
96 | if (buttonlight_is_on) | ||
97 | _ll_buttonlight_off(); | ||
54 | } | 98 | } |
55 | } | 99 | } |
56 | 100 | ||
57 | bool _backlight_init(void) | 101 | bool _backlight_init(void) |
58 | { | 102 | { |
59 | GPIOA_DIR |= 1<<5; | 103 | GPIOA_DIR |= 1<<5; |
104 | if (c200v2_variant == 1) { | ||
105 | /* On this variant A7 is the backlight and | ||
106 | * A5 is the buttonlight */ | ||
107 | GPIOA_DIR |= 1<<7; | ||
108 | } | ||
60 | return true; | 109 | return true; |
61 | } | 110 | } |
62 | 111 | ||
@@ -70,21 +119,40 @@ void _backlight_set_brightness(int brightness) | |||
70 | _backlight_off(); | 119 | _backlight_off(); |
71 | } | 120 | } |
72 | 121 | ||
122 | static void _pwm_on(void) | ||
123 | { | ||
124 | _set_timer2_pwm_ratio(backlight_level); | ||
125 | } | ||
126 | |||
127 | static void _pwm_off(void) | ||
128 | { | ||
129 | if (buttonlight_is_on == 0 && backlight_is_on == 0) | ||
130 | _set_timer2_pwm_ratio(0); | ||
131 | } | ||
132 | |||
73 | void _backlight_on(void) | 133 | void _backlight_on(void) |
74 | { | 134 | { |
135 | if (backlight_is_on == 1) { | ||
136 | /* Update pwm ratio in case user changed the brightness */ | ||
137 | _pwm_on(); | ||
138 | return; | ||
139 | } | ||
140 | |||
75 | #ifdef HAVE_LCD_ENABLE | 141 | #ifdef HAVE_LCD_ENABLE |
76 | lcd_enable(true); /* power on lcd + visible display */ | 142 | lcd_enable(true); /* power on lcd + visible display */ |
77 | #endif | 143 | #endif |
78 | if (!backlight_is_on) | 144 | _ll_backlight_on(); |
79 | _ll_backlight_on(); | 145 | _pwm_on(); |
80 | _set_timer2_pwm_ratio(backlight_level); | ||
81 | backlight_is_on = 1; | 146 | backlight_is_on = 1; |
82 | } | 147 | } |
83 | 148 | ||
84 | void _backlight_off(void) | 149 | void _backlight_off(void) |
85 | { | 150 | { |
151 | if (backlight_is_on == 0) | ||
152 | return; | ||
153 | |||
86 | backlight_is_on = 0; | 154 | backlight_is_on = 0; |
87 | _set_timer2_pwm_ratio(0); | 155 | _pwm_off(); |
88 | _ll_backlight_off(); | 156 | _ll_backlight_off(); |
89 | #ifdef HAVE_LCD_ENABLE | 157 | #ifdef HAVE_LCD_ENABLE |
90 | lcd_enable(false); /* power off visible display */ | 158 | lcd_enable(false); /* power off visible display */ |
@@ -93,20 +161,22 @@ void _backlight_off(void) | |||
93 | 161 | ||
94 | void _buttonlight_on(void) | 162 | void _buttonlight_on(void) |
95 | { | 163 | { |
96 | /* Needed for buttonlight and MicroSD to work at the same time */ | 164 | if (buttonlight_is_on == 1) |
97 | /* Turn ROD control on, as the OF does */ | 165 | return; |
98 | GPIOD_DIR |= (1<<7); | 166 | |
99 | SD_MCI_POWER |= (1<<7); | 167 | _ll_buttonlight_on(); |
100 | GPIOD_PIN(7) = (1<<7); | 168 | _pwm_on(); |
101 | buttonlight_is_on = 1; | 169 | buttonlight_is_on = 1; |
102 | } | 170 | } |
103 | 171 | ||
104 | void _buttonlight_off(void) | 172 | void _buttonlight_off(void) |
105 | { | 173 | { |
106 | /* Needed for buttonlight and MicroSD to work at the same time */ | 174 | if (buttonlight_is_on == 0) |
107 | /* Turn ROD control off, as the OF does */ | 175 | return; |
108 | SD_MCI_POWER &= ~(1<<7); | 176 | |
109 | GPIOD_PIN(7) = 0; | ||
110 | GPIOD_DIR &= ~(1<<7); | ||
111 | buttonlight_is_on = 0; | 177 | buttonlight_is_on = 0; |
178 | _pwm_off(); | ||
179 | _ll_buttonlight_off(); | ||
112 | } | 180 | } |
181 | |||
182 | /* vim:set ts=4 sw=4 et: */ | ||