174 lines
3.9 KiB
C
174 lines
3.9 KiB
C
/**
|
|
* @file gpio.h
|
|
* @author HUGE-IC Application Team
|
|
* @brief GPIO HAL driver
|
|
* @version 1.0.0
|
|
* @date 2021-9-8
|
|
*
|
|
* @copyright Copyright (c) 2021 HUGE-IC
|
|
*/
|
|
#ifndef _HAL_GPIO_H_
|
|
#define _HAL_GPIO_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
/**
|
|
* @brief Enumeration constant for GPIO pin direction select
|
|
* @note : this enum must mapping to OS @PinDirection
|
|
*/
|
|
enum gpio_pin_direction {
|
|
/*! Set GPIO to input mode.
|
|
*/
|
|
GPIO_DIR_INPUT,
|
|
|
|
/*! Set GPIO to output mode.
|
|
*/
|
|
GPIO_DIR_OUTPUT,
|
|
};
|
|
|
|
/**
|
|
* @breif : enum of GPIO pin mode
|
|
* @note : this enum must mapping to OS @PinMode
|
|
*/
|
|
enum gpio_pin_mode {
|
|
/*! gpio mode : push-pull & pull none
|
|
*/
|
|
GPIO_PULL_NONE,
|
|
|
|
/*! gpio mode : push-pull & pull up
|
|
*/
|
|
GPIO_PULL_UP,
|
|
|
|
/*! gpio mode : push-pull & pull down
|
|
*/
|
|
GPIO_PULL_DOWN,
|
|
|
|
/*! gpio mode : open-drain & pull none
|
|
*/
|
|
GPIO_OPENDRAIN_PULL_NONE,
|
|
|
|
/*! gpio mode : open-drain & pull up
|
|
*/
|
|
GPIO_OPENDRAIN_PULL_UP,
|
|
|
|
/*! Set the GPIO drop open-drain mode to NO.
|
|
*/
|
|
GPIO_OPENDRAIN_DROP_NONE,
|
|
|
|
/*! Set the GPIO drop open-drain mode to down mode.
|
|
*/
|
|
GPIO_OPENDRAIN_DROP_DOWN,
|
|
|
|
};
|
|
|
|
/**
|
|
* @breif : Enumeration constant for GPIO pin interrupt event.
|
|
*/
|
|
enum gpio_irq_event {
|
|
/*! None interrupt event.
|
|
*/
|
|
GPIO_IRQ_EVENT_NONE,
|
|
|
|
/*! Rising interrupt event.
|
|
*/
|
|
GPIO_IRQ_EVENT_RISE,
|
|
|
|
/*! Falling interrupt event.
|
|
*/
|
|
GPIO_IRQ_EVENT_FALL,
|
|
|
|
/*! Rising and falling interrupt event.
|
|
*/
|
|
GPIO_IRQ_EVENT_ALL,
|
|
};
|
|
|
|
|
|
/**
|
|
* @breif : enum of io control cmd
|
|
*/
|
|
enum gpio_ioctl_cmd {
|
|
/*! switch GPIO input delay on or off
|
|
*/
|
|
GPIO_INPUT_DELAY_ON_OFF,
|
|
|
|
/*! Atomic operation in GPIO direction.
|
|
*/
|
|
GPIO_DIR_ATOMIC,
|
|
|
|
/*! Atomic operation in GPIO vaule.
|
|
*/
|
|
GPIO_VALUE_ATOMIC,
|
|
|
|
/*! LOCK GPIO config exclude I/O DAT register until MCU reset or peripheral reset.
|
|
*/
|
|
GPIO_LOCK,
|
|
|
|
/*! GPIO debunce
|
|
*/
|
|
GPIO_DEBUNCE,
|
|
|
|
/*! GPIO toggle, use for output data toggle
|
|
*/
|
|
GPIO_OUTPUT_TOGGLE,
|
|
|
|
/*! Set GPIO pin to general analog function
|
|
*/
|
|
GPIO_GENERAL_ANALOG,
|
|
|
|
/*! Set GPIO pin to analog function with disable AIOEN
|
|
*/
|
|
GPIO_AIODIS_ANALOG,
|
|
|
|
GPIO_CMD_SET_IEEN,
|
|
/*! Get IOMAP O_FUNC according to pin
|
|
*/
|
|
GPIO_GET_OUTMAP,
|
|
|
|
/*! Get IOMAP I_FUNC according to pin
|
|
*/
|
|
GPIO_GET_INMAP,
|
|
|
|
/* PARA1: enum smap_node
|
|
* PARA2: enum smap_output/smap_input
|
|
*/
|
|
GPIO_SET_SMAP,
|
|
/*! Get pin according to IOMAP O_FUNC
|
|
*/
|
|
GPIO_GET_OUTMAP_PIN,
|
|
};
|
|
|
|
|
|
typedef void (*gpio_irq_hdl)(int32 id, enum gpio_irq_event event, uint32 param1, uint32 param2);
|
|
|
|
struct gpio_device {
|
|
struct dev_obj dev;
|
|
};
|
|
|
|
struct gpio_hal_ops {
|
|
struct devobj_ops ops;
|
|
int32(*mode)(struct gpio_device *gpio, uint32 pin, enum gpio_pin_mode mode, enum gpio_pull_level level);
|
|
int32(*dir)(struct gpio_device *gpio, uint32 pin, enum gpio_pin_direction direction);
|
|
int32(*set)(struct gpio_device *gpio, uint32 pin, uint32 val);
|
|
int32(*get)(struct gpio_device *gpio, uint32 pin);
|
|
int32(*request_pin_irq)(struct gpio_device *gpio, uint32 pin, gpio_irq_hdl handler, uint32 data, enum gpio_irq_event evt);
|
|
int32(*release_pin_irq)(struct gpio_device *gpio, uint32 pin, enum gpio_irq_event evt);
|
|
int32(*ioctl)(struct gpio_device *gpio, uint32 pin, uint32 cmd, uint32 param1, uint32 param2);
|
|
};
|
|
|
|
int32 gpio_set_mode(uint32 pin, enum gpio_pin_mode mode, enum gpio_pull_level level);
|
|
int32 gpio_set_dir(uint32 pin, enum gpio_pin_direction direction);
|
|
int32 gpio_set_val(uint32 pin, uint32 value);
|
|
int32 gpio_get_val(uint32 pin);
|
|
int32 gpio_request_pin_irq(uint32 pin, gpio_irq_hdl handler, uint32 data, enum gpio_irq_event evt);
|
|
int32 gpio_release_pin_irq(uint32 pin, enum gpio_irq_event evt);
|
|
int32 gpio_ioctl(uint32 pin, uint32 cmd, uint32 param1, uint32 param2);
|
|
|
|
extern struct gpio_device *gpio_get(uint32 pin);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|
|
|