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:
parent
4034e0b47f
commit
533c29b2f2
2 changed files with 63 additions and 48 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#ifdef SANSA_C200V2
|
||||
/* button driver needs to know if a lcd operation is in progress */
|
||||
static bool lcd_busy = false;
|
||||
static unsigned short dbop_input = 0xFFFF;
|
||||
#endif
|
||||
|
||||
/* Display status */
|
||||
|
@ -182,24 +183,45 @@ static inline void as3525_dbop_init(void)
|
|||
lcd_delay(20);
|
||||
}
|
||||
|
||||
/* we need to set the DBOP_DOUT pins high, for correct dbop reads */
|
||||
bool lcd_button_support(void)
|
||||
static unsigned short lcd_dbop_read(void)
|
||||
{
|
||||
const fb_data data = 0xffff;
|
||||
unsigned int dbop_ctrl_old = DBOP_CTRL;
|
||||
unsigned int dbop_timpol23_old = DBOP_TIMPOL_23;
|
||||
unsigned int value;
|
||||
|
||||
if (lcd_busy) /* we can't use dbop for reading if we are in the */
|
||||
return false; /* middle of a write operation */
|
||||
/* make sure that the DBOP FIFO is empty */
|
||||
while ((DBOP_STAT & (1<<10)) == 0);
|
||||
|
||||
/* use out of screen coordinates */
|
||||
lcd_send_command(R_X_ADDR_AREA, 0);
|
||||
lcd_send_command(1, 0);
|
||||
lcd_send_command(R_Y_ADDR_AREA, 0);
|
||||
lcd_send_command(1, 0);
|
||||
/* write DBOP_DOUT to pre-charge DBOP data lines with a high level */
|
||||
DBOP_TIMPOL_23 = 0xe167e167; /* no strobe towards lcd */
|
||||
DBOP_CTRL = (1 << 16) | /* enw=1 (enable write) */
|
||||
(1 << 12); /* ow=1 (16-bit data width) */
|
||||
DBOP_DOUT = 0xFFFF; /* all pins high */
|
||||
while ((DBOP_STAT & (1<<10)) == 0);
|
||||
|
||||
lcd_write_data(&data, 1);
|
||||
/* perform a DBOP read */
|
||||
DBOP_CTRL = (1 << 15) | /* strd=1 (start read) */
|
||||
(1 << 12) | /* ow=1 (16-bit data width) */
|
||||
(31 << 0); /* rs_t=31 (read DBOP at end of cycle) */
|
||||
while ((DBOP_STAT & (1<<16)) == 0);
|
||||
value = DBOP_DIN;
|
||||
|
||||
return true;
|
||||
/* restore previous values */
|
||||
DBOP_TIMPOL_23 = dbop_timpol23_old;
|
||||
DBOP_CTRL = dbop_ctrl_old;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/* get the DBOP input value, either directly or cached if DBOP is busy */
|
||||
unsigned short int lcd_dbop_input(void)
|
||||
{
|
||||
if (!lcd_busy) {
|
||||
dbop_input = lcd_dbop_read();
|
||||
}
|
||||
return dbop_input;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* LCD init */
|
||||
|
@ -430,6 +452,8 @@ void lcd_update_rect(int x, int y, int width, int height)
|
|||
|
||||
#ifdef SANSA_C200V2
|
||||
lcd_busy = true;
|
||||
/* perform a dbop read before doing a potentially lengthy lcd update */
|
||||
dbop_input = lcd_dbop_read();
|
||||
#endif
|
||||
|
||||
if (width <= 1) {
|
||||
|
|
Loading…
Reference in a new issue