RISCV_GPIO使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 11/14/2022

    1. 概述

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

    Figure 1: GPIO框架

    GPIO的框架如上图,中间层是 gpiolib,用于管理系统中的 GPIO。gpiolib 汇总了 GPIO 的通用操作,根据 GPIO 的特性,gpiolib 对上(其他 Drivers)提供的一套统一通用的操作 GPIO 的软件接口。对下,Gpiolib 提供了针对不同芯片操作的一套 framework,针对不同芯片,只需要实现mdrv_gpio_io.c,然后使用 Gpiolib 提供的注册函数,将其挂接到 Gpiolib 上。

    2. GPIO NUM与PAD对应表

    请通过原理图上GPIO 的Pad name在表1-1中查找对应的GPIO Index,GPIO Index作为软件操作GPIO相关函数的输入参数使用。

    例如:希望操作的GPIO为 PAD_KEY1,根据表1-1中的内容找到对应的GPIO Index为12。

    表1-1:GPIO NUM与PAD对应表

    Pad Name GPIO Index Pad Name GPIO Index Pad Name GPIO Index Pad Name GPIO Index
    PAD_I2C5_SCL 0 PAD_I2C5_SDA 1 PAD_SD0_GPIO0 2 PAD_SD0_VCTRL 3
    PAD_SD0_CDZ 4 PAD_SD0_D1 5 PAD_SD0_D0 6 PAD_SD0_CLK 7
    PAD_SD0_CMD 8 PAD_SD0_D3 9 PAD_SD0_D2 10 PAD_KEY0 11
    PAD_KEY1 12 PAD_KEY2 13 PAD_KEY3 14 PAD_KEY4 15
    PAD_KEY5 16 PAD_KEY6 17 PAD_KEY7 18 PAD_KEY8 19
    PAD_KEY9 20 PAD_KEY10 21 PAD_KEY11 22 PAD_KEY12 23
    PAD_KEY13 24 PAD_PM_PWM0 25 PAD_PM_PWM1 26 PAD_PM_I2CM_SCL 27
    PAD_PM_I2CM_SDA 28 PAD_PM_UART_RX0 29 PAD_PM_UART_TX0 30 PAD_PM_IR_RX 31
    PAD_PM_GPIO0 32 PAD_PM_GPIO1 33 PAD_PM_GPIO2 34 PAD_PM_GPIO3 35
    PAD_PM_GPIO4 36 PAD_PM_GPIO5 37 PAD_PM_SPI_WPZ 38 PAD_PM_SPI_DO 39
    PAD_PM_SPI_CZ 40 PAD_PM_SPI_HLD 41 PAD_PM_SPI_CK 42 PAD_PM_SPI_DI 43
    PAD_SAR_GPIO0 44 PAD_SAR_GPIO1 45 PAD_EMMC_RSTN 46 PAD_EMMC_CLK 47
    PAD_EMMC_CMD 48 PAD_EMMC_DS 49 PAD_EMMC_D3 50 PAD_EMMC_D4 51
    PAD_EMMC_D0 52 PAD_EMMC_D5 53 PAD_EMMC_D1 54 PAD_EMMC_D6 55
    PAD_EMMC_D2 56 PAD_EMMC_D7 57 PAD_OUTP_RX1_CH_0 58 PAD_OUTN_RX1_CH_0 59
    PAD_OUTP_RX1_CH_1 60 PAD_OUTN_RX1_CH_1 61 PAD_OUTP_RX1_CH_2 62 PAD_OUTN_RX1_CH_2 63
    PAD_OUTP_RX1_CH_3 64 PAD_OUTN_RX1_CH_3 65 PAD_OUTP_RX0_CH_0 66 PAD_OUTN_RX0_CH_0 67
    PAD_OUTP_RX0_CH_1 68 PAD_OUTN_RX0_CH_1 69 PAD_OUTP_RX0_CH_2 70 PAD_OUTN_RX0_CH_2 71
    PAD_OUTP_RX0_CH_3 72 PAD_OUTN_RX0_CH_3 73 PAD_OUTP_RX0_CH_4 74 PAD_OUTN_RX0_CH_4 75
    PAD_OUTP_RX0_CH_5 76 PAD_OUTN_RX0_CH_5 77 PAD_SPDIF_TX 78 PAD_SR_IO3 79
    PAD_SR_IO2 80 PAD_SR_IO1 81 PAD_SR_IO0 82 PAD_SR_PDN1 83
    PAD_SR_MCLK1 84 PAD_SR_RST1 85 PAD_I2C1_SDA 86 PAD_I2C1_SCL 87
    PAD_SR_PDN0 88 PAD_SR_MCLK0 89 PAD_SR_RST0 90 PAD_I2C0_SDA 91
    PAD_I2C0_SCL 92 PAD_SR_PDN2 93 PAD_SR_MCLK2 94 PAD_SR_RST2 95
    PAD_I2C2_SDA 96 PAD_I2C2_SCL 97 PAD_SR_PDN3 98 PAD_SR_MCLK3 99
    PAD_SR_RST3 100 PAD_I2C3_SDA 101 PAD_I2C3_SCL 102 PAD_PWM_OUT0 103
    PAD_PWM_OUT1 104 PAD_PWM_OUT2 105 PAD_PWM_OUT3 106 PAD_PWM_OUT4 107
    PAD_PWM_OUT5 108 PAD_PWM_OUT6 109 PAD_PWM_OUT7 110 PAD_PWM_OUT8 111
    PAD_PWM_OUT9 112 PAD_PWM_OUT10 113 PAD_PWM_OUT11 114 PAD_OUTP_TX0_CH_0 115
    PAD_OUTN_TX0_CH_0 116 PAD_OUTP_TX0_CH_1 117 PAD_OUTN_TX0_CH_1 118 PAD_OUTP_TX0_CH_2 119
    PAD_OUTN_TX0_CH_2 120 PAD_OUTP_TX0_CH_3 121 PAD_OUTN_TX0_CH_3 122 PAD_OUTP_TX0_CH_4 123
    PAD_OUTN_TX0_CH_4 124 PAD_OUTP_TX1_CH_0 125 PAD_OUTN_TX1_CH_0 126 PAD_OUTP_TX1_CH_1 127
    PAD_OUTN_TX1_CH_1 128 PAD_OUTP_TX1_CH_2 129 PAD_OUTN_TX1_CH_2 130 PAD_OUTP_TX1_CH_3 131
    PAD_OUTN_TX1_CH_3 132 PAD_OUTP_TX1_CH_4 133 PAD_OUTN_TX1_CH_4 134 PAD_SAR_ADC_0 135
    PAD_SAR_ADC_1 136 PAD_SAR_ADC_2 137 PAD_SAR_ADC_3 138 PAD_SAR_ADC_4 139
    PAD_SAR_ADC_5 140 PAD_SAR_ADC_6 141 PAD_SAR_ADC_7 142 PAD_SAR_ADC_8 143
    PAD_SAR_ADC_9 144 PAD_SAR_ADC_10 145 PAD_SAR_ADC_11 146 PAD_SAR_ADC_12 147
    PAD_SAR_ADC_13 148 PAD_SAR_ADC_14 149 PAD_SAR_ADC_15 150 PAD_SAR_ADC_16 151
    PAD_SAR_ADC_17 152 PAD_SAR_ADC_18 153 PAD_SAR_ADC_19 154 PAD_SAR_ADC_20 155
    PAD_SAR_ADC_21 156 PAD_SAR_ADC_22 157 PAD_SAR_ADC_23 158 PAD_SR_IO4 159
    PAD_RGMII0_MCLK 160 PAD_RGMII0_RSTN 161 PAD_RGMII0_RXCLK 162 PAD_RGMII0_RXCTL 163
    PAD_RGMII0_RXD0 164 PAD_RGMII0_RXD1 165 PAD_RGMII0_RXD2 166 PAD_RGMII0_RXD3 167
    PAD_RGMII0_TXCLK 168 PAD_RGMII0_TXCTL 169 PAD_RGMII0_TXD0 170 PAD_RGMII0_TXD1 171
    PAD_RGMII0_TXD2 172 PAD_RGMII0_TXD3 173 PAD_RGMII0_MDIO 174 PAD_RGMII0_MDC 175
    PAD_UART_RX2 176 PAD_UART_TX2 177 PAD_UART_RX3 178 PAD_UART_TX3 179
    PAD_UART_RX4 180 PAD_UART_TX4 181 PAD_UART_RX1 182 PAD_UART_TX1 183
    PAD_FUART_RX 184 PAD_FUART_TX 185 PAD_FUART_RTS 186 PAD_FUART_CTS 187

    3. GPIO接口的使用

    3.1. 设置引脚为GPIO MODE

    • 目的

      设置引脚为GPIO MODE。

    • 语法

      void drv_gpio_pad_set(U8 gpio_index);
      
    • 参数

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

      返回值 描述
      void

    3.2. 设置引脚的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.3. 获取引脚的TMUX模式

    • 目的

      获取引脚的TMUX模式。

    • 语法

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

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

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

    3.4. 设置引脚的电压模式

    • 目的

      获取输入引脚的电平。

    • 语法

      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. 设置引脚为输出模式

    • 目的

      设置某只引脚为输出模式。

    • 语法

      U8 drv_gpio_pad_oen(U8 gpio_index);
      
    • 参数

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

      返回值 描述
      0 成功
      other 失败

    3.6. 设置引脚为输入模式

    • 目的

      设置某只引脚为输入模式。

    • 语法

      U8 drv_gpio_pad_odn(U8 gpio_index);
      
    • 参数

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

      返回值 描述
      0 成功
      other 失败

    3.7. 获取电平状态

    • 目的

      获取引脚的电平状态。

    • 语法

      int drv_gpio_pad_read(U8 gpio_index, U8* pad_level);
      
    • 参数

      参数名称 描述
      gpio_index GPIO Index
      pad_level 电平状态
    • 返回值

      返回值 描述
      0 成功
      other 失败

    3.8. 设置输出高电平

    • 目的

      设置引脚输出高电平。

    • 语法

      U8 drv_gpio_pull_high(U8 gpio_index);
      
    • 参数

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

      返回值 描述
      0 成功
      other 失败

    3.9. 设置输出低电平

    • 目的

      设置引脚输出低电平。

    • 语法

      U8 drv_gpio_pull_low(U8 gpio_index);
      
    • 参数

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

      返回值 描述
      0 成功
      other 失败

    3.10. 获取引脚状态

    • 目的

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

    • 语法

      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.11. 设置GPIO的上拉功能

    • 目的

      开启指定的GPIO上拉功能。

    • 语法

      U8 drv_gpio_pull_up(U8 gpio_index);
      
    • 参数

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

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

    3.12. 设置GPIO的下拉功能

    • 目的

      开启指定的GPIO下拉功能。

    • 语法

      U8 drv_gpio_pull_down(U8 gpio_index);
      
    • 参数

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

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

    3.13. 关闭GPIO的上/下拉功能

    • 目的

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

    • 语法

      U8 drv_gpio_pull_off(U8 gpio_index);
      
    • 参数

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

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

    3.14. 获取GPIO的上/下拉状态

    • 目的

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

    • 语法

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

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

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

    3.15. 设置GPIO的驱动能力

    • 目的

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

    • 语法

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

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

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

    3.16. 获取GPI的驱动能力等级

    • 目的

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

    • 语法

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

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

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

    3.17. 获取GPIO的中断号

    • 目的

      获取指定的GPIO的中断号。

    • 语法

      int drv_gpio_to_irq(U8 gpio_index);
      
    • 参数

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

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

    3.18. 获取GPIO Index

    • 目的

      通过GPIO Name获取GPIO Index。

    • 语法

      U8 drv_gpio_name_to_num(U8* p_name, U8* gpio_index);
      
    • 参数

      参数名称 描述
      p_name PAD Name
      gpio_index 获取到的GPIO Index
    • 返回值

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

    3.19. 获取特定PadMode对应的PIN脚

    • 目的

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

    • 语法

      U32* drv_gpio_padmode_to_padindex(U32 mode);
      
    • 参数

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

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

    4. GPIO复用功能

    4.1. 复用功能使用说明

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

    1. <padmux>
    2. [schematic_u32_u32_u32]
    3. PAD_SAR_ADC_0   PINMUX_FOR_ADC0_MODE1   MDRV_PUSE_PWMADC0,
    4. PAD_SAR_ADC_1   PINMUX_FOR_ADC1_MODE1   MDRV_PUSE_PWMADC1,
    5. PAD_SAR_ADC_2   PINMUX_FOR_ADC2_MODE1   MDRV_PUSE_PWMADC2;
    

    如上图所示,第一列和第二列分别表示Pad Name和Tmux Mode

    MDRV_PUSE_XXX可以理解为当前这一组的配置的Name

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

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

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

    3. 配置的Pad和Mode必须是匹配的。

    5. 相关文件路径

    5.1. 头文件路径

    rtk\proj\sc\driver\sysdriver\gpio\drv\pub\drv_gpio.h

    5.2. Demo路径

    rtk\proj\sc\driver\sysdriver\gpio\drv\src\gpio_test.c