Index: firmware/target/arm/iriver/h10/button-h10.c =================================================================== --- firmware/target/arm/iriver/h10/button-h10.c (revision 16290) +++ firmware/target/arm/iriver/h10/button-h10.c (working copy) @@ -35,10 +35,10 @@ { /* Enable REW, FF, Play, Left, Right, Hold buttons */ GPIO_SET_BITWISE(GPIOA_ENABLE, 0xfc); - + /* Enable POWER button */ GPIO_SET_BITWISE(GPIOB_ENABLE, 0x01); - + /* We need to output to pin 6 of GPIOD when reading the scroll pad value */ GPIO_SET_BITWISE(GPIOD_ENABLE, 0x40); GPIO_SET_BITWISE(GPIOD_OUTPUT_EN, 0x40); @@ -55,14 +55,40 @@ return adc_scan(ADC_REMOTE) < 0x2B; } +/* touchpad sliding defines */ +#define UP_ZONE 0x260 /* above this we act as up button */ +#define DOWN_ZONE 0x200 /* below this we act as down button */ +#define AVG_CNT 0x8 /* sliding average */ +#define MIN_STILL_COUNT 80 /* non-slide count to trigger button func */ + +int last_pos = -1; +int last_tpstate = -1; + +// debugging only +int button_lastpadpos(void) +{ + return last_pos; +} +int button_lasttpstate(void) +{ + return last_tpstate; +} + /* * Get button pressed from hardware */ int button_read_device(void) { int btn = BUTTON_NONE; - int data; - unsigned char state; + int data; /* raw data from pad */ + static int data_prev[AVG_CNT]; /* previous raw data averaging array */ + static int data_prev_cnt = 0; /* averaging count */ + int i; + int pos = -1; /* position (calculated) */ + static int pos_prev = -1; /* previous position */ + static int still_count = 0; /* number of readings on same position */ + static int down_pos = -1; /* position of downpress */ + unsigned char state; /* GPIO state */ static bool hold_button = false; static bool remote_hold_button = false; bool hold_button_old; @@ -90,10 +116,10 @@ if ((state & 0x20) == 0) btn |= BUTTON_REW; if ((state & 0x40) == 0) btn |= BUTTON_RIGHT; if ((state & 0x80) == 0) btn |= BUTTON_LEFT; - + /* Read power button */ if (GPIOB_INPUT_VAL & 0x1) btn |= BUTTON_POWER; - + /* Read scroller */ if ( GPIOD_INPUT_VAL & 0x20 ) { @@ -101,16 +127,70 @@ udelay(250); data = adc_scan(ADC_SCROLLPAD); GPIO_SET_BITWISE(GPIOD_OUTPUT_VAL, 0x40); - - if(data < 0x224) + /* do sliding data averaging */ + data_prev[(data_prev_cnt++) % AVG_CNT] = data; + if(data_prev_cnt >= AVG_CNT) { - btn |= BUTTON_SCROLL_DOWN; - } else { - btn |= BUTTON_SCROLL_UP; + pos = 0; + for(i = 0; i < AVG_CNT; i++) + pos += data_prev[i]; + pos /= AVG_CNT; + last_pos = pos; ////debugging only! } } + else + { + if(down_pos > 0) + { + /* process release */ + if((down_pos > UP_ZONE) && (pos_prev > UP_ZONE)) + btn |= BUTTON_SCROLL_UP; + if((down_pos < DOWN_ZONE) && (pos_prev < DOWN_ZONE)) + btn |= BUTTON_SCROLL_DOWN; + } + pos = -1; + pos_prev = -1; + down_pos = -1; + data_prev_cnt = 0; + still_count = 0; + } + + if(pos > 0) + { + /* mark down event */ + if((data_prev_cnt >= AVG_CNT) && (down_pos < 0)) + { + down_pos = pos; + pos_prev = pos; + last_tpstate = down_pos; ////// DBG ONLY + } + + if(abs(pos-pos_prev) < 0x2) + { + /* holding still */ + if(still_count++ > MIN_STILL_COUNT) + { + if(pos < DOWN_ZONE) + btn |= BUTTON_SCROLL_DOWN; + else if(pos > UP_ZONE) + btn |= BUTTON_SCROLL_UP; + } + } + else + { + /* sliding */ + if((down_pos > UP_ZONE) && (pos < pos_prev) && + (pos < (down_pos - 0x10))) + btn |= BUTTON_SCROLL_DOWN; + if((down_pos < DOWN_ZONE) && (pos > pos_prev) && + (pos > (down_pos + 0x10))) + btn |= BUTTON_SCROLL_UP; + } + + pos_prev = pos; + } } - + /* remote buttons */ remote_hold_button_old = remote_hold_button; @@ -142,6 +222,6 @@ /* remote play button should be dead if hold */ if (!remote_hold_button && !(GPIOA_INPUT_VAL & 0x1)) btn |= BUTTON_RC_PLAY; - + return btn; }