GPIO使用参考


1. 概述

GPIO 采用标准的LINUX框架,能够使用统一的接口来操作gpio。

请查看硬件线路图上GPIO 的PAD name,查找这个表格,对应的num 就是你要操作的GPIO的 num。

例如:硬件线路图上的一个GPIO 是PAD_PM_GPIO8,如果要操作这个GPIO,对应的num =129。

开放使用的GPIO列表:

表1-1 GPIO NUM 与PAD对应表

PAD NUM PAD NUM PAD NUM PAD NUM
PAD_GPIO0 0 PAD_SR_IO06 28 PAD_SD_D0 56 PAD_ETH_TN 84
PAD_GPIO1 1 PAD_SR_IO07 29 PAD_SD_D1 57 PAD_ETH_TP 85
PAD_GPIO2 2 PAD_SR_IO08 30 PAD_SD_D2 58 PAD_USB_DM 86
PAD_GPIO3 3 PAD_SR_IO09 31 PAD_SD_D3 59 PAD_USB_DP 87
PAD_GPIO4 4 PAD_SR_IO10 32 PAD_PM_SD_CDZ 60 PAD_SD1_IO0 88
PAD_GPIO5 5 PAD_SR_IO11 33 PAD_PM_IRIN 61 PAD_SD1_IO1 89
PAD_GPIO6 6 PAD_SR_IO12 34 PAD_PM_GPIO0 62 PAD_SD1_IO2 90
PAD_GPIO7 7 PAD_SR_IO13 35 PAD_PM_GPIO1 63 PAD_SD1_IO3 91
PAD_GPIO8 8 PAD_SR_IO14 36 PAD_PM_GPIO2 64 PAD_SD1_IO4 92
PAD_GPIO9 9 PAD_SR_IO15 37 PAD_PM_GPIO3 65 PAD_SD1_IO5 93
PAD_GPIO12 10 PAD_SR_IO16 38 PAD_PM_GPIO4 66 PAD_SD1_IO6 94
PAD_GPIO13 11 PAD_SR_IO17 39 PAD_PM_GPIO7 67 PAD_SD1_IO7 95
PAD_GPIO14 12 PAD_UART0_RX 40 PAD_PM_GPIO8 68 PAD_SD1_IO8 96
PAD_GPIO15 13 PAD_UART0_TX 41 PAD_PM_GPIO9 69
PAD_FUART_RX 14 PAD_UART1_RX 42 PAD_PM_SPI_CZ 70
PAD_FUART_TX 15 PAD_UART1_TX 43 PAD_PM_SPI_CK 71
PAD_FUART_CTS 16 PAD_SPI0_CZ 44 PAD_PM_SPI_DI 72
PAD_FUART_RTS 17 PAD_SPI0_CK 45 PAD_PM_SPI_DO 73
PAD_I2C0_SCL 18 PAD_SPI0_DI 46 PAD_PM_SPI_WPZ 74
PAD_I2C0_SDA 19 PAD_SPI0_DO 47 PAD_PM_SPI_HLD 75
PAD_I2C1_SCL 20 PAD_SPI1_CZ 48 PAD_PM_LED0 76
PAD_I2C1_SDA 21 PAD_SPI1_CK 49 PAD_PM_LED1 77
PAD_SR_IO00 22 PAD_SPI1_DI 50 PAD_SAR_GPIO0 78
PAD_SR_IO01 23 PAD_SPI1_DO 51 PAD_SAR_GPIO1 79
PAD_SR_IO02 24 PAD_PWM0 52 PAD_SAR_GPIO2 80
PAD_SR_IO03 25 PAD_PWM1 53 PAD_SAR_GPIO3 81
PAD_SR_IO04 26 PAD_SD_CLK 54 PAD_ETH_RN 82
PAD_SR_IO05 27 PAD_SD_CMD 55 PAD_ETH_RP 83

2. 内核使用GPIO


2.1. 申请为gpio端口

  • 目的

    创建端口为GPIO。

  • 语法

    int gpio_request(unsigned gpio, const char *label)
    
  • 参数

    表2-1

    参数名称 描述
    gpio Gpio num
    label 具体名称
  • 返回值

    表2-2

    返回值 描述
    0 成功。
    Other 失败。

2.2. 设为输入

  • 目的

    标记gpio为输入。

  • 语法

    int gpio_direction_input(unsigned gpio);
    
  • 参数

    表2-3

    参数名称 描述
    gpio Gpio num
  • 返回值

    表2-4

    返回值 描述
    0 成功。
    Other 失败。

2.3. 设为输出

  • 目的

    标记gpio为输出。

  • 语法

    int gpio_direction_output(unsigned gpio, int value);
    
  • 参数

    表2-5

    参数名称 描述
    gpio Gpio num
    value 输出值
  • 返回值

    表2-6

    返回值 描述
    0 成功。
    Other 失败。

2.4. 获取输入电平

  • 目的

    获取输入引脚的电平。

  • 语法

    int gpio_get_value(unsigned gpio);
    
  • 参数

    表2-7

    参数名称 描述
    gpio Gpio num
  • 返回值

    表2-8

    返回值 描述
    Int 电平值

2.5. 设置输出电平

  • 目的

    设定输出引脚的电平。

  • 语法

    void gpio_set_value(unsigned gpio, int value);
    
  • 参数

    表2-8

    参数名称 描述
    gpio Gpio num
    value 输出值
  • 返回值

    表2-10

    返回值 描述
    0 成功
    Other 失败

3. 用户空间使用GPIO

用户空间访问gpio,即通过sysfs接口访问gpio

  • 下面是/sys/class/gpio目录下的三种文件: 

    • export/unexport文件

    • gpioN指代具体的gpio引脚

    • gpio_chipN指代gpio控制器

必须知道以上接口没有标准device文件和它们的链接。

图3-1


3.1. export/unexport文件接口

/sys/class/gpio/export,该接口只能写不能读。

用户程序通过写入gpio的编号来向内核申请将某个gpio的控制权导出到用户空间,前提是没有内核代码申请这个gpio端口,如用户申请编号为12的GPIO的命令:

echo 12 > export

上述操作会为12号gpio创建一个节点gpio12,此时/sys/class/gpio目录下边生成一个gpio12的目录,如下图所示:

图3-2

/sys/class/gpio/unexport和导出的效果相反,比如移除gpio12这个节点操作命令:

echo 12 > unexport

上述操作将会移除gpio12这个节点,如下图所示:

图3-3


3.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)函数就会返回。

图3-4


3.3. 示例

非中断模式

读操作:int getGpioValue(int port),传入要读去掉端口号,返回该端口值(0或1);

写操作:void setGpioValue(int port, int value),传入要设置的端口号和值。


4. UBOOT使用GPIO


4.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)

4.2. API


4.2.1. 设为输入

  • 目的

    标记gpio为输入。

  • 语法

    void MDrv_GPIO_Pad_Odn(MS_GPIO_NUM u32IndexGPIO);
    
  • 参数

    表4-1

    参数名称 描述
    u32IndexGPIO Gpio num
  • 返回值

    表4-2

    返回值 描述
    void

4.2.2. 设为输出

  • 目的

    标记gpio为输出。

  • 语法

    void MDrv_GPIO_Pad_Oen(MS_GPIO_NUM u32IndexGPIO);
    
  • 参数

    表4-3

    参数名称 描述
    u32IndexGPIO Gpio num
  • 返回值

    表4-4

    返回值 描述
    Void

4.2.3. 获取输入电平

  • 目的

    获取输入引脚的电平。

  • 语法

    U8 MDrv_GPIO_Pad_Read(MS_GPIO_NUM u32IndexGPIO);
    
  • 参数

    表4-5

    参数名称 描述
    u32IndexGPIO Gpio num
  • 返回值

    表4-6

    返回值 描述
    unsigned char 电平值

4.2.4. 设置输出高电平

  • 目的

    设定该引脚为高电平。

  • 语法

    void MDrv_GPIO_Pull_High(MS_GPIO_NUM u32IndexGPIO);
    
  • 参数

    表4-7

    参数名称 描述
    gpio Gpio num

4.2.5. 设置输出低电平

  • 目的

    设定该引脚为低电平。

  • 语法

    void MDrv_GPIO_Pull_Low(MS_GPIO_NUM u32IndexGPIO);
    
  • 参数

    表4-8

    参数名称 描述
    gpio Gpio num