summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-02-19 22:54:48 +0000
committerThomas Martitz <kugel@rockbox.org>2009-02-19 22:54:48 +0000
commit7d0b9f7fb7d66dd3b03e6a9ccfebeb9d0e92d2ab (patch)
tree52c8afcf292c28a8d7be46697e3783e1d3fb796c
parent4d32457410c94d5fd035f4698a9d6458ddc35e62 (diff)
Fix occasional power button ghost presses and get rid of the delay which was needed to reduce the ghost presses (i.e. don't read power button too during lcd updates)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20058 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/as3525/sansa-fuze/button-fuze.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/firmware/target/arm/as3525/sansa-fuze/button-fuze.c b/firmware/target/arm/as3525/sansa-fuze/button-fuze.c
index 9b6df70bd9..f5dca441d5 100644
--- a/firmware/target/arm/as3525/sansa-fuze/button-fuze.c
+++ b/firmware/target/arm/as3525/sansa-fuze/button-fuze.c
@@ -128,13 +128,14 @@ bool button_hold(void)
static short button_dbop(void)
{
- /* skip home reading if lcd_button_support was blocked,
+ /* skip home and power reading if lcd_button_support was blocked,
* since the dbop bit 15 is invalid then, and use the old value instead */
- /* -20 (arbitary value) indicates valid home button read */
- int old_home = -20;
- int delay = 0;
+ /* -20 (arbitary value) indicates valid home&power button read */
+ int old_home_power = -20;
if(!lcd_button_support())
- old_home = (_dbop_din & 1<<15);
+ {
+ old_home_power = (_dbop_din & (1<<15|1<<8));
+ }
/* Wait for fifo to empty */
while ((DBOP_STAT & (1<<10)) == 0);
@@ -145,10 +146,8 @@ static short button_dbop(void)
DBOP_TIMPOL_01 = 0xe167e167;
DBOP_TIMPOL_23 = 0xe167006e;
- while(delay++ < 64);
-
DBOP_CTRL |= (1<<15); /* start read */
- ((DBOP_STAT & (1<<16)) == 0); /* wait for valid data */
+ while((DBOP_STAT & (1<<16)) == 0); /* wait for valid data */
_dbop_din = DBOP_DIN; /* now read */
@@ -158,8 +157,12 @@ static short button_dbop(void)
DBOP_CTRL |= (1<<16);
DBOP_CTRL &= ~(1<<19);
- if (old_home != -20)
- _dbop_din |= old_home;
+ /* write back old values if blocked */
+ if (old_home_power != -20)
+ {
+ _dbop_din |= old_home_power & 1<<15;
+ _dbop_din &= 0xfeff|(old_home_power & 1<<8);
+ }
return _dbop_din;
}