summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tcc780x/adc-tcc780x.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/tcc780x/adc-tcc780x.c')
-rw-r--r--firmware/target/arm/tcc780x/adc-tcc780x.c76
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
36static unsigned short adcdata[8];
37
38static 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
61unsigned 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
70void 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}