commit d100cff8c72292b8ab2408c7cdb815080be358df Author: Marcin Bukat Date: Thu Nov 17 01:05:29 2011 +0100 fix scrollstrip problems at driver level diff --git a/firmware/target/coldfire/mpio/hd300/button-hd300.c b/firmware/target/coldfire/mpio/hd300/button-hd300.c index 8239b54..ae0b1e1 100644 --- a/firmware/target/coldfire/mpio/hd300/button-hd300.c +++ b/firmware/target/coldfire/mpio/hd300/button-hd300.c @@ -29,10 +29,17 @@ #include "powermgmt.h" #define SLIDER_BASE_SENSITIVITY 8 +#define SLIDER_REL_TIMEOUT HZ /* GPI7 H-L, GPI6 H-L, GPI7 L-H, GPI6 L-H */ #define SLIDER_GPIO_MASK ((1<<15)|(1<<14)|(1<<7)|(1<<6)) +static volatile struct scroll_state_t { + signed char dir; + long timeout; + bool rel; +} scroll; + static inline void disable_scrollstrip_interrupts(void) { and_l(~SLIDER_GPIO_MASK,&GPIO_INT_EN); @@ -89,10 +96,20 @@ void scrollstrip_isr(void) scroll_dir = scroll_state[prev_scroll_lines][new_scroll_lines]; prev_scroll_lines = new_scroll_lines; - + + /* catch sequence error */ + if (scroll_dir == BUTTON_NONE) + return; + + /* direction reversal */ if (direction != scroll_dir) { - /* direction reversal */ + /* post release event to the button queue */ + if (queue_empty(&button_queue)) + queue_post(&button_queue, direction|BUTTON_REL, 0); + + scroll.rel = true; + direction = scroll_dir; count = 0; ack_scrollstrip_interrupt(); @@ -121,6 +138,10 @@ void scrollstrip_isr(void) if (queue_empty(&button_queue)) queue_post(&button_queue, scroll_dir, 0); + scroll.dir = scroll_dir; + scroll.timeout = current_tick + SLIDER_REL_TIMEOUT; + scroll.rel = false; + ack_scrollstrip_interrupt(); enable_scrollstrip_interrupts(); } @@ -235,5 +256,15 @@ int button_read_device(void) } /* !button_hold() */ + if (!scroll.rel) + if (TIME_AFTER(current_tick, scroll.timeout)) + { + if (queue_empty(&button_queue)) + { + queue_post(&button_queue, scroll.dir|BUTTON_REL, 0); + scroll.rel = true; + } + } + return btn; }