mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-09 13:15:18 -05:00
* 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:
parent
8bff564a7c
commit
9f6d3a758f
2 changed files with 55 additions and 49 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,42 +68,42 @@ 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);
|
||||||
|
|
||||||
|
|
@ -111,29 +111,27 @@ unsigned int battery_adc_voltage(void)
|
||||||
dummy = REG_SADC_BATDAT;
|
dummy = REG_SADC_BATDAT;
|
||||||
|
|
||||||
REG_SADC_ENA |= SADC_ENA_PBATEN;
|
REG_SADC_ENA |= SADC_ENA_PBATEN;
|
||||||
bat_val = 0;
|
|
||||||
|
|
||||||
/* primitive wakeup event */
|
wakeup_wait(&battery_wkup, HZ/4);
|
||||||
while(bat_val == 0 && timeout--)
|
bat_val = REG_SADC_BATDAT;
|
||||||
sleep(0);
|
|
||||||
|
|
||||||
logf("%d %d", bat_val, (bat_val*BATTERY_SCALE_FACTOR)>>10);
|
logf("%d %d", bat_val, (bat_val * BATTERY_SCALE_FACTOR) / 4096);
|
||||||
|
|
||||||
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
|
||||||
);
|
);
|
||||||
|
|
@ -166,17 +164,17 @@ int button_read_device(int *data)
|
||||||
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)
|
||||||
|
|
@ -197,11 +195,10 @@ 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)
|
||||||
|
|
@ -269,8 +266,8 @@ void SADC(void)
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -292,6 +289,7 @@ void adc_init(void)
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue