GPIO使用参考


REVISION HISTORY

Revision No. Description Date
1.0
  • Initial release
  • 04/18/2023
    1.1
  • 增加第八章DEBUG&FAQ
  • 04/08/2025

    1. 概述

    General Purpose Input Output (通用输入/输出)简称为GPIO。GPIO 采用标准的LINUX框架,能够使用统一的接口来操作gpio。

    图1-1 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的宏定义遵循一套规则:

      1. 不同IP之间的偏移为0x10000

      2. 同一个IP中不同Channel之间的偏移为0x100

      3. 同一个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