diff options
author | Jörg Hohensohn <hohensoh@rockbox.org> | 2003-07-16 21:07:53 +0000 |
---|---|---|
committer | Jörg Hohensohn <hohensoh@rockbox.org> | 2003-07-16 21:07:53 +0000 |
commit | d8a4bf3ec6b0659afb15431807b244ab8485d66c (patch) | |
tree | 2356f60b90cfc73742a67053c4868f3a04188682 | |
parent | e9d40587de6f9574bf7639d3a8aee3655155022b (diff) | |
download | rockbox-d8a4bf3ec6b0659afb15431807b244ab8485d66c.tar.gz rockbox-d8a4bf3ec6b0659afb15431807b244ab8485d66c.zip |
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.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/firmware/drivers/adc.c b/firmware/drivers/adc.c index 861be80987..2bb5edf3bf 100644 --- a/firmware/drivers/adc.c +++ b/firmware/drivers/adc.c | |||
@@ -48,10 +48,45 @@ unsigned short adc_read(int channel) | |||
48 | return adcdata[channel]; | 48 | return adcdata[channel]; |
49 | } | 49 | } |
50 | 50 | ||
51 | /* Batch convert 4 analog channels. If lower is true, convert AN0-AN3, | ||
52 | * otherwise AN4-AN7. | ||
53 | */ | ||
54 | static void adc_batch_convert(bool lower) | ||
55 | { | ||
56 | int reg = lower ? 0 : 4; | ||
57 | volatile unsigned short* ANx = ((unsigned short*) ADDRAH_ADDR); | ||
58 | int i; | ||
59 | |||
60 | ADCSR = ADCSR_ADST | ADCSR_SCAN | ADCSR_CKS | reg | 3; | ||
61 | |||
62 | /* Busy wait until conversion is complete. A bit ugly perhaps, but | ||
63 | * we should only need to wait about 4 * 14 µs */ | ||
64 | while(!(ADCSR & ADCSR_ADF)) | ||
65 | { | ||
66 | } | ||
67 | |||
68 | /* Stop scanning */ | ||
69 | ADCSR = 0; | ||
70 | |||
71 | for (i = 0; i < 4; i++) | ||
72 | { | ||
73 | /* Read converted values */ | ||
74 | adcdata[reg++] = ANx[i] >> 6; | ||
75 | } | ||
76 | } | ||
77 | |||
51 | void adc_init(void) | 78 | void adc_init(void) |
52 | { | 79 | { |
53 | ADCR = 0; /* No external trigger */ | 80 | int i; |
54 | 81 | ADCR = 0x7f; /* No external trigger; other bits should be 1 according to the manual... */ | |
82 | |||
55 | current_channel = 0; | 83 | current_channel = 0; |
84 | |||
85 | /* Do a first scan to initialize all values */ | ||
86 | /* AN0 to AN3 */ | ||
87 | adc_batch_convert(true); | ||
88 | /* AN4 to AN7 */ | ||
89 | adc_batch_convert(false); | ||
90 | |||
56 | tick_add_task(adc_tick); | 91 | tick_add_task(adc_tick); |
57 | } | 92 | } |