diff options
-rw-r--r-- | firmware/SOURCES | 6 | ||||
-rw-r--r-- | firmware/export/config/sansafuzev2.h | 18 | ||||
-rw-r--r-- | firmware/target/arm/as3525/kernel-as3525.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c | 192 | ||||
-rw-r--r-- | firmware/target/arm/as3525/sansa-fuzev2/button-target.h | 6 | ||||
-rw-r--r-- | firmware/target/arm/as3525/sd-as3525.c | 21 | ||||
-rw-r--r-- | firmware/target/arm/as3525/sd-as3525v2.c | 20 | ||||
-rw-r--r-- | firmware/target/arm/as3525/system-as3525.c | 21 | ||||
-rw-r--r-- | firmware/target/arm/as3525/system-target.h | 6 |
9 files changed, 238 insertions, 54 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES index 48360d7b45..0e95ba5880 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES | |||
@@ -407,11 +407,11 @@ target/arm/pnx0101/timer-pnx0101.c | |||
407 | target/arm/as3525/system-as3525.c | 407 | target/arm/as3525/system-as3525.c |
408 | target/arm/as3525/kernel-as3525.c | 408 | target/arm/as3525/kernel-as3525.c |
409 | target/arm/as3525/timer-as3525.c | 409 | target/arm/as3525/timer-as3525.c |
410 | #ifdef HAVE_SCROLLWHEEL | ||
411 | target/arm/as3525/scrollwheel-as3525.c | ||
412 | #endif | ||
413 | #if CONFIG_CPU == AS3525 | 410 | #if CONFIG_CPU == AS3525 |
414 | target/arm/as3525/sd-as3525.c | 411 | target/arm/as3525/sd-as3525.c |
412 | #ifdef HAVE_SCROLLWHEEL | ||
413 | target/arm/as3525/scrollwheel-as3525.c | ||
414 | #endif /* HAVE_SCROLLWHEEL */ | ||
415 | #else /* AS3535v2 */ | 415 | #else /* AS3535v2 */ |
416 | target/arm/as3525/sd-as3525v2.c | 416 | target/arm/as3525/sd-as3525v2.c |
417 | #endif | 417 | #endif |
diff --git a/firmware/export/config/sansafuzev2.h b/firmware/export/config/sansafuzev2.h index 172434282d..4caab8464a 100644 --- a/firmware/export/config/sansafuzev2.h +++ b/firmware/export/config/sansafuzev2.h | |||
@@ -68,6 +68,15 @@ | |||
68 | /* There is no hardware tone control */ | 68 | /* There is no hardware tone control */ |
69 | #define HAVE_SW_TONE_CONTROLS | 69 | #define HAVE_SW_TONE_CONTROLS |
70 | 70 | ||
71 | /* define this if the unit uses a scrollwheel for navigation */ | ||
72 | #define HAVE_SCROLLWHEEL | ||
73 | /* define to activate advanced wheel acceleration code */ | ||
74 | #define HAVE_WHEEL_ACCELERATION | ||
75 | /* define from which rotation speed [degree/sec] on the acceleration starts */ | ||
76 | #define WHEEL_ACCEL_START 540 | ||
77 | /* define type of acceleration (1 = ^2, 2 = ^3, 3 = ^4) */ | ||
78 | #define WHEEL_ACCELERATION 1 | ||
79 | |||
71 | #endif /* !BOOTLOADER */ | 80 | #endif /* !BOOTLOADER */ |
72 | 81 | ||
73 | /* put the lcd frame buffer in IRAM */ | 82 | /* put the lcd frame buffer in IRAM */ |
@@ -126,15 +135,6 @@ | |||
126 | /* Which backlight fading type? */ | 135 | /* Which backlight fading type? */ |
127 | #define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING | 136 | #define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING |
128 | 137 | ||
129 | /* define this if the unit uses a scrollwheel for navigation */ | ||
130 | #define HAVE_SCROLLWHEEL | ||
131 | /* define to activate advanced wheel acceleration code */ | ||
132 | #define HAVE_WHEEL_ACCELERATION | ||
133 | /* define from which rotation speed [degree/sec] on the acceleration starts */ | ||
134 | #define WHEEL_ACCEL_START 540 | ||
135 | /* define type of acceleration (1 = ^2, 2 = ^3, 3 = ^4) */ | ||
136 | #define WHEEL_ACCELERATION 1 | ||
137 | |||
138 | /* define this if you have a flash memory storage */ | 138 | /* define this if you have a flash memory storage */ |
139 | #define HAVE_FLASH_STORAGE | 139 | #define HAVE_FLASH_STORAGE |
140 | 140 | ||
diff --git a/firmware/target/arm/as3525/kernel-as3525.c b/firmware/target/arm/as3525/kernel-as3525.c index 4ae1a03809..ff489a86e8 100644 --- a/firmware/target/arm/as3525/kernel-as3525.c +++ b/firmware/target/arm/as3525/kernel-as3525.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include "panic.h" | 24 | #include "panic.h" |
25 | #include "timer.h" | 25 | #include "timer.h" |
26 | 26 | ||
27 | #ifdef HAVE_SCROLLWHEEL | 27 | #if INCREASED_SCROLLWHEEL_POLLING |
28 | #include "button-target.h" | 28 | #include "button-target.h" |
29 | /* The scrollwheel is polled every 5 ms (the tick tasks only every 10) */ | 29 | /* The scrollwheel is polled every 5 ms (the tick tasks only every 10) */ |
30 | static int poll_scrollwheel = 0; | 30 | static int poll_scrollwheel = 0; |
diff --git a/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c b/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c index db08414ae5..9421076cce 100644 --- a/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c +++ b/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c | |||
@@ -24,37 +24,198 @@ | |||
24 | #include "button.h" | 24 | #include "button.h" |
25 | #include "backlight.h" | 25 | #include "backlight.h" |
26 | 26 | ||
27 | extern void scrollwheel(unsigned wheel_value); | ||
28 | |||
29 | #ifdef HAS_BUTTON_HOLD | 27 | #ifdef HAS_BUTTON_HOLD |
30 | static bool hold_button = false; | 28 | static bool hold_button = false; |
31 | #endif | 29 | #endif |
30 | |||
31 | #ifdef HAVE_SCROLLWHEEL | ||
32 | #define SCROLLWHEEL_BITS (1<<7|1<<6) | ||
33 | /* TIMER units */ | ||
34 | #define TIMER_TICK (TIMER_FREQ/HZ) /* how long a tick lasts */ | ||
35 | #define TIMER_MS (TIMER_TICK/(1000/HZ))/* how long a ms lasts */ | ||
36 | |||
37 | #define WHEEL_REPEAT_INTERVAL (300*TIMER_MS) /* 300ms */ | ||
38 | #define WHEEL_FAST_ON_INTERVAL ( 20*TIMER_MS) /* 20ms */ | ||
39 | #define WHEEL_FAST_OFF_INTERVAL ( 60*TIMER_MS) /* 60ms */ | ||
40 | /* phsyical clicks per rotation * wheel value changes per phys click */ | ||
41 | #define WHEEL_CHANGES_PER_CLICK 4 | ||
42 | #define WHEELCLICKS_PER_ROTATION (12*WHEEL_CHANGES_PER_CLICK) | ||
43 | |||
44 | /* | ||
45 | * based on button-e200.c, adjusted to the AMS timers and fuzev2's | ||
46 | * scrollwheel and cleaned up a little | ||
47 | */ | ||
48 | static void scrollwheel(unsigned int wheel_value) | ||
49 | { | ||
50 | /* wheel values and times from the previous irq */ | ||
51 | static unsigned int old_wheel_value = 0; | ||
52 | static unsigned int wheel_repeat = BUTTON_NONE; | ||
53 | static long last_wheel_post = 0; | ||
54 | |||
55 | /* We only post every 4th action, as this matches better with the physical | ||
56 | * clicks of the wheel */ | ||
57 | static unsigned int wheel_click_count = 0; | ||
58 | /* number of items to skip in lists, 1 in slow mode */ | ||
59 | static unsigned int wheel_delta = 0; | ||
60 | /* accumulated wheel rotations per second */ | ||
61 | static unsigned long wheel_velocity = 0; | ||
62 | /* fast or slow mode? */ | ||
63 | static int wheel_fast_mode = 0; | ||
64 | |||
65 | /* Read wheel | ||
66 | * Bits 6 and 7 of GPIOA change as follows (Gray Code): | ||
67 | * Clockwise rotation 00 -> 01 -> 11 -> 10 -> 00 | ||
68 | * Counter-clockwise 00 -> 10 -> 11 -> 01 -> 00 | ||
69 | * | ||
70 | * For easy look-up, actual wheel values act as indicies also, | ||
71 | * which is why the table seems to be not ordered correctly | ||
72 | */ | ||
73 | static const unsigned char wheel_tbl[2][4] = | ||
74 | { | ||
75 | { 2, 0, 3, 1 }, /* Clockwise rotation */ | ||
76 | { 1, 3, 0, 2 }, /* Counter-clockwise */ | ||
77 | }; | ||
78 | |||
79 | unsigned int btn = BUTTON_NONE; | ||
80 | |||
81 | if (old_wheel_value == wheel_tbl[0][wheel_value]) | ||
82 | btn = BUTTON_SCROLL_FWD; | ||
83 | else if (old_wheel_value == wheel_tbl[1][wheel_value]) | ||
84 | btn = BUTTON_SCROLL_BACK; | ||
85 | |||
86 | if (btn == BUTTON_NONE) | ||
87 | { | ||
88 | old_wheel_value = wheel_value; | ||
89 | return; | ||
90 | } | ||
91 | |||
92 | int repeat = 1; /* assume repeat */ | ||
93 | long time = TIMER1_VALUE + current_tick*TIMER_TICK; /* to timer unit */ | ||
94 | long v = (time - last_wheel_post); | ||
95 | |||
96 | /* interpolate velocity in timer_freq/timer_unit == 1/s */ | ||
97 | if (v) v = TIMER_FREQ / v; | ||
98 | |||
99 | /* accumulate velocities over time with each v */ | ||
100 | wheel_velocity = (7*wheel_velocity + v) / 8; | ||
101 | |||
102 | if (btn != wheel_repeat) | ||
103 | { | ||
104 | /* direction reversals nullify all fast mode states */ | ||
105 | wheel_repeat = btn; | ||
106 | repeat = | ||
107 | wheel_velocity = | ||
108 | wheel_click_count = 0; | ||
109 | } | ||
110 | |||
111 | if (wheel_fast_mode != 0) | ||
112 | { | ||
113 | /* fast OFF happens immediately when velocity drops below | ||
114 | threshold */ | ||
115 | if (TIME_AFTER(time, | ||
116 | last_wheel_post + WHEEL_FAST_OFF_INTERVAL)) | ||
117 | { | ||
118 | /* moving out of fast mode */ | ||
119 | wheel_fast_mode = 0; | ||
120 | /* reset velocity */ | ||
121 | wheel_velocity = 0; | ||
122 | /* wheel_delta is always 1 in slow mode */ | ||
123 | wheel_delta = 1; | ||
124 | } | ||
125 | } | ||
126 | else | ||
127 | { | ||
128 | /* fast ON gets filtered to avoid inadvertent jumps to fast mode */ | ||
129 | if (repeat && wheel_velocity > TIMER_FREQ/WHEEL_FAST_ON_INTERVAL) | ||
130 | { | ||
131 | /* moving into fast mode */ | ||
132 | wheel_fast_mode = 1 << 31; | ||
133 | wheel_click_count = 0; | ||
134 | wheel_velocity = TIMER_FREQ/WHEEL_FAST_OFF_INTERVAL; | ||
135 | } | ||
136 | else if (++wheel_click_count < WHEEL_CHANGES_PER_CLICK) | ||
137 | { /* skip some wheel changes, so that 1 post represents | ||
138 | * 1 item in lists */ | ||
139 | btn = BUTTON_NONE; | ||
140 | } | ||
141 | |||
142 | /* wheel_delta is always 1 in slow mode */ | ||
143 | wheel_delta = 1; | ||
144 | } | ||
145 | |||
146 | if (btn != BUTTON_NONE) | ||
147 | { | ||
148 | wheel_click_count = 0; | ||
149 | |||
150 | /* generate repeats if quick enough */ | ||
151 | if (repeat && TIME_BEFORE(time, | ||
152 | last_wheel_post + WHEEL_REPEAT_INTERVAL)) | ||
153 | btn |= BUTTON_REPEAT; | ||
154 | |||
155 | last_wheel_post = time; | ||
156 | |||
157 | if (queue_empty(&button_queue)) | ||
158 | { | ||
159 | queue_post(&button_queue, btn, wheel_fast_mode | | ||
160 | (wheel_delta << 24) | wheel_velocity*360/WHEELCLICKS_PER_ROTATION); | ||
161 | /* message posted - reset delta and poke backlight on*/ | ||
162 | wheel_delta = 1; | ||
163 | backlight_on(); | ||
164 | buttonlight_on(); | ||
165 | } | ||
166 | else | ||
167 | { | ||
168 | /* skipped post - increment delta */ | ||
169 | if (++wheel_delta > 0x7f) | ||
170 | wheel_delta = 0x7f; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | old_wheel_value = wheel_value; | ||
175 | } | ||
176 | #endif | ||
177 | |||
32 | void button_init_device(void) | 178 | void button_init_device(void) |
33 | { | 179 | { |
180 | #if defined(HAVE_SCROLLWHEEL) | ||
34 | GPIOA_DIR &= ~(1<<6|1<<7); | 181 | GPIOA_DIR &= ~(1<<6|1<<7); |
35 | GPIOC_DIR = 0; | 182 | GPIOC_DIR = 0; |
36 | GPIOB_DIR |= (1<<4)|(1<<0); | 183 | GPIOB_DIR |= (1<<4)|(1<<0); |
37 | 184 | ||
38 | GPIOB_PIN(4) = 1<<4; /* activate the wheel */ | 185 | GPIOB_PIN(4) = 1<<4; /* activate the wheel */ |
39 | } | ||
40 | 186 | ||
41 | void get_scrollwheel(void) | 187 | /* setup scrollwheel isr */ |
42 | { | 188 | /* clear previous irq if any */ |
43 | #if defined(HAVE_SCROLLWHEEL) && !defined(BOOTLOADER) | 189 | GPIOA_IC = SCROLLWHEEL_BITS; |
44 | /* scroll wheel handling */ | 190 | /* enable edge detecting */ |
191 | GPIOA_IS &= ~SCROLLWHEEL_BITS; | ||
192 | /* detect both raising and falling edges */ | ||
193 | GPIOA_IBE |= SCROLLWHEEL_BITS; | ||
194 | /* lastly, enable the interrupt */ | ||
195 | GPIOA_IE |= SCROLLWHEEL_BITS; | ||
196 | #endif | ||
197 | } | ||
45 | 198 | ||
199 | /* read the 2 bits at the same time */ | ||
46 | #define GPIOA_PIN76_offset ((1<<(6+2)) | (1<<(7+2))) | 200 | #define GPIOA_PIN76_offset ((1<<(6+2)) | (1<<(7+2))) |
47 | #define GPIOA_PIN76 (*(volatile unsigned char*)(GPIOA_BASE+GPIOA_PIN76_offset)) | 201 | #define GPIOA_PIN76 (*(volatile unsigned char*)(GPIOA_BASE+GPIOA_PIN76_offset)) |
48 | scrollwheel(GPIOA_PIN76 >> 6); | ||
49 | 202 | ||
203 | void button_gpioa_isr(void) | ||
204 | { | ||
205 | #if defined(HAVE_SCROLLWHEEL) | ||
206 | /* scroll wheel handling */ | ||
207 | if (GPIOA_MIS & SCROLLWHEEL_BITS) | ||
208 | scrollwheel(GPIOA_PIN76 >> 6); | ||
209 | |||
210 | /* ack interrupt */ | ||
211 | GPIOA_IC = SCROLLWHEEL_BITS; | ||
50 | #endif | 212 | #endif |
51 | } | 213 | } |
52 | 214 | ||
215 | |||
53 | /* | 216 | /* |
54 | * Get button pressed from hardware | 217 | * Get button pressed from hardware |
55 | */ | 218 | */ |
56 | |||
57 | |||
58 | int button_read_device(void) | 219 | int button_read_device(void) |
59 | { | 220 | { |
60 | int btn = 0; | 221 | int btn = 0; |
@@ -62,12 +223,12 @@ int button_read_device(void) | |||
62 | static long power_counter = 0; | 223 | static long power_counter = 0; |
63 | unsigned gpiod6; | 224 | unsigned gpiod6; |
64 | 225 | ||
65 | |||
66 | /* if we don't wait for the fifo to empty, we'll see screen corruption | 226 | /* if we don't wait for the fifo to empty, we'll see screen corruption |
67 | * (the higher the CPU frequency the higher the corruption) */ | 227 | * (the higher the CPU frequency the higher the corruption) */ |
68 | while ((DBOP_STAT & (1<<10)) == 0); | 228 | while ((DBOP_STAT & (1<<10)) == 0); |
69 | 229 | ||
70 | get_scrollwheel(); | 230 | int delay = 30; |
231 | while(delay--) nop; | ||
71 | 232 | ||
72 | CCU_IO &= ~(1<<12); | 233 | CCU_IO &= ~(1<<12); |
73 | 234 | ||
@@ -77,6 +238,7 @@ int button_read_device(void) | |||
77 | gpiod6 = GPIOD_PIN(6); | 238 | gpiod6 = GPIOD_PIN(6); |
78 | 239 | ||
79 | GPIOB_PIN(0) = 0; | 240 | GPIOB_PIN(0) = 0; |
241 | |||
80 | udelay(1); | 242 | udelay(1); |
81 | 243 | ||
82 | if (GPIOC_PIN(1) & 1<<1) | 244 | if (GPIOC_PIN(1) & 1<<1) |
@@ -114,6 +276,12 @@ int button_read_device(void) | |||
114 | { | 276 | { |
115 | hold_button_old = hold_button; | 277 | hold_button_old = hold_button; |
116 | backlight_hold_changed(hold_button); | 278 | backlight_hold_changed(hold_button); |
279 | /* mask scrollwheel irq so we don't need to check for | ||
280 | * the hold button in the isr */ | ||
281 | if (hold_button) | ||
282 | GPIOA_IE &= ~SCROLLWHEEL_BITS; | ||
283 | else | ||
284 | GPIOA_IE |= SCROLLWHEEL_BITS; | ||
117 | } | 285 | } |
118 | #else | 286 | #else |
119 | (void)hold_button_old; | 287 | (void)hold_button_old; |
diff --git a/firmware/target/arm/as3525/sansa-fuzev2/button-target.h b/firmware/target/arm/as3525/sansa-fuzev2/button-target.h index d7ef9623f9..c64c68f951 100644 --- a/firmware/target/arm/as3525/sansa-fuzev2/button-target.h +++ b/firmware/target/arm/as3525/sansa-fuzev2/button-target.h | |||
@@ -30,12 +30,6 @@ | |||
30 | void button_init_device(void); | 30 | void button_init_device(void); |
31 | bool button_hold(void); | 31 | bool button_hold(void); |
32 | int button_read_device(void); | 32 | int button_read_device(void); |
33 | void get_scrollwheel(void); | ||
34 | |||
35 | #define WHEEL_REPEAT_INTERVAL (HZ/5) | ||
36 | #define WHEEL_COUNTER_DIV 4 | ||
37 | #define ACCEL_INCREMENT 2 | ||
38 | #define ACCEL_SHIFT 2 | ||
39 | /* Sandisk Sansa Fuze button codes */ | 33 | /* Sandisk Sansa Fuze button codes */ |
40 | 34 | ||
41 | /* Main unit's buttons */ | 35 | /* Main unit's buttons */ |
diff --git a/firmware/target/arm/as3525/sd-as3525.c b/firmware/target/arm/as3525/sd-as3525.c index 1cf7e51cf8..9c3ff0b5fe 100644 --- a/firmware/target/arm/as3525/sd-as3525.c +++ b/firmware/target/arm/as3525/sd-as3525.c | |||
@@ -131,6 +131,7 @@ bool sd_enabled = false; | |||
131 | 131 | ||
132 | #if defined(HAVE_MULTIDRIVE) | 132 | #if defined(HAVE_MULTIDRIVE) |
133 | static bool hs_card = false; | 133 | static bool hs_card = false; |
134 | #define EXT_SD_BITS (1<<2) | ||
134 | #endif | 135 | #endif |
135 | 136 | ||
136 | static struct wakeup transfer_completion_signal; | 137 | static struct wakeup transfer_completion_signal; |
@@ -172,12 +173,13 @@ static int sd1_oneshot_callback(struct timeout *tmo) | |||
172 | return 0; | 173 | return 0; |
173 | } | 174 | } |
174 | 175 | ||
175 | void INT_GPIOA(void) | 176 | void sd_gpioa_isr(void) |
176 | { | 177 | { |
177 | static struct timeout sd1_oneshot; | 178 | static struct timeout sd1_oneshot; |
179 | if (GPIOA_MIS & EXT_SD_BITS) | ||
180 | timeout_register(&sd1_oneshot, sd1_oneshot_callback, (3*HZ/10), 0); | ||
178 | /* acknowledge interrupt */ | 181 | /* acknowledge interrupt */ |
179 | GPIOA_IC = (1<<2); | 182 | GPIOA_IC = EXT_SD_BITS; |
180 | timeout_register(&sd1_oneshot, sd1_oneshot_callback, (3*HZ/10), 0); | ||
181 | } | 183 | } |
182 | #endif /* HAVE_HOTSWAP */ | 184 | #endif /* HAVE_HOTSWAP */ |
183 | 185 | ||
@@ -479,15 +481,12 @@ static void init_pl180_controller(const int drive) | |||
479 | #ifdef HAVE_MULTIDRIVE | 481 | #ifdef HAVE_MULTIDRIVE |
480 | VIC_INT_ENABLE = | 482 | VIC_INT_ENABLE = |
481 | (drive == INTERNAL_AS3525) ? INTERRUPT_NAND : INTERRUPT_MCI0; | 483 | (drive == INTERNAL_AS3525) ? INTERRUPT_NAND : INTERRUPT_MCI0; |
482 | |||
483 | /* setup isr for microsd monitoring */ | ||
484 | VIC_INT_ENABLE = (INTERRUPT_GPIOA); | ||
485 | /* clear previous irq */ | 484 | /* clear previous irq */ |
486 | GPIOA_IC = (1<<2); | 485 | GPIOA_IC = EXT_SD_BITS; |
487 | /* enable edge detecting */ | 486 | /* enable edge detecting */ |
488 | GPIOA_IS &= ~(1<<2); | 487 | GPIOA_IS &= ~EXT_SD_BITS; |
489 | /* detect both raising and falling edges */ | 488 | /* detect both raising and falling edges */ |
490 | GPIOA_IBE |= (1<<2); | 489 | GPIOA_IBE |= EXT_SD_BITS; |
491 | 490 | ||
492 | #else | 491 | #else |
493 | VIC_INT_ENABLE = INTERRUPT_NAND; | 492 | VIC_INT_ENABLE = INTERRUPT_NAND; |
@@ -910,9 +909,9 @@ tCardInfo *card_get_info_target(int card_no) | |||
910 | void card_enable_monitoring_target(bool on) | 909 | void card_enable_monitoring_target(bool on) |
911 | { | 910 | { |
912 | if (on) /* enable interrupt */ | 911 | if (on) /* enable interrupt */ |
913 | GPIOA_IE |= (1<<2); | 912 | GPIOA_IE |= EXT_SD_BITS; |
914 | else /* disable interrupt */ | 913 | else /* disable interrupt */ |
915 | GPIOA_IE &= ~(1<<2); | 914 | GPIOA_IE &= ~EXT_SD_BITS; |
916 | } | 915 | } |
917 | #endif /* HAVE_HOTSWAP */ | 916 | #endif /* HAVE_HOTSWAP */ |
918 | 917 | ||
diff --git a/firmware/target/arm/as3525/sd-as3525v2.c b/firmware/target/arm/as3525/sd-as3525v2.c index 2f263f7378..65fc13feae 100644 --- a/firmware/target/arm/as3525/sd-as3525v2.c +++ b/firmware/target/arm/as3525/sd-as3525v2.c | |||
@@ -342,6 +342,7 @@ static volatile bool retry; | |||
342 | 342 | ||
343 | #if defined(HAVE_MULTIDRIVE) | 343 | #if defined(HAVE_MULTIDRIVE) |
344 | int active_card = 0; | 344 | int active_card = 0; |
345 | #define EXT_SD_BITS (1<<2) | ||
345 | #endif | 346 | #endif |
346 | 347 | ||
347 | static inline void mci_delay(void) { udelay(1000); } | 348 | static inline void mci_delay(void) { udelay(1000); } |
@@ -687,14 +688,12 @@ int sd_init(void) | |||
687 | wakeup_init(&transfer_completion_signal); | 688 | wakeup_init(&transfer_completion_signal); |
688 | 689 | ||
689 | #ifdef HAVE_MULTIDRIVE | 690 | #ifdef HAVE_MULTIDRIVE |
690 | /* setup isr for microsd monitoring */ | ||
691 | VIC_INT_ENABLE = (INTERRUPT_GPIOA); | ||
692 | /* clear previous irq */ | 691 | /* clear previous irq */ |
693 | GPIOA_IC = (1<<2); | 692 | GPIOA_IC = EXT_SD_BITS; |
694 | /* enable edge detecting */ | 693 | /* enable edge detecting */ |
695 | GPIOA_IS &= ~(1<<2); | 694 | GPIOA_IS &= ~EXT_SD_BITS; |
696 | /* detect both raising and falling edges */ | 695 | /* detect both raising and falling edges */ |
697 | GPIOA_IBE |= (1<<2); | 696 | GPIOA_IBE |= EXT_SD_BITS; |
698 | /* Configure XPD for SD-MCI interface */ | 697 | /* Configure XPD for SD-MCI interface */ |
699 | CCU_IO |= (1<<2); | 698 | CCU_IO |= (1<<2); |
700 | #endif | 699 | #endif |
@@ -961,20 +960,21 @@ static int sd1_oneshot_callback(struct timeout *tmo) | |||
961 | return 0; | 960 | return 0; |
962 | } | 961 | } |
963 | 962 | ||
964 | void INT_GPIOA(void) | 963 | void sd_gpioa_isr(void) |
965 | { | 964 | { |
966 | static struct timeout sd1_oneshot; | 965 | static struct timeout sd1_oneshot; |
966 | if (GPIOA_MIS & EXT_SD_BITS) | ||
967 | timeout_register(&sd1_oneshot, sd1_oneshot_callback, (3*HZ/10), 0); | ||
967 | /* acknowledge interrupt */ | 968 | /* acknowledge interrupt */ |
968 | GPIOA_IC = (1<<2); | 969 | GPIOA_IC = EXT_SD_BITS; |
969 | timeout_register(&sd1_oneshot, sd1_oneshot_callback, (3*HZ/10), 0); | ||
970 | } | 970 | } |
971 | 971 | ||
972 | void card_enable_monitoring_target(bool on) | 972 | void card_enable_monitoring_target(bool on) |
973 | { | 973 | { |
974 | if (on) /* enable interrupt */ | 974 | if (on) /* enable interrupt */ |
975 | GPIOA_IE |= (1<<2); | 975 | GPIOA_IE |= EXT_SD_BITS; |
976 | else /* disable interrupt */ | 976 | else /* disable interrupt */ |
977 | GPIOA_IE &= ~(1<<2); | 977 | GPIOA_IE &= ~EXT_SD_BITS; |
978 | } | 978 | } |
979 | #endif /* HAVE_HOTSWAP */ | 979 | #endif /* HAVE_HOTSWAP */ |
980 | 980 | ||
diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c index 0b1884aa16..e3e41998ce 100644 --- a/firmware/target/arm/as3525/system-as3525.c +++ b/firmware/target/arm/as3525/system-as3525.c | |||
@@ -70,7 +70,8 @@ default_interrupt(RESERVED6); /* Interrupt 25 : unused */ | |||
70 | default_interrupt(RESERVED7); /* Interrupt 26 : unused */ | 70 | default_interrupt(RESERVED7); /* Interrupt 26 : unused */ |
71 | default_interrupt(RESERVED8); /* Interrupt 27 : unused */ | 71 | default_interrupt(RESERVED8); /* Interrupt 27 : unused */ |
72 | default_interrupt(RESERVED9); /* Interrupt 28 : unused */ | 72 | default_interrupt(RESERVED9); /* Interrupt 28 : unused */ |
73 | default_interrupt(INT_GPIOA); | 73 | /* INT_GPIOA is declared in this file */ |
74 | void INT_GPIOA(void); | ||
74 | default_interrupt(INT_GPIOB); | 75 | default_interrupt(INT_GPIOB); |
75 | default_interrupt(INT_GPIOC); | 76 | default_interrupt(INT_GPIOC); |
76 | 77 | ||
@@ -144,6 +145,18 @@ static void setup_vic(void) | |||
144 | } | 145 | } |
145 | } | 146 | } |
146 | 147 | ||
148 | void INT_GPIOA(void) | ||
149 | { | ||
150 | #ifdef HAVE_MULTIDRIVE | ||
151 | void sd_gpioa_isr(void); | ||
152 | sd_gpioa_isr(); | ||
153 | #endif | ||
154 | #if (defined(HAVE_SCROLLWHEEL) && CONFIG_CPU != AS3525) | ||
155 | void button_gpioa_isr(void); | ||
156 | button_gpioa_isr(); | ||
157 | #endif | ||
158 | } | ||
159 | |||
147 | void irq_handler(void) | 160 | void irq_handler(void) |
148 | { | 161 | { |
149 | asm volatile( "stmfd sp!, {r0-r5,ip,lr} \n" /* Store context */ | 162 | asm volatile( "stmfd sp!, {r0-r5,ip,lr} \n" /* Store context */ |
@@ -348,6 +361,12 @@ void system_init(void) | |||
348 | ascodec_init(); | 361 | ascodec_init(); |
349 | 362 | ||
350 | #ifndef BOOTLOADER | 363 | #ifndef BOOTLOADER |
364 | /* setup isr for microsd monitoring and for scrollwheel irq */ | ||
365 | #if defined(HAVE_MULTIDRIVE) || (defined(HAVE_SCROLLWHEEL) && CONFIG_CPU != AS3525) | ||
366 | VIC_INT_ENABLE = (INTERRUPT_GPIOA); | ||
367 | /* pin selection for irq happens in the drivers */ | ||
368 | #endif | ||
369 | |||
351 | /* Initialize power management settings */ | 370 | /* Initialize power management settings */ |
352 | ascodec_write(AS3514_CVDD_DCDC3, AS314_CP_DCDC3_SETTING); | 371 | ascodec_write(AS3514_CVDD_DCDC3, AS314_CP_DCDC3_SETTING); |
353 | #if CONFIG_TUNER | 372 | #if CONFIG_TUNER |
diff --git a/firmware/target/arm/as3525/system-target.h b/firmware/target/arm/as3525/system-target.h index 1ccd3282db..d2cf99499d 100644 --- a/firmware/target/arm/as3525/system-target.h +++ b/firmware/target/arm/as3525/system-target.h | |||
@@ -27,7 +27,11 @@ | |||
27 | 27 | ||
28 | #include "clock-target.h" /* CPUFREQ_* are defined here */ | 28 | #include "clock-target.h" /* CPUFREQ_* are defined here */ |
29 | 29 | ||
30 | #ifdef HAVE_SCROLLWHEEL | 30 | /* We can use a interrupt-based mechanism on the fuzev2 */ |
31 | #define INCREASED_SCROLLWHEEL_POLLING \ | ||
32 | (defined(HAVE_SCROLLWHEEL) && (CONFIG_CPU == AS3525)) | ||
33 | |||
34 | #if INCREASED_SCROLLWHEEL_POLLING | ||
31 | /* let the timer interrupt twice as often for the scrollwheel polling */ | 35 | /* let the timer interrupt twice as often for the scrollwheel polling */ |
32 | #define KERNEL_TIMER_FREQ (TIMER_FREQ/2) | 36 | #define KERNEL_TIMER_FREQ (TIMER_FREQ/2) |
33 | #else | 37 | #else |