* Onda VX777: add support for its single physical button

* Use real wakeup events in the battery ADC driver
 * Adjust battery charge information a bit


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22458 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Maurus Cuelenaere 2009-08-21 21:35:12 +00:00
parent 8bff564a7c
commit 9f6d3a758f
2 changed files with 55 additions and 49 deletions

View file

@ -23,7 +23,9 @@
#include "config.h" #include "config.h"
#ifndef VX777
#define HAS_BUTTON_HOLD #define HAS_BUTTON_HOLD
#endif
bool button_hold(void); bool button_hold(void);
void button_init_device(void); void button_init_device(void);
@ -57,11 +59,18 @@ void button_set_touch_available(void);
.C=0xA22AA2C, .D=0x23DC, .E=0x8E3E6, \ .C=0xA22AA2C, .D=0x23DC, .E=0x8E3E6, \
.F=0x76CF88AA, .divider=0xFFAD4013} .F=0x76CF88AA, .divider=0xFFAD4013}
#ifdef ONDA_VX777
#define BUTTON_MAIN (BUTTON_POWER | BUTTON_TOPLEFT | BUTTON_TOPMIDDLE | \
BUTTON_TOPRIGHT | BUTTON_MIDLEFT | BUTTON_CENTER | \
BUTTON_MIDRIGHT | BUTTON_BOTTOMLEFT | BUTTON_BOTTOMMIDDLE | \
BUTTON_BOTTOMRIGHT)
#else
#define BUTTON_MAIN (BUTTON_POWER | BUTTON_VOL_UP | BUTTON_VOL_DOWN | \ #define BUTTON_MAIN (BUTTON_POWER | BUTTON_VOL_UP | BUTTON_VOL_DOWN | \
BUTTON_MENU | BUTTON_TOPLEFT | BUTTON_TOPMIDDLE | \ BUTTON_MENU | BUTTON_TOPLEFT | BUTTON_TOPMIDDLE | \
BUTTON_TOPRIGHT | BUTTON_MIDLEFT | BUTTON_CENTER | \ BUTTON_TOPRIGHT | BUTTON_MIDLEFT | BUTTON_CENTER | \
BUTTON_MIDRIGHT | BUTTON_BOTTOMLEFT | BUTTON_BOTTOMMIDDLE | \ BUTTON_MIDRIGHT | BUTTON_BOTTOMLEFT | BUTTON_BOTTOMMIDDLE | \
BUTTON_BOTTOMRIGHT) BUTTON_BOTTOMRIGHT)
#endif
/* No remote */ /* No remote */
#define BUTTON_REMOTE 0 #define BUTTON_REMOTE 0

View file

@ -43,7 +43,7 @@
#define BTN_MENU (1 << 20) #define BTN_MENU (1 << 20)
#define BTN_VOL_UP (1 << 19) #define BTN_VOL_UP (1 << 19)
#elif defined(ONDA_VX777) #elif defined(ONDA_VX777)
/* TODO */ #define BTN_OFF (1 << 29)
#else #else
#error No buttons defined! #error No buttons defined!
#endif #endif
@ -68,72 +68,70 @@ static signed int x_pos, y_pos;
static int datacount = 0; static int datacount = 0;
static volatile int cur_touch = 0; static volatile int cur_touch = 0;
static volatile bool pen_down = false; static volatile bool pen_down = false;
static volatile unsigned short bat_val;
static struct mutex battery_mtx; static struct mutex battery_mtx;
static struct wakeup battery_wkup;
const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
{ {
/* TODO */ /* TODO */
1000 1600
}; };
const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
{ {
/* TODO */ /* TODO */
900 1500
}; };
/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
{ {
/* TODO */ /* TODO */
{ 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000 }, { 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400 },
}; };
/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ /* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
const unsigned short percent_to_volt_charge[11] = const unsigned short percent_to_volt_charge[11] =
{ {
/* TODO */ /* TODO */
1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400
}; };
/* VBAT = (BDATA/4096) * 7.5V */ /* VBAT = (BDATA/4096) * 7.5V */
#define BATTERY_SCALE_FACTOR 1875 #define BATTERY_SCALE_FACTOR 7500
/* Returns battery voltage from ADC [millivolts] */ /* Returns battery voltage from ADC [millivolts] */
unsigned int battery_adc_voltage(void) unsigned int battery_adc_voltage(void)
{ {
unsigned int dummy, timeout=HZ/4; unsigned int dummy, bat_val;
mutex_lock(&battery_mtx); mutex_lock(&battery_mtx);
dummy = REG_SADC_BATDAT; dummy = REG_SADC_BATDAT;
dummy = REG_SADC_BATDAT; dummy = REG_SADC_BATDAT;
REG_SADC_ENA |= SADC_ENA_PBATEN; REG_SADC_ENA |= SADC_ENA_PBATEN;
bat_val = 0;
wakeup_wait(&battery_wkup, HZ/4);
/* primitive wakeup event */ bat_val = REG_SADC_BATDAT;
while(bat_val == 0 && timeout--)
sleep(0); logf("%d %d", bat_val, (bat_val * BATTERY_SCALE_FACTOR) / 4096);
logf("%d %d", bat_val, (bat_val*BATTERY_SCALE_FACTOR)>>10);
mutex_unlock(&battery_mtx); mutex_unlock(&battery_mtx);
return (bat_val*BATTERY_SCALE_FACTOR)>>10; return (bat_val * BATTERY_SCALE_FACTOR) / 4096;
} }
void button_init_device(void) void button_init_device(void)
{ {
__gpio_as_input(32*3 + 29); /* VX777 and VX747(+) */
#ifdef ONDA_VX747 #ifdef ONDA_VX747
__gpio_as_input(32*3 + 29);
__gpio_as_input(32*3 + 27); __gpio_as_input(32*3 + 27);
__gpio_as_input(32*3 + 16); __gpio_as_input(32*3 + 16);
__gpio_as_input(32*3 + 1); __gpio_as_input(32*3 + 1);
__gpio_as_input(32*3 + 0); __gpio_as_input(32*3 + 0);
#elif defined(ONDA_VX747P) #elif defined(ONDA_VX747P)
__gpio_as_input(32*3 + 29);
__gpio_as_input(32*3 + 27); __gpio_as_input(32*3 + 27);
__gpio_as_input(32*3 + 20); __gpio_as_input(32*3 + 20);
__gpio_as_input(32*3 + 19); __gpio_as_input(32*3 + 19);
@ -149,7 +147,7 @@ bool button_hold(void)
#elif defined(ONDA_VX747P) #elif defined(ONDA_VX747P)
(~REG_GPIO_PXPIN(2)) & BTN_HOLD (~REG_GPIO_PXPIN(2)) & BTN_HOLD
#elif defined(ONDA_VX777) #elif defined(ONDA_VX777)
false /* TODO */ false
#endif #endif
? true : false ? true : false
); );
@ -159,24 +157,24 @@ int button_read_device(int *data)
{ {
int ret = 0; int ret = 0;
static int old_data = 0; static int old_data = 0;
*data = old_data; *data = old_data;
/* Filter button events out if HOLD button is pressed at firmware/ level */ /* Filter button events out if HOLD button is pressed at firmware/ level */
if(button_hold()) if(button_hold())
return 0; return 0;
#ifndef ONDA_VX777
int tmp = (~REG_GPIO_PXPIN(3)) & BTN_MASK; int tmp = (~REG_GPIO_PXPIN(3)) & BTN_MASK;
if(tmp & BTN_OFF)
ret |= BUTTON_POWER;
#ifndef ONDA_VX777
if(tmp & BTN_VOL_DOWN) if(tmp & BTN_VOL_DOWN)
ret |= BUTTON_VOL_DOWN; ret |= BUTTON_VOL_DOWN;
if(tmp & BTN_VOL_UP) if(tmp & BTN_VOL_UP)
ret |= BUTTON_VOL_UP; ret |= BUTTON_VOL_UP;
if(tmp & BTN_MENU) if(tmp & BTN_MENU)
ret |= BUTTON_MENU; ret |= BUTTON_MENU;
if(tmp & BTN_OFF)
ret |= BUTTON_POWER;
#endif #endif
if(cur_touch != 0 && pen_down) if(cur_touch != 0 && pen_down)
@ -187,7 +185,7 @@ int button_read_device(int *data)
#endif #endif
if( UNLIKELY(!is_backlight_on(true)) ) if( UNLIKELY(!is_backlight_on(true)) )
*data = 0; *data = 0;
old_data = *data; old_data = *data;
} }
@ -197,13 +195,12 @@ int button_read_device(int *data)
/* Interrupt handler */ /* Interrupt handler */
void SADC(void) void SADC(void)
{ {
unsigned char state; unsigned char state, sadcstate;
unsigned char sadcstate;
sadcstate = REG_SADC_STATE; sadcstate = REG_SADC_STATE;
state = REG_SADC_STATE & (~REG_SADC_CTRL); state = sadcstate & (~REG_SADC_CTRL);
REG_SADC_STATE &= sadcstate; REG_SADC_STATE &= sadcstate;
if(state & SADC_CTRL_PENDM) if(state & SADC_CTRL_PENDM)
{ {
/* Pen down IRQ */ /* Pen down IRQ */
@ -211,7 +208,7 @@ void SADC(void)
REG_SADC_CTRL |= (SADC_CTRL_PENDM); REG_SADC_CTRL |= (SADC_CTRL_PENDM);
pen_down = true; pen_down = true;
} }
if(state & SADC_CTRL_PENUM) if(state & SADC_CTRL_PENUM)
{ {
/* Pen up IRQ */ /* Pen up IRQ */
@ -221,26 +218,26 @@ void SADC(void)
datacount = 0; datacount = 0;
cur_touch = 0; cur_touch = 0;
} }
if(state & SADC_CTRL_TSRDYM) if(state & SADC_CTRL_TSRDYM)
{ {
unsigned int dat; unsigned int dat;
unsigned short xData, yData; unsigned short xData, yData;
signed short tsz1Data, tsz2Data; signed short tsz1Data, tsz2Data;
dat = REG_SADC_TSDAT; dat = REG_SADC_TSDAT;
xData = (dat >> 0) & 0xFFF; xData = (dat >> 0) & 0xFFF;
yData = (dat >> 16) & 0xFFF; yData = (dat >> 16) & 0xFFF;
dat = REG_SADC_TSDAT; dat = REG_SADC_TSDAT;
tsz1Data = (dat >> 0) & 0xFFF; tsz1Data = (dat >> 0) & 0xFFF;
tsz2Data = (dat >> 16) & 0xFFF; tsz2Data = (dat >> 16) & 0xFFF;
if(!pen_down) if(!pen_down)
return; return;
tsz1Data = tsz2Data - tsz1Data; tsz1Data = tsz2Data - tsz1Data;
if((tsz1Data > 100) || (tsz1Data < -100)) if((tsz1Data > 100) || (tsz1Data < -100))
{ {
if(datacount == 0) if(datacount == 0)
@ -253,9 +250,9 @@ void SADC(void)
x_pos += xData; x_pos += xData;
y_pos += yData; y_pos += yData;
} }
datacount++; datacount++;
if(datacount >= TS_AD_COUNT) if(datacount >= TS_AD_COUNT)
{ {
cur_touch = ((x_pos / datacount) << 16) | cur_touch = ((x_pos / datacount) << 16) |
@ -266,11 +263,11 @@ void SADC(void)
else else
datacount = 0; datacount = 0;
} }
if(state & SADC_CTRL_PBATRDYM) if(state & SADC_CTRL_PBATRDYM)
{ {
bat_val = REG_SADC_BATDAT;
/* Battery AD IRQ */ /* Battery AD IRQ */
wakeup_signal(&battery_wkup);
} }
} }
@ -280,18 +277,19 @@ void adc_init(void)
REG_SADC_ENA = 0; REG_SADC_ENA = 0;
REG_SADC_STATE &= (~REG_SADC_STATE); REG_SADC_STATE &= (~REG_SADC_STATE);
REG_SADC_CTRL = 0x1f; REG_SADC_CTRL = 0x1f;
REG_SADC_CFG = SADC_CFG_INIT; REG_SADC_CFG = SADC_CFG_INIT;
system_enable_irq(IRQ_SADC); system_enable_irq(IRQ_SADC);
REG_SADC_SAMETIME = 10; REG_SADC_SAMETIME = 10;
REG_SADC_WAITTIME = 100; REG_SADC_WAITTIME = 100;
REG_SADC_STATE &= ~REG_SADC_STATE; REG_SADC_STATE &= ~REG_SADC_STATE;
REG_SADC_CTRL = ~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM | SADC_CTRL_PBATRDYM); REG_SADC_CTRL = ~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM | SADC_CTRL_PBATRDYM);
REG_SADC_ENA = SADC_ENA_TSEN; REG_SADC_ENA = SADC_ENA_TSEN;
mutex_init(&battery_mtx); mutex_init(&battery_mtx);
wakeup_init(&battery_wkup);
} }
void adc_close(void) void adc_close(void)
@ -301,4 +299,3 @@ void adc_close(void)
sleep(20); sleep(20);
__cpm_stop_sadc(); __cpm_stop_sadc();
} }