Sansa c200v2: update DBOP button reading mechanism, this enables readout of the volume buttons, rec and hold button.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22635 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Bertrik Sikken 2009-09-05 18:56:59 +00:00
parent 4034e0b47f
commit 533c29b2f2
2 changed files with 63 additions and 48 deletions

View file

@ -26,10 +26,10 @@
#include "powermgmt.h"
unsigned short _dbop_din = 0;
static unsigned short _dbop_din = 0xFFFF;
/* in the lcd driver */
extern bool lcd_button_support(void);
extern unsigned short int lcd_dbop_input(void);
static bool hold_button = false;
#ifndef BOOTLOADER
@ -52,26 +52,6 @@ bool button_hold(void)
return hold_button;
}
static void button_read_dbop(void)
{
/* Set up dbop for input */
DBOP_CTRL |= (1<<19); /* Tri-state DBOP on read cycle */
DBOP_CTRL &= ~(1<<16); /* disable output (1:write enabled) */
DBOP_TIMPOL_01 = 0xe167e167; /* Set Timing & Polarity regs 0 & 1 */
DBOP_TIMPOL_23 = 0xe167006e; /* Set Timing & Polarity regs 2 & 3 */
DBOP_CTRL |= (1<<15); /* start read */
while (!(DBOP_STAT & (1<<16))); /* wait for valid data */
_dbop_din = DBOP_DIN; /* Read dbop data*/
/* Reset dbop for output */
DBOP_TIMPOL_01 = 0x6e167; /* Set Timing & Polarity regs 0 & 1 */
DBOP_TIMPOL_23 = 0xa167e06f; /* Set Timing & Polarity regs 2 & 3 */
DBOP_CTRL |= (1<<16); /* Enable output (0:write disable) */
DBOP_CTRL &= ~(1<<19); /* Tri-state when no active write */
}
/*
* Get button pressed from hardware
*/
@ -79,13 +59,27 @@ int button_read_device(void)
{
int btn = BUTTON_NONE;
_dbop_din = lcd_dbop_input();
/* hold button handling */
hold_button = ((_dbop_din & (1<<12)) == 0);
#ifndef BOOTLOADER
/* light handling */
if (hold_button != hold_button_old)
{
hold_button_old = hold_button;
backlight_hold_changed(hold_button);
}
#endif /* BOOTLOADER */
if (hold_button) {
return 0;
}
/* direct GPIO connections */
if (GPIOA_PIN(3))
btn |= BUTTON_POWER;
if(lcd_button_support())
button_read_dbop();
/* DBOP buttons */
if(!(_dbop_din & (1<<2)))
btn |= BUTTON_LEFT;
if(!(_dbop_din & (1<<3)))
@ -96,15 +90,12 @@ int button_read_device(void)
btn |= BUTTON_UP;
if(!(_dbop_din & (1<<6)))
btn |= BUTTON_RIGHT;
#ifndef BOOTLOADER
/* light handling */
if (hold_button != hold_button_old)
{
hold_button_old = hold_button;
backlight_hold_changed(hold_button);
}
#endif /* BOOTLOADER */
if(!(_dbop_din & (1<<13)))
btn |= BUTTON_VOL_UP;
if(!(_dbop_din & (1<<14)))
btn |= BUTTON_VOL_DOWN;
if(!(_dbop_din & (1<<15)))
btn |= BUTTON_REC;
return btn;
}