blob: 70fce9905fb4ecf68136561035ab5b1b68946706 [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
Brian Silverman25a06d92013-12-15 16:28:52 -080036void EXTI2_IRQHandler(void) {
37 uint32_t inputs = GPIOB->IDR;
38 EXTI->PR = EXTI_PR_PR2;
39 if (inputs & (1 << 2)) {
40 digital_capture_11N();
41 } else {
42 digital_capture_11P();
43 }
44}
45
46void EXTI4_IRQHandler(void) {
47 uint32_t inputs = GPIOC->IDR;
48 EXTI->PR = EXTI_PR_PR4;
49 if (inputs & (1 << 4)) {
50 digital_capture_0N();
51 } else {
52 digital_capture_0P();
53 }
54}
55
56static void EXTI5_Handler(uint32_t inputs) {
57 if (inputs & (1 << 5)) {
58 digital_capture_1N();
59 } else {
60 digital_capture_1P();
61 }
62}
63
64static void EXTI7_Handler(uint32_t inputs) {
65 if (inputs & (1 << 7)) {
66 digital_capture_10N();
67 } else {
68 digital_capture_10P();
69 }
70}
71
72static void EXTI8_Handler(uint32_t inputs) {
Brian Silverman57621112014-01-01 16:08:24 -080073 if (inputs & (1 << 8)) {
Brian Silverman25a06d92013-12-15 16:28:52 -080074 digital_capture_7N();
75 } else {
76 digital_capture_7P();
77 }
78}
79
80static void EXTI9_Handler(uint32_t inputs) {
81 if (inputs & (1 << 9)) {
82 digital_capture_6N();
83 } else {
84 digital_capture_6P();
85 }
86}
87
88void EXTI9_5_IRQHandler(void) {
Brian Silverman57621112014-01-01 16:08:24 -080089 uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR, c_inputs = GPIOC->IDR;
Brian Silverman25a06d92013-12-15 16:28:52 -080090 uint32_t exti = __clz(EXTI->PR);
91 EXTI->PR = (1 << 31) >> exti;
92 switch (exti) {
93 case 31 - 5:
Brian Silverman57621112014-01-01 16:08:24 -080094 EXTI5_Handler(c_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -080095 break;
96 case 31 - 7:
Brian Silverman57621112014-01-01 16:08:24 -080097 EXTI7_Handler(a_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -080098 break;
99 case 31 - 8:
Brian Silverman57621112014-01-01 16:08:24 -0800100 EXTI8_Handler(b_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800101 break;
102 case 31 - 9:
Brian Silverman57621112014-01-01 16:08:24 -0800103 EXTI9_Handler(b_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800104 break;
105 }
106}
107
108static void EXTI10_Handler(uint32_t inputs) {
109 if (inputs & (1 << 10)) {
110 digital_capture_5N();
111 } else {
112 digital_capture_5P();
113 }
114}
115
116static void EXTI11_Handler(uint32_t inputs) {
117 if (inputs & (1 << 11)) {
118 digital_capture_9N();
119 } else {
120 digital_capture_9P();
121 }
122}
123
124static void EXTI12_Handler(uint32_t inputs) {
125 if (inputs & (1 << 12)) {
126 digital_capture_8N();
127 } else {
128 digital_capture_8P();
129 }
130}
131
132static void EXTI13_Handler(uint32_t inputs) {
133 if (inputs & (1 << 13)) {
134 digital_capture_2N();
135 } else {
136 digital_capture_2P();
137 }
138}
139
140static void EXTI14_Handler(uint32_t inputs) {
141 if (inputs & (1 << 14)) {
142 digital_capture_3N();
143 } else {
144 digital_capture_3P();
145 }
146}
147
148static void EXTI15_Handler(uint32_t inputs) {
149 if (inputs & (1 << 15)) {
150 digital_capture_4N();
151 } else {
152 digital_capture_4P();
153 }
154}
155
156void EXTI15_10_IRQHandler(void) {
Brian Silverman57621112014-01-01 16:08:24 -0800157 uint32_t a_inputs = GPIOA->IDR, b_inputs = GPIOB->IDR, c_inputs = GPIOC->IDR;
Brian Silverman25a06d92013-12-15 16:28:52 -0800158 uint32_t exti = __clz(EXTI->PR);
159 EXTI->PR = (1 << 31) >> exti;
160 switch (exti) {
161 case 31 - 10:
Brian Silverman57621112014-01-01 16:08:24 -0800162 EXTI10_Handler(b_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800163 break;
164 case 31 - 11:
Brian Silverman57621112014-01-01 16:08:24 -0800165 EXTI11_Handler(a_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800166 break;
167 case 31 - 12:
Brian Silverman57621112014-01-01 16:08:24 -0800168 EXTI12_Handler(a_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800169 break;
170 case 31 - 13:
Brian Silverman57621112014-01-01 16:08:24 -0800171 EXTI13_Handler(c_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800172 break;
173 case 31 - 14:
Brian Silverman57621112014-01-01 16:08:24 -0800174 EXTI14_Handler(c_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800175 break;
176 case 31 - 15:
Brian Silverman57621112014-01-01 16:08:24 -0800177 EXTI15_Handler(c_inputs);
Brian Silverman25a06d92013-12-15 16:28:52 -0800178 break;
179 }
180}
181
182static void init_exti(int exti, int port) {
183 EXTI_set(exti, port);
184 EXTI->IMR |= 1 << exti;
185 EXTI->RTSR |= 1 << exti;
186 EXTI->FTSR |= 1 << exti;
187}
188
189void digital_init(void) {
190 init_exti(2, 1);
191 init_exti(4, 2);
192 init_exti(5, 2);
193 init_exti(7, 0);
194 init_exti(8, 1);
195 init_exti(9, 1);
196 init_exti(10, 1);
197 init_exti(11, 0);
198 init_exti(12, 0);
199 init_exti(13, 2);
200 init_exti(14, 2);
201 init_exti(15, 2);
202
203 NVIC_SetPriority(EXTI2_IRQn, 1);
204 NVIC_EnableIRQ(EXTI2_IRQn);
205 NVIC_SetPriority(EXTI4_IRQn, 1);
206 NVIC_EnableIRQ(EXTI4_IRQn);
207 NVIC_SetPriority(EXTI9_5_IRQn, 1);
208 NVIC_EnableIRQ(EXTI9_5_IRQn);
209 NVIC_SetPriority(EXTI15_10_IRQn, 1);
210 NVIC_EnableIRQ(EXTI15_10_IRQn);
211}