rp2040/driver/inc/gpio.h

134 lines
5.0 KiB
C

#ifndef __HARDWARE_GPIO_H__
#define __HARDWARE_GPIO_H__
#include "reg.h"
#include "gpio_reg.h"
#include "sio_reg.h"
#define GPIO_SIO_DIR_IN (0)
#define GPIO_SIO_DIR_OUT (1)
#define GPIO_FUNC_XIP (0) /* not available for GPIO0~29 */
#define GPIO_FUNC_SPI (1) /* only available for GPIO0~29 */
#define GPIO_FUNC_UART (2) /* only available for GPIO0~29 */
#define GPIO_FUNC_I2C (3) /* only available for GPIO0~29 */
#define GPIO_FUNC_PWM (4) /* only available for GPIO0~29 */
#define GPIO_FUNC_SIO (5) /* available for all GPIO */
#define GPIO_FUNC_PIO0 (6) /* only available for GPIO0~29 */
#define GPIO_FUNC_PIO1 (7) /* only available for GPIO0~29 */
#define GPIO_FUNC_CLOCK (8) /* only available for GPIO20~25 */
#define GPIO_FUNC_USB (9)
#define GPIO_FUNC_NULL (31)
#define GPIO_IRQ_NULL (0)
#define GPIO_IRQ_LEVEL_LOW (1)
#define GPIO_IRQ_LEVEL_HIGH (2)
#define GPIO_IRQ_EDGE_FALL (4)
#define GPIO_IRQ_EDGE_RISE (8)
#define GPIO_OVER_OUT_PERIPHERAL (0)
#define GPIO_OVER_OUT_PERIPHERAL_INVERSE (1)
#define GPIO_OVER_OUT_FORCE_LOW (2)
#define GPIO_OVER_OUT_FORCE_HIGH (3)
#define GPIO_OVER_OE_PERIPHERAL (0)
#define GPIO_OVER_OE_PERIPHERAL_INVERSE (1)
#define GPIO_OVER_OE_FORCE_DISABLE (2)
#define GPIO_OVER_OE_FORCE_ENABLE (3)
#define GPIO_OVER_IN_PERIPHERAL (0)
#define GPIO_OVER_IN_PERIPHERAL_INVERSE (1)
#define GPIO_OVER_IN_FORCE_LOW (2)
#define GPIO_OVER_IN_FORCE_HIGH (3)
#define GPIO_OVER_IRQ_NORMAL (0)
#define GPIO_OVER_IRQ_INVERSE (1)
#define GPIO_OVER_IRQ_FORCE_LOW (2)
#define GPIO_OVER_IRQ_FORCE_HIGH (3)
#define GPIO_PADS_VOLTAGE_3V3 (0)
#define GPIO_PADS_VOLTAGE_1V8 (1)
#define GPIO_PADS_DRIVE_STRENGTH_2MA (0)
#define GPIO_PADS_DRIVE_STRENGTH_4MA (1)
#define GPIO_PADS_DRIVE_STRENGTH_8MA (2)
#define GPIO_PADS_DRIVE_STRENGTH_12MA (3)
#define GPIO_PADS_SLEW_RATE_SLOW (0)
#define GPIO_PADS_SLEW_RATE_FAST (1)
struct gpio_cfg_s {
uint8_t pin;
uint8_t sio_dir; /* GPIO_SIO_DIR_XXX */
uint8_t funcsel; /* GPIO_FUNC_XXX */
uint8_t over_out; /* GPIO_OVER_OUT_XXX */
uint8_t over_oe; /* GPIO_OVER_OE_XXX */
uint8_t over_in; /* GPIO_OVER_IN_XXX */
uint8_t over_irq; /* GPIO_OVER_IRQ_XXX */
uint8_t slew_rate; /* slew rate control, slow or fast */
uint8_t schmitt; /* enable or disable schmitt */
uint8_t pull_down; /* enable or disable pull down */
uint8_t pull_up; /* enable or disable pull up */
uint8_t drive; /* drive strength */
uint8_t ie; /* enable or disable input */
uint8_t od; /* output disable, has priority over output enable from peripherals */
};
#ifdef __cplusplus
extern "C" {
#endif
uint8_t gpio_read(uint8_t pin);
void gpio_write(uint8_t pin, uint8_t value);
void gpio_set(uint8_t pin);
void gpio_clear(uint8_t pin);
void gpio_toggle(uint8_t pin);
void gpio_oe_write(uint8_t pin, uint8_t value);
void gpio_oe_set(uint8_t pin);
void gpio_oe_clear(uint8_t pin);
void gpio_oe_toggle(uint8_t pin);
uint32_t gpio_read_multi(void);
void gpio_write_multi(uint32_t value);
void gpio_set_multi(uint32_t pins);
void gpio_clear_multi(uint32_t pins);
void gpio_toggle_multi(uint32_t pins);
void gpio_oe_write_multi(uint32_t value);
void gpio_oe_set_multi(uint32_t pins);
void gpio_oe_clear_multi(uint32_t pins);
void gpio_oe_toggle_multi(uint32_t pins);
uint32_t gpio_get_status(uint8_t pin, uint32_t status);
void gpio_func_sel(uint8_t pin, uint8_t func);
void gpio_over_out_set(uint8_t pin, uint8_t over);
void gpio_over_oe_set(uint8_t pin, uint8_t over);
void gpio_over_in_set(uint8_t pin, uint8_t over);
void gpio_over_irq_set(uint8_t pin, uint8_t over);
void gpio_init(struct gpio_cfg_s *cfg);
void gpio_init_simple(uint8_t pin, uint8_t func, uint8_t pulldown, uint8_t pullup);
uint8_t gpio_irq_get_raw_status(uint8_t pin, uint8_t irq);
void gpio_irq_raw_status_clear(uint8_t pin, uint8_t irq);
void gpio_irq_enable_proc0(uint8_t pin, uint8_t irq);
void gpio_irq_disable_proc0(uint8_t pin, uint8_t irq);
void gpio_irq_force_proc0(uint8_t pin, uint8_t irq);
void gpio_irq_deforce_proc0(uint8_t pin, uint8_t irq);
uint8_t gpio_irq_get_status_proc0(uint8_t pin, uint8_t irq);
void gpio_irq_enable_proc1(uint8_t pin, uint8_t irq);
void gpio_irq_disable_proc1(uint8_t pin, uint8_t irq);
void gpio_irq_force_proc1(uint8_t pin, uint8_t irq);
void gpio_irq_deforce_proc1(uint8_t pin, uint8_t irq);
uint8_t gpio_irq_get_status_proc1(uint8_t pin, uint8_t irq);
void gpio_irq_enable_dormant(uint8_t pin, uint8_t irq);
void gpio_irq_disable_dormant(uint8_t pin, uint8_t irq);
void gpio_irq_force_dormant(uint8_t pin, uint8_t irq);
void gpio_irq_deforce_dormant(uint8_t pin, uint8_t irq);
uint8_t gpio_irq_get_status_dormant(uint8_t pin, uint8_t irq);
#ifdef __cplusplus
}
#endif
#endif /* __HARDWARE_GPIO_H__ */