blob: a15b00b8fc0fb85207d4d266250d7f4f8e68751e [file] [log] [blame]
Brian Silverman25a06d92013-12-15 16:28:52 -08001#include "cape/digital.h"
2
3#include <STM32F2XX.h>
4
5#include "cape/util.h"
6
7static void digital_capture_default(void) {}
8
9void digital_capture_0P(void) ALIAS_WEAK(digital_capture_default);
10void digital_capture_0N(void) ALIAS_WEAK(digital_capture_default);
11void digital_capture_1P(void) ALIAS_WEAK(digital_capture_default);
12void digital_capture_1N(void) ALIAS_WEAK(digital_capture_default);
13void digital_capture_2P(void) ALIAS_WEAK(digital_capture_default);
14void digital_capture_2N(void) ALIAS_WEAK(digital_capture_default);
15void digital_capture_3P(void) ALIAS_WEAK(digital_capture_default);
16void digital_capture_3N(void) ALIAS_WEAK(digital_capture_default);
17void digital_capture_4P(void) ALIAS_WEAK(digital_capture_default);
18void digital_capture_4N(void) ALIAS_WEAK(digital_capture_default);
19void digital_capture_5P(void) ALIAS_WEAK(digital_capture_default);
20void digital_capture_5N(void) ALIAS_WEAK(digital_capture_default);
21void digital_capture_6P(void) ALIAS_WEAK(digital_capture_default);
22void digital_capture_6N(void) ALIAS_WEAK(digital_capture_default);
23void digital_capture_7P(void) ALIAS_WEAK(digital_capture_default);
24void digital_capture_7N(void) ALIAS_WEAK(digital_capture_default);
25void digital_capture_8P(void) ALIAS_WEAK(digital_capture_default);
26void digital_capture_8N(void) ALIAS_WEAK(digital_capture_default);
27void digital_capture_9P(void) ALIAS_WEAK(digital_capture_default);
28void digital_capture_9N(void) ALIAS_WEAK(digital_capture_default);
29void digital_capture_10P(void) ALIAS_WEAK(digital_capture_default);
30void digital_capture_10N(void) ALIAS_WEAK(digital_capture_default);
31void digital_capture_11P(void) ALIAS_WEAK(digital_capture_default);
32void digital_capture_11N(void) ALIAS_WEAK(digital_capture_default);
33void digital_capture_12P(void) ALIAS_WEAK(digital_capture_default);
34void digital_capture_12N(void) ALIAS_WEAK(digital_capture_default);
35
36typedef void (*EXTIHandler)(uint32_t);
37
38void EXTI2_IRQHandler(void) {
39 uint32_t inputs = GPIOB->IDR;
40 EXTI->PR = EXTI_PR_PR2;
41 if (inputs & (1 << 2)) {
42 digital_capture_11N();
43 } else {
44 digital_capture_11P();
45 }
46}
47
48void EXTI4_IRQHandler(void) {
49 uint32_t inputs = GPIOC->IDR;
50 EXTI->PR = EXTI_PR_PR4;
51 if (inputs & (1 << 4)) {
52 digital_capture_0N();
53 } else {
54 digital_capture_0P();
55 }
56}
57
58static void EXTI5_Handler(uint32_t inputs) {
59 if (inputs & (1 << 5)) {
60 digital_capture_1N();
61 } else {
62 digital_capture_1P();
63 }
64}
65
66static void EXTI7_Handler(uint32_t inputs) {
67 if (inputs & (1 << 7)) {
68 digital_capture_10N();
69 } else {
70 digital_capture_10P();
71 }
72}
73
74static void EXTI8_Handler(uint32_t inputs) {
75 if (inputs & (1 << 7)) {
76 digital_capture_7N();
77 } else {
78 digital_capture_7P();
79 }
80}
81
82static void EXTI9_Handler(uint32_t inputs) {
83 if (inputs & (1 << 9)) {
84 digital_capture_6N();
85 } else {
86 digital_capture_6P();
87 }
88}
89
90void EXTI9_5_IRQHandler(void) {
91 uint32_t inputs = GPIOC->IDR;
92 uint32_t exti = __clz(EXTI->PR);
93 EXTI->PR = (1 << 31) >> exti;
94 switch (exti) {
95 case 31 - 5:
96 EXTI5_Handler(inputs);
97 break;
98 case 31 - 7:
99 EXTI7_Handler(inputs);
100 break;
101 case 31 - 8:
102 EXTI8_Handler(inputs);
103 break;
104 case 31 - 9:
105 EXTI9_Handler(inputs);
106 break;
107 }
108}
109
110static void EXTI10_Handler(uint32_t inputs) {
111 if (inputs & (1 << 10)) {
112 digital_capture_5N();
113 } else {
114 digital_capture_5P();
115 }
116}
117
118static void EXTI11_Handler(uint32_t inputs) {
119 if (inputs & (1 << 11)) {
120 digital_capture_9N();
121 } else {
122 digital_capture_9P();
123 }
124}
125
126static void EXTI12_Handler(uint32_t inputs) {
127 if (inputs & (1 << 12)) {
128 digital_capture_8N();
129 } else {
130 digital_capture_8P();
131 }
132}
133
134static void EXTI13_Handler(uint32_t inputs) {
135 if (inputs & (1 << 13)) {
136 digital_capture_2N();
137 } else {
138 digital_capture_2P();
139 }
140}
141
142static void EXTI14_Handler(uint32_t inputs) {
143 if (inputs & (1 << 14)) {
144 digital_capture_3N();
145 } else {
146 digital_capture_3P();
147 }
148}
149
150static void EXTI15_Handler(uint32_t inputs) {
151 if (inputs & (1 << 15)) {
152 digital_capture_4N();
153 } else {
154 digital_capture_4P();
155 }
156}
157
158void EXTI15_10_IRQHandler(void) {
159 uint32_t inputs = GPIOC->IDR;
160 uint32_t exti = __clz(EXTI->PR);
161 EXTI->PR = (1 << 31) >> exti;
162 switch (exti) {
163 case 31 - 10:
164 EXTI10_Handler(inputs);
165 break;
166 case 31 - 11:
167 EXTI11_Handler(inputs);
168 break;
169 case 31 - 12:
170 EXTI12_Handler(inputs);
171 break;
172 case 31 - 13:
173 EXTI13_Handler(inputs);
174 break;
175 case 31 - 14:
176 EXTI14_Handler(inputs);
177 break;
178 case 31 - 15:
179 EXTI15_Handler(inputs);
180 break;
181 }
182}
183
184static void init_exti(int exti, int port) {
185 EXTI_set(exti, port);
186 EXTI->IMR |= 1 << exti;
187 EXTI->RTSR |= 1 << exti;
188 EXTI->FTSR |= 1 << exti;
189}
190
191void digital_init(void) {
192 init_exti(2, 1);
193 init_exti(4, 2);
194 init_exti(5, 2);
195 init_exti(7, 0);
196 init_exti(8, 1);
197 init_exti(9, 1);
198 init_exti(10, 1);
199 init_exti(11, 0);
200 init_exti(12, 0);
201 init_exti(13, 2);
202 init_exti(14, 2);
203 init_exti(15, 2);
204
205 NVIC_SetPriority(EXTI2_IRQn, 1);
206 NVIC_EnableIRQ(EXTI2_IRQn);
207 NVIC_SetPriority(EXTI4_IRQn, 1);
208 NVIC_EnableIRQ(EXTI4_IRQn);
209 NVIC_SetPriority(EXTI9_5_IRQn, 1);
210 NVIC_EnableIRQ(EXTI9_5_IRQn);
211 NVIC_SetPriority(EXTI15_10_IRQn, 1);
212 NVIC_EnableIRQ(EXTI15_10_IRQn);
213}