1 /*
2  * This file is part of the MicroPython project, http://micropython.org/
3  *
4  * The MIT License (MIT)
5  *
6  * Copyright (c) 2017-2018 Damien P. George
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  */
26 
27 #include <stdbool.h>
28 
29 #include "genhdr/pins.h"
30 
31 // For simplicity just convert all HAL errors to one errno.
mp_hal_status_to_neg_errno(HAL_StatusTypeDef status)32 static inline int mp_hal_status_to_neg_errno(HAL_StatusTypeDef status) {
33     return status == HAL_OK ? 0 : -1;
34 }
35 
36 #define mp_hal_delay_us_fast(us) mp_hal_delay_us(us)
37 
38 #define MP_HAL_PIN_MODE_INPUT           (0)
39 #define MP_HAL_PIN_MODE_OUTPUT          (1)
40 #define MP_HAL_PIN_MODE_ALT             (2)
41 #define MP_HAL_PIN_MODE_ANALOG          (3)
42 #if defined(GPIO_ASCR_ASC0)
43 #define MP_HAL_PIN_MODE_ADC             (11)
44 #else
45 #define MP_HAL_PIN_MODE_ADC             (3)
46 #endif
47 #define MP_HAL_PIN_MODE_OPEN_DRAIN      (5)
48 #define MP_HAL_PIN_MODE_ALT_OPEN_DRAIN  (6)
49 #define MP_HAL_PIN_PULL_NONE            (GPIO_NOPULL)
50 #define MP_HAL_PIN_PULL_UP              (GPIO_PULLUP)
51 #define MP_HAL_PIN_PULL_DOWN            (GPIO_PULLDOWN)
52 #define MP_HAL_PIN_SPEED_LOW            (GPIO_SPEED_FREQ_LOW)
53 #define MP_HAL_PIN_SPEED_MEDIUM         (GPIO_SPEED_FREQ_MEDIUM)
54 #define MP_HAL_PIN_SPEED_HIGH           (GPIO_SPEED_FREQ_HIGH)
55 #define MP_HAL_PIN_SPEED_VERY_HIGH      (GPIO_SPEED_FREQ_VERY_HIGH)
56 
57 #define mp_hal_pin_obj_t        uint32_t
58 #define mp_hal_pin_input(p)     mp_hal_pin_config((p), MP_HAL_PIN_MODE_INPUT, MP_HAL_PIN_PULL_NONE, 0)
59 #define mp_hal_pin_output(p)    mp_hal_pin_config((p), MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_NONE, 0)
60 #define mp_hal_pin_open_drain(p) mp_hal_pin_config((p), MP_HAL_PIN_MODE_OPEN_DRAIN, MP_HAL_PIN_PULL_NONE, 0)
61 #define mp_hal_pin_low(p)       (((GPIO_TypeDef*)((p) & ~0xf))->BSRR = 0x10000 << ((p) & 0xf))
62 #define mp_hal_pin_high(p)      (((GPIO_TypeDef*)((p) & ~0xf))->BSRR = 1 << ((p) & 0xf))
63 #define mp_hal_pin_od_low(p)    mp_hal_pin_low(p)
64 #define mp_hal_pin_od_high(p)   mp_hal_pin_high(p)
65 #define mp_hal_pin_read(p)      ((((GPIO_TypeDef*)((p) & ~0xf))->IDR >> ((p) & 0xf)) & 1)
66 #define mp_hal_pin_write(p, v)  ((v) ? mp_hal_pin_high(p) : mp_hal_pin_low(p))
67 
68 void mp_hal_pin_config(uint32_t port_pin, uint32_t mode, uint32_t pull, uint32_t alt);
69 void mp_hal_pin_config_speed(uint32_t port_pin, uint32_t speed);
70 
71 #define pin_A0  (GPIOA_BASE |  0)
72 #define pin_A1  (GPIOA_BASE |  1)
73 #define pin_A2  (GPIOA_BASE |  2)
74 #define pin_A3  (GPIOA_BASE |  3)
75 #define pin_A4  (GPIOA_BASE |  4)
76 #define pin_A5  (GPIOA_BASE |  5)
77 #define pin_A6  (GPIOA_BASE |  6)
78 #define pin_A7  (GPIOA_BASE |  7)
79 #define pin_A8  (GPIOA_BASE |  8)
80 #define pin_A9  (GPIOA_BASE |  9)
81 #define pin_A10 (GPIOA_BASE | 10)
82 #define pin_A11 (GPIOA_BASE | 11)
83 #define pin_A12 (GPIOA_BASE | 12)
84 #define pin_A13 (GPIOA_BASE | 13)
85 #define pin_A14 (GPIOA_BASE | 14)
86 #define pin_A15 (GPIOA_BASE | 15)
87 
88 #define pin_B0  (GPIOB_BASE |  0)
89 #define pin_B1  (GPIOB_BASE |  1)
90 #define pin_B2  (GPIOB_BASE |  2)
91 #define pin_B3  (GPIOB_BASE |  3)
92 #define pin_B4  (GPIOB_BASE |  4)
93 #define pin_B5  (GPIOB_BASE |  5)
94 #define pin_B6  (GPIOB_BASE |  6)
95 #define pin_B7  (GPIOB_BASE |  7)
96 #define pin_B8  (GPIOB_BASE |  8)
97 #define pin_B9  (GPIOB_BASE |  9)
98 #define pin_B10 (GPIOB_BASE | 10)
99 #define pin_B11 (GPIOB_BASE | 11)
100 #define pin_B12 (GPIOB_BASE | 12)
101 #define pin_B13 (GPIOB_BASE | 13)
102 #define pin_B14 (GPIOB_BASE | 14)
103 #define pin_B15 (GPIOB_BASE | 15)
104 
105 #define pin_C0  (GPIOC_BASE |  0)
106 #define pin_C1  (GPIOC_BASE |  1)
107 #define pin_C2  (GPIOC_BASE |  2)
108 #define pin_C3  (GPIOC_BASE |  3)
109 #define pin_C4  (GPIOC_BASE |  4)
110 #define pin_C5  (GPIOC_BASE |  5)
111 #define pin_C6  (GPIOC_BASE |  6)
112 #define pin_C7  (GPIOC_BASE |  7)
113 #define pin_C8  (GPIOC_BASE |  8)
114 #define pin_C9  (GPIOC_BASE |  9)
115 #define pin_C10 (GPIOC_BASE | 10)
116 #define pin_C11 (GPIOC_BASE | 11)
117 #define pin_C12 (GPIOC_BASE | 12)
118 #define pin_C13 (GPIOC_BASE | 13)
119 #define pin_C14 (GPIOC_BASE | 14)
120 #define pin_C15 (GPIOC_BASE | 15)
121 
122 #define pin_D0  (GPIOD_BASE |  0)
123 #define pin_D1  (GPIOD_BASE |  1)
124 #define pin_D2  (GPIOD_BASE |  2)
125 #define pin_D3  (GPIOD_BASE |  3)
126 #define pin_D4  (GPIOD_BASE |  4)
127 #define pin_D5  (GPIOD_BASE |  5)
128 #define pin_D6  (GPIOD_BASE |  6)
129 #define pin_D7  (GPIOD_BASE |  7)
130 #define pin_D8  (GPIOD_BASE |  8)
131 #define pin_D9  (GPIOD_BASE |  9)
132 #define pin_D10 (GPIOD_BASE | 10)
133 #define pin_D11 (GPIOD_BASE | 11)
134 #define pin_D12 (GPIOD_BASE | 12)
135 #define pin_D13 (GPIOD_BASE | 13)
136 #define pin_D14 (GPIOD_BASE | 14)
137 #define pin_D15 (GPIOD_BASE | 15)
138 
139 #define pin_E0  (GPIOE_BASE |  0)
140 #define pin_E1  (GPIOE_BASE |  1)
141 #define pin_E2  (GPIOE_BASE |  2)
142 #define pin_E3  (GPIOE_BASE |  3)
143 #define pin_E4  (GPIOE_BASE |  4)
144 #define pin_E5  (GPIOE_BASE |  5)
145 #define pin_E6  (GPIOE_BASE |  6)
146 #define pin_E7  (GPIOE_BASE |  7)
147 #define pin_E8  (GPIOE_BASE |  8)
148 #define pin_E9  (GPIOE_BASE |  9)
149 #define pin_E10 (GPIOE_BASE | 10)
150 #define pin_E11 (GPIOE_BASE | 11)
151 #define pin_E12 (GPIOE_BASE | 12)
152 #define pin_E13 (GPIOE_BASE | 13)
153 #define pin_E14 (GPIOE_BASE | 14)
154 #define pin_E15 (GPIOE_BASE | 15)
155 
156 #define pin_F0  (GPIOF_BASE |  0)
157 #define pin_F1  (GPIOF_BASE |  1)
158 #define pin_F2  (GPIOF_BASE |  2)
159 #define pin_F3  (GPIOF_BASE |  3)
160 #define pin_F4  (GPIOF_BASE |  4)
161 #define pin_F5  (GPIOF_BASE |  5)
162 #define pin_F6  (GPIOF_BASE |  6)
163 #define pin_F7  (GPIOF_BASE |  7)
164 #define pin_F8  (GPIOF_BASE |  8)
165 #define pin_F9  (GPIOF_BASE |  9)
166 #define pin_F10 (GPIOF_BASE | 10)
167 #define pin_F11 (GPIOF_BASE | 11)
168 #define pin_F12 (GPIOF_BASE | 12)
169 #define pin_F13 (GPIOF_BASE | 13)
170 #define pin_F14 (GPIOF_BASE | 14)
171 #define pin_F15 (GPIOF_BASE | 15)
172 
173 #define pin_G0  (GPIOG_BASE |  0)
174 #define pin_G1  (GPIOG_BASE |  1)
175 #define pin_G2  (GPIOG_BASE |  2)
176 #define pin_G3  (GPIOG_BASE |  3)
177 #define pin_G4  (GPIOG_BASE |  4)
178 #define pin_G5  (GPIOG_BASE |  5)
179 #define pin_G6  (GPIOG_BASE |  6)
180 #define pin_G7  (GPIOG_BASE |  7)
181 #define pin_G8  (GPIOG_BASE |  8)
182 #define pin_G9  (GPIOG_BASE |  9)
183 #define pin_G10 (GPIOG_BASE | 10)
184 #define pin_G11 (GPIOG_BASE | 11)
185 #define pin_G12 (GPIOG_BASE | 12)
186 #define pin_G13 (GPIOG_BASE | 13)
187 #define pin_G14 (GPIOG_BASE | 14)
188 #define pin_G15 (GPIOG_BASE | 15)
189 
190 #define pin_H0  (GPIOH_BASE |  0)
191 #define pin_H1  (GPIOH_BASE |  1)
192 #define pin_H2  (GPIOH_BASE |  2)
193 #define pin_H3  (GPIOH_BASE |  3)
194 #define pin_H4  (GPIOH_BASE |  4)
195 #define pin_H5  (GPIOH_BASE |  5)
196 #define pin_H6  (GPIOH_BASE |  6)
197 #define pin_H7  (GPIOH_BASE |  7)
198 #define pin_H8  (GPIOH_BASE |  8)
199 #define pin_H9  (GPIOH_BASE |  9)
200 #define pin_H10 (GPIOH_BASE | 10)
201 #define pin_H11 (GPIOH_BASE | 11)
202 #define pin_H12 (GPIOH_BASE | 12)
203 #define pin_H13 (GPIOH_BASE | 13)
204 #define pin_H14 (GPIOH_BASE | 14)
205 #define pin_H15 (GPIOH_BASE | 15)
206 
207 #define pin_I0  (GPIOI_BASE |  0)
208 #define pin_I1  (GPIOI_BASE |  1)
209 #define pin_I2  (GPIOI_BASE |  2)
210 #define pin_I3  (GPIOI_BASE |  3)
211 #define pin_I4  (GPIOI_BASE |  4)
212 #define pin_I5  (GPIOI_BASE |  5)
213 #define pin_I6  (GPIOI_BASE |  6)
214 #define pin_I7  (GPIOI_BASE |  7)
215 #define pin_I8  (GPIOI_BASE |  8)
216 #define pin_I9  (GPIOI_BASE |  9)
217 #define pin_I10 (GPIOI_BASE | 10)
218 #define pin_I11 (GPIOI_BASE | 11)
219 #define pin_I12 (GPIOI_BASE | 12)
220 #define pin_I13 (GPIOI_BASE | 13)
221 #define pin_I14 (GPIOI_BASE | 14)
222 #define pin_I15 (GPIOI_BASE | 15)
223 
224 #define pin_J0  (GPIOJ_BASE |  0)
225 #define pin_J1  (GPIOJ_BASE |  1)
226 #define pin_J2  (GPIOJ_BASE |  2)
227 #define pin_J3  (GPIOJ_BASE |  3)
228 #define pin_J4  (GPIOJ_BASE |  4)
229 #define pin_J5  (GPIOJ_BASE |  5)
230 #define pin_J6  (GPIOJ_BASE |  6)
231 #define pin_J7  (GPIOJ_BASE |  7)
232 #define pin_J8  (GPIOJ_BASE |  8)
233 #define pin_J9  (GPIOJ_BASE |  9)
234 #define pin_J10 (GPIOJ_BASE | 10)
235 #define pin_J11 (GPIOJ_BASE | 11)
236 #define pin_J12 (GPIOJ_BASE | 12)
237 #define pin_J13 (GPIOJ_BASE | 13)
238 #define pin_J14 (GPIOJ_BASE | 14)
239 #define pin_J15 (GPIOJ_BASE | 15)
240