summaryrefslogtreecommitdiff
path: root/firmware/drivers/button.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/button.c')
-rw-r--r--firmware/drivers/button.c36
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
259void 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
258long button_get(bool block) 275long 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
270long button_get_w_tmo(int ticks) 295long 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}