diff --git a/arch/arm/src/rp2040/rp2040_gpio.c b/arch/arm/src/rp2040/rp2040_gpio.c index a2aacbb6df3..5f39cc2ae4e 100644 --- a/arch/arm/src/rp2040/rp2040_gpio.c +++ b/arch/arm/src/rp2040/rp2040_gpio.c @@ -35,13 +35,8 @@ #include "arm_arch.h" #include "chip.h" - #include "rp2040_gpio.h" -#include "hardware/rp2040_pads_bank0.h" -#include "hardware/rp2040_io_bank0.h" -#include "hardware/rp2040_sio.h" - /**************************************************************************** * Private Functions ****************************************************************************/ @@ -67,3 +62,10 @@ void rp2040_gpio_set_pulls(uint32_t gpio, int up, int down) RP2040_PADS_BANK0_GPIO_PUE | RP2040_PADS_BANK0_GPIO_PDE, RP2040_PADS_BANK0_GPIO(gpio)); } + +void rp2040_gpio_init(uint32_t gpio) +{ + rp2040_gpio_setdir(gpio, false); + rp2040_gpio_put(gpio, false); + rp2040_gpio_set_function(gpio, RP2040_GPIO_FUNC_SIO); +} diff --git a/arch/arm/src/rp2040/rp2040_gpio.h b/arch/arm/src/rp2040/rp2040_gpio.h index 18dc3de4b0b..afcde83a154 100644 --- a/arch/arm/src/rp2040/rp2040_gpio.h +++ b/arch/arm/src/rp2040/rp2040_gpio.h @@ -27,10 +27,26 @@ #include +#include "hardware/rp2040_sio.h" +#include "hardware/rp2040_io_bank0.h" +#include "hardware/rp2040_pads_bank0.h" + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ +#define RP2040_GPIO_FUNC_JTAG RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_JTAG +#define RP2040_GPIO_FUNC_SPI RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_SPI +#define RP2040_GPIO_FUNC_UART RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_UART +#define RP2040_GPIO_FUNC_I2C RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_I2C +#define RP2040_GPIO_FUNC_PWM RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_PWM +#define RP2040_GPIO_FUNC_SIO RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_SIO +#define RP2040_GPIO_FUNC_PIO0 RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_PIO0 +#define RP2040_GPIO_FUNC_PIO1 RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_PIO1 +#define RP2040_GPIO_FUNC_CLOCKS RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_CLOCKS +#define RP2040_GPIO_FUNC_USB RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_USB +#define RP2040_GPIO_FUNC_NULL RP2040_IO_BANK0_GPIO_CTRL_FUNCSEL_NULL + /**************************************************************************** * Public Types ****************************************************************************/ @@ -50,12 +66,52 @@ extern "C" #define EXTERN extern #endif +/**************************************************************************** + * Inline Functions + ****************************************************************************/ + +static inline void rp2040_gpio_put(uint32_t gpio, int set) +{ + uint32_t value = 1 << gpio; + + if (set) + { + putreg32(value, RP2040_SIO_GPIO_OUT_SET); + } + else + { + putreg32(value, RP2040_SIO_GPIO_OUT_CLR); + } +} + +static inline bool rp2040_gpio_get(uint32_t gpio) +{ + uint32_t value = 1 << gpio; + + return (getreg32(RP2040_SIO_GPIO_IN) & value) != 0; +} + +static inline void rp2040_gpio_setdir(uint32_t gpio, int out) +{ + uint32_t value = 1 << gpio; + + if (out) + { + putreg32(value, RP2040_SIO_GPIO_OE_SET); + } + else + { + putreg32(value, RP2040_SIO_GPIO_OE_CLR); + } +} + /**************************************************************************** * Public Function Prototypes ****************************************************************************/ void rp2040_gpio_set_function(uint32_t gpio, uint32_t func); void rp2040_gpio_set_pulls(uint32_t gpio, int up, int down); +void rp2040_gpio_init(uint32_t gpio); #undef EXTERN #if defined(__cplusplus)