blob: 9e67dd545c6741ff1ed55971d6c657af8e94310a [file] [log] [blame]
brians0ab60bb2013-01-31 02:21:51 +00001// ****************************************************************************
2// CopyLeft qwerk Robotics unINC. 2010 All Rights Reserved.
3// ****************************************************************************
4
5// ****************************************************************************
6// **************** IO Pin Setup
7// ****************************************************************************
8
9#include "FreeRTOS.h"
10
11void analog_init (void)
12{
13 // b[1:0] CAN RD1 p0.0
14 // b[3:2] CAN TD1 p0.1
15 //PINCON->PINSEL0 = 0x00000005;
16
17 // b[29:28] USB_DMIN p0.30
18 // b[27:26] USB_DPLUS p0.29
19 // b[21:20] AD0.3 p0.26
20 // b[19:18] AD0.2 p0.25
21 // PINCON->PINSEL1 = 0x14140000;
22
23 // PINCON->PINSEL2 = 0x0;
24
25 // b[31:30] AD0.5 p1.31
26 // b[29:28] V_BUS p1.30
27 // b[21:20] MCOB1 p1.26
28 // b[19:18] MCOA1 p1.25
29 // b[15:14] MCI1 p1.23
30 // b[13:12] MCOB0 p1.22
31 // b[09:08] MCI0 p1.20
32 // b[07:06] MCOA0 p1.19
33 // b[05:04] USB_UP_LED p1.18
34 //PINCON->PINSEL3 = 0xE0145150;
35 SC->PCONP |= PCONP_PCAD;
36
37 // Enable AD0.0, AD0.1, AD0.2, AD0.3
38 PINCON->PINSEL1 &= 0xFFC03FFF;
39 PINCON->PINSEL1 |= 0x00D54000;
40 ADC->ADCR = 0x00200500;
41}
42
43// ****************************************************************************
44// **************** ADC Functions
45// ****************************************************************************
46
47
48// **************** macros
49// starts convertion [26:24] = 001
50
51// **************** functions
52int analog(int channel)
53{
54 ADC->ADCR = ((ADC->ADCR & 0xF8FFFF00) | (0x01000000 | (1 << channel)));
55
56 // Poll until it is done.
57 while(!(ADC->ADGDR & 0x80000000));
58
59 return ((ADC->ADGDR & 0x0000FFF0) >> 4);
60}
61// GPIO1 P0.4
62// GPIO2 P0.5
63// GPIO3 P0.6
64// GPIO4 P0.7
65// GPIO5 P0.8
66// GPIO6 P0.9
67// GPIO7 P2.0
68// GPIO8 P2.1
69// GPIO9 P2.2
70// GPIO10 P2.3
71// GPIO11 P2.4
72// GPIO12 P2.5
73
74// DIP0 P1.29
75// DIP1 P2.13
76// DIP2 P0.11
77// DIP3 P0.10
78#define readGPIO(gpio,chan) ((((gpio)->FIOPIN) >> (chan)) & 1)
79inline int readGPIO_inline(int major,int minor){
80 switch(major){
81 case 0:
82 return readGPIO(GPIO0,minor);
83 case 1:
84 return readGPIO(GPIO1,minor);
85 case 2:
86 return readGPIO(GPIO2,minor);
87 default:
88 return -1;
89 }
90}
91int digital(int channel)
92{
93 if(channel < 1){
94 return -1;
95 }else if(channel < 7){
96 int chan = channel + 3;
97 return readGPIO(GPIO0,chan);
98 }else if(channel < 13){
99 int chan = channel - 7;
100 return readGPIO(GPIO2,chan);
101 }
102 return -1;
103}
104int dip(int channel)
105{
106 switch(channel){
107 case 0:
108 return readGPIO(GPIO1,29);
109 case 1:
110 return readGPIO(GPIO2,13);
111 case 2:
112 return readGPIO(GPIO0,11);
113 case 3:
114 return readGPIO(GPIO0,10);
115 default:
116 return -1;
117
118 }
119}
120//ENC0A 1.20
121//ENC0B 1.23
122//ENC1A 2.11
123//ENC1B 2.12
124//ENC2A 0.21
125//ENC2B 0.22
126//ENC3A 0.19
127//ENC3B 0.20
128
129#define ENC(gpio,a,b) readGPIO(gpio,a) * 2 + readGPIO(gpio,b)
130int encoder_bits(int channel)
131{
132 switch(channel){
133 case 0:
134 return ENC(GPIO1,20,23);
135 case 1:
136 return ENC(GPIO2,11,12);
137 case 2:
138 return ENC(GPIO0,21,22);
139 case 3:
140 return ENC(GPIO0,19,20);
141 default:
142 return -1;
143 }
144 return -1;
145}
146
147volatile int32_t encoder1_val;
148void encoder_init(void)
149{
150// port 0
151 // Setup the encoder interface.
152 SC->PCONP |= PCONP_PCQEI;
153 PINCON->PINSEL3 = ((PINCON->PINSEL3 & 0xffff3dff) | 0x00004100);
154
155 // Reset the count and velocity
156 QEI->QEICON = 0x00000005;
157
158 QEI->QEICONF = 0x00000004;
159 // Wrap back to 0 when we wrap the int...
160 QEI->QEIMAXPOS = 0xffffffff;
161// port 1
162 NVIC_EnableIRQ(EINT1_IRQn);
163 NVIC_EnableIRQ(EINT2_IRQn);
164 //NVIC_EnableIRQ(EINT3_IRQn);
165 //PINSEL4 23/22 0 1
166 //PINSEL4 25 24 0 1
167 PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 22)) | (0x1 << 22);
168 PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 24)) | (0x1 << 24);
169
170 //EXTMODE 1 2 1 1 // all others off
171 SC->EXTMODE = 0x6;
172 SC->EXTINT = 0x6;
173 encoder1_val = 0;
174//ports 2 and 3
175
176
177}
178void EINT1_IRQHandler(void){
179 //ENC1A 2.11
180 int stored_val = encoder1_val;
181 int fiopin = GPIO2->FIOPIN;
182 if(((fiopin >> 1) ^ fiopin) & 0x800){
183 stored_val ++;
184 }else{
185 stored_val --;
186 }
187 encoder1_val = stored_val;
188 SC->EXTPOLAR ^= 0x2;
189 SC->EXTINT = 0x2;
190}
191void EINT2_IRQHandler(void){
192 //ENC1B 2.12
193 int stored_val = encoder1_val;
194 int fiopin = GPIO2->FIOPIN;
195 if(((fiopin >> 1) ^ fiopin) & 0x800){
196 stored_val --;
197 }else{
198 stored_val ++;
199 }
200 encoder1_val = stored_val;
201 SC->EXTPOLAR ^= 0x4;
202 SC->EXTINT = 0x4;
203}
204void EINT3_IRQHandler(void){
205
206}
207int32_t encoder_val(int chan)
208{
209 switch(chan){
210 case 0:
211 return (int32_t)QEI->QEIPOS;
212 case 1:
213 return encoder1_val;
214 case 2:
215 case 3:
216 default:
217 return -1;
218 }
219}
220