Sigmastar_GPIO使用参考

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 01/31/2024

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

      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

    3.6 DEMO

    demo源码位于sc/driver/sysdriver/gpio/drv/src/gpio_test.c