free-dap/platform/rp2040/hal_gpio.h
2022-01-04 19:28:52 -08:00

86 lines
3.1 KiB
C

// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) 2021, Alex Taradov <alex@taradov.com>. All rights reserved.
#ifndef _HAL_GPIO_H_
#define _HAL_GPIO_H_
/*- Definitions -------------------------------------------------------------*/
#define HAL_GPIO_PIN(name, port, pin, func) \
static inline void HAL_GPIO_##name##_set(void) \
{ \
SIO->GPIO_OUT_SET = (1 << pin); \
(void)HAL_GPIO_##name##_set; \
} \
\
static inline void HAL_GPIO_##name##_clr(void) \
{ \
SIO->GPIO_OUT_CLR = (1 << pin); \
(void)HAL_GPIO_##name##_clr; \
} \
\
static inline void HAL_GPIO_##name##_toggle(void) \
{ \
SIO->GPIO_OUT_XOR = (1 << pin); \
(void)HAL_GPIO_##name##_toggle; \
} \
\
static inline void HAL_GPIO_##name##_write(int value) \
{ \
if (value) \
SIO->GPIO_OUT_SET = (1 << pin); \
else \
SIO->GPIO_OUT_CLR = (1 << pin); \
(void)HAL_GPIO_##name##_write; \
} \
\
static inline void HAL_GPIO_##name##_in(void) \
{ \
SIO->GPIO_OE_CLR = (1 << pin); \
IO_BANK##port->GPIO##pin##_CTRL = IO_BANK##port##_GPIO##pin##_CTRL_FUNCSEL_sio_##pin; \
PADS_BANK##port##_CLR->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PDE_Msk | PADS_BANK##port##_GPIO##pin##_PUE_Msk; \
PADS_BANK##port##_SET->GPIO##pin = PADS_BANK##port##_GPIO##pin##_IE_Msk; \
(void)HAL_GPIO_##name##_in; \
} \
\
static inline void HAL_GPIO_##name##_out(void) \
{ \
SIO->GPIO_OE_SET = (1 << pin); \
IO_BANK##port->GPIO##pin##_CTRL = IO_BANK##port##_GPIO##pin##_CTRL_FUNCSEL_sio_##pin; \
(void)HAL_GPIO_##name##_out; \
} \
\
static inline void HAL_GPIO_##name##_init(void) \
{ \
IO_BANK##port->GPIO##pin##_CTRL = IO_BANK##port##_GPIO##pin##_CTRL_FUNCSEL_##func; \
(void)HAL_GPIO_##name##_init; \
} \
\
static inline void HAL_GPIO_##name##_pullup(void) \
{ \
PADS_BANK##port##_SET->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PUE_Msk; \
PADS_BANK##port##_CLR->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PDE_Msk; \
(void)HAL_GPIO_##name##_pullup; \
} \
\
static inline void HAL_GPIO_##name##_pulldown(void) \
{ \
PADS_BANK##port##_SET->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PDE_Msk; \
PADS_BANK##port##_CLR->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PUE_Msk; \
(void)HAL_GPIO_##name##_pulldown; \
} \
\
static inline int HAL_GPIO_##name##_read(void) \
{ \
return (SIO->GPIO_IN & (1 << pin)) != 0; \
(void)HAL_GPIO_##name##_read; \
} \
\
static inline void HAL_GPIO_##name##_funcsel(int fn) \
{ \
IO_BANK##port->GPIO##pin##_CTRL_b.FUNCSEL = fn; \
(void)HAL_GPIO_##name##_funcsel; \
} \
#endif // _HAL_GPIO_H_