GPIO使用参考

Version 0.1


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