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

GPIO的框架如上图,中间层是 gpiolib,用于管理系统中的 GPIO。gpiolib 汇总了 GPIO 的通用操作,根据 GPIO 的特性,gpiolib 对上(其他 Drivers)提供的一套统一通用的操作 GPIO 的软件接口。对下,Gpiolib 提供了针对不同芯片操作的一套 framework,针对不同芯片,只需要实现drv_gpio_io.c,然后使用 Gpiolib 提供的注册函数,将其挂接到 Gpiolib 上。
2. 关键字说明¶
2.1. GPIO Index¶
原理图上GPIO的Pad name可以在表1-1中查找到对应的GPIO Index,GPIO Index作为软件操作GPIO相关函数的输入参数使用。
例如:希望操作的GPIO为 PAD_KEY1,根据表1-1中的内容找到对应的GPIO Index为12。
表1-1:GPIO Index与PAD对应表
Pad Name | GPIO Index | Pad Name | GPIO Index | Pad Name | GPIO Index |
---|---|---|---|---|---|
PAD_UART0_TX | 0 | PAD_PWM_OUT00 | 1 | PAD_PWM_OUT01 | 2 |
PAD_SPI_CK | 3 | PAD_SPI_HLD | 4 | PAD_SPI_CZ | 5 |
PAD_SPI_WPZ | 6 | PAD_SPI_DI | 7 | PAD_SPI_DO | 8 |
PAD_GPIOE_00 | 9 | PAD_GPIOE_01 | 10 | PAD_GPIOE_02 | 11 |
PAD_GPIOE_03 | 12 | PAD_GPIOE_04 | 13 | PAD_GPIOE_05 | 14 |
PAD_GPIOE_06 | 15 | PAD_GPIOE_07 | 16 | PAD_GPIOE_08 | 17 |
PAD_GPIOE_09 | 18 | PAD_GPIOE_10 | 19 | PAD_GPIOE_11 | 20 |
PAD_GPIOE_12 | 21 | PAD_GPIOE_13 | 22 | PAD_GPIOE_14 | 23 |
PAD_GPIOE_15 | 24 | PAD_GPIOE_16 | 25 | PAD_GPIOE_17 | 26 |
PAD_GPIOE_18 | 27 | PAD_GPIOE_19 | 28 | PAD_GPIOE_20 | 29 |
PAD_GPIOE_21 | 30 | PAD_GPIOE_22 | 31 | PAD_GPIOE_23 | 32 |
PAD_GPIOE_24 | 33 | PAD_GPIOE_25 | 34 | PAD_GPIOE_26 | 35 |
PAD_GPIOE_27 | 36 | PAD_GPIOE_28 | 37 | PAD_GPIOA_00 | 38 |
PAD_GPIOA_01 | 39 | PAD_GPIOA_02 | 40 | PAD_GPIOA_03 | 41 |
PAD_GPIOA_04 | 42 | PAD_GPIOA_05 | 43 | PAD_GPIOA_06 | 44 |
PAD_GPIOA_07 | 45 | PAD_GPIOA_08 | 46 | PAD_GPIOA_09 | 47 |
PAD_GPIOA_10 | 48 | PAD_GPIOA_11 | 49 | PAD_EMMC_RST | 50 |
PAD_EMMC_CLK | 51 | PAD_EMMC_CMD | 52 | PAD_EMMC_DS | 53 |
PAD_EMMC_D3 | 54 | PAD_EMMC_D4 | 55 | PAD_EMMC_D0 | 56 |
PAD_EMMC_D5 | 57 | PAD_EMMC_D1 | 58 | PAD_EMMC_D6 | 59 |
PAD_EMMC_D2 | 60 | PAD_EMMC_D7 | 61 | PAD_GPIOA_12 | 62 |
PAD_GPIOA_13 | 63 | PAD_GPIOA_14 | 64 | PAD_GPIOA_15 | 65 |
PAD_GPIOA_16 | 66 | PAD_GPIOA_17 | 67 | PAD_GPIOA_18 | 68 |
PAD_GPIOA_19 | 69 | PAD_GPIOB_00 | 70 | PAD_GPIOB_01 | 71 |
PAD_GPIOB_02 | 72 | PAD_GPIOB_03 | 73 | PAD_GPIOB_04 | 74 |
PAD_GPIOB_05 | 75 | PAD_GPIOB_06 | 76 | PAD_GPIOB_07 | 77 |
PAD_GPIOB_08 | 78 | PAD_OUTP_RX0_CH0 | 79 | PAD_OUTN_RX0_CH0 | 80 |
PAD_OUTP_RX0_CH1 | 81 | PAD_OUTN_RX0_CH1 | 82 | PAD_OUTP_RX0_CH2 | 83 |
PAD_OUTN_RX0_CH2 | 84 | PAD_OUTP_RX0_CH3 | 85 | PAD_OUTN_RX0_CH3 | 86 |
PAD_GPIOC_00 | 87 | PAD_GPIOC_01 | 88 | PAD_GPIOC_02 | 89 |
PAD_GPIOC_03 | 90 | PAD_GPIOC_04 | 91 | PAD_GPIOC_05 | 92 |
PAD_GPIOC_06 | 93 | PAD_GPIOC_07 | 94 | PAD_GPIOC_08 | 95 |
PAD_OUTP_CH0 | 96 | PAD_OUTN_CH0 | 97 | PAD_OUTP_CH1 | 98 |
PAD_OUTN_CH1 | 99 | PAD_OUTP_CH2 | 100 | PAD_OUTN_CH2 | 101 |
PAD_OUTP_CH3 | 102 | PAD_OUTN_CH3 | 103 | PAD_OUTP_CH4 | 104 |
PAD_OUTN_CH4 | 105 | PAD_SAR_ADC0_00 | 106 | PAD_SAR_ADC0_01 | 107 |
PAD_SAR_ADC0_02 | 108 | PAD_SAR_ADC0_03 | 109 | PAD_SAR_ADC0_04 | 110 |
PAD_SAR_ADC0_05 | 111 | PAD_SAR_ADC0_06 | 112 | PAD_SAR_ADC0_07 | 113 |
PAD_SAR_ADC0_08 | 114 | PAD_SAR_ADC0_09 | 115 | PAD_SAR_ADC0_10 | 116 |
PAD_SAR_ADC0_11 | 117 | PAD_SAR_ADC0_12 | 118 | PAD_SAR_ADC0_13 | 119 |
PAD_SAR_ADC0_14 | 120 | PAD_PWM_ADC01 | 121 | PAD_PWM_ADC00 | 122 |
PAD_GPIOD_01 | 123 | PAD_GPIOD_02 | 124 | PAD_GPIOD_03 | 125 |
PAD_GPIOD_00 | 126 | PAD_UART0_RX | 127 | PAD_PM_GPIO4 | 128 |
PAD_PM_GPIO5 | 129 | PAD_PM_PWM1_OUT | 130 | PAD_PM_I2C_SDA | 131 |
PAD_PM_PWM0_OUT | 132 | PAD_PM_I2C_SCL | 133 | PAD_PM_GPIO1 | 134 |
PAD_PM_GPIO3 | 135 | PAD_PM_UART1_TX | 136 | PAD_PM_GPIO2 | 137 |
PAD_PM_GPIO7 | 138 | PAD_PM_GPIO6 | 139 | PAD_PM_UART1_RX | 140 |
PAD_PM_ADC00_IN | 141 | PAD_PM_GPIO0 | 142 | PAD_PM_SAR_GPIO0 | 143 |
PAD_PM_SAR_GPIO1 | 144 | PAD_PM_SAR_GPIO2 | 145 | PAD_PM_SAR_GPIO3 | 146 |
PAD_PM_SAR_GPIO4 | 147 |
3. 功能描述¶
- 共有0-147编号共148个GPIO Pin,均可配置为GPIO Mode
- 支持对gpio管脚的上下拉状态进行配置
- 支持对gpio管脚的驱动能力进行配置
4. 硬件连接¶
将对应gpio引脚连接至硬件即可。
5. Uboot用法介绍¶
5.1. Uboot config配置说明¶
[*] SigmaStar drivers ---> [*] SigmaStar GPIO [*] SigmaStar padmux
5.2. 相关代码路径¶
drivers/sstar/gpio/drv_gpio.c drivers/sstar/gpio/drv_gpio.h drivers/sstar/gpio/pcupid/hal_gpio.c drivers/sstar/gpio/pcupid/hal_gpio.h drivers/sstar/gpio/pcupid/hal_pinmux.c drivers/sstar/gpio/pcupid/hal_pinmux.h drivers/sstar/include/pcupid/gpio.h drivers/sstar/include/pcupidpadmux.h
5.3. Dts参数配置说明¶
gpio: gpio { compatible = "sstar,gpio"; status = "okay"; };
属性 | 描述 | 备注 |
---|---|---|
compatible | 用于匹配驱动进行驱动注册 | 禁止修改 |
status | 驱动开关 | 根据需要配置,okay/disabled |
5.4. Uboot cmd参数说明¶
<input|set|clear|toggle> <pin>
→ input/set/clear/toggle the specified pin
gpio status [-a] [<bank> | <pin>]
→ show [all / claimed] GPIOs
cmd | 参数 | 说明 |
---|---|---|
input | pin | 设置引脚号为pin的引脚为gpio input mode |
set | pin | 设置引脚号为pin的引脚为gpio output high mode |
clear | pin | 设置引脚号为pin的引脚为gpio output low mode |
toggle | pin | 将引脚号为pin的引脚电平翻转 |
status | pin | 查看引脚号为pin的引脚的状态 |
5.5. Uboot cmd使用实例¶
gpio input <gpio#>
→ gpio input 69 // gpio69 set as input
gpio set <gpio#>
→ gpio set 10 // gpio10 set as output high
gpio clear <gpio#>
→ gpio clear 49 // gpio49 set as output low
gpio toggle <gpio#>
→ gpio toggle 49 // gpio49 level toggle
gpio status <gpio#>
→ gpio status 20 // gpio20 status
5.6. 引脚初始状态设置¶
5.6.1. Uboot Config¶
编译Uboot时:make menuconfig
[*] SigmaStar drivers ---> [*] SigmaStar PAD_INIT
5.6.2. 功能使用说明¶
PAD的初始状态包括输入/输出状态、电平状态、内部上拉状态、引脚驱动能力等级。因此在设置PAD初始状态的时候,主要是对以上四种状态进行配置。在xxx-padmux.dtsi中具体的配置格式如下:
/* * Format: * <Pad_Index Direction Level_State Pull_State Driving_Level> */ 1. <PAD_OUTP_RX0_CH0 GPIO_DIR_IN GPIO_LEVEL_NA PAD_PULL_UP PAD_DRV_1>, 2. <PAD_PM_I2C_SDA GPIO_DIR_OUT GPIO_LEVEL_HIGH PAD_PULL_DOWN PAD_DRV_1>, 3. <PAD_GPIOC_00 GPIO_DIR_NA GPIO_LEVEL_NA PAD_HIZ PAD_DRV_3>, 4. <GPIO_NR GPIO_DIR_NA GPIO_LEVEL_NA PAD_PULL_DEFAULT PAD_DRV_DEFAULT>;
如上所示:
-
Pad_Index:表示PAD序号,可参考表1-1:GPIO NUM与PAD对应表。
-
Direction:表示Pad的输入/输出模式,可以选择配置为:GPIO_DIR_IN、GPIO_DIR_OUT、GPIO_DIR_NA。
GPIO_DIR_IN表示设置为输入,GPIO_DIR_OUT表示设置为输出。如果只需要设置PAD的内部上拉状态和驱动能力等级,而不需要将PAD设置为GPIO mode的话,可以在Direction位置传入GPIO_DIR_NA。Pad设置为输入/输出模式的时候需要将这只Pad设置为GPIO mode,所以需要在配置padmux的位置加入GPIO mode的设定
1. <PAD_OUTP_RX0_CH0 PINMUX_FOR_GPIO_MODE MDRV_PUSE_GPIO_OUTP_RX0_CH0>, 2. <PAD_PM_I2C_SDA PINMUX_FOR_GPIO_MODE MDRV_PUSE_GPIO_PM_I2C_SDA>, 3. <PAD_GPIOC_00 PINMUX_FOR_GPIO_MODE MDRV_PUSE_GPIO_GPIOC_00>,
-
Level_State:表示电平高低状态,可以选择配置为:GPIO_LEVEL_HIGH、GPIO_LEVEL_LOW、GPIO_LEVEL_NA。
GPIO_LEVEL_HIGH表示高电平,GPIO_LEVEL_LOW表示低电平,GPIO_LEVEL_NA则表示无需配置初始电平,使用默认电平即可。
-
Pull_State:表示内部上下拉状态,可以选择配置为:PAD_PULL_UP、PAD_PULL_DOWN、PAD_HIZ、PAD_PULL_DEFAULT。
PAD_PULL_UP表示内部上拉,PAD_PULL_DOWN表示内部下拉,PAD_HIZ表示悬空,在不需要设置内部上拉状态的时候,可以选择PAD_PULL_DEFAULT,表示设置为默认状态
-
Driving_Level:表示驱动能力等级,可以选择配置为PAD_DRV_0、PAD_DRV_1、PAD_DRV_2......当不需要设置驱动能力等级的时候,也可以选择PAD_DRV_DEFAULT,即使用当前驱动能力等级,不做配置
Name Config Direction GPIO_DIR_IN、GPIO_DIR_OUT、GPIO_DIR_NA Level_State GPIO_LEVEL_HIGH、GPIO_LEVEL_LOW、GPIO_LEVEL_NA Pull_State PAD_PULL_UP、PAD_PULL_DOWN、PAD_HIZ、PAD_PULL_DEFAULT Driving_Level PAD_DRV_0、PAD_DRV_1、PAD_DRV_2、……PAD_DRV_DEFAULT
6. Kernel用法介绍¶
6.1. Kernel config配置说明¶
Device Drivers ---> [*] GPIO Support ---> [*] /sys/class/gpio/... (sysfs interface) [*] SStar SoC platform drivers ---> [*] GPIO driver [*] PADMUX driver
6.2. 相关代码路径¶
drivers/sstar/gpio/drv_gpio.c drivers/sstar/gpio/drv_gpio_io.c drivers/sstar/gpio/pcupid/hal_gpio.c drivers/sstar/gpio/pcupid/hal_gpio.h drivers/sstar/gpio/pcupid/hal_pinmux.c drivers/sstar/gpio/pcupid/hal_pinmux.h drivers/sstar/gpio/os/gpio_os.h drivers/sstar/gpio/ut/gpio_irq_test.c drivers/sstar/include/pcupid/gpio.h drivers/sstar/include/pcupid/padmux.h
6.3. Dts参数配置说明¶
gpio: gpio { compatible = "sstar,gpio"; #gpio-cells = <2>; status = "okay"; };
属性 | 描述 | 备注 |
---|---|---|
compatible | 用于匹配驱动进行驱动注册 | 禁止修改 |
#gpio-cells | 声明设备节点gpio cells的个数 | 配置为2表示第一个cell为gpio号,第二个cell表示gpio有效电平 |
status | 驱动开关 | 根据需要配置,ok/disabled |
6.4. 模块使用介绍¶
6.4.1. export/unexport文件接口¶
Userspace可以通过sysfs接口操作GPIO
/sys/class/gpio对应的源码位于driver/gpio/gpiolib-sysfs.c
/sys/class/gpio目录下的包含export/unexport、gpioN、gpio_chipN三种文件:
文件名 | 读写权限 | 值 | 描述 |
---|---|---|---|
export | wo | GPIO Index | 在用户空间申请某个GPIO的控制权 |
unexport | wo | GPIO Index | 在用户空间移除某个GPIO的控制权 |
gpioN | ro | 包含具体GPIO的direction、value等信息 | |
gpio_chipN | ro | 指代GPIO控制器 |
-
/sys/class/gpio/export 文件属性为只允许写不允许读,用户程序通过写入GPIO的编号来向内核申请将某个GPIO的控制权导出到用户空间(sysfs),前提是没有内核代码申请这个GPIO端口,如用户申请编号为12的GPIO的命令:
# echo 12 > export
上述操作会为GPIO Index为12的GPIO创建一个节点gpio12,此时/sys/class/gpio目录下边生成一个gpio12的目录,如下图所示:
-
/sys/class/gpio/unexport 文件属性也为只允许写不允许读,和export的效果相反,用户通过写入GPIO的编号来移除用户空间(sysfs)的接口。如移除gpio12文件夹的操作命令:
# echo 12 > unexport
上述操作将会移除gpio12这个节点,如下图所示:
6.4.2. /sys/class/gpio/gpioN¶
/sys/class/gpio/gpioN 指代某个具体的gpio端口,里边有如下属性文件:
文件名 | 读写权限 | 值 | 描述 |
direction | rw | in | 输入模式,value不可写 |
out | 输出模式,value可写 | ||
high | 输出状态,默认高电平状态,value可写 | ||
low | 输出状态,默认低电平状态,value可写 | ||
value | rw | 1 | 高电平状态 |
0 | 低电平状态 | ||
edge | rw | none | disable gpio中断 |
rising | 使能gpio中断,并设置为上升沿触发 | ||
falling | 使能gpio中断,并设置为下降沿触发 | ||
both | 使能gpio中断,并设置为双边沿触发 |
direction 表示gpio端口的方向,读取结果是in或out,读取命令为:
# cat direction
value 表示gpio引脚的电平,0表示低电平,1表示高电平;读取命令为:
# cat value
可以对direction进行写操作,命令为:
# echo in > direction
# echo out > direction
如果direction被配置为输出(out),电平默认为低,同时value是可写的,操作命令为:
# echo 1 > value # echo 0 > value
direction写入low或high时不仅可以设置为输出还可以设置指定的输出电平。操作命令为:
# echo high > direction
# echo low > direction
当然如果内核不支持或者内核代码不愿意,将不会存在这个属性,比如内核调用了gpio_export(N,0)就表示内核不愿意修改gpio端口方向属性。
edge 表示是否使能gpio中断,并设置触发模式,支持上升沿触发、下降沿触发、双边沿触发:
# cat edge
可以对edge进行写操作,命令为:
# echo none > edge # echo rising > edge # echo falling > edge # echo both > edge
如果需要使能某只脚的中断,需要先将该脚设置为输入状态,并设置触发模式,则可以调用poll(2)函数监听该中断,中断触发后poll(2)函数就会返回。
6.4.3. /sys/class/sstar/msys¶
LINUX GPIO框架暂时未支持GPIO上下拉和驱动能力调节相关配置,在LINUX的GPIO标准框架外,我们又增加了另外的文件接口用于操作GPIO的上下拉和调节驱动能力。如需支持此功能,首先需要打开 CONFIG_MSYS_GPIO 配置,该配置位于menuconfig中:Device Drivers -> SStar SoC platform drivers -> msys api ->support GPIO pull and driving modify
/sys/class/sstar/msys对应的源代码位于driver/sstar/msys/ms_msys.c
设置上拉/下拉之前需要先将GPIO设置为输入状态,输出状态上拉/下拉是没法测量的:
引脚设置为输入状态后,进入sys/class/sstar/msys文件夹:
-
gpio_pull 可以写入up和down
文件名 读写权限 值 描述 gpio_pull rw up 上拉模式 down 下拉模式 查看GPIO当前的pull 状态是pull up / pull down / pull off:
1. # echo 50 > gpio_pull 2. # cat gpio_pull
如果输入非法的GPIO Index 和GPIO Name,则会报错:
设置上拉和设置下拉的命令为:
1. # echo 50 up > gpio_pull 2. # echo 50 down > gpio_pull
设置后查看gpio_pull的状态,如下图,50表示GPIO Index,PAD_OUTN_RX0_CH3表示GPIO Name。
1. # cat gpio_pull
如果输入非法的GPIO Index 和GPIO Name,则会报错:
检查具体BIT是否被正确写入,可以根据HW checklist,查找对应的PAD(如下图GPIO INDEX:50)。当pull up的时候PE bit位为1,PS bit位为0;pull down的时候PE bit位为1,PS bit位为0。具体操作命令为:
1. # riu_r 0x103e 0x34
查看riu_r返回值的BIT6、BIT11
-
gpio_drive 可以写入驱动的等级
文件名 读写权限 值 描述 gpio_drive rw 0~8 设置GPIO的驱动等级 当前平台中GPIO的驱动能力等级可查阅HW checklist。
查看GPIO的初始驱动能力等级的命令位:(也可以直接使用GPIO43的名称PAD_OUTP_RX0_CH0)
1. # echo 43 > gpio_drive 2. # cat gpio_drive
如果输入非法的GPIO Index 和GPIO Name,则会报错:
设置驱动能力之前将GPIO设置为高电平输出状态方便测量,设置命令为:
1. # echo 43 1 > gpio_drive
43为GPIO Index,1为驱动能力等级,对应4mA
设置驱动能力之后查看gpio_driver的状态,如下图,设置GPIO Index为43的引脚的驱动能力为4mA成功。
1. # cat gpio_drive
检查具体BIT是否被正确写入,可以根据HW checklist,查找对应的PAD(如下图GPIO INDEX:50)。当设置驱动等级为1时,[103E56]#7 ~ #8为01。具体操作命令为:
1. # riu_r 0x103e 0x2B
查看riu_r返回值的BIT7、BIT8
6.4.4. 复用功能使用说明¶
当需要使用GPIO的复用功能时候,首先需要获取所要操作的PIN脚的Name、所要复用的Tmux Mode,将他们配置在xxx-padmux.dtsi中:
<PAD_EMMC_RST PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_RST>, <PAD_EMMC_CLK PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_CLK>, <PAD_EMMC_CMD PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_CMD>, <PAD_EMMC_D0 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D0>, <PAD_EMMC_D1 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D1>, <PAD_EMMC_D2 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D2>, <PAD_EMMC_D3 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D3>, <PAD_EMMC_D4 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D4>, <PAD_EMMC_D5 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D5>, <PAD_EMMC_D6 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D6>, <PAD_EMMC_D7 PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_D7>, <PAD_EMMC_DS PINMUX_FOR_EMMC8B_BOOT_MODE_1 MDRV_PUSE_EMMC_DS>,
如上所示,第一列和第二列分别表示Pad Name和Tmux Mode,MDRV_PUSE_XXX可以理解为当前这一组的配置的Name。
配置的时候需要注意的事项:
-
一个Pad只能配置一种Mode,不可以一个Pad同时配置多个Mode。
-
一个Puse只能对应一组配置,否则会造成冲突。
-
配置的Pad和Mode必须是匹配的。
-
不允许在驱动中直接进行复用操作,要求复用的配置都集中到xxx_padmux.dtsi。(需要动态调整复用配置的除外,目的是为了方便管理和减少配置冲突)
6.4.5. 引脚初始状态设置¶
编译Kernel时:make menuconfig
Device Drivers--> [*] SStar SoC platform drivers--> [*] PAD_INIT driver
详见本文章节:功能使用说明
6.5. Sample Code¶
6.5.1 用户空间中断¶
用户空间代码使能gpio中断请参考sstar_gpio_poll.c。
1. #include <stdio.h> 2. #include <stdlib.h> 3. #include <unistd.h> 4. #include <fcntl.h> 5. #include <sys/poll.h> 6. 7. int main(int argc, char *argv[]) 8. { 9. char buff[1024]; 10. int gpio_id; 12. struct pollfd fds[1]; 13. int gpio_fd = open("/sys/class/gpio/gpio135/value", O_RDONLY); 14. if (gpio_fd == -1) 15. {printf("gpio open\n");} 16. else 17. {printf("/sys/class/gpio/gpio135/value\n");} 18. fds[0].fd = gpio_fd; 19. fds[0].events = POLLPRI; 20. int ret = read(gpio_fd, buff, 10); 21. if (ret == -1) 22. printf("read fail\n"); 23. else 24. printf("read\n"); 25. while (1) 26. { 27. printf("revents is %d\n", fds[0].revents); 28. ret = poll(fds, 1, -1); 29. if (ret == -1) 30. printf("poll\n"); 31. 32. if (fds[0].revents & POLLPRI) 33. { 34. ret = lseek(gpio_fd, 0, SEEK_SET); 35. if (ret == -1) 36. printf("lseek\n"); 37. ret = read(gpio_fd, buff, 10); 38. if (ret == -1) 39. printf("read\n"); 40. printf("get interrupt\n"); 41. } 42. } 43. }
6.5.2 API使用参考¶
#include <drv_gpio.h> int main() { u8 index = 0; gpio_request(index,"test"); gpio_direction_input(index); //do your operation gpio_set_value(index,1); //..... gpio_free(index); }
7. API参考¶
该功能模块提供以下接口:
API名称 | 功能 |
---|---|
gpio_request | 申请gpio端口 |
gpio_free | 释放gpio端口 |
gpio_direction_input | 标记gpio为输入 |
gpio_direction_output | 标记gpio为输出 |
gpio_get_value | 获取输入引脚的电平 |
gpio_set_value | 设定输出引脚的电平 |
sstar_gpio_pad_set | 设置引脚为gpio_mode |
sstar_gpio_pad_clr | 清楚引脚的gpio_mode |
sstar_gpio_pad_val_set | 设置引脚的tmux模式 |
sstar_gpio_pad_val_get | 获取某只pad当前配置的PadMode |
sstar_gpio_vol_val_set | 获取输入引脚的电平,该接口仅在Muffin支持 |
sstar_gpio_pad_in_out | 判断引脚的输入输出状态 |
sstar_gpio_pull_up | 开启指定的gpio上拉功能 |
sstar_gpio_pull_down | 开启指定的gpio下拉功能 |
sstar_gpio_pull_off | 关闭指定的gpio上下拉功能,并切换至悬空状态 |
sstar_gpio_pull_status | 获取指定的gpio上下拉状态 |
sstar_gpio_drv_set | 设置指定的gpio驱动能力 |
sstar_gpio_drv_get | 获取指定的gpio的驱动能力等级 |
sstar_gpio_to_irq | 获取知道你过的gpio的中断号 |
sstar_gpio_name_to_num | 通过gpio name获取gpio index |
sstar_gpio_padmode_to_padindex | 查询能够使用某一个特定的padmode的所有gpio脚 |
mdrv_padmux_getpad | 以puse检索dtsi中配置的pad |
mdrv_padmux_getmode | 以puse检索dtsi中配置的tmux mode |
mdrv_padmux_getpuse | 获取puse的宏定义 |
7.1. 申请gpio端口¶
-
目的
创建端口为GPIO。
-
语法
int gpio_request(unsigned gpio, const char *label)
-
参数
参数名称 描述 gpio GPIO Index label 具体名称 -
返回值
返回值 描述 0 成功 other 失败
7.2. 释放gpio端口¶
-
目的
释放GPIO端口。
-
语法
void gpio_free(unsigned gpio)
-
参数
参数名称 描述 gpio GPIO Index -
返回值
返回值 描述 void 无
7.3. 设为输入¶
-
目的
标记gpio为输入。
-
语法
int gpio_direction_input(unsigned gpio);
-
参数
参数名称 描述 gpio GPIO Index -
返回值
返回值 描述 0 成功 other 失败
7.4. 设为输出¶
-
目的
标记gpio为输出。
-
语法
int gpio_direction_output(unsigned gpio, int value);
-
参数
参数名称 描述 gpio GPIO Index value 输出值 -
返回值
返回值 描述 0 成功 other 失败
7.5. 获取输入电平¶
-
目的
获取输入引脚的电平。
-
语法
int gpio_get_value(unsigned gpio);
-
参数
参数名称 描述 gpio GPIO Index -
返回值
返回值 描述 int 电平值
7.6. 设置输出电平¶
-
目的
设定输出引脚的电平。
-
语法
void gpio_set_value(unsigned gpio, int value);
-
参数
参数名称 描述 gpio GPIO Index value 输出值 -
返回值
返回值 描述 0 成功 other 失败
7.7. 设置引脚为GPIO MODE¶
-
目的
设置引脚为GPIO MODE。
-
语法
void sstar_gpio_pad_set(U8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 void 无
7.8. 清除引脚为GPIO MODE¶
-
目的
清除引脚的GPIO MODE。
-
语法
void sstar_gpio_pad_clr(U8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 void 无
7.9. 设置引脚的TMUX模式¶
-
目的
设置引脚的TMUX模式。
-
语法
U8 sstar_gpio_pad_val_set(U8 gpio_index, U32 pad_mode);
-
参数
参数名称 描述 gpio_index GPIO Index pad_mode TMUX MODE -
返回值
返回值 描述 1 输出参数错误 0 成功
7.10. 获取引脚的TMUX模式¶
-
目的
该API用于获取某只Pad当前配置的PadMode,前提是这只Pad配置PadMode的时候是通过Padmux接口进行配置,直接操作寄存器进行配置的方式则不会使该API生效。
-
语法
U8 sstar_gpio_pad_val_get(U8 gpio_index, U32* pad_mode);
-
参数
参数名称 描述 gpio_index Group Index pad_mode 获取到的TMUX MODE -
返回值
返回值 描述 1 输出参数错误 0 成功
7.11. 设置引脚的电压模式¶
-
目的
获取输入引脚的电平,注意本接口仅在Muffin支持。
-
语法
void sstar_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 无
7.12. 获取引脚状态¶
-
目的
判断引脚的状态是输入还是输出。
-
语法
U8 sstar_gpio_pad_in_out(U8 gpio_index, U8* pad_in_out);
-
参数
参数名称 描述 gpio_index GPIO Index pad_in_out 0表示引脚状态为输出,1表示引脚状态为输入 -
返回值
返回值 描述 1 输入参数错误 0 成功
7.13. 设置GPIO的上拉功能¶
-
目的
开启指定的GPIO上拉功能。
-
语法
U8 sstar_gpio_pull_up(U8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 0 设置成功 other 该引脚不支持上拉设置或者输入参数错误
7.14. 设置GPIO的下拉功能¶
-
目的
开启指定的GPIO下拉功能。
-
语法
U8 sstar_gpio_pull_down(U8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 0 设置成功 other 该引脚不支持下拉设置或者输入参数错误
7.15. 关闭GPIO的上/下拉功能¶
-
目的
关闭指定的GPIO上/下拉功能,并切换至悬空状态。
-
语法
U8 sstar_gpio_pull_off(U8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 0 设置成功 other 该引脚不支持上拉设置或者输入参数错误
7.16. 获取GPIO的上/下拉状态¶
-
目的
获取指定的GPIO上/下拉状态。
-
语法
U8 sstar_gpio_pull_status(U8 gpio_index, U8* pull_status);
-
参数
参数名称 描述 gpio_index GPIO Index pull_status 获取到的上/下拉状态 -
返回值
返回值 描述 0 获取成功 1 该引脚不支持上拉设置或者输入参数错误
7.17. 设置GPIO的驱动能力¶
-
目的
设置指定的GPIO的驱动能力。
-
语法
U8 sstar_gpio_drv_set(U8 gpio_index, U8 level);
-
参数
参数名称 描述 gpio_index GPIO Index level 驱动能力等级 -
返回值
返回值 描述 0 设置成功 other 该引脚不支持驱动能力设置或者输入参数错误
7.18. 获取GPIO的驱动能力等级¶
-
目的
获取指定的GPIO的驱动能力等级。
-
语法
U8 sstar_gpio_drv_get(U8 gpio_index, U8* level);
-
参数
参数名称 描述 gpio_index GPIO Index level 获取到的GPIO的驱动能力等级 -
返回值
返回值 描述 0 获取成功 1 该引脚不支持驱动能力设置或者输入参数错误
7.19. 获取GPIO的中断号¶
-
目的
获取指定的GPIO的中断号。
-
语法
int sstar_gpio_to_irq(U8 gpio_index);
-
参数
参数名称 描述 gpio_index GPIO Index -
返回值
返回值 描述 virq Virq为返回的中断号 负数或0 失败
7.20. 获取GPIO Index¶
-
目的
通过GPIO Name获取GPIO Index。
-
语法
U8 sstar_gpio_name_to_num(U8* p_name, U8* gpio_index);
-
参数
参数名称 描述 p_name GPIO Name gpio_index 获取到的GPIO Index -
返回值
返回值 描述 1 输入参数错误 0 成功
7.21. 获取特定PadMode对应的PIN脚¶
-
目的
查询能够使用某一个特定PadMode的所有GPIO脚。
-
语法
U32* sstar_gpio_padmode_to_padindex(U32 mode);
-
参数
参数名称 描述 mode 所要查询的PadMode -
返回值
返回值 描述 数组首地址 存放GPIO Index的数组
7.22. 获取复用到的引脚¶
-
目的
以Puse为检索条件遍历,获取xxx-padmux.dtsi中配置到的Pad。
-
语法
int mdrv_padmux_getpad (int Puse);
-
参数
参数名称 描述 Puse Puse的宏定义 -
返回值
返回值 描述 PadId 成功获取到padmux.dtsi中的Pad的宏定义 PAD_UNKNOWN 输入的Puse有误或者padmux.dtsi中没有对应的PadId
7.23. 获取复用到的Tmux Mode¶
-
目的
以Puse为检索条件遍历,获取xxx-padmux.dtsi中配置到的Tmux Mode。
-
语法
int mdrv_padmux_getmode (int Puse);
-
参数
参数名称 描述 Puse Puse的宏定义 -
返回值
返回值 描述 PadId 成功获取到padmux.dtsi中的Mode的宏定义 PAD_UNKNOWN 输入的Puse有误或者padmux.dtsi中没有对应的PadId
7.24. 获取PUSE的宏定义¶
-
目的
因为PUSE的宏定义遵循一套规则:
-
不同IP之间的偏移为0x10000
-
同一个IP中不同Channel之间的偏移为0x100
-
同一个IP同一个Channel中不同Puse之间的偏移为0x1
因此可以根据这三个参数获取Puse的宏定义。
-
-
语法
int mdrv_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
8. FAQ¶
当操作gpio出现异常时,可参考如下几点进行调试。
常见问题 | 排查方向 |
---|---|
export无法拉高拉低 | 电压表实际量测,直接写寄存器 |
padmode异常 | 使用iocheck工具检查padmode设置是否正确 |
8.1. 直接写寄存器¶
操作对应gpio pin的寄存器拉高拉低,使用电压表量测有无变化,定位是cat value有误还是 set value有误。
8.2. 使用iocheck工具检查¶
在目录kernel/sstar/drivers/gpio/ut/io_check目录下,直接make即可生成prog_io_check工具,打包到customer分区即可开机使用。
支持的选项如下:
选项 | 功能 |
---|---|
-s | 设置padmux mode |
-g | 获取padmux mode |
-i | 指定引脚号 |
-m | 指定模式 |
-v | 校验padmux mode冲突情况 |
例:查询某gpio pin,其索引为index
查询当前复用情况:./prog_io_check -i index
设置为对应mode:./prog_io_check -i index -m mode_index -s