diff options
Diffstat (limited to 'firmware/target/arm/ipod/1g2g/adc-ipod-1g2g.c')
-rw-r--r-- | firmware/target/arm/ipod/1g2g/adc-ipod-1g2g.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/firmware/target/arm/ipod/1g2g/adc-ipod-1g2g.c b/firmware/target/arm/ipod/1g2g/adc-ipod-1g2g.c new file mode 100644 index 0000000000..759b6fb592 --- /dev/null +++ b/firmware/target/arm/ipod/1g2g/adc-ipod-1g2g.c | |||
@@ -0,0 +1,100 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Jens Arnold | ||
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 | |||
20 | #include "config.h" | ||
21 | #include "cpu.h" | ||
22 | #include "hwcompat.h" | ||
23 | #include "kernel.h" | ||
24 | |||
25 | static struct mutex adc_mutex NOCACHEBSS_ATTR; | ||
26 | |||
27 | unsigned short adc_scan(int channel) | ||
28 | { | ||
29 | int i, j; | ||
30 | unsigned short data = 0; | ||
31 | unsigned pval; | ||
32 | |||
33 | (void)channel; /* there is only one */ | ||
34 | spinlock_lock(&adc_mutex); | ||
35 | |||
36 | if ((IPOD_HW_REVISION >> 16) == 1) | ||
37 | { | ||
38 | pval = GPIOB_OUTPUT_VAL; | ||
39 | GPIOB_OUTPUT_VAL = pval | 0x04; /* B2 -> high */ | ||
40 | for (i = 32; i > 0; --i); | ||
41 | |||
42 | GPIOB_OUTPUT_VAL = pval; /* B2 -> low */ | ||
43 | for (i = 200; i > 0; --i); | ||
44 | |||
45 | for (j = 0; j < 8; j++) | ||
46 | { | ||
47 | GPIOB_OUTPUT_VAL = pval | 0x02; /* B1 -> high */ | ||
48 | for (i = 8; i > 0; --i); | ||
49 | |||
50 | data = (data << 1) | ((GPIOB_INPUT_VAL & 0x08) >> 3); | ||
51 | |||
52 | GPIOB_OUTPUT_VAL = pval; /* B1 -> low */ | ||
53 | for (i = 320; i > 0; --i); | ||
54 | } | ||
55 | } | ||
56 | else if ((IPOD_HW_REVISION >> 16) == 2) | ||
57 | { | ||
58 | pval = GPIOB_OUTPUT_VAL; | ||
59 | GPIOB_OUTPUT_VAL = pval | 0x0a; /* B1, B3 -> high */ | ||
60 | while (!(GPIOB_INPUT_VAL & 0x04)); /* wait for B2 == 1 */ | ||
61 | |||
62 | GPIOB_OUTPUT_VAL = pval; /* B1, B3 -> low */ | ||
63 | while (GPIOB_INPUT_VAL & 0x04); /* wait for B2 == 0 */ | ||
64 | |||
65 | for (j = 0; j < 8; j++) | ||
66 | { | ||
67 | GPIOB_OUTPUT_VAL = pval | 0x02; /* B1 -> high */ | ||
68 | while (!(GPIOB_INPUT_VAL & 0x04)); /* wait for B2 == 1 */ | ||
69 | |||
70 | data = (data << 1) | ((GPIOB_INPUT_VAL & 0x10) >> 4); | ||
71 | |||
72 | GPIOB_OUTPUT_VAL = pval; /* B1 -> low */ | ||
73 | while (GPIOB_INPUT_VAL & 0x04); /* wait for B2 == 0 */ | ||
74 | } | ||
75 | } | ||
76 | spinlock_unlock(&adc_mutex); | ||
77 | return data; | ||
78 | } | ||
79 | |||
80 | void adc_init(void) | ||
81 | { | ||
82 | spinlock_init(&adc_mutex); | ||
83 | |||
84 | GPIOB_ENABLE |= 0x1e; /* enable B1..B4 */ | ||
85 | |||
86 | if ((IPOD_HW_REVISION >> 16) == 1) | ||
87 | { | ||
88 | GPIOB_OUTPUT_EN = (GPIOB_OUTPUT_EN & ~0x08) | 0x16; | ||
89 | /* B1, B2, B4 -> output, B3 -> input */ | ||
90 | GPIOB_OUTPUT_VAL = (GPIOB_OUTPUT_VAL & ~0x06) | 0x10; | ||
91 | /* B1, B2 -> low, B4 -> high */ | ||
92 | } | ||
93 | else if ((IPOD_HW_REVISION >> 16) == 2) | ||
94 | { | ||
95 | GPIOB_OUTPUT_EN = (GPIOB_OUTPUT_EN & ~0x14) | 0x0a; | ||
96 | /* B1, B3 -> output, B2, B4 -> input */ | ||
97 | GPIOB_OUTPUT_VAL &= ~0x0a; /* B1, B3 -> low */ | ||
98 | while (GPIOB_INPUT_VAL & 0x04); /* wait for B2 == 0 */ | ||
99 | } | ||
100 | } | ||