summaryrefslogtreecommitdiff
path: root/firmware/target/arm/ipod/button-1g-3g.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/ipod/button-1g-3g.c')
-rw-r--r--firmware/target/arm/ipod/button-1g-3g.c49
1 files changed, 18 insertions, 31 deletions
diff --git a/firmware/target/arm/ipod/button-1g-3g.c b/firmware/target/arm/ipod/button-1g-3g.c
index d5592f0447..74af4c2cd2 100644
--- a/firmware/target/arm/ipod/button-1g-3g.c
+++ b/firmware/target/arm/ipod/button-1g-3g.c
@@ -47,11 +47,9 @@ static int int_btn = BUTTON_NONE;
47 * we only enable it for a very short time to check for changes every 47 * we only enable it for a very short time to check for changes every
48 * tick, and only keep it enabled if there is activity. */ 48 * tick, and only keep it enabled if there is activity. */
49#define WHEEL_TIMEOUT (HZ/4) 49#define WHEEL_TIMEOUT (HZ/4)
50static int wheel_timeout = 0;
51#endif 50#endif
52 51
53/* iPod 3G and mini 1G, mini 2G uses iPod 4G code */ 52static void handle_scroll_wheel(int new_scroll, int was_hold)
54void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
55{ 53{
56 int wheel_keycode = BUTTON_NONE; 54 int wheel_keycode = BUTTON_NONE;
57 static int prev_scroll = -1; 55 static int prev_scroll = -1;
@@ -64,10 +62,6 @@ void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
64 {0, -1, 1, 0} 62 {0, -1, 1, 0}
65 }; 63 };
66 64
67#ifdef IPOD_1G2G
68 wheel_timeout = WHEEL_TIMEOUT;
69#endif
70
71 if ( prev_scroll == -1 ) { 65 if ( prev_scroll == -1 ) {
72 prev_scroll = new_scroll; 66 prev_scroll = new_scroll;
73 } 67 }
@@ -80,26 +74,14 @@ void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
80 reset_poweroff_timer(); 74 reset_poweroff_timer();
81 if (++count == 6) { /* reduce sensitivity */ 75 if (++count == 6) { /* reduce sensitivity */
82 count = 0; 76 count = 0;
77 /* 1st..3rd Gen wheel has inverse direction mapping
78 * compared to Mini 1st Gen wheel. */
83 switch (direction) { 79 switch (direction) {
84 case 1: 80 case 1:
85 if (reverse) { 81 wheel_keycode = BUTTON_SCROLL_BACK;
86 /* 'r' keypress */
87 wheel_keycode = BUTTON_SCROLL_FWD;
88 }
89 else {
90 /* 'l' keypress */
91 wheel_keycode = BUTTON_SCROLL_BACK;
92 }
93 break; 82 break;
94 case -1: 83 case -1:
95 if (reverse) { 84 wheel_keycode = BUTTON_SCROLL_FWD;
96 /* 'l' keypress */
97 wheel_keycode = BUTTON_SCROLL_BACK;
98 }
99 else {
100 /* 'r' keypress */
101 wheel_keycode = BUTTON_SCROLL_FWD;
102 }
103 break; 85 break;
104 default: 86 default:
105 /* only happens if we get out of sync */ 87 /* only happens if we get out of sync */
@@ -174,7 +156,7 @@ static int ipod_3g_button_read(void)
174 } 156 }
175 157
176 if (source & 0xc0) { 158 if (source & 0xc0) {
177 handle_scroll_wheel((state & 0xc0) >> 6, was_hold, 0); 159 handle_scroll_wheel((state & 0xc0) >> 6, was_hold);
178 } 160 }
179 161
180 /* ack any active interrupts */ 162 /* ack any active interrupts */
@@ -219,6 +201,7 @@ int button_read_device(void)
219 static bool hold_button = false; 201 static bool hold_button = false;
220 bool hold_button_old; 202 bool hold_button_old;
221#ifdef IPOD_1G2G 203#ifdef IPOD_1G2G
204 static int wheel_timeout = 0;
222 static unsigned char last_wheel_value = 0; 205 static unsigned char last_wheel_value = 0;
223 unsigned char wheel_value; 206 unsigned char wheel_value;
224 207
@@ -228,17 +211,21 @@ int button_read_device(void)
228 { 211 {
229 GPIOB_OUTPUT_VAL |= 0x01; /* enable wheel */ 212 GPIOB_OUTPUT_VAL |= 0x01; /* enable wheel */
230 udelay(50); /* let the voltage settle */ 213 udelay(50); /* let the voltage settle */
231 wheel_value = GPIOA_INPUT_VAL >> 6; 214 GPIOA_INT_EN = 0xff; /* enable wheel interrupts */
232 if (wheel_value != last_wheel_value) 215 }
233 { 216 wheel_value = GPIOA_INPUT_VAL >> 6;
234 last_wheel_value = wheel_value; 217 if (wheel_value != last_wheel_value)
235 wheel_timeout = WHEEL_TIMEOUT; /* keep wheel enabled */ 218 {
236 } 219 last_wheel_value = wheel_value;
237 } 220 wheel_timeout = WHEEL_TIMEOUT; /* keep wheel enabled */
221 }
238 if (wheel_timeout) 222 if (wheel_timeout)
239 wheel_timeout--; 223 wheel_timeout--;
240 else 224 else
225 {
226 GPIOA_INT_EN = 0x3f; /* disable wheel interrupts */
241 GPIOB_OUTPUT_VAL &= ~0x01; /* disable wheel */ 227 GPIOB_OUTPUT_VAL &= ~0x01; /* disable wheel */
228 }
242 } 229 }
243#endif 230#endif
244 231