173 lines
6.7 KiB
C
173 lines
6.7 KiB
C
#ifndef _GPIO_H
|
|
#define _GPIO_H
|
|
|
|
#define IO_PORT_SPILT(io) ((u32)(io)) / 16, BIT(((u32)(io)) %16)
|
|
|
|
|
|
// PORT引脚输入输出模式
|
|
enum gpio_mode {
|
|
PORT_OUTPUT_LOW = 0,
|
|
PORT_OUTPUT_HIGH = 1,
|
|
PORT_HIGHZ = 2, //高阻模式
|
|
|
|
PORT_INPUT_FLOATING = 0x10, //浮空输入
|
|
PORT_INPUT_PULLUP_10K = 0x11,
|
|
PORT_INPUT_PULLUP_100K,
|
|
PORT_INPUT_PULLUP_1M,
|
|
|
|
PORT_INPUT_PULLDOWN_10K = 0x21,
|
|
PORT_INPUT_PULLDOWN_100K,
|
|
PORT_INPUT_PULLDOWN_1M,
|
|
|
|
PORT_KEEP_STATE = 0x30,
|
|
};
|
|
|
|
enum gpio_drive_strength {
|
|
PORT_DRIVE_STRENGT_2p4mA, ///< 最大驱动电流 2.4mA
|
|
PORT_DRIVE_STRENGT_8p0mA, ///< 最大驱动电流 8.0mA
|
|
PORT_DRIVE_STRENGT_24p0mA, ///< 最大驱动电流 24.0mA
|
|
PORT_DRIVE_STRENGT_64p0mA, ///< 最大驱动电流 64.0mA
|
|
};
|
|
|
|
enum gpio_pullup_mode {
|
|
GPIO_PULLUP_DISABLE,
|
|
GPIO_PULLUP_10K,
|
|
GPIO_PULLUP_100K,
|
|
GPIO_PULLUP_1M,
|
|
};
|
|
enum gpio_pulldown_mode {
|
|
GPIO_PULLDOWN_DISABLE,
|
|
GPIO_PULLDOWN_10K,
|
|
GPIO_PULLDOWN_100K,
|
|
GPIO_PULLDOWN_1M,
|
|
};
|
|
|
|
|
|
#define PORT_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */
|
|
#define PORT_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
|
|
#define PORT_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
|
|
#define PORT_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */
|
|
#define PORT_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
|
|
#define PORT_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
|
|
#define PORT_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
|
|
#define PORT_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
|
|
#define PORT_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
|
|
#define PORT_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
|
|
#define PORT_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
|
|
#define PORT_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
|
|
#define PORT_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
|
|
#define PORT_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
|
|
#define PORT_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
|
|
#define PORT_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
|
|
#define PORT_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
|
|
|
|
#define PORT_PIN_MASK (0x0000FFFFu) /* PIN mask for assert test */
|
|
|
|
#include "asm/gpio_hw.h"
|
|
|
|
struct gpio_config {
|
|
u32 pin;
|
|
enum gpio_mode mode;
|
|
enum gpio_drive_strength hd;
|
|
};
|
|
//配置同组多个io模式及强驱. 形参详见枚举; pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
|
|
int gpio_init(enum gpio_port port, const struct gpio_config *config);
|
|
//恢复同组多个io为高阻态. 形参详见枚举; pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
|
|
int gpio_deinit(enum gpio_port port, u32 pin);
|
|
//配置同组多个io模式. 形参详见枚举; pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
|
|
//return:<0:error
|
|
int gpio_set_mode(enum gpio_port port, u32 pin, enum gpio_mode mode);
|
|
int gpio_keep_mode_at_sleep(enum gpio_port port, u32 pin);
|
|
enum gpio_mode gpio_get_mode(enum gpio_port port, u32 pin);
|
|
|
|
// 读取单个io输入值. gpio:IO_PORTA_00
|
|
int gpio_read(u32 gpio);
|
|
//读取同组多个io值. 形参详见枚举; pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
|
|
int gpio_read_port(enum gpio_port port, u32 pin);
|
|
|
|
// 设置单个io输出电平(需先配置为输出). gpio:IO_PORTA_00; value:0:out 0, 1:out 1
|
|
int gpio_write(u32 gpio, u32 value);
|
|
// 设置同组多个io输出电平(需先配置为输出).
|
|
// pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
|
|
// out_state:0:out 0, 1:out 1
|
|
int gpio_write_port(enum gpio_port port, u32 pin, int out_state);
|
|
|
|
//翻转同组多个io输出电平(需先配置为输出). pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
|
|
//return:<0:error
|
|
int gpio_toggle_port(enum gpio_port port, u32 pin);
|
|
|
|
// 获取同组多个io输出电平
|
|
int gpio_get_out_level(enum gpio_port port, u32 pin);
|
|
|
|
// 设置同组多个io强驱
|
|
int gpio_set_drive_strength(enum gpio_port port, u32 pin, enum gpio_drive_strength drive);
|
|
|
|
// 获取单个io输出强度 pin:只能带入1个io
|
|
enum gpio_drive_strength gpio_get_drive_strength(enum gpio_port port, u32 pin);
|
|
|
|
//打印芯片全部gpio寄存器,crossbar信息
|
|
void gpio_dump();
|
|
//打印芯片指定io寄存器,crossbar信息
|
|
void gpio_appoint_dump(enum gpio_port port, u32 pin);
|
|
|
|
|
|
// ----------------------------------------
|
|
// PORT中断
|
|
enum gpio_irq_edge {
|
|
PORT_IRQ_DISABLE = 0, ///< Disable PORT interrupt
|
|
PORT_IRQ_EDGE_RISE = 1, ///< PORT interrupt type : rising edge
|
|
PORT_IRQ_EDGE_FALL = 2, ///< PORT interrupt type : falling edge
|
|
PORT_IRQ_ANYEDGE = 3, ///< PORT interrupt type : both rising and falling edge
|
|
};
|
|
typedef void (*gpio_irq_callback_p)(enum gpio_port port, u32 pin, enum gpio_irq_edge edge);
|
|
struct gpio_irq_config_st {
|
|
u32 pin;
|
|
enum gpio_irq_edge irq_edge;
|
|
gpio_irq_callback_p callback;
|
|
u8 irq_priority;//中断优先级
|
|
};
|
|
//配置中断(已使能)
|
|
//禁止同一个io同一边沿多次注册
|
|
//单边沿与双边沿切换: 请先注销(PORT_IRQ_DISABLE)再注册
|
|
int gpio_irq_config(enum gpio_port port, const struct gpio_irq_config_st *config);//pa,pb,pc,pp0,usb
|
|
//注销io中断接口
|
|
int gpio_irq_deinit(enum gpio_port port, u32 pin);
|
|
//修改中断回调函数
|
|
int gpio_irq_set_callback(enum gpio_port port, u32 pin, gpio_irq_callback_p callback);
|
|
//快速切换使能同组多个io中断响应
|
|
int gpio_irq_enable(enum gpio_port port, u32 pin);
|
|
//快速切换暂停同组多个io中断响应
|
|
int gpio_irq_disable(enum gpio_port port, u32 pin);
|
|
|
|
//只有注册单边沿触发才能调用该函数切换边沿
|
|
//单边沿与双边沿切换: 请先注销再注册
|
|
int gpio_irq_set_edge(enum gpio_port port, u32 pin, enum gpio_irq_edge irq_edge);
|
|
// 获取单个io触发边沿 pin:只能带入1个io
|
|
enum gpio_irq_edge gpio_irq_get_edge(enum gpio_port port, u32 pin);
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------
|
|
// PORT 功能配置
|
|
// 配置单个io为特殊功能. pin:只能带入1个io
|
|
//return:<0:error
|
|
int gpio_set_function(enum gpio_port port, u32 pin, enum gpio_function fn);
|
|
// 注销单个io的特殊功能. pin:只能带入1个io
|
|
//return:<0:error
|
|
int gpio_disable_function(enum gpio_port port, u32 pin, enum gpio_function fn);
|
|
/* 示例:
|
|
gpio_set_function(PORTA, PORT_PIN_0, PORT_FUNC_UART0_TX);
|
|
gpio_set_function(PORTA, PORT_PIN_1, PORT_FUNC_UART0_RX);
|
|
gpio_set_function(PORTA, PORT_PIN_2, PORT_FUNC_UART0_CTS);
|
|
gpio_set_function(PORTA, PORT_PIN_3, PORT_FUNC_UART0_RTS);
|
|
*/
|
|
|
|
// io复用时,io资源申请
|
|
int gpio_request_function(enum gpio_port port, u32 pin, enum gpio_function fn, u32 timeout);
|
|
// io复用时,io资源释放
|
|
int gpio_release_function(enum gpio_port port, u32 pin, enum gpio_function fn);
|
|
|
|
#endif
|
|
|