RISCV_GPIO使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 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
配置的时候需要注意的事项:
-
一个Pad只能配置一种Mode,不可以一个Pad同时配置多个Mode。
-
一个Puse只能对应一组配置,否则会造成冲突。
-
配置的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