跳转至

Sigmastar_GPIO使用参考

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 01/22/2024
    1.1
  • 增加第八章DEBUG&FAQ
  • 11/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,针对不同芯片,只需要实现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_I2C1_SDA 0 PAD_SR_RST0 1 PAD_SR_MCLK0 2
    PAD_I2C1_SCL 3 PAD_SR_RST1 4 PAD_SR_MCLK1 5
    PAD_I2C2_SCL 6 PAD_I2C2_SDA 7 PAD_GPIO0 8
    PAD_GPIO1 9 PAD_GPIO2 10 PAD_GPIO3 11
    PAD_GPIO4 12 PAD_GPIO5 13 PAD_GPIO6 14
    PAD_GPIO7 15 PAD_GPIO8 16 PAD_GPIO9 17
    PAD_GPIO10 18 PAD_GPIO11 19 PAD_SD0_CDZ 20
    PAD_SD0_D1 21 PAD_SD0_D0 22 PAD_SD0_CLK 23
    PAD_SD0_CMD 24 PAD_SD0_D3 25 PAD_SD0_D2 26
    PAD_FUART_RTS 27 PAD_FUART_CTS 28 PAD_FUART_RX 29
    PAD_FUART_TX 30 PAD_MSPI_CZ 31 PAD_MSPI_DO 32
    PAD_MSPI_DI 33 PAD_MSPI_CK 34 PAD_SPI0_DO 35
    PAD_SPI0_DI 36 PAD_SPI0_HLD 37 PAD_SPI0_WPZ 38
    PAD_SPI0_CZ 39 PAD_SPI0_CK 40 PAD_I2C0_SDA 41
    PAD_I2C0_SCL 42 PAD_PM_GPIO12 43 PAD_PM_GPIO11 44
    PAD_PM_UART_TX 45 PAD_PM_UART_RX 46 PAD_PM_PSPI0_INT 47
    PAD_PM_PSPI0_DI 48 PAD_PM_PSPI0_DO 49 PAD_PM_PSPI0_CK 50
    PAD_PM_PSPI0_CZ 51 PAD_PM_GPIO10 52 PAD_PM_GPIO9 53
    PAD_PM_GPIO8 54 PAD_PM_GPIO7 55 PAD_PM_PWM3 56
    PAD_PM_PWM2 57 PAD_PM_PWM1 58 PAD_PM_PWM0 59
    PAD_PM_GPIO6 60 PAD_PM_GPIO5 61 PAD_PM_GPIO4 62
    PAD_PM_UART2_TX 63 PAD_PM_UART2_RX 64 PAD_PM_I2C_CLK 65
    PAD_PM_I2C_SDA 66 PAD_PM_SDIO_INT 67 PAD_PM_GPIO3 68
    PAD_PM_GPIO2 69 PAD_PM_GPIO1 70 PAD_PM_GPIO0 71
    PAD_PM_SDIO_D1 72 PAD_PM_SDIO_D0 73 PAD_PM_SDIO_CLK 74
    PAD_PM_SDIO_CMD 75 PAD_PM_SDIO_D3 76 PAD_PM_SDIO_D2 77
    PAD_PM_FUART_RTS 78 PAD_PM_FUART_CTS 79 PAD_PM_FUART_RX 80
    PAD_PM_FUART_TX 81 PAD_PM_HSRAM_GPIO0 82 PAD_PM_HSRAM_GPIO1 83
    PAD_PM_HSRAM_GPIO2 84 PAD_PM_HSRAM_GPIO3 85 PAD_PM_HSRAM_GPIO4 86
    PAD_PM_HSRAM_GPIO5 87 PAD_PM_HSRAM_GPIO6 88 PAD_PM_HSRAM_GPIO7 89
    PAD_PM_HSRAM_GPIO8 90 PAD_PM_HSRAM_GPIO9 91 PAD_PM_HSRAM_GPIO10 92
    PAD_PM_HSRAM_GPIO11 93 PAD_PM_HSRAM_GPIO12 94 PAD_PM_SAR_GPIO0 95
    PAD_PM_SAR_GPIO1 96 PAD_PM_SAR_GPIO2 97 PAD_PM_SAR_GPIO3 98
    PAD_PM_SAR_GPIO4 99 PAD_OUTN_RX0_CH5 100 PAD_OUTP_RX0_CH5 101
    PAD_OUTN_RX0_CH4 102 PAD_OUTP_RX0_CH4 103 PAD_OUTN_RX0_CH3 104
    PAD_OUTP_RX0_CH3 105 PAD_OUTN_RX0_CH2 106 PAD_OUTP_RX0_CH2 107
    PAD_OUTN_RX0_CH1 108 PAD_OUTP_RX0_CH1 109 PAD_OUTN_RX0_CH0 110
    PAD_OUTP_RX0_CH0 111

    3. 功能描述

    • 支持对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/chip_name/hal_gpio.c
    drivers/sstar/gpio/chip_name/hal_gpio.h
    drivers/sstar/gpio/chip_name/hal_pinmux.c
    drivers/sstar/gpio/chip_name/hal_pinmux.h
    drivers/sstar/include/chip_name/gpio.h
    drivers/sstar/include/chip_name/padmux.h
    

    5.3. Dts参数配置说明

    gpio: gpio {
        compatible = "sgs,gpio";
        status = "okay";
    };
    
    属性 描述 备注
    compatible 用于匹配驱动进行驱动注册 禁止修改
    status 驱动开关 根据需要配置,ok/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

    6. Kernel用法介绍

    6.1. Kernel config配置说明

    Device Drivers  --->
    
        [*] GPIO Support  --->
            [*]   /sys/class/gpio/... (sysfs interface)
    
        [*] SStar SoC platform drivers  --->
            [*]   Sstar GPIO driver
            [*]   PADMUX driver
    

    6.2. 相关代码路径

    drivers/sstar/gpio/drv/drv_gpio.c
    drivers/sstar/gpio/drv/drv_gpio.h
    drivers/sstar/gpio/hal/chip_name/src/hal_gpio.c
    drivers/sstar/gpio/hal/chip_name/inc/hal_gpio.h
    drivers/sstar/gpio/hal/chip_name/src/hal_gpio_common.c
    drivers/sstar/gpio/hal/chip_name/src/hal_pinmux.c
    drivers/sstar/gpio/hal/chip_name/inc/hal_pinmux.h
    drivers/sstar/gpio/hal//chip_name/pub/gpio.h
    drivers/sstar/gpio/hal/chip_name/pub/padmux.h
    drivers/sstar/gpio/os/gpio_os.h
    drivers/sstar/gpio/ut/gpio_irq_test.c
    

    6.3. Dts参数配置说明

    gpio: gpio {
        compatible = "sgs,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控制器

    GPIO index可在drivers/sstar/include/CHIPNAME/gpio.h

    • /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/sgs/msys

    LINUX GPIO框架暂时未支持GPIO上下拉和驱动能力调节相关配置,在LINUX的GPIO标准框架外,我们又增加了另外的文件接口用于操作GPIO的上下拉和调节驱动能力。如需支持此功能,首先需要打开 CONFIG_MSYS_GPIO 配置,该配置位于menuconfig中:

    Device Drivers  --->
    
        [*] SStar SoC platform drivers  --->
            [*]   support GPIO pull and driving modify
            [*]   support padmux modify and verify
    

    /sys/class/sstar/msys对应的源代码位于driver/sstar/msys/ms_msys.c

    设置上拉/下拉之前需要先将GPIO设置为输入状态,输出状态上拉/下拉是没法测量的:

    引脚设置为输入状态后,进入sys/class/mstar/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是否被正确写入,可以根据GPIO_Mapping_Table,查找对应的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的驱动能力等级可查阅GPIO_Mapping_Table。

      查看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是否被正确写入,可以根据GPIO_Mapping_Table,查找对应的PAD(如下图GPIO INDEX:50)。当设置驱动等级为1时,[103E56]#7 ~ #8为01。具体操作命令为:

      1. # riu_r 0x103e 0x2B
      

      查看riu_r返回值的BIT7、BIT8

    • mux_verify 用于确认复用冲突

      文件名 读写权限 描述
      mux_verify rw 0~8 确认复用功能是否冲突

      以操作PAD_I2C1_SDA的PINMUX_FOR_I2C1_MODE_1为例:

      1. # echo PAD_I2C1_SDA I2C1_MODE_1 > /sys/class/sstar/msys/mux_verify
      2. # cat mux_verify
      

      如下显示则表示设置正确,当前无复用冲突

      如下显示则表示当前存在复用问题

      Please check register value of [bank: 0x103E, offset: 0x00, mask: 0x0008]
      Correct value is not 0x0008, but current value is 0x0008
      

      有问题的寄存器地址:[bank: 0x103E, offset: 0x00, mask: 0x0008],正确的值是不为0x0008,因为mask是0x0008(BIT3==0x0008),所以BIT3要为0,但现在BIT3等于1,BIT3需要清掉

      Please check register value of [bank: 0x103C, offset: 0x53, mask: 0x0003]
      Correct value is 0x0001, but current value is 0x0000
      

      有问题的寄存器地址:[bank: 0x103C, offset: 0x53, mask: 0x0003],正确的值是0x0001,因为mask是0x0003(BIT1|BIT0==0x0003),所以BIT0要为1,BIT1要为0

    • mux_modify 用于配置复用功能

      文件名 读写权限 描述
      mux_modify rw 0~8 配置复用功能

      以操作PAD_I2C1_SDA的PINMUX_FOR_I2C1_MODE_1为例:

    6.4.4. 复用功能使用说明

    当需要使用GPIO的复用功能时候,首先需要获取所要操作的PIN脚的Name、所要复用的Tmux Mode,将他们配置在xxx-padmux.dtsi中:

    1. <PAD_VSYNC_OUT      PINMUX_FOR_VGA_VSYNC_MODE_1      MDRV_PUSE_VGA_VSYNC>
    2. <PAD_HSYNC_OUT      PINMUX_FOR_VGA_HSYNC_MODE_1      MDRV_PUSE_VGA_HSYNC>
    

    如上所示,第一列和第二列分别表示Pad Name和Tmux Mode,MDRV_PUSE_XXX可以理解为当前这一组的配置的Name。

    配置的时候需要注意的事项:

    • 一个Pad只能配置一种Mode,不可以一个Pad同时配置多个Mode。

    • 一个Puse只能对应一组配置,否则会造成冲突。

    • 配置的Pad和Mode必须是匹配的。

    • 不允许在驱动中直接进行复用操作,要求复用的配置都集中到xxx_padmux.dtsi。(需要动态调整复用配置的除外,目的是为了方便管理和减少配置冲突)

    6.5. Sample Code

    用户空间代码使能gpio中断参考demo。

    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.    }
    

    7. API参考

    该功能模块提供以下接口:

    API名称 功能
    gpio_request 申请gpio端口
    gpio_free 释放gpio端口
    gpio_direction_input 标记gpio为输入
    gpio_direction_output 标记gpio为输出
    gpio_get_value 获取输入引脚的电平
    gpio_set_value 设定输出引脚的电平
    drv_gpio_pad_set 设置引脚为gpio_mode
    drv_gpio_pad_clr 清楚引脚的gpio_mode
    drv_gpio_pad_val_set 设置引脚的tmux模式
    drv_gpio_pad_val_get 获取某只pad当前配置的PadMode
    drv_gpio_vol_val_set 获取输入引脚的电平,该接口仅在Muffin支持
    drv_gpio_pad_in_out 判断引脚的输入输出状态
    drv_gpio_pull_up 开启指定的gpio上拉功能
    drv_gpio_pull_down 开启指定的gpio下拉功能
    drv_gpio_pull_off 关闭指定的gpio上下拉功能,并切换至悬空状态
    drv_gpio_pull_status 获取指定的gpio上下拉状态
    drv_gpio_drv_set 设置指定的gpio驱动能力
    drv_gpio_drv_get 获取指定的gpio的驱动能力等级
    drv_gpio_to_irq 获取知道你过的gpio的中断号
    drv_gpio_name_to_num 通过gpio name获取gpio index
    drv_gpio_padmode_to_padindex 查询能够使用某一个特定的padmode的所有gpio脚
    drv_padmux_getpad 以puse检索dtsi中配置的pad
    drv_padmux_getmode 以puse检索dtsi中配置的tmux mode
    drv_padmux_getpuse 获取puse的宏定义

    7.1. gpio_request

    • 目的

      创建端口为GPIO。

    • 语法

      int gpio_request(unsigned gpio, const char *label)
      
    • 参数

      参数名称 描述
      gpio GPIO Index
      label 具体名称
    • 返回值

      返回值 描述
      0 成功
      other 失败

    7.2. gpio_free

    • 目的

      释放GPIO端口。

    • 语法

      void gpio_free(unsigned gpio)
      
    • 参数

      参数名称 描述
      gpio GPIO Index
    • 返回值

      返回值 描述
      void

    7.3. gpio_direction_input

    • 目的

      标记gpio为输入。

    • 语法

      int gpio_direction_input(unsigned gpio);
      
    • 参数

      参数名称 描述
      gpio GPIO Index
    • 返回值

      返回值 描述
      0 成功
      other 失败

    7.4. gpio_direction_output

    • 目的

      标记gpio为输出。

    • 语法

      int gpio_direction_output(unsigned gpio, int value);
      
    • 参数

      参数名称 描述
      gpio GPIO Index
      value 输出值
    • 返回值

      返回值 描述
      0 成功
      other 失败

    7.5. gpio_get_value

    • 目的

      获取输入引脚的电平。

    • 语法

      int gpio_get_value(unsigned gpio);
      
    • 参数

      参数名称 描述
      gpio GPIO Index
    • 返回值

      返回值 描述
      int 电平值

    7.6. gpio_set_value

    • 目的

      设定输出引脚的电平。

    • 语法

      void gpio_set_value(unsigned gpio, int value);
      
    • 参数

      参数名称 描述
      gpio GPIO Index
      value 输出值
    • 返回值

      返回值 描述
      0 成功
      other 失败

    7.7. drv_gpio_pad_set

    • 目的

      设置引脚为GPIO MODE。

    • 语法

      void drv_gpio_pad_set(U8 gpio_index);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
    • 返回值

      返回值 描述
      void

    7.8. drv_gpio_pad_clr

    • 目的

      清除引脚的GPIO MODE。

    • 语法

      void drv_gpio_pad_clr(U8 gpio_index);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
    • 返回值

      返回值 描述
      void

    7.9. drv_gpio_pad_val_set

    • 目的

      设置引脚的TMUX模式。

    • 语法

      U8 drv_gpio_pad_val_set(U8 gpio_index, U32 pad_mode);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
      pad_mode TMUX MODE
    • 返回值

      返回值 描述
      1 输出参数错误
      0 成功

    7.10. drv_gpio_pad_val_get

    • 目的

      该API用于获取某只Pad当前配置的PadMode,前提是这只Pad配置PadMode的时候是通过Padmux接口进行配置,直接操作寄存器进行配置的方式则不会使该API生效。

    • 语法

      U8 drv_gpio_pad_val_get(U8 gpio_index, U32* pad_mode);
      
    • 参数

      参数名称 描述
      gpio_index Group Index
      pad_mode 获取到的TMUX MODE
    • 返回值

      返回值 描述
      1 输出参数错误
      0 成功

    7.11. drv_gpio_vol_val_set

    • 目的

      获取输入引脚的电平,注意本接口仅在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

    7.12. drv_gpio_pad_in_out

    • 目的

      判断引脚的状态是输入还是输出。

    • 语法

      U8 drv_gpio_pad_in_out(U8 gpio_index, U8* pad_in_out);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
      pad_in_out 0表示引脚状态为输出,1表示引脚状态为输入
    • 返回值

      返回值 描述
      1 输入参数错误
      0 成功

    7.13. drv_gpio_pull_up

    • 目的

      开启指定的GPIO上拉功能。

    • 语法

      U8 drv_gpio_pull_up(U8 gpio_index);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
    • 返回值

      返回值 描述
      0 设置成功
      other 该引脚不支持上拉设置或者输入参数错误

    7.14. drv_gpio_pull_down

    • 目的

      开启指定的GPIO下拉功能。

    • 语法

      U8 drv_gpio_pull_down(U8 gpio_index);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
    • 返回值

      返回值 描述
      0 设置成功
      other 该引脚不支持下拉设置或者输入参数错误

    7.15. drv_gpio_pull_off

    • 目的

      关闭指定的GPIO上/下拉功能,并切换至悬空状态。

    • 语法

      U8 drv_gpio_pull_off(U8 gpio_index);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
    • 返回值

      返回值 描述
      0 设置成功
      other 该引脚不支持上拉设置或者输入参数错误

    7.16. drv_gpio_pull_status

    • 目的

      获取指定的GPIO上/下拉状态。

    • 语法

      U8 drv_gpio_pull_status(U8 gpio_index, U8* pull_status);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
      pull_status 获取到的上/下拉状态
    • 返回值

      返回值 描述
      0 获取成功
      1 该引脚不支持上拉设置或者输入参数错误

    7.17. drv_gpio_drv_set

    • 目的

      设置指定的GPIO的驱动能力。

    • 语法

      U8 drv_gpio_drv_set(U8 gpio_index, U8 level);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
      level 驱动能力等级
    • 返回值

      返回值 描述
      0 设置成功
      other 该引脚不支持驱动能力设置或者输入参数错误

    7.18. drv_gpio_drv_get

    • 目的

      获取指定的GPIO的驱动能力等级。

    • 语法

      U8 drv_gpio_drv_get(U8 gpio_index, U8* level);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
      level 获取到的GPIO的驱动能力等级
    • 返回值

      返回值 描述
      0 获取成功
      1 该引脚不支持驱动能力设置或者输入参数错误

    7.19. drv_gpio_to_irq

    • 目的

      获取指定的GPIO的中断号。

    • 语法

      int drv_gpio_to_irq(U8 gpio_index);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
    • 返回值

      返回值 描述
      virq Virq为返回的中断号
      负数或0 失败

    7.20. drv_gpio_name_to_num

    • 目的

      通过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 成功

    7.21. drv_gpio_padmode_to_padindex

    • 目的

      查询能够使用某一个特定PadMode的所有GPIO脚。

    • 语法

      U32* drv_gpio_padmode_to_padindex(U32 mode);
      
    • 参数

      参数名称 描述
      mode 所要查询的PadMode
    • 返回值

      返回值 描述
      数组首地址 存放GPIO Index的数组

    7.22. drv_padmux_getpad

    • 目的

      以Puse为检索条件遍历,获取xxx-padmux.dtsi中配置到的Pad。

    • 语法

      int drv_padmux_getpad (int Puse);
      
    • 参数

      参数名称 描述
      Puse Puse的宏定义
    • 返回值

      返回值 描述
      PadId 成功获取到padmux.dtsi中的Pad的宏定义
      PAD_UNKNOWN 输入的Puse有误或者padmux.dtsi中没有对应的PadId

    7.23. drv_padmux_getmode

    • 目的

      以Puse为检索条件遍历,获取xxx-padmux.dtsi中配置到的Tmux Mode。

    • 语法

      int drv_padmux_getmode (int Puse);
      
    • 参数

      参数名称 描述
      Puse Puse的宏定义
    • 返回值

      返回值 描述
      PadId 成功获取到padmux.dtsi中的Mode的宏定义
      PAD_UNKNOWN 输入的Puse有误或者padmux.dtsi中没有对应的PadId

    7.24. drv_padmux_getpuse

    • 目的

      因为PUSE的宏定义遵循一套规则:

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

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

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

    8. FAQ

    当操作gpio出现异常时,可参考如下几点进行调试。

    常见问题 排查方向
    export无法拉高拉低 电压表实际量测,直接写寄存器
    padmode异常 使用iocheck工具检查padmode设置是否正确

    8.1. 直接写寄存器

    操作对应gpio pin的寄存器拉高拉低,使用电压表量测有无变化,定位是cat value有误还是 set value有误。

    8.2. 使用iocheck工具检查

    在目录kernel/drivers/sstar/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