summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tcc77x/adc-tcc77x.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/tcc77x/adc-tcc77x.c')
-rw-r--r--firmware/target/arm/tcc77x/adc-tcc77x.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/firmware/target/arm/tcc77x/adc-tcc77x.c b/firmware/target/arm/tcc77x/adc-tcc77x.c
new file mode 100644
index 0000000000..d6d97aaf84
--- /dev/null
+++ b/firmware/target/arm/tcc77x/adc-tcc77x.c
@@ -0,0 +1,71 @@
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
33static unsigned short adcdata[8];
34
35static void adc_do_read(void)
36{
37 int i;
38 uint32_t adc_status;
39
40 PCLKCFG6 |= (1<<15); /* Enable ADC clock */
41
42 /* Start converting the first 4 channels */
43 for (i = 0; i < 4; i++)
44 ADCCON = i;
45
46 /* Wait for data to become stable */
47 while ((ADCDATA & 0x1) == 0);
48
49 /* Now read the values back */
50 for (i=0;i < 4; i++) {
51 adc_status = ADCSTATUS;
52 adcdata[(adc_status >> 16) & 0x7] = adc_status & 0x3ff;
53 }
54
55 PCLKCFG6 &= ~(1<<15); /* Disable ADC clock */
56}
57
58unsigned short adc_read(int channel)
59{
60 adc_do_read();
61
62 return adcdata[channel];
63}
64
65void adc_init(void)
66{
67 int i;
68
69 ADCCON = (1<<4); /* Leave standby mode */
70 ADCCFG |= 0x00000003; /* Single-mode, auto power-down */
71}