summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/sansa-fuze/button-fuze.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/as3525/sansa-fuze/button-fuze.c')
-rw-r--r--firmware/target/arm/as3525/sansa-fuze/button-fuze.c96
1 files changed, 45 insertions, 51 deletions
diff --git a/firmware/target/arm/as3525/sansa-fuze/button-fuze.c b/firmware/target/arm/as3525/sansa-fuze/button-fuze.c
index e52a1d37d8..0e50ec659a 100644
--- a/firmware/target/arm/as3525/sansa-fuze/button-fuze.c
+++ b/firmware/target/arm/as3525/sansa-fuze/button-fuze.c
@@ -42,8 +42,9 @@ static bool hold_button_old = false;
42#else 42#else
43#define hold_button false 43#define hold_button false
44#endif /* !BOOTLOADER */ 44#endif /* !BOOTLOADER */
45static int int_btn = BUTTON_NONE; 45static short _dbop_din = BUTTON_NONE;
46short _dbop_din = BUTTON_NONE; 46
47extern void lcd_button_support(void);
47 48
48void button_init_device(void) 49void button_init_device(void)
49{ 50{
@@ -53,12 +54,12 @@ void button_init_device(void)
53 54
54/* clickwheel */ 55/* clickwheel */
55#if !defined(BOOTLOADER) && defined(HAVE_SCROLLWHEEL) 56#if !defined(BOOTLOADER) && defined(HAVE_SCROLLWHEEL)
56static void get_wheel(void) 57static void clickwheel(void)
57{ 58{
58 static unsigned int old_wheel_value = 0; 59 static unsigned int old_wheel_value = 0;
59 static unsigned int wheel_value = 0; 60 static unsigned int wheel_value = 0;
60 static unsigned int wheel_repeat = BUTTON_NONE; 61 static unsigned int wheel_repeat = BUTTON_NONE;
61 /* getting BUTTON_REPEAT works like this: We increment repeat by if the 62 /* getting BUTTON_REPEAT works like this: We increment repeat by 2 if the
62 * wheel was turned, and decrement it by 1 each tick, 63 * wheel was turned, and decrement it by 1 each tick,
63 * that means: if you change the wheel fast enough, repeat will be >1 and 64 * that means: if you change the wheel fast enough, repeat will be >1 and
64 * we send BUTTON_REPEAT 65 * we send BUTTON_REPEAT
@@ -126,30 +127,15 @@ static void get_wheel(void)
126} 127}
127#endif /* !defined(BOOTLOADER) && defined(SCROLLWHEEL) */ 128#endif /* !defined(BOOTLOADER) && defined(SCROLLWHEEL) */
128 129
129#if !defined(BOOTLOADER)
130/* get hold button state */
131static void get_hold(void)
132{
133 hold_button = _dbop_din & (1<<12);
134}
135#endif
136
137bool button_hold(void) 130bool button_hold(void)
138{ 131{
139 return hold_button; 132 return hold_button;
140} 133}
141 134
142static void get_power(void) 135static int button_dbop(void)
143{
144 if (_dbop_din & (1<<8))
145 int_btn |= BUTTON_POWER;
146}
147
148static void get_button_from_dbob(void)
149{ 136{
150 int_btn &= ~(BUTTON_HOLD| 137 int ret = 0;
151 BUTTON_POWER); 138 lcd_button_support();
152
153 /* Wait for fifo to empty */ 139 /* Wait for fifo to empty */
154 while ((DBOP_STAT & (1<<10)) == 0); 140 while ((DBOP_STAT & (1<<10)) == 0);
155 141
@@ -181,34 +167,43 @@ static void get_button_from_dbob(void)
181 DBOP_CTRL &= ~(1<<19); 167 DBOP_CTRL &= ~(1<<19);
182 168
183#if !defined(BOOTLOADER) 169#if !defined(BOOTLOADER)
184 get_hold(); 170 hold_button = _dbop_din & (1<<12);
185#if defined(HAVE_SCROLLWHEEL) 171 if (hold_button)
186 get_wheel(); 172 return BUTTON_NONE;
187#endif 173#endif
174 /* read power */
175 if (_dbop_din & (1<<8))
176 ret |= BUTTON_POWER;
177 if(!(_dbop_din & (1<<15)))
178 ret |= BUTTON_HOME;
179#if defined(HAVE_SCROLLWHEEL)
180 clickwheel();
188#endif 181#endif
189 get_power(); 182
183 return ret;
184}
185
186/* for the debug menu */
187short button_dbop_data(void)
188{
189 return _dbop_din;
190} 190}
191 191
192static void get_button_from_gpio(void) 192static int button_gpio(void)
193{ 193{
194 /* reset buttons we're going to read */ 194 int btn = BUTTON_NONE;
195 int_btn &= ~(BUTTON_LEFT|
196 BUTTON_RIGHT|
197 BUTTON_UP|
198 BUTTON_DOWN|
199 BUTTON_SELECT);
200 if(hold_button) 195 if(hold_button)
201 return; 196 return btn;
202 /* set afsel, so that we can read our buttons */ 197 /* set afsel, so that we can read our buttons */
203 GPIOC_AFSEL &= ~(1<<2|1<<3|1<<4|1<<5|1<<6); 198 GPIOC_AFSEL &= ~(1<<2|1<<3|1<<4|1<<5|1<<6);
204 /* set dir so we can read our buttons (but reset the C pins first) */ 199 /* set dir so we can read our buttons (but reset the C pins first) */
205 GPIOB_DIR &= ~(1<<4); 200 GPIOB_DIR &= ~(1<<4);
206 GPIOC_DIR |= (1<<2|1<<3|1<<4|1<<5|1<<6); 201 GPIOC_DIR |= (1<<2|1<<3|1<<4|1<<5|1<<6);
207 GPIOC_PIN(2) |= (1<<2); 202 GPIOC_PIN(2) = (1<<2);
208 GPIOC_PIN(3) |= (1<<3); 203 GPIOC_PIN(3) = (1<<3);
209 GPIOC_PIN(4) |= (1<<4); 204 GPIOC_PIN(4) = (1<<4);
210 GPIOC_PIN(5) |= (1<<5); 205 GPIOC_PIN(5) = (1<<5);
211 GPIOC_PIN(6) |= (1<<6); 206 GPIOC_PIN(6) = (1<<6);
212 207
213 GPIOC_DIR &= ~(1<<2|1<<3|1<<4|1<<5|1<<6); 208 GPIOC_DIR &= ~(1<<2|1<<3|1<<4|1<<5|1<<6);
214 209
@@ -218,31 +213,30 @@ static void get_button_from_gpio(void)
218 213
219 /* direct GPIO connections */ 214 /* direct GPIO connections */
220 if (!GPIOC_PIN(3)) 215 if (!GPIOC_PIN(3))
221 int_btn |= BUTTON_LEFT; 216 btn |= BUTTON_LEFT;
222 if (!GPIOC_PIN(2)) 217 if (!GPIOC_PIN(2))
223 int_btn |= BUTTON_UP; 218 btn |= BUTTON_UP;
224 if (!GPIOC_PIN(6)) 219 if (!GPIOC_PIN(6))
225 int_btn |= BUTTON_DOWN; 220 btn |= BUTTON_DOWN;
226 if (!GPIOC_PIN(5)) 221 if (!GPIOC_PIN(5))
227 int_btn |= BUTTON_RIGHT; 222 btn |= BUTTON_RIGHT;
228 if (!GPIOC_PIN(4)) 223 if (!GPIOC_PIN(4))
229 int_btn |= BUTTON_SELECT; 224 btn |= BUTTON_SELECT;
230 /* return to settings needed for lcd */ 225 /* return to settings needed for lcd */
231 GPIOC_DIR |= (1<<2|1<<3|1<<4|1<<5|1<<6); 226 GPIOC_DIR |= (1<<2|1<<3|1<<4|1<<5|1<<6);
232 GPIOC_AFSEL |= (1<<2|1<<3|1<<4|1<<5|1<<6); 227 GPIOC_AFSEL |= (1<<2|1<<3|1<<4|1<<5|1<<6);
233}
234 228
235static inline void get_buttons_from_hw(void) 229 return btn;
236{
237 get_button_from_dbob();
238 get_button_from_gpio();
239} 230}
231
240/* 232/*
241 * Get button pressed from hardware 233 * Get button pressed from hardware
242 */ 234 */
243int button_read_device(void) 235int button_read_device(void)
244{ 236{
245 get_buttons_from_hw(); 237 int ret = BUTTON_NONE;
238 ret |= button_dbop();
239 ret |= button_gpio();
246#ifndef BOOTLOADER 240#ifndef BOOTLOADER
247 /* light handling */ 241 /* light handling */
248 if (hold_button != hold_button_old) 242 if (hold_button != hold_button_old)
@@ -252,5 +246,5 @@ int button_read_device(void)
252 } 246 }
253#endif /* BOOTLOADER */ 247#endif /* BOOTLOADER */
254 248
255 return int_btn; /* set in button_int */ 249 return ret;
256} 250}