36#define HAL_GPIO_PORTA 0
37#define HAL_GPIO_PORTB 1
38#define HAL_GPIO_PORTC 2
40#define HAL_GPIO_PMUX_A 0
41#define HAL_GPIO_PMUX_B 1
42#define HAL_GPIO_PMUX_C 2
43#define HAL_GPIO_PMUX_D 3
44#define HAL_GPIO_PMUX_E 4
45#define HAL_GPIO_PMUX_F 5
46#define HAL_GPIO_PMUX_G 6
47#define HAL_GPIO_PMUX_H 7
48#define HAL_GPIO_PMUX_I 8
49#define HAL_GPIO_PMUX_J 9
50#define HAL_GPIO_PMUX_K 10
51#define HAL_GPIO_PMUX_L 11
52#define HAL_GPIO_PMUX_M 12
53#define HAL_GPIO_PMUX_N 13
57extern bool pin_levels[3][32];
59#define HAL_GPIO_PIN(name, port, pin) \
60 static inline void HAL_GPIO_##name##_set(void) \
62 pin_levels[HAL_GPIO_PORT##port][pin] = true; \
63 (void)HAL_GPIO_##name##_set; \
66 static inline void HAL_GPIO_##name##_clr(void) \
68 pin_levels[HAL_GPIO_PORT##port][pin] = false; \
69 (void)HAL_GPIO_##name##_clr; \
72 static inline void HAL_GPIO_##name##_toggle(void) \
74 pin_levels[HAL_GPIO_PORT##port][pin] = !pin_levels[HAL_GPIO_PORT##port][pin]; \
75 (void)HAL_GPIO_##name##_toggle; \
78 static inline void HAL_GPIO_##name##_write(int value) \
80 pin_levels[HAL_GPIO_PORT##port][pin] = !!value; \
81 (void)HAL_GPIO_##name##_write; \
84 static inline void HAL_GPIO_##name##_drvstr(int value) \
86 (void)HAL_GPIO_##name##_write; \
89 static inline void HAL_GPIO_##name##_in(void) \
91 (void)HAL_GPIO_##name##_in; \
94 static inline void HAL_GPIO_##name##_out(void) \
96 (void)HAL_GPIO_##name##_out; \
99 static inline void HAL_GPIO_##name##_off(void) \
101 (void)HAL_GPIO_##name##_off; \
104 static inline void HAL_GPIO_##name##_pullup(void) \
106 (void)HAL_GPIO_##name##_pullup; \
109 static inline void HAL_GPIO_##name##_pulldown(void) \
111 (void)HAL_GPIO_##name##_pulldown; \
114 static inline int HAL_GPIO_##name##_read(void) \
116 return pin_levels[HAL_GPIO_PORT##port][pin]; \
117 (void)HAL_GPIO_##name##_read; \
120 static inline int HAL_GPIO_##name##_state(void) \
123 (void)HAL_GPIO_##name##_state; \
126 static inline void HAL_GPIO_##name##_pmuxen(int mux) \
128 (void)HAL_GPIO_##name##_pmuxen; \
131 static inline void HAL_GPIO_##name##_pmuxdis(void) \
133 (void)HAL_GPIO_##name##_pmuxdis; \
136 static inline uint8_t HAL_GPIO_##name##_pin(void) \
138 return ((HAL_GPIO_PORT##port << 5) | (pin & 0x1f)); \
139 (void)HAL_GPIO_##name##_pin; \
145#define HAL_GPIO_PIN(name, port, pin) \
146 static inline void HAL_GPIO_##name##_set(void) \
148 PORT->Group[HAL_GPIO_PORT##port].OUTSET.reg = (1 << pin); \
149 (void)HAL_GPIO_##name##_set; \
152 static inline void HAL_GPIO_##name##_clr(void) \
154 PORT->Group[HAL_GPIO_PORT##port].OUTCLR.reg = (1 << pin); \
155 (void)HAL_GPIO_##name##_clr; \
158 static inline void HAL_GPIO_##name##_toggle(void) \
160 PORT->Group[HAL_GPIO_PORT##port].OUTTGL.reg = (1 << pin); \
161 (void)HAL_GPIO_##name##_toggle; \
164 static inline void HAL_GPIO_##name##_write(int value) \
167 PORT->Group[HAL_GPIO_PORT##port].OUTSET.reg = (1 << pin); \
169 PORT->Group[HAL_GPIO_PORT##port].OUTCLR.reg = (1 << pin); \
170 (void)HAL_GPIO_##name##_write; \
173 static inline void HAL_GPIO_##name##_drvstr(int value) \
176 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg |= PORT_PINCFG_DRVSTR; \
178 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg &= ~PORT_PINCFG_DRVSTR; \
179 (void)HAL_GPIO_##name##_write; \
182 static inline void HAL_GPIO_##name##_in(void) \
184 PORT->Group[HAL_GPIO_PORT##port].DIRCLR.reg = (1 << pin); \
185 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg |= PORT_PINCFG_INEN; \
186 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg &= ~PORT_PINCFG_PULLEN; \
187 (void)HAL_GPIO_##name##_in; \
190 static inline void HAL_GPIO_##name##_out(void) \
192 PORT->Group[HAL_GPIO_PORT##port].DIRSET.reg = (1 << pin); \
193 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg |= PORT_PINCFG_INEN; \
194 (void)HAL_GPIO_##name##_out; \
197 static inline void HAL_GPIO_##name##_off(void) \
199 PORT->Group[HAL_GPIO_PORT##port].DIRCLR.reg = (1 << pin); \
200 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg &= ~(PORT_PINCFG_PULLEN | PORT_PINCFG_INEN); \
201 (void)HAL_GPIO_##name##_off; \
204 static inline void HAL_GPIO_##name##_pullup(void) \
206 PORT->Group[HAL_GPIO_PORT##port].OUTSET.reg = (1 << pin); \
207 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg |= PORT_PINCFG_PULLEN; \
208 (void)HAL_GPIO_##name##_pullup; \
211 static inline void HAL_GPIO_##name##_pulldown(void) \
213 PORT->Group[HAL_GPIO_PORT##port].OUTCLR.reg = (1 << pin); \
214 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg |= PORT_PINCFG_PULLEN; \
215 (void)HAL_GPIO_##name##_pulldown; \
218 static inline int HAL_GPIO_##name##_read(void) \
220 return (PORT->Group[HAL_GPIO_PORT##port].IN.reg & (1 << pin)) != 0; \
221 (void)HAL_GPIO_##name##_read; \
224 static inline int HAL_GPIO_##name##_state(void) \
226 return (PORT->Group[HAL_GPIO_PORT##port].DIR.reg & (1 << pin)) != 0; \
227 (void)HAL_GPIO_##name##_state; \
230 static inline void HAL_GPIO_##name##_pmuxen(int mux) \
232 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg |= PORT_PINCFG_PMUXEN; \
234 PORT->Group[HAL_GPIO_PORT##port].PMUX[pin>>1].bit.PMUXO = mux; \
236 PORT->Group[HAL_GPIO_PORT##port].PMUX[pin>>1].bit.PMUXE = mux; \
237 (void)HAL_GPIO_##name##_pmuxen; \
240 static inline void HAL_GPIO_##name##_pmuxdis(void) \
242 PORT->Group[HAL_GPIO_PORT##port].PINCFG[pin].reg &= ~PORT_PINCFG_PMUXEN; \
243 (void)HAL_GPIO_##name##_pmuxdis; \
246 static inline uint8_t HAL_GPIO_##name##_pin(void) \
248 return ((HAL_GPIO_PORT##port << 5) | (pin & 0x1f)); \
249 (void)HAL_GPIO_##name##_pin; \
255HAL_GPIO_PIN(SWCLK, A, 30)
256HAL_GPIO_PIN(SWDIO, A, 31)
258#ifdef APP_USES_TINYUSB
259HAL_GPIO_PIN(USB_N, A, 24)
260HAL_GPIO_PIN(USB_P, A, 25)