1.1. GPIO

gpio接口类型:基本功能,外部io中断功能,crossbar功能,复用功能,io占用打印。

1.1.1. GPIO 基本功能

配置io输入,输出,高阻,强驱。gpio基本功能接口支持同组单个或多个任意io(1~16个)操作。传入0个io会触发断言提醒。

#define GPIO_PIN_0                 ((uint16_t)0x0001)  /* Pin 0 selected    */
#define GPIO_PIN_1                 ((uint16_t)0x0002)  /* Pin 1 selected    */
#define GPIO_PIN_2                 ((uint16_t)0x0004)  /* Pin 2 selected    */
#define GPIO_PIN_3                 ((uint16_t)0x0008)  /* Pin 3 selected    */
#define GPIO_PIN_4                 ((uint16_t)0x0010)  /* Pin 4 selected    */
#define GPIO_PIN_5                 ((uint16_t)0x0020)  /* Pin 5 selected    */
#define GPIO_PIN_6                 ((uint16_t)0x0040)  /* Pin 6 selected    */
#define GPIO_PIN_7                 ((uint16_t)0x0080)  /* Pin 7 selected    */
#define GPIO_PIN_8                 ((uint16_t)0x0100)  /* Pin 8 selected    */
#define GPIO_PIN_9                 ((uint16_t)0x0200)  /* Pin 9 selected    */
#define GPIO_PIN_10                ((uint16_t)0x0400)  /* Pin 10 selected   */
#define GPIO_PIN_11                ((uint16_t)0x0800)  /* Pin 11 selected   */
#define GPIO_PIN_12                ((uint16_t)0x1000)  /* Pin 12 selected   */
#define GPIO_PIN_13                ((uint16_t)0x2000)  /* Pin 13 selected   */
#define GPIO_PIN_14                ((uint16_t)0x4000)  /* Pin 14 selected   */
#define GPIO_PIN_15                ((uint16_t)0x8000)  /* Pin 15 selected   */
#define GPIO_PIN_All               ((uint16_t)0xFFFF)  /* All pins selected */

#define GPIO_PIN_MASK              (0x0000FFFFu) /* PIN mask for assert test */
#include "asm/gpio_hw.h"

1.1.1.1. gpio_init

初始化gpio,配置同组多个io为同一种模式,支持同组单个io,或者最多16个io同时操作。

原型:

int gpio_init(enum gpio_port port, const struct gpio_config *config);
参数:

port

io端口号,详见枚举enum gpio_port

config

io配置信息

返回值

暂未使用

示例:

struct gpio_config gpio_config_test = {
    .pin = PORT_PIN_0 | PORT_PIN_1 | PORT_PIN_2 | PORT_PIN_3,//多个IO一起初始化
    .mode = PORT_OUTPUT_LOW,//PORT_INPUT_PULLUP_10K,
    .hd = PORT_DRIVE_STRENGT_2p4mA,
};
//配置PB0/PB1/PB2/PB3输出模式并输出0
gpio_init(PORTB, &gpio_config_test);

1.1.1.2. gpio_deinit

释放gpio,配置多io为弱驱高阻态,支持同组最多16个,或者单个io操作。

原型:

int gpio_deinit(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

返回值

暂未使用

示例:

//恢复PA3/PA10为高阻态
gpio_deinit(PORTA, PORT_PIN_3 | PORT_PIN_10);

1.1.1.3. gpio_set_mode

初始化gpio,配置同组多个io为同一种模式,支持同组最多16个,或者单个io操作。与gpio_init相比少了io强驱模式配置。

原型:

int gpio_set_mode(enum gpio_port port, u32 pin, enum gpio_mode mode);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

mode

io模式,如PORT_INPUT_PULLUP_10K,详见枚举enum gpio_mode

返回值

0:成功,<0:失败

示例:

int ret = gpio_set_mode(PORTB, PORT_PIN_1, PORT_OUTPUT_LOW);
if (ret < 0) {
    printf("gpio init error");
}else{
    printf("gpio init succ");
}

1.1.1.4. gpio_get_mode

该函数体未实现。

原型:

enum gpio_mode gpio_get_mode(enum gpio_port port, u32 pin);

1.1.1.5. gpio_read

gpio输入模式下,读取io状态,兼容旧接口,只获取单个io状态。

原型:

int gpio_read(u32 gpio);// 读取单个io输入值. gpio:IO_PORTA_00
参数:

gpio

具体某个io,如:IO_PORTA_00

返回值

0:io输入低;1:io输入高;<0:错误

1.1.1.6. gpio_read_port

gpio输入模式下,读取io状态,支持获取同组最多16个,或者单个io状态。

原型:

//读取同组多个io值. 形参详见枚举; pin:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等
int gpio_read_port(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

返回值

<0:失败;>=0:成功,低16个bit表示每个io状态(pin对应的bit有效)

1.1.1.7. gpio_write

gpio输出模式下,设置io输出状态,兼容旧接口,只配置单个io状态。

原型:

// 设置单个io输出电平(需先配置为输出). gpio:IO_PORTA_00; value:0:out 0, 1:out 1
int gpio_write(u32 gpio, u32 value);
参数:

gpio

具体某个io,如:IO_PORTA_00

value

1:输出高;0:输出低

返回值

无效

1.1.1.8. gpio_write_port

gpio输出模式下,设置io输出状态,支持配置同组最多16个,或者单个io状态。

原型:

// 设置同组多个io输出电平(需先配置为输出).
int gpio_write_port(enum gpio_port port, u32 pin, int out_state);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

out_state

1:输出高;0:输出低

返回值

无效

1.1.1.9. gpio_toggle_port

gpio输出模式下,翻转io输出状态,支持配置同组最多16个,或者单个io。

原型:

//需先配置为输出
int gpio_toggle_port(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

返回值

<0:错误;0:成功

1.1.1.10. gpio_get_out_level

gpio任意模式下,获取io输出寄存器的状态,支持配置同组最多16个,或者单个io。

原型:

int gpio_get_out_level(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

返回值

<0:错误;>=0:成功,低16个bit表示每个io状态(pin对应的bit有效)

1.1.1.11. gpio_set_drive_strength

配置io输出驱动等级,支持配置同组最多16个,或者单个io。

原型:

int gpio_set_drive_strength(enum gpio_port port, u32 pin, enum gpio_drive_strength drive);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

drive

驱动级别。详见枚举enum gpio_drive_strength

返回值

无效

1.1.1.12. gpio_get_drive_strength

获取gpio输出强度等级,只支持单个io。

原型:

// 获取单个io输出强度 pin:只能带入1个io
enum gpio_drive_strength  gpio_get_drive_strength(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 ,只支持单个io。

返回值

驱动级别。详见枚举enum gpio_drive_strength

1.1.1.13. gpio_hw_op_dir

1.1.1.14. gpio_hw_op_out

配置同组多个io为不同的状态。配置模式包括:赋值,与,或,异或。与以上接口区别:上面接口配置多io为同一状态;该接口配置多io为不同状态。

- gpio_hw_op_dir :配置输入输出
- gpio_hw_op_out :配置输出值
- gpio_hw_op_die :配置die
- gpio_hw_op_dieh:配置dieh
- gpio_hw_op_pu0 :配置上拉
- gpio_hw_op_pu1 :配置上拉
- gpio_hw_op_pd0 :配置下拉
- gpio_hw_op_pd1 :配置下拉

原型:

int gpio_hw_op_dir(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_out(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_die(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_dieh(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pu0(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pu1(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pd0(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
int gpio_hw_op_pd1(const enum gpio_port port, u32 pin, u32 value, const enum port_op_mode op);
参数:

port

io端口号,详见枚举enum gpio_port:PORTA,PORTB

pin

具体的io序号,如:PORT_PIN_0 | PORT_PIN_3等,支持单个io或多个io。

value

要配置的值,每个io可以配置不同的状态(pin对应的bit有效,其他bit无效)

op

操作模式。详见枚举enum port_op_mode :PORT_SET,PORT_AND,,,

返回值

<0 :error ;other:ok

1.1.2. GPIO 中断功能

配置io外部中断功能。支持单边沿,部分支持双边沿。io中断的数量及单双边沿情况请参阅对应Soc规格书。所有io共用同一个中断号。io中断驱动会根据边沿配置为上拉10K或下拉10K。

外部io中断没有滤波功能。

1.1.2.1. gpio_irq_config

初始化gpio中断功能,或关闭中断功能。内部会根据触发边沿配置好上下拉,支持同组最多16个,或者单个io操作。不同芯片中断io及数目不同,请参阅对应Soc规格书。

原型:

//默认使能中断
//禁止同一个io同一边沿多次注册
//单边沿与双边沿切换: 请先注销(irq_edge设为PORT_IRQ_DISABLE)再注册
int gpio_irq_config(enum gpio_port port, const struct gpio_irq_config_st *config);
参数:

port

io端口号,详见枚举enum gpio_port

config

io中断配置信息

返回值

暂未使用

示例:

void gpio_irq_callback_p_test1(enum gpio_port port, u32 pin, enum gpio_irq_edge edge)
{
    printf("port%d.%d:%d-cb1\n", port, pin, edge);
}
struct gpio_irq_config_st gpio_irq_config_test = {
    .pin = PORT_PIN_0 | PORT_PIN_2,//配置为相同状态
    .irq_edge = PORT_IRQ_EDGE_FALL,//PORT_IRQ_ANYEDGE双边沿//PORT_IRQ_DISABLE关闭注销
    .callback = gpio_irq_callback_p_test1,
};
gpio_irq_config(PORTA, &gpio_irq_config_test);

1.1.2.2. gpio_irq_set_callback

设置或修改io中断回调函数,可以设置为NULL,支持同组最多16个,或者单个io操作。

原型:

int gpio_irq_set_callback(enum gpio_port port, u32 pin, gpio_irq_callback_p callback);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

callback

回调函数指针,可以为NULL

返回值

暂未使用

1.1.2.3. gpio_irq_set_edge

修改io中断触发沿,只有注册单边沿触发才能调用该函数切换边沿,支持同组最多16个,或者单个io操作。单边沿与双边沿切换: 请先注销再注册

原型:

//只有注册单边沿触发才能调用该函数切换边沿
//单边沿与双边沿切换: 请先注销再注册
int gpio_irq_set_edge(enum gpio_port port, u32 pin, enum gpio_irq_edge irq_edge);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

irq_edge

触发边沿,详见枚举enum gpio_irq_edge

返回值

暂未使用

1.1.2.4. gpio_irq_get_edge

获取io中断触发沿,只支持单个io操作。

原型:

//  获取单个io触发边沿 pin:只能带入1个io
enum gpio_irq_edge gpio_irq_get_edge(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0

返回值

触发边沿,详见枚举enum gpio_irq_edge

1.1.2.5. gpio_irq_enable

已初始化,临时打开io中断,支持同组最多16个,或者单个io操作。

原型:

int gpio_irq_enable(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

返回值

暂未使用

1.1.2.6. gpio_irq_disable

已初始化,临时关闭io中断,支持同组最多16个,或者单个io操作。

原型:

int gpio_irq_disable(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 or PORT_PIN_0 | PORT_PIN_2等

返回值

暂未使用

1.1.3. GPIO crossbar功能配置

支持crossbar的功能可映射到任意io。具体功能详见枚举enum gpio_function。该类接口仅支持单个io,仅完成io映射,具体输入输出等功能另配。

1.1.3.1. gpio_set_function

将外设功能映射到io。只支持单个io操作。

原型:

// 配置单个io为特殊功能. pin:只能带入1个io
int gpio_set_function(enum gpio_port port, u32 pin, enum gpio_function fn);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 等

fn

外设功能,详见枚举:enum gpio_function

返回值

<0:错误;0:成功

示例:

int ret = gpio_set_function(PORTB, PORT_PIN_1, PORT_FUNC_UART0_TX);
if (ret < 0) {
    printf("gpio uart0 tx error");
}else{
    printf("gpio uart0 tx succ");
}

1.1.3.2. gpio_disable_function

将映射到io的外设功能注销,同时配置释放io,配置为高阻。只支持单个io操作。

原型:

// 注销单个io的特殊功能. pin:只能带入1个io
int gpio_disable_function(enum gpio_port port, u32 pin, enum gpio_function fn);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 等

fn

外设功能,详见枚举:enum gpio_function

返回值

<0:错误;0:成功

1.1.4. GPIO 复用功能配置

待开放。

1.1.4.1. gpio_request_function

注册io功能复用。只支持单个io操作。(暂未实现)

原型:

// io复用时,io资源申请
int gpio_request_function(enum gpio_port port, u32 pin, enum gpio_function fn, u32 timeout);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 等

fn

外设功能,详见枚举:enum gpio_function

timeout

获取io权限要等待的时间,单位:

返回值

<0:错误;0:成功

1.1.4.2. gpio_release_function

注销io功能复用。只支持单个io操作。(暂未实现)

原型:

// io复用时,io资源释放
int gpio_release_function(enum gpio_port port, u32 pin, enum gpio_function fn);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 等

fn

外设功能,详见枚举:enum gpio_function

返回值

<0:错误;0:成功

1.1.5. GPIO io占用打印

打印所有io基本功能及crossbar功能使用情况。不支持的功能显示为—–,未配置的crossbar显示dis。输入通道ich有默认值,可能出现单个io输入到多个内部外设。

1.1.5.1. gpio_dump

打印芯片全部gpio寄存器,crossbar信息

原型:

//打印芯片全部gpio寄存器,crossbar信息
void gpio_dump();
参数:

返回值

1.1.5.2. gpio_appoint_dump

打印同组单个或多个指定io寄存器,和crossbar信息。

原型:

//打印芯片指定io寄存器,crossbar信息
void gpio_appoint_dump(enum gpio_port port, u32 pin);
参数:

port

io端口号,详见枚举enum gpio_port

pin

具体的io序号,如:PORT_PIN_0 等(未指定的pin bit打印0)

返回值