GPIO使用参考
1. 概述¶
GPIO 采用标准的LINUX框架,能够使用统一的接口来操作gpio。
2. GPIO NUM 与PAD对应表¶
请查看硬件线路图上GPIO 的PAD name,查找表格,对应的num 就是要操作的GPIO的num。
例如:硬件线路图上的一个GPIO 是PAD_PM_GPIO7,如果要操作这个GPIO,对应的num=13。
开放用的GPIO列表:
PAD | NUM | PAD | NUM | PAD | NUM | PAD | NUM | PAD | NUM |
---|---|---|---|---|---|---|---|---|---|
PAD_PM_UART_RX1 | 0 | PAD_FUART_TX | 33 | PAD_SR0_IO14 | 66 | PAD_TX1_IO07 | 99 | PAD_HDMITX_SDA | 132 |
PAD_PM_UART_TX1 | 1 | PAD_FUART_CTS | 34 | PAD_SR0_IO15 | 67 | PAD_TX1_IO08 | 100 | PAD_HDMITX_SCL | 133 |
PAD_PM_UART_RX | 2 | PAD_FUART_RTS | 35 | PAD_SR0_IO16 | 68 | PAD_TX1_IO09 | 101 | PAD_VSYNC_OUT | 134 |
PAD_PM_UART_TX | 3 | PAD_I2C0_SCL | 36 | PAD_SR0_IO17 | 69 | PAD_TTL0 | 102 | PAD_HSYNC_OUT | 135 |
PAD_PM_I2CM_SCL | 4 | PAD_I2C0_SDA | 37 | PAD_SR0_IO18 | 70 | PAD_TTL1 | 103 | PAD_GPIO8 | 136 |
PAD_PM_I2CM_SDA | 5 | PAD_ETH_LED0 | 38 | PAD_SR0_IO19 | 71 | PAD_TTL2 | 104 | PAD_GPIO9 | 137 |
PAD_PM_GPIO0 | 6 | PAD_ETH_LED1 | 39 | PAD_SR1_IO00 | 72 | PAD_TTL3 | 105 | PAD_GPIO10 | 138 |
PAD_PM_GPIO1 | 7 | PAD_SPI_DO | 40 | PAD_SR1_IO01 | 73 | PAD_TTL4 | 106 | PAD_GPIO11 | 139 |
PAD_PM_GPIO2 | 8 | PAD_SPI_DI | 41 | PAD_SR1_IO02 | 74 | PAD_TTL5 | 107 | PAD_GPIO12 | 140 |
PAD_PM_GPIO3 | 9 | PAD_SPI_CK | 42 | PAD_SR1_IO03 | 75 | PAD_TTL6 | 108 | PAD_GPIO13 | 141 |
PAD_PM_GPIO4 | 10 | PAD_SPI_CZ | 43 | PAD_SR1_IO04 | 76 | PAD_TTL7 | 109 | PAD_GPIO14 | 142 |
PAD_PM_GPIO5 | 11 | PAD_GPIO0 | 44 | PAD_SR1_IO05 | 77 | PAD_TTL8 | 110 | PAD_GPIO15 | 143 |
PAD_PM_GPIO6 | 12 | PAD_GPIO1 | 45 | PAD_SR1_IO06 | 78 | PAD_TTL9 | 111 | PAD_GPIO16 | 144 |
PAD_PM_GPIO7 | 13 | PAD_GPIO2 | 46 | PAD_SR1_IO07 | 79 | PAD_TTL10 | 112 | PAD_SD_GPIO0 | 145 |
PAD_PM_SPI_CZ | 14 | PAD_GPIO3 | 47 | PAD_SR1_IO08 | 80 | PAD_TTL11 | 113 | PAD_SD1_GPIO0 | 146 |
PAD_PM_SPI_CK | 15 | PAD_GPIO4 | 48 | PAD_SR1_IO09 | 81 | PAD_TTL12 | 114 | PAD_SD1_GPIO1 | 147 |
PAD_PM_SPI_DI | 16 | PAD_GPIO5 | 49 | PAD_SR1_IO10 | 82 | PAD_TTL13 | 115 | PAD_SD1_CDZ | 148 |
PAD_PM_SPI_DO | 17 | PAD_GPIO6 | 50 | PAD_SR1_IO11 | 83 | PAD_TTL14 | 116 | PAD_SD1_D1 | 149 |
PAD_PM_SPI_WPZ | 18 | PAD_GPIO7 | 51 | PAD_SR1_IO12 | 84 | PAD_TTL15 | 117 | PAD_SD1_D0 | 150 |
PAD_PM_SPI_HLD | 19 | PAD_SR0_IO00 | 52 | PAD_SR1_IO13 | 85 | PAD_TTL16 | 118 | PAD_SD1_CLK | 151 |
PAD_PM_IRIN | 20 | PAD_SR0_IO01 | 53 | PAD_SR1_IO14 | 86 | PAD_TTL17 | 119 | PAD_SD1_CMD | 152 |
PAD_SAR_GPIO0 | 21 | PAD_SR0_IO02 | 54 | PAD_SR1_IO15 | 87 | PAD_TTL18 | 120 | PAD_SD1_D3 | 153 |
PAD_SAR_GPIO1 | 22 | PAD_SR0_IO03 | 55 | PAD_SR1_IO16 | 88 | PAD_TTL19 | 121 | PAD_SD1_D2 | 154 |
PAD_SAR_GPIO2 | 23 | PAD_SR0_IO04 | 56 | PAD_SR1_IO17 | 89 | PAD_TTL20 | 122 | PAD_ETH_RN | 155 |
PAD_SAR_GPIO3 | 24 | PAD_SR0_IO05 | 57 | PAD_SR1_IO18 | 90 | PAD_TTL21 | 123 | PAD_ETH_RP | 156 |
PAD_SD0_CDZ | 25 | PAD_SR0_IO06 | 58 | PAD_SR1_IO19 | 91 | PAD_TTL22 | 124 | PAD_ETH_TN | 157 |
PAD_SD0_D1 | 26 | PAD_SR0_IO07 | 59 | PAD_TX1_IO00 | 92 | PAD_TTL23 | 125 | PAD_ETH_TP | 158 |
PAD_SD0_D0 | 27 | PAD_SR0_IO08 | 60 | PAD_TX1_IO01 | 93 | PAD_TTL24 | 126 | PAD_DM_P0 | 159 |
PAD_SD0_CLK | 28 | PAD_SR0_IO09 | 61 | PAD_TX1_IO02 | 94 | PAD_TTL25 | 127 | PAD_DP_P0 | 160 |
PAD_SD0_CMD | 29 | PAD_SR0_IO10 | 62 | PAD_TX1_IO03 | 95 | PAD_TTL26 | 128 | PAD_DM_P1 | 161 |
PAD_SD0_D3 | 30 | PAD_SR0_IO11 | 63 | PAD_TX1_IO04 | 96 | PAD_TTL27 | 129 | PAD_DP_P1 | 162 |
PAD_SD0_D2 | 31 | PAD_SR0_IO12 | 64 | PAD_TX1_IO05 | 97 | PAD_SATA_GPIO0 | 130 | ||
PAD_FUART_RX | 32 | PAD_SR0_IO13 | 65 | PAD_TX1_IO06 | 98 | PAD_HDMITX_HPD | 131 |
3. 内核使用GPIO¶
3.1. 申请为gpio端口¶
-
目的
创建端口为GPIO。
-
语法
int gpio_request(unsigned gpio, const char *label)
-
参数
参数名称 描述 gpio Gpio num label 具体名称 -
返回值
返回值 描述 0 成功。 Other 失败。
3.2. 设为输入¶
-
目的
标记gpio为输入。
-
语法
int gpio_direction_input(unsigned gpio);
-
参数
参数名称 描述 gpio Gpio num -
返回值
返回值 描述 0 成功。 Other 失败。
3.3. 设为输出¶
-
目的
标记gpio为输出。
-
语法
int gpio_direction_output(unsigned gpio, int value);
-
参数
参数名称 描述 gpio Gpio num value 输出值 -
返回值
返回值 描述 0 成功。 Other 失败。
3.4. 获取输入电平¶
-
目的
获取输入引脚的电平。
-
语法
int gpio_get_value(unsigned gpio);
-
参数
参数名称 描述 gpio Gpio num -
返回值
返回值 描述 Int 电平值
3.5. 设置输出电平¶
-
目的
设定输出引脚的电平。
-
语法
void gpio_set_value(unsigned gpio, int value);
-
参数
参数名称 描述 gpio Gpio num value 输出值 -
返回值
返回值 描述 0 成功。 Other 失败。
4. 用户空间使用GPIO¶
用户空间访问gpio,即通过sysfs接口访问gpio
下面是/sys/class/gpio目录下的三种文件:
--export/unexport文件
--gpioN指代具体的gpio引脚
--gpio_chipN指代gpio控制器
必须知道以上接口没有标准device文件和它们的链接。
4.1. export/unexport文件接口¶
/sys/class/gpio/export,该接口只能写不能读。
用户程序通过写入gpio的编号来向内核申请将某个gpio的控制权导出到用户空间,前提是没有内核代码申请这个gpio端口,如用户申请编号为12的GPIO的命令:
echo 12 > export
上述操作会为12号gpio创建一个节点gpio12,此时/sys/class/gpio目录下边生成一个gpio12的目录,如下图所示:
/sys/class/gpio/unexport和导出的效果相反,比如移除gpio12这个节点操作命令:
echo 12 > unexport
上述操作将会移除gpio12这个节点,如下图所示:
4.2. /sys/class/gpio/gpioN¶
指代某个具体的gpio端口,里边有如下属性文件:
**direction**表示gpio端口的方向,读取结果是in或out。也可以对该文件进行写操作,写入out 时该gpio设为输出同时电平默认为低。写入low或high时不仅可以设置为输出还可以设置指定的输出电平。 当然如果内核不支持或者内核代码不愿意,将不会存在这个属性,比如内核调用了gpio_export(N,0)就表示内核不愿意修改gpio端口方向属性 。
**value**表示gpio引脚的电平,0表示低电平,1表示高电平;如果gpio被配置为输出,这个值是可写的,记住任何非零的值都将输出为高电平。如果某个引脚被配置为中断,则可以调用poll(2)函数监听该中断,中断触发后poll(2)函数就会返回。
4.3. 示例¶
非中断模式
读操作:int getGpioValue(int port),传入要读去掉端口号,返回该端口值(0或1);
写操作:void setGpioValue(int port, int value),传入要设置的端口号和值。
5. UBOOT使用GPIO¶
5.1. CMD:gpio -Config gpio port¶
Usage:
gpio (for 2nd parameter, you must type at least 3 characters) gpio output <gpio#> <1/0> : ex: gpio output 69 1 gpio input/get <gpio#> : ex: gpio input 10 (gpio 10 set as input) gpio toggle <gpio#> : ex: gpio tog 49 (toggle) gpio state <gpio#> : ex: gpio sta 49 (get i/o status(direction) & pin status) gpio list [num_of_pins] : ex: gpio list 10 (list GPIO1~GPIO10 status)
5.2. API¶
5.2.1. 设为输入¶
-
目的
标记gpio为输入。
-
语法
void MDrv_GPIO_Pad_Odn(MS_GPIO_NUM u32IndexGPIO);
-
参数
参数名称 描述 u32IndexGPIO Gpio num -
返回值
返回值 描述 void
5.2.2. 设为输出¶
-
目的
标记gpio为输出。
-
语法
void MDrv_GPIO_Pad_Oen(MS_GPIO_NUM u32IndexGPIO);
-
参数
参数名称 描述 u32IndexGPIO Gpio num -
返回值
返回值 描述 Void
5.2.3. 获取输入电平¶
-
目的
获取输入引脚的电平。
-
语法
U8 MDrv_GPIO_Pad_Read(MS_GPIO_NUM u32IndexGPIO);
-
参数
参数名称 描述 u32IndexGPIO Gpio num -
返回值
返回值 描述 unsigned char 电平值
5.2.4. 设置输出高电平¶
-
目的
设定该引脚为高电平。
-
语法
void MDrv_GPIO_Pull_High(MS_GPIO_NUM u32IndexGPIO);
-
参数
参数名称 描述 gpio Gpio num
5.2.5. 设置输出低电平¶
-
目的
设定该引脚为低电平。
-
语法
void MDrv_GPIO_Pull_Low(MS_GPIO_NUM u32IndexGPIO);
-
参数
参数名称 描述 gpio Gpio num