diff options
Diffstat (limited to 'firmware/target/arm/tcc780x/adc-tcc780x.c')
-rw-r--r-- | firmware/target/arm/tcc780x/adc-tcc780x.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/firmware/target/arm/tcc780x/adc-tcc780x.c b/firmware/target/arm/tcc780x/adc-tcc780x.c new file mode 100644 index 0000000000..871db2b61d --- /dev/null +++ b/firmware/target/arm/tcc780x/adc-tcc780x.c | |||
@@ -0,0 +1,76 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Dave Chapman | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | #include "config.h" | ||
20 | #include "cpu.h" | ||
21 | #include "system.h" | ||
22 | #include "kernel.h" | ||
23 | #include "thread.h" | ||
24 | #include "string.h" | ||
25 | #include "adc.h" | ||
26 | |||
27 | /* | ||
28 | TODO: We probably want to do this on the timer interrupt once we get | ||
29 | interrupts going - see the sh-adc.c implementation for an example which | ||
30 | looks like it should work well with the TCC77x. | ||
31 | |||
32 | Also, this code is practically identical between 77x & 780x targets. | ||
33 | Should probably find a common location to avoid the duplication. | ||
34 | */ | ||
35 | |||
36 | static unsigned short adcdata[8]; | ||
37 | |||
38 | static void adc_do_read(void) | ||
39 | { | ||
40 | int i; | ||
41 | uint32_t adc_status; | ||
42 | |||
43 | PCLK_ADC |= PCK_EN; /* Enable ADC clock */ | ||
44 | |||
45 | /* Start converting the first 4 channels */ | ||
46 | for (i = 0; i < 4; i++) | ||
47 | ADCCON = i; | ||
48 | |||
49 | /* Wait for data to become stable */ | ||
50 | while ((ADCDATA & 0x1) == 0); | ||
51 | |||
52 | /* Now read the values back */ | ||
53 | for (i=0;i < 4; i++) { | ||
54 | adc_status = ADCSTATUS; | ||
55 | adcdata[(adc_status >> 16) & 0x7] = adc_status & 0x3ff; | ||
56 | } | ||
57 | |||
58 | PCLK_ADC &= ~PCK_EN; /* Disable ADC clock */ | ||
59 | } | ||
60 | |||
61 | unsigned short adc_read(int channel) | ||
62 | { | ||
63 | /* Either move this to an interrupt routine, or only perform the read if | ||
64 | the last call was X length of time ago. */ | ||
65 | adc_do_read(); | ||
66 | |||
67 | return adcdata[channel]; | ||
68 | } | ||
69 | |||
70 | void adc_init(void) | ||
71 | { | ||
72 | /* consider configuring PCK_ADC source here */ | ||
73 | |||
74 | ADCCON = (1<<4); /* Leave standby mode */ | ||
75 | ADCCFG |= 0x00000003; /* Single-mode, auto power-down */ | ||
76 | } | ||