diff options
Diffstat (limited to 'firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c')
-rw-r--r-- | firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c b/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c index 7f82b692c7..8244c475fa 100644 --- a/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c +++ b/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c | |||
@@ -30,6 +30,7 @@ static bool hold_button = false; | |||
30 | 30 | ||
31 | #ifdef HAVE_SCROLLWHEEL | 31 | #ifdef HAVE_SCROLLWHEEL |
32 | #define SCROLLWHEEL_BITS (1<<7|1<<6) | 32 | #define SCROLLWHEEL_BITS (1<<7|1<<6) |
33 | #define SCROLLWHEEL_BITS_POS 6 | ||
33 | /* TIMER units */ | 34 | /* TIMER units */ |
34 | #define TIMER_TICK (KERNEL_TIMER_FREQ/HZ)/* how long a tick lasts */ | 35 | #define TIMER_TICK (KERNEL_TIMER_FREQ/HZ)/* how long a tick lasts */ |
35 | #define TIMER_MS (TIMER_TICK/(1000/HZ))/* how long a ms lasts */ | 36 | #define TIMER_MS (TIMER_TICK/(1000/HZ))/* how long a ms lasts */ |
@@ -78,10 +79,17 @@ static void scrollwheel(unsigned int wheel_value) | |||
78 | 79 | ||
79 | unsigned int btn = BUTTON_NONE; | 80 | unsigned int btn = BUTTON_NONE; |
80 | 81 | ||
81 | if (old_wheel_value == wheel_tbl[0][wheel_value]) | 82 | if (hold_button) |
83 | { | ||
84 | } | ||
85 | else if (old_wheel_value == wheel_tbl[0][wheel_value]) | ||
86 | { | ||
82 | btn = BUTTON_SCROLL_FWD; | 87 | btn = BUTTON_SCROLL_FWD; |
88 | } | ||
83 | else if (old_wheel_value == wheel_tbl[1][wheel_value]) | 89 | else if (old_wheel_value == wheel_tbl[1][wheel_value]) |
90 | { | ||
84 | btn = BUTTON_SCROLL_BACK; | 91 | btn = BUTTON_SCROLL_BACK; |
92 | } | ||
85 | 93 | ||
86 | if (btn == BUTTON_NONE) | 94 | if (btn == BUTTON_NONE) |
87 | { | 95 | { |
@@ -200,11 +208,13 @@ void button_gpioa_isr(void) | |||
200 | { | 208 | { |
201 | #if defined(HAVE_SCROLLWHEEL) | 209 | #if defined(HAVE_SCROLLWHEEL) |
202 | /* scroll wheel handling */ | 210 | /* scroll wheel handling */ |
203 | if (GPIOA_MIS & SCROLLWHEEL_BITS) | 211 | unsigned long bits = GPIOA_MIS & SCROLLWHEEL_BITS; |
204 | scrollwheel(GPIOA_PIN_MASK(0xc0) >> 6); | ||
205 | 212 | ||
206 | /* ack interrupt */ | 213 | if (bits) |
207 | GPIOA_IC = SCROLLWHEEL_BITS; | 214 | { |
215 | scrollwheel(GPIOA_PIN_MASK(SCROLLWHEEL_BITS) >> SCROLLWHEEL_BITS_POS); | ||
216 | GPIOA_IC = bits; /* ack interrupt */ | ||
217 | } | ||
208 | #endif | 218 | #endif |
209 | } | 219 | } |
210 | 220 | ||
@@ -225,8 +235,10 @@ int button_read_device(void) | |||
225 | int delay = 30; | 235 | int delay = 30; |
226 | while(delay--) nop; | 236 | while(delay--) nop; |
227 | 237 | ||
238 | disable_irq(); | ||
239 | |||
228 | bool ccu_io_bit12 = CCU_IO & (1<<12); | 240 | bool ccu_io_bit12 = CCU_IO & (1<<12); |
229 | bitclr32(&CCU_IO, 1<<12); | 241 | CCU_IO &= ~(1<<12); |
230 | 242 | ||
231 | /* B1 is shared with FM i2c */ | 243 | /* B1 is shared with FM i2c */ |
232 | bool gpiob_pin0_dir = GPIOB_DIR & (1<<1); | 244 | bool gpiob_pin0_dir = GPIOB_DIR & (1<<1); |
@@ -256,7 +268,9 @@ int button_read_device(void) | |||
256 | GPIOB_DIR |= 1<<1; | 268 | GPIOB_DIR |= 1<<1; |
257 | 269 | ||
258 | if(ccu_io_bit12) | 270 | if(ccu_io_bit12) |
259 | bitset32(&CCU_IO, 1<<12); | 271 | CCU_IO |= (1<<12); |
272 | |||
273 | enable_irq(); | ||
260 | 274 | ||
261 | #ifdef HAS_BUTTON_HOLD | 275 | #ifdef HAS_BUTTON_HOLD |
262 | #ifndef BOOTLOADER | 276 | #ifndef BOOTLOADER |
@@ -265,12 +279,6 @@ int button_read_device(void) | |||
265 | { | 279 | { |
266 | hold_button = hold; | 280 | hold_button = hold; |
267 | backlight_hold_changed(hold); | 281 | backlight_hold_changed(hold); |
268 | /* mask scrollwheel irq so we don't need to check for | ||
269 | * the hold button in the isr */ | ||
270 | if (hold) | ||
271 | GPIOA_IE &= ~SCROLLWHEEL_BITS; | ||
272 | else | ||
273 | GPIOA_IE |= SCROLLWHEEL_BITS; | ||
274 | } | 282 | } |
275 | #else | 283 | #else |
276 | hold_button = hold; | 284 | hold_button = hold; |