D2: Use a common function for reading ADC values from the PMU

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23007 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Rob Purchase 2009-10-08 15:47:43 +00:00
parent 5a435e62d0
commit 292a53da4b
5 changed files with 54 additions and 31 deletions

View file

@ -41,35 +41,22 @@ static int short_cmp(const void *a, const void *b)
void button_read_touch()
{
unsigned char buf[3];
static long last_touch_interrupt = 0;
static int touch_data_index = 0;
/* put the touchscreen into idle mode */
pcf50606_write(PCF5060X_ADCC1, 0);
/* here the touch coordinates are read 5 times */
/* they will be sorted and the middle one will be used */
pcf50606_write(PCF5060X_ADCC2, (0xE<<1) | 1); /* ADC start X+Y */
do {
buf[1] = pcf50606_read(PCF5060X_ADCS2);
} while (!(buf[1] & 0x80)); /* Busy wait on ADCRDY flag */
buf[0] = pcf50606_read(PCF5060X_ADCS1);
buf[2] = pcf50606_read(PCF5060X_ADCS3);
pcf50606_write(PCF5060X_ADCC2, 0); /* ADC stop */
if (TIME_AFTER(current_tick, last_touch_interrupt + 1))
{
/* resets the index if the last touch could not be read 5 times */
touch_data_index = 0;
}
x[touch_data_index] = (buf[0] << 2) | (buf[1] & 3);
y[touch_data_index] = (buf[2] << 2) | ((buf[1] & 0xC) >> 2);
/* here the touch coordinates are read 5 times */
/* they will be sorted and the middle one will be used */
pcf50606_read_adc(PCF5060X_ADC_TSC_XY,
&x[touch_data_index], &y[touch_data_index]);
touch_data_index++;
@ -126,7 +113,7 @@ void button_init_device(void)
{
/* Configure GPIOA 4 (POWER) and 8 (HOLD) for input */
GPIOA_DIR &= ~0x110;
/* Configure GPIOB 4 (button pressed) for input */
GPIOB_DIR &= ~0x10;
@ -229,12 +216,12 @@ int button_read_device(int *data)
touch_hold = false;
pcf50606_write(PCF5060X_ADCC1, 1);
}
if (!(GPIOA & 0x4))
btn |= BUTTON_POWER;
if (btn & BUTTON_TOUCHSCREEN && !is_backlight_on(true))
old_data = *data = 0;
return btn;
}

View file

@ -26,7 +26,7 @@
#include "pcf50606.h"
unsigned short current_voltage = 3910;
const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
{
3380
@ -42,7 +42,7 @@ const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
{
/* Standard D2 internal battery */
{ 3370, 3690, 3750, 3775, 3790, 3820, 3880, 3940, 3980, 4090, 4170 }
/* TODO: DIY replacements eg. Nokia BP-4L ? */
};
@ -65,15 +65,9 @@ unsigned int battery_adc_voltage(void)
if (TIME_BEFORE(last_tick+HZ, current_tick))
{
int adc_val, irq_status;
unsigned char buf[2];
short adc_val;
pcf50606_read_adc(PCF5060X_ADC_BATVOLT_RES, &adc_val, NULL);
irq_status = disable_irq_save();
pcf50606_write(PCF5060X_ADCC2, 0x1);
pcf50606_read_multiple(PCF5060X_ADCS1, buf, 2);
restore_interrupt(irq_status);
adc_val = (buf[0]<<2) | (buf[1] & 3); //ADCDAT1H+ADCDAT1L
current_voltage = (adc_val * BATTERY_SCALE_FACTOR) >> 10;
last_tick = current_tick;