1
0
Fork 0
forked from len0rd/rockbox

Reverted to the old ADC driver, since it appeared to cause fake OFF keypresses (weird indeed, since the OFF key doesn't use the ADC on the plain Recorder). However, I did fix the batch convert, since it caused fake keypresses at boot time.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4260 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2004-01-20 11:57:50 +00:00
parent 14971f49cd
commit 26f42605c2

View file

@ -22,38 +22,25 @@
#include "thread.h" #include "thread.h"
#include "adc.h" #include "adc.h"
/* This driver updates the adcdata[] array by converting one A/D channel static int current_channel;
group on each system tick. Each group is 4 channels, which means that
it takes 2 ticks to convert all 8 channels. */
static int current_group;
static unsigned short adcdata[NUM_ADC_CHANNELS]; static unsigned short adcdata[NUM_ADC_CHANNELS];
static unsigned int adcreg[NUM_ADC_CHANNELS] =
{
ADDRAH_ADDR, ADDRBH_ADDR, ADDRCH_ADDR, ADDRDH_ADDR,
ADDRAH_ADDR, ADDRBH_ADDR, ADDRCH_ADDR, ADDRDH_ADDR
};
static void adc_tick(void) static void adc_tick(void)
{ {
/* Copy the data from the previous conversion */ /* Read the data that has bee converted since the last tick */
if(current_group) adcdata[current_channel] =
{ *(unsigned short *)adcreg[current_channel] >> 6;
adcdata[4] = ADDRA >> 6;
adcdata[5] = ADDRB >> 6;
adcdata[6] = ADDRC >> 6;
adcdata[7] = ADDRD >> 6;
}
else
{
adcdata[0] = ADDRA >> 6;
adcdata[1] = ADDRB >> 6;
adcdata[2] = ADDRC >> 6;
adcdata[3] = ADDRD >> 6;
}
/* Start converting the next group */ /* Start a conversion on the next channel */
current_group = !current_group; current_channel++;
ADCSR = ADCSR_ADST | ADCSR_SCAN | (current_group?4:0) | 3; if(current_channel == NUM_ADC_CHANNELS)
current_channel = 0;
/* The conversion will be ready when we serve the next tick interrupt. ADCSR = ADCSR_ADST | current_channel;
No need to check ADCSR for finished conversion since the conversion
will be ready long before the next tick. */
} }
unsigned short adc_read(int channel) unsigned short adc_read(int channel)
@ -61,20 +48,44 @@ unsigned short adc_read(int channel)
return adcdata[channel]; return adcdata[channel];
} }
void adc_init(void) /* Batch convert 4 analog channels. If lower is true, convert AN0-AN3,
* otherwise AN4-AN7.
*/
static void adc_batch_convert(bool lower)
{ {
ADCR = 0x7f; /* No external trigger; other bits should be 1 according int reg = lower ? 0 : 4;
to the manual... */ volatile unsigned short* ANx = ((unsigned short*) ADDRAH_ADDR);
int i;
/* Make sure that there is no conversion running */ ADCSR = ADCSR_ADST | ADCSR_SCAN | reg | 3;
/* Busy wait until conversion is complete. A bit ugly perhaps, but
* we should only need to wait about 4 * 14 µs */
while(!(ADCSR & ADCSR_ADF))
{
}
/* Stop scanning */
ADCSR = 0; ADCSR = 0;
/* Start with converting group 0 by setting current_group to 1 */ for (i = 0; i < 4; i++)
current_group = 1; {
/* Read converted values */
adcdata[reg++] = ANx[i] >> 6;
}
}
void adc_init(void)
{
ADCR = 0x7f; /* No external trigger; other bits should be 1 according to the manual... */
current_channel = 0;
/* Do a first scan to initialize all values */
/* AN4 to AN7 */
adc_batch_convert(false);
/* AN0 to AN3 */
adc_batch_convert(true);
tick_add_task(adc_tick); tick_add_task(adc_tick);
/* Wait until both groups have been converted before we continue,
so adcdata[] contains valid data */
sleep(2);
} }