summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Hohensohn <hohensoh@rockbox.org>2003-07-16 21:07:53 +0000
committerJörg Hohensohn <hohensoh@rockbox.org>2003-07-16 21:07:53 +0000
commitd8a4bf3ec6b0659afb15431807b244ab8485d66c (patch)
tree2356f60b90cfc73742a67053c4868f3a04188682
parente9d40587de6f9574bf7639d3a8aee3655155022b (diff)
downloadrockbox-d8a4bf3ec6b0659afb15431807b244ab8485d66c.zip
rockbox-d8a4bf3ec6b0659afb15431807b244ab8485d66c.tar.gz
rockbox-d8a4bf3ec6b0659afb15431807b244ab8485d66c.tar.bz2
rockbox-d8a4bf3ec6b0659afb15431807b244ab8485d66c.tar.xz
Patch 772577 by Magnus Holmgren: measure all ADC channels within adc_init(), so afterwards adc_read() can be used right away.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3834 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/adc.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/firmware/drivers/adc.c b/firmware/drivers/adc.c
index 861be80..2bb5edf 100644
--- a/firmware/drivers/adc.c
+++ b/firmware/drivers/adc.c
@@ -48,10 +48,45 @@ unsigned short adc_read(int channel)
return adcdata[channel];
}
+/* Batch convert 4 analog channels. If lower is true, convert AN0-AN3,
+ * otherwise AN4-AN7.
+ */
+static void adc_batch_convert(bool lower)
+{
+ int reg = lower ? 0 : 4;
+ volatile unsigned short* ANx = ((unsigned short*) ADDRAH_ADDR);
+ int i;
+
+ ADCSR = ADCSR_ADST | ADCSR_SCAN | ADCSR_CKS | 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;
+
+ for (i = 0; i < 4; i++)
+ {
+ /* Read converted values */
+ adcdata[reg++] = ANx[i] >> 6;
+ }
+}
+
void adc_init(void)
{
- ADCR = 0; /* No external trigger */
-
+ int i;
+ 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 */
+ /* AN0 to AN3 */
+ adc_batch_convert(true);
+ /* AN4 to AN7 */
+ adc_batch_convert(false);
+
tick_add_task(adc_tick);
}