diff options
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/button.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index a1fd58c447..7c5858a1e3 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include "system.h" | 26 | #include "system.h" |
27 | #include "button.h" | 27 | #include "button.h" |
28 | #include "kernel.h" | 28 | #include "kernel.h" |
29 | #include "thread.h" | ||
29 | #include "backlight.h" | 30 | #include "backlight.h" |
30 | #include "serial.h" | 31 | #include "serial.h" |
31 | #include "power.h" | 32 | #include "power.h" |
@@ -255,21 +256,52 @@ static void button_tick(void) | |||
255 | lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); | 256 | lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); |
256 | } | 257 | } |
257 | 258 | ||
259 | void button_boost(bool state) | ||
260 | { | ||
261 | static bool boosted = false; | ||
262 | |||
263 | if (state && !boosted) | ||
264 | { | ||
265 | cpu_boost(true); | ||
266 | boosted = true; | ||
267 | } | ||
268 | else if (!state && boosted) | ||
269 | { | ||
270 | cpu_boost(false); | ||
271 | boosted = false; | ||
272 | } | ||
273 | } | ||
274 | |||
258 | long button_get(bool block) | 275 | long button_get(bool block) |
259 | { | 276 | { |
260 | struct event ev; | 277 | struct event ev; |
261 | 278 | int pending_count = queue_count(&button_queue); | |
262 | if ( block || !queue_empty(&button_queue) ) | 279 | |
280 | /* Control the CPU boost trying to keep queue empty. */ | ||
281 | if (pending_count == 0) | ||
282 | button_boost(false); | ||
283 | else if (pending_count > 2) | ||
284 | button_boost(true); | ||
285 | |||
286 | if ( block || pending_count ) | ||
263 | { | 287 | { |
264 | queue_wait(&button_queue, &ev); | 288 | queue_wait(&button_queue, &ev); |
265 | return ev.id; | 289 | return ev.id; |
266 | } | 290 | } |
291 | |||
267 | return BUTTON_NONE; | 292 | return BUTTON_NONE; |
268 | } | 293 | } |
269 | 294 | ||
270 | long button_get_w_tmo(int ticks) | 295 | long button_get_w_tmo(int ticks) |
271 | { | 296 | { |
272 | struct event ev; | 297 | struct event ev; |
298 | |||
299 | /* Be sure to keep boosted state. */ | ||
300 | if (!queue_empty(&button_queue)) | ||
301 | return button_get(true); | ||
302 | |||
303 | button_boost(false); | ||
304 | |||
273 | queue_wait_w_tmo(&button_queue, &ev, ticks); | 305 | queue_wait_w_tmo(&button_queue, &ev, ticks); |
274 | return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE; | 306 | return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE; |
275 | } | 307 | } |