Sigmastar_GPIO使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 08/27/2024 |
1. 概述¶
General Purpose Input Output (通用输入/输出)简称为GPIO。GPIO 采用标准的LINUX框架,能够使用统一的接口来操作gpio。

GPIO的框架如上图,中间层是 gpiolib,用于管理系统中的 GPIO。gpiolib 汇总了 GPIO 的通用操作,根据 GPIO 的特性,gpiolib 对上(其他 Drivers)提供的一套统一通用的操作 GPIO 的软件接口。对下,Gpiolib 提供了针对不同芯片操作的一套 framework,针对不同芯片,只需要实现mdrv_gpio_io.c,然后使用 Gpiolib 提供的注册函数,将其挂接到 Gpiolib 上。
2. 关键字说明¶
2.1. GPIO Index¶
原理图上GPIO的Pad name可以在表1-1中查找到对应的GPIO Index,GPIO Index作为软件操作GPIO相关函数的输入参数使用。
例如:希望操作的GPIO为 PAD_GPIO4,根据表1-1中的内容找到对应的GPIO Index为12。
表1-1:GPIO Index与PAD对应表
Pad Name | GPIO Index | Pad Name | GPIO Index | Pad Name | GPIO Index |
---|---|---|---|---|---|
PAD_SD1_IO1 | 0 | PAD_SD1_IO0 | 1 | PAD_SD1_IO5 | 2 |
PAD_SD1_IO4 | 3 | PAD_SD1_IO3 | 4 | PAD_SD1_IO2 | 5 |
PAD_SD1_IO6 | 6 | PAD_UART1_RX | 7 | PAD_UART1_TX | 8 |
PAD_SPI0_CZ | 9 | PAD_SPI0_CK | 10 | PAD_SPI0_DI | 11 |
PAD_SPI0_DO | 12 | PAD_PWM0 | 13 | PAD_PWM1 | 14 |
PAD_SD_CLK | 15 | PAD_SD_CMD | 16 | PAD_SD_D0 | 17 |
PAD_SD_D1 | 18 | PAD_SD_D2 | 19 | PAD_SD_D3 | 20 |
PAD_USB_CID | 21 | PAD_PM_SD_CDZ | 22 | PAD_PM_IRIN | 23 |
PAD_PM_UART_RX | 24 | PAD_PM_UART_TX | 25 | PAD_PM_GPIO0 | 26 |
PAD_PM_GPIO1 | 27 | PAD_PM_GPIO2 | 28 | PAD_PM_GPIO3 | 29 |
PAD_PM_GPIO4 | 30 | PAD_PM_GPIO7 | 31 | PAD_PM_GPIO8 | 32 |
PAD_PM_GPIO9 | 33 | PAD_PM_SPI_CZ | 34 | PAD_PM_SPI_DI | 35 |
PAD_PM_SPI_WPZ | 36 | PAD_PM_SPI_DO | 37 | PAD_PM_SPI_CK | 38 |
PAD_PM_SPI_HLD | 39 | PAD_PM_LED0 | 40 | PAD_PM_LED1 | 41 |
PAD_FUART_RX | 42 | PAD_FUART_TX | 43 | PAD_FUART_CTS | 44 |
PAD_FUART_RTS | 45 | PAD_GPIO0 | 46 | PAD_GPIO1 | 47 |
PAD_GPIO2 | 48 | PAD_GPIO3 | 49 | PAD_GPIO4 | 50 |
PAD_GPIO5 | 51 | PAD_GPIO6 | 52 | PAD_GPIO7 | 53 |
PAD_GPIO14 | 54 | PAD_GPIO15 | 55 | PAD_I2C0_SCL | 56 |
PAD_I2C0_SDA | 57 | PAD_I2C1_SCL | 58 | PAD_I2C1_SDA | 59 |
PAD_SR_IO00 | 60 | PAD_SR_IO01 | 61 | PAD_SR_IO02 | 62 |
PAD_SR_IO03 | 63 | PAD_SR_IO04 | 64 | PAD_SR_IO05 | 65 |
PAD_SR_IO06 | 66 | PAD_SR_IO07 | 67 | PAD_SR_IO08 | 68 |
PAD_SR_IO09 | 69 | PAD_SR_IO10 | 70 | PAD_SR_IO11 | 71 |
PAD_SR_IO12 | 72 | PAD_SR_IO13 | 73 | PAD_SR_IO14 | 74 |
PAD_SR_IO15 | 75 | PAD_SR_IO16 | 76 | PAD_SR_IO17 | 77 |
PAD_SAR_GPIO3 | 78 | PAD_SAR_GPIO2 | 79 | PAD_SAR_GPIO1 | 80 |
PAD_SAR_GPIO0 | 81 |
3. RTOS用法介绍¶
3.1 DRIVER PATH¶
sc/driver/sysdriver/gpio/drv/pub/drv_gpio.h sc/driver/sysdriver/gpio/drv/pub/drv_gpio_io.h sc/driver/sysdriver/gpio/drv/src/drv_gpio.c sc/driver/sysdriver/gpio/drv/src/drv_gpio_io.c sc/driver/sysdriver/gpio/hal/chipname/src/hal_gpio.c sc/driver/sysdriver/gpio/hal/chipname/src/hal_pinmux.c sc/driver/sysdriver/gpio/hal/chipname/inc/hal_gpio.h sc/driver/sysdriver/gpio/hal/chipname/inc/hal_pinmux.h sc/driver/sysdriver/gpio/hal/chipname/pub/gpio.h sc/driver/sysdriver/gpio/hal/chipname/pub/padmux.h
3.2 CONFIG配置¶
#make menuconfig BSP Driver Options ---> [*] Support GPIO driver
3.3 SYSDESC配置¶
无需在chipname.sys文件中进行gpio配置
3.4. 配置复用功能¶
方法一
在chipname-padmux.c
文件配置引脚复用功能,该文件位于sc/driver/sysdriver/padmux/hal/chipname/src
,只需要在对应的schematic
属性添加如下内容中设定,比如下文所示:
pad_info_t schematic[] = { {PAD_GPIO0, PINMUX_FOR_PWM0_MODE_1, MDRV_PUSE_PWM0}, {PAD_GPIO1, PINMUX_FOR_PWM1_MODE_1, MDRV_PUSE_PWM1}, {PAD_GPIO2, PINMUX_FOR_PWM2_MODE_3, MDRV_PUSE_PWM2}, {PAD_GPIO3, PINMUX_FOR_PWM3_MODE_1, MDRV_PUSE_PWM3}, {PAD_GPIO4, PINMUX_FOR_PWM4_MODE_1, MDRV_PUSE_PWM4}, {PAD_GPIO5, PINMUX_FOR_PWM5_MODE_3, MDRV_PUSE_PWM5}, {PAD_GPIO6, PINMUX_FOR_PWM6_MODE_3, MDRV_PUSE_PWM6}, {PAD_GPIO7, PINMUX_FOR_PWM7_MODE_3, MDRV_PUSE_PWM7}, {PAD_PM_PWM0, PINMUX_FOR_PM_PWM0_MODE_1, MDRV_PUSE_PWM8}, {PAD_PM_PWM1, PINMUX_FOR_PM_PWM1_MODE_1, MDRV_PUSE_PWM9}, {PAD_PM_PWM2, PINMUX_FOR_PM_PWM2_MODE_1, MDRV_PUSE_PWM10}, {PAD_PM_PWM3, PINMUX_FOR_PM_PWM3_MODE_1, MDRV_PUSE_PWM11}, };
第一列为引脚索引号,可以在sc/drivers/sysdriver/gpio/hal/chipname/pub/gpio.h
中查询;
第二列为模式定义,可以在sc/drivers/sysdriver/gpio/hal/chipname/pub/padmux.h
中查询;
第三列为引脚及搭配模式的索引名称,可以在sc/drivers/sysdriver/padmux/drv/pub/drv_puse.h
中查询;
方法二
在sc/driver/sysdriver/sysdesc/hal/chipname/pub
中的padmux节点配置引脚复用功能,比如下文所示:
<padmux> [schematic_u32_u32_u32] PAD_GPIO0 PINMUX_FOR_PWM0_MODE_1 MDRV_PUSE_PWM0, PAD_GPIO1 PINMUX_FOR_PWM1_MODE_1 MDRV_PUSE_PWM1, PAD_GPIO2 PINMUX_FOR_PWM2_MODE_3 MDRV_PUSE_PWM2, PAD_GPIO3 PINMUX_FOR_PWM3_MODE_1 MDRV_PUSE_PWM3, PAD_GPIO4 PINMUX_FOR_PWM4_MODE_1 MDRV_PUSE_PWM4, PAD_GPIO5 PINMUX_FOR_PWM5_MODE_3 MDRV_PUSE_PWM5, PAD_GPIO6 PINMUX_FOR_PWM6_MODE_3 MDRV_PUSE_PWM6, PAD_GPIO7 PINMUX_FOR_PWM7_MODE_3 MDRV_PUSE_PWM7, PAD_PM_PWM0 PINMUX_FOR_PM_PWM0_MODE_1 MDRV_PUSE_PWM8, PAD_PM_PWM1 PINMUX_FOR_PM_PWM1_MODE_1 MDRV_PUSE_PWM9, PAD_PM_PWM2 PINMUX_FOR_PM_PWM2_MODE_1 MDRV_PUSE_PWM10, PAD_PM_PWM3 PINMUX_FOR_PM_PWM3_MODE_1 MDRV_PUSE_PWM11; [status_u8] 1;
需要注意的是方法二的优先级更高,即方法一和方法二都存在的时候,生效的是在sc/driver/sysdriver/sysdesc/hal/chipname/pub
中的padmux节点配置
3.5 API说明¶
3.5.1. 设置引脚为GPIO MODE¶
-
目的
设置引脚为GPIO MODE。
-
语法
void drv_gpio_pad_set(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 void 无
3.5.2. 清除引脚为GPIO MODE¶
-
目的
清除引脚的GPIO MODE。
-
语法
void drv_gpio_pad_clr(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 void 无
3.5.3. 设置引脚的TMUX模式¶
-
目的
设置引脚的TMUX模式。
-
语法
u8 drv_gpio_pad_val_set(u8 gpio_index, u32 pad_mode);
-
参数
参数名称 描述 gpio_index GPIO Index pad_mode TMUX MODE -
返回值
返回值 描述 1 输出参数错误 0 成功
3.5.4. 获取引脚的TMUX模式¶
-
目的
该API用于获取某只Pad当前配置的PadMode,前提是这只Pad配置PadMode的时候是通过Padmux接口进行配置,直接操作寄存器进行配置的方式则不会使该API生效。
-
语法
u8 drv_gpio_pad_val_get(u8 gpio_index, u32* pad_mode);
-
参数
参数名称 描述 gpio_index GPIO Index pad_mode 获取到的TMUX MODE -
返回值
返回值 描述 1 输出参数错误 0 成功
3.5.5. 设置引脚的电压模式¶
-
目的
获取输入引脚的电平,注意本接口仅在Muffin支持。
-
语法
void drv_gpio_vol_val_set(u8 group, u32 mode);
-
参数
参数名称 描述 group Group num (11 Groups in total) mode Mode = 0:引脚电压为3.3V; Mode = 1:引脚电压为1.8V -
返回值
返回值 描述 void 无
3.5.6. 设置引脚为输出模式¶
-
目的
设置引脚为输出模式。
-
语法
u8 drv_gpio_pad_oen(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 1 输入参数错误 0 成功
3.5.7. 设置引脚为输入模式¶
-
目的
设置引脚为输入模式。
-
语法
u8 drv_gpio_pad_odn(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 1 输入参数错误 0 成功
3.5.8. 获取引脚电平状态¶
-
目的
获取引脚电平状态。
-
语法
u8 drv_gpio_pad_read(u8 gpio_index, u8* pad_level);
-
参数
参数名称 描述 gpio_index GPIO Index pad_level 0表示高电平,1表示低电平 -
返回值
返回值 描述 1 输入参数错误 0 成功
3.5.9. 拉高引脚电平¶
-
目的
拉高引脚电平
-
语法
u8 drv_gpio_set_high(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 1 输入参数错误 0 成功
3.5.10. 拉低引脚电平¶
-
目的
拉低引脚电平
-
语法
u8 drv_gpio_set_low(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 1 输入参数错误 0 成功
3.5.11. 获取引脚状态¶
-
目的
判断引脚的状态是输入还是输出。
-
语法
u8 drv_gpio_pad_in_out(u8 gpio_index, u8* pad_in_out);
-
参数
参数名称 描述 gpio_index GPIO Index pad_in_out 0表示引脚状态为输出,1表示引脚状态为输入 -
返回值
返回值 描述 1 输入参数错误 0 成功
3.5.12. 设置GPIO的上拉功能¶
-
目的
开启指定的GPIO上拉功能。
-
语法
u8 drv_gpio_pull_up(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 0 设置成功 other 该引脚不支持上拉设置或者输入参数错误
3.5.13. 设置GPIO的下拉功能¶
-
目的
开启指定的GPIO下拉功能。
-
语法
u8 drv_gpio_pull_down(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 0 设置成功 other 该引脚不支持下拉设置或者输入参数错误
3.5.14. 关闭GPIO的上/下拉功能¶
-
目的
关闭指定的GPIO上/下拉功能,并切换至悬空状态。
-
语法
u8 drv_gpio_pull_off(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 0 设置成功 other 该引脚不支持上拉设置或者输入参数错误
3.5.15. 获取GPIO的上/下拉状态¶
-
目的
获取指定的GPIO上/下拉状态。
-
语法
u8 drv_gpio_pull_status(u8 gpio_index, u8* pull_status);
-
参数
参数名称 描述 gpio_index GPIO Index pull_status 获取到的上/下拉状态 -
返回值
返回值 描述 0 获取成功 1 该引脚不支持上拉设置或者输入参数错误
3.5.16. 设置GPIO的驱动能力¶
-
目的
设置指定的GPIO的驱动能力。
-
语法
u8 drv_gpio_drv_set(u8 gpio_index, u8 level);
-
参数
参数名称 描述 gpio_index GPIO Index level 驱动能力等级 -
返回值
返回值 描述 0 设置成功 other 该引脚不支持驱动能力设置或者输入参数错误
3.5.17. 获取GPIO的驱动能力等级¶
-
目的
获取指定的GPIO的驱动能力等级。
-
语法
u8 drv_gpio_drv_get(u8 gpio_index, u8* level);
-
参数
参数名称 描述 gpio_index GPIO Index level 获取到的GPIO的驱动能力等级 -
返回值
返回值 描述 0 获取成功 1 该引脚不支持驱动能力设置或者输入参数错误
3.5.18. 获取GPIO的中断号¶
-
目的
获取指定的GPIO的中断号。
-
语法
int drv_gpio_to_irq(u8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 virq Virq为返回的中断号 负数或0 失败
3.5.19. 获取GPIO Index¶
-
目的
通过GPIO Name获取GPIO Index。
-
语法
u8 drv_gpio_name_to_num(u8* p_name, u8* gpio_index);
-
参数
参数名称 描述 p_name GPIO Name gpio_index 获取到的GPIO Index -
返回值
返回值 描述 1 输入参数错误 0 成功
3.5.20. 获取特定PadMode对应的PIN脚¶
-
目的
查询能够使用某一个特定PadMode的所有GPIO脚。
-
语法
u32* drv_gpio_padmode_to_padindex(u32 mode);
-
参数
参数名称 描述 mode 所要查询的PadMode -
返回值
返回值 描述 数组首地址 存放GPIO Index的数组
3.5.21. 获取复用到的引脚¶
-
目的
以puse为检索条件遍历,获取padmux中配置到的Pad。
-
语法
int drv_padmux_getpad (int puse);
-
参数
参数名称 描述 puse puse的宏定义 -
返回值
返回值 描述 PadId 成功获取到padmux中的Pad的宏定义 PAD_UNKNOWN 输入的Puse有误或者padmux中没有对应的PadId
3.5.22. 获取复用到的Tmux Mode¶
-
目的
以puse为检索条件遍历,获取padmux中配置到的Tmux Mode。
-
语法
int drv_padmux_getmode (int puse);
-
参数
参数名称 描述 puse puse的宏定义 -
返回值
返回值 描述 PadId 成功获取到padmux.dtsi中的Mode的宏定义 PAD_UNKNOWN 输入的Puse有误或者padmux.dtsi中没有对应的PadId
3.5.23. 获取PUSE的宏定义¶
-
目的
因为PUSE的宏定义遵循一套规则:
-
不同IP之间的偏移为0x10000
-
同一个IP中不同Channel之间的偏移为0x100
-
同一个IP同一个Channel中不同Puse之间的偏移为0x1
因此可以根据这三个参数获取Puse的宏定义。
-
-
语法
int drv_padmux_getpuse (int IP_Index, int Channel_Index, int Pad_Index);
-
参数
参数名称 描述 IP_Index Puse所在的IP,可在mdrv_puse.h中查阅 Channel_Index Puse所在的Channel,可在mdrv_puse.h中查阅 Pad_Index Puse在channel中的Index,可在mdrv_puse.h中查阅 -
返回值
返回值 描述 Puse 成功获取到padmux.dtsi中的PadId
3.6 DEMO¶
demo源码位于sc/driver/sysdriver/gpio/drv/src/gpio_test.c