RISCV_GPIO使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 04/18/2023 | |
1.1 | 03/31/2025 |
1. 概述¶
General Purpose Input Output (通用输入/输出)简称为GPIO。
risc-v下,由sstar gpio driver提供统一的操作接口。使用者可以对所需GPIO做输入,输出,拉高,拉低,设置中断等操作。
相关driver路径:
sc/driver/sysdriver/gpio/drv/src/gpio_test.c sc/driver/sysdriver/gpio/drv/src/mdrv_gpio.c sc/driver/sysdriver/gpio/drv/src/mdrv_gpio_io.c sc/driver/sysdriver/gpio/drv/src/mdrv_sw_iic.c sc/driver/sysdriver/gpio/drv/src/ms_gpioi2c.c sc/driver/sysdriver/gpio/drv/pub/drv_gpio.h sc/driver/sysdriver/gpio/drv/pub/mdrv_gpio.h sc/driver/sysdriver/gpio/drv/pub/mdrv_gpio_io.h sc/driver/sysdriver/gpio/drv/pub/mdrv_sw_iic.h sc/driver/sysdriver/gpio/hal/pcupid/src/irq-gpi.c sc/driver/sysdriver/gpio/hal/pcupid/src/irq-pmsleep.c sc/driver/sysdriver/gpio/hal/pcupid/src/mhal_gpio.c sc/driver/sysdriver/gpio/hal/pcupid/src/mhal_pinmux.c sc/driver/sysdriver/gpio/hal/pcupid/pub/gpio.h sc/driver/sysdriver/gpio/hal/pcupid/pub/padmux.h sc/driver/sysdriver/gpio/hal/pcupid/inc/gpi-irqs.h sc/driver/sysdriver/gpio/hal/pcupid/inc/mhal_gpio.h sc/driver/sysdriver/gpio/hal/pcupid/inc/mhal_pinmux.h sc/driver/sysdriver/gpio/hal/pcupid/inc/pmsleep-irqs.h sc/driver/sysdriver/gpio/hal/pcupid/pub/gpio.h sc/driver/sysdriver/gpio/hal/pcupid/pub/padmux.h
测试代码可以参考文件:
sc/driver/sysdriver/gpio/drv/src/gpio_test.c
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. 用法介绍¶
GPIO mode的优先级高于padmux,意味着如果对某个正在被功能复用的引脚,设定的GPIO mode进行操作,就会影响到原先复用的功能的通讯。
5.1. Config配置¶
Sigmastar Drivers--> [*] SigmaStar GPIO [*] SigmaStar padmux
5.2. PADMUX设定¶
使用gpio可通过sysdecs配置gpio padmux,如下配置MIPI padmux与将PAD_GPIOA_01配置成gpio mode
sc\driver\sysdriver\sysdesc\hal\pcupid\pub\pcupid-default.sys:
<padmux> [schematic_u32_u32_u32] PAD_OUTP_CH0 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_P_CH0, PAD_OUTN_CH0 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_N_CH0, PAD_OUTP_CH1 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_P_CH1, PAD_OUTN_CH1 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_N_CH1, PAD_OUTP_CH2 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_P_CH2, PAD_OUTN_CH2 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_N_CH2, PAD_OUTP_CH3 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_P_CH3, PAD_OUTN_CH3 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_N_CH3, PAD_OUTP_CH4 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_P_CH4, PAD_OUTN_CH4 PINMUX_FOR_MIPI_TX_MODE_1 MDRV_PUSE_TX_MIPI_N_CH4, PAD_SAR_ADC0_08 PINMUX_FOR_I2C4_MODE_2 MDRV_PUSE_I2C4_SCL, PAD_SAR_ADC0_09 PINMUX_FOR_I2C4_MODE_2 MDRV_PUSE_I2C4_SDA, PAD_GPIOA_01 PINMUX_FOR_GPIO_MODE MDRV_PUSE_NA; [status_u8] 1;
5.3. Sample Code¶
#include <drv_gpio.h> int main() { u8 index = 0; drv_gpio_pad_set(index); drv_gpio_pad_oen(index); //do your operation drv_gpio_set_high(index); drv_gpio_set_low(index); //...... }
6. API参考¶
使用者在要调用gpio API进行操作的时候,仅需要参考drv_gpio.h当中提供的API。该功能模块提供以下接口:
6.1. drv_gpio_init¶
-
static inline void drv_gpio_init(void)
功能:关闭 gpio的 ALL_PAD_IN设定
参数:
参数 说明 void - 返回值:
返回值 说明 void -
6.2. drv_gpio_pad_set¶
-
static inline void drv_gpio_pad_set(U8 gpio_index)
功能:设定某根GPIO引脚为GPIO mode
参数:
参数 说明 gpio_index gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 void -
6.3. drv_gpio_padgroupmode_set¶
-
static inline U8 drv_gpio_padgroupmode_set(U32 pad_mode)
功能:设定pad mode,设定成功后会自动清除对应所有引脚的gpio mode
参数:
参数 说明 pad_mode 要设定的padmode,padmod定义请参考padmux.h 返回值:
返回值 说明 U8 0: 设定成功 1: 设定失败
6.4. drv_gpio_pad_val_set¶
-
static inline U8 drv_gpio_pad_val_set(U8 gpio_index, U32 pad_mode)
功能: 设定pad mode,但设定成功后,只会清除gpio_index的gpio mode
参数:
参数 说明 gpio_index gpio引脚编号,引脚编号请参考gpio.h pad_mode 所要设定的pad mode,pad mode定义请参考padmux.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败,优先检查是否gpio_index与pad_mode不匹配
6.5. drv_gpio_pad_val_get¶
-
static inline U8 drv_gpio_pad_val_get(U8 gpio_index, U32* pad_mode)
功能:查找对应gpio当前设定的pad mode
参数:
参数 说明 gpio_index gpio引脚编号,引脚编号请参考gpio.h pad_mode 指针类型,用于存储gpio当前设定的pad mode 返回值:
返回值 说明 U8 0:查找成功,pad mode存在参数pad_mode当中 1:查找失败,引脚错误
6.6. drv_gpio_pad_val_check¶
-
static inline U8 drv_gpio_pad_val_check(U8 gpio_index, U32 pad_mode)
功能:检查gpio引脚与pad_mode是否匹配
参数:
参数 说明 gpio_index 所要查找的gpio引脚编号,引脚编号请参考gpio.h pad_mode 所要查找的pad mode,pad mode定义请参考padmux.h 返回值:
返回值 说明 U8 0:匹配 1:不匹配
6.7. drv_gpio_pad_oen¶
-
static inline U8 drv_gpio_pad_oen(U8 gpio_index)
功能:设定引脚gpio mode output,但不会自动去设定gpio mode enable
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:成功 1:引脚超出范围,或者引脚未设定成gpio mode
6.8. drv_gpio_pad_odn¶
-
static inline U8 drv_gpio_pad_odn(U8 gpio_index)
功能:设定引脚gpio mode input,但不会自动去设定gpio mode enable
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:成功 1:引脚超出范围,或者引脚未设定成gpio mode
6.9. drv_gpio_pad_in_out¶
-
static inline U8 drv_gpio_pad_in_out(U8 gpio_index, U8* pad_in_out)
功能:获取指定引脚的输入输出状态
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h pad_in_out 指针类型,0:输出; 1:输入 返回值:
返回值 说明 U8 0:成功 1:引脚超出范围
6.10. drv_gpio_pad_read¶
-
static inline U8 drv_gpio_pad_read(U8 gpio_index, U8* pad_level)
功能:获取指定gpio的电平高低
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h pad_level 指针类型,0:低电平; 1:高电平 返回值:
返回值 说明 U8 0:成功 1:引脚超出范围
6.11. drv_gpio_pull_high¶
-
static inline U8 drv_gpio_pull_high(U8 gpio_index)
功能:设定指定引脚为输出高电平,不会自动设定gpio mode enable
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败
6.12. drv_gpio_pull_low¶
-
static inline U8 drv_gpio_pull_low(U8 gpio_index)
功能:设定指定引脚为输出低电平,不会自动设定gpio mode enable
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败
6.13. drv_gpio_set_high¶
-
static inline U8 drv_gpio_set_high(U8 gpio_index)
功能:设定引脚输出高电平,会自动设定gpio mode enable
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败,引脚超出范围
6.14. drv_gpio_set_low¶
-
static inline U8 drv_gpio_set_low(U8 gpio_index)
功能:设定引脚输出低电平,会自动设定gpio mode enable
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败,引脚超出范围
6.15. drv_gpio_pull_up¶
-
static inline U8 drv_gpio_pull_up(U8 gpio_index)
功能:设定引脚内部上拉
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败,引脚超出范围
6.16. drv_gpio_pull_down¶
-
static inline U8 drv_gpio_pull_down(U8 gpio_index)
功能:设定引脚内部下拉
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败,引脚超出范围
6.17. drv_gpio_pull_off¶
-
static inline U8 drv_gpio_pull_off(U8 gpio_index)
功能:取消引脚上下拉
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 0:设定成功 1:设定失败,引脚超出范围
6.18. drv_gpio_pull_status¶
-
static inline U8 drv_gpio_pull_status(U8 gpio_index, U8* pull_status)
功能:获取引脚上下拉状态
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h pull_status 指针类型,存储上下拉状态;0:下拉;1:上拉 返回值:
返回值 说明 U8 0:获取成功 1:获取失败,引脚超出范围
6.19. drv_gpio_drv_set¶
-
static inline U8 drv_gpio_drv_set(U8 gpio_index, U8 level)
功能:设定引脚驱动能力
参数:
参数 说明 gpio_index 所要设定的gpio引脚编号,引脚编号请参考gpio.h level 设定的驱动能力等级,详见HW Checklist 返回值:
返回值 说明 U8 0:设定成功 1:设定失败,引脚超出范围
6.20. drv_gpio_drv_get¶
-
static inline U8 drv_gpio_drv_get(U8 gpio_index, U8* level)
功能:获取引脚当前驱动能力
参数:
参数 说明 gpio_index 所要获取的gpio引脚编号,引脚编号请参考gpio.h level 当前引脚的驱动能力等级 返回值:
返回值 说明 U8 0:获取成功 1:获取失败,引脚超出范围
6.21. drv_gpio_to_irq¶
-
static inline int drv_gpio_to_irq(U8 gpio_index)
功能:获取gpio中断号
参数:
参数 说明 gpio_index 所要获取的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 U8 -1:设定失败 >=0:引脚对应的中断号
6.22. drv_gpio_pad_clr¶
-
static inline void drv_gpio_pad_clr(U8 gpio_index)
功能:清除指定index的gpio_mdoe
参数:
参数 说明 gpio_index 所要获取的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 void -
6.23. drv_gpio_vol_val_set¶
不支持
6.24. drv_gpio_get_check_count¶
-
static inline u8 drv_gpio_get_check_count(void)
功能:得到gpio check count
参数:
参数 说明 void - 返回值:
返回值 说明 void -
6.25. drv_gpio_get_check_info¶
-
static inline void* drv_gpio_get_check_info(u8 index)
功能:得到gpio check info
参数:
参数 说明 index 所要获取的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 void* check info
6.26. drv_gpio_name_to_num¶
-
static inline u8 drv_gpio_name_to_num(u8* p_name, u8* gpio_index)
功能:通过管脚名获取管脚index
参数:
参数 说明 p_name gpio引脚名,引脚名请参考gpio.h gpio_index 存取所要获取的gpio引脚编号,引脚编号请参考gpio.h 返回值:
返回值 说明 u8 0:成功 1:引脚超出范围,或者引脚未设定成gpio mode
6.27. drv_gpio_num_to_name¶
-
static inline u8 drv_gpio_num_to_name(u8 gpio_index, const u8** p_name)
功能:通过管脚index获取管脚名
参数:
参数 说明 gpio_index 所要获取的gpio引脚编号,引脚编号请参考gpio.h p_name 存储管脚名 返回值:
返回值 说明 u8 0:成功 1:引脚超出范围,或者引脚未设定成gpio mode
6.28. drv_gpio_padmode_to_val¶
-
static inline u8 drv_gpio_padmode_to_val(u8* p_mode, u32* mode_to_val)
功能:通过padmode名获取padmode值
参数:
参数 说明 p_mdoe 所要获取的padmode名,请参考padmux.h mode_to_val 所要获取的padmode编号,编号请参考padmux.h 返回值:
返回值 说明 void 0:成功 1:引脚超出范围,或者引脚未设定成gpio mode
6.29. drv_gpio_padmode_to_padindex¶
-
static inline u32* drv_gpio_padmode_to_padindex(u32 mode)
功能:通过padmode获取padindex
参数:
参数 说明 mode 所要获取的padmode编号,编号请参考padmux.h 返回值:
返回值 说明 u32* 配置为该padmode的所有padindex
6.30. drv_gpio_get_reg_cfg¶
-
static inline u8 drv_gpio_get_reg_cfg(u8 gpio_index, void* reg_cfg)
功能:得到gpio寄存器配置
参数:
参数 说明 gpio_index 所要获取的gpio引脚编号,引脚编号请参考gpio.h reg_cfg 存储要获取的reg_cfg 返回值:
返回值 说明 u8 0:成功 1:引脚超出范围,或者引脚未设定成gpio mode
7. FAQ¶
参考GPIO FAQ