linux驱动之GPIO子系统

一、前言

在嵌入式中,GPIO作为一个常用的信息输入输出手段经常被用在各种场合,那么今天本文就来简单地说一下嵌入式linux中的GPIO子系统。本文为笔者的理解,如果错漏还望指出

二、GPIO子系统介绍

在嵌入式linux中,GPIO引脚 通常联系在一起。但是在嵌入式linux系统的代码结构中,他们的关系远比我们想象的复杂。

2.1 pinctrl

在嵌入式linux中,用 pin control subsystem 来对一款芯片的引脚进行管理,我们经常在设备树中看到 pinctrl 这样的节点,其实就是 引脚控制子系统 驱动的设备树节点。该子系统的帮助各个驱动设备管理引脚,包括 引脚功能复用(pin multiplexing)引脚配置(pin configuration)(如输出电平及上下拉电阻) 等。所以其他的设备驱动在调用 pin control subsystem 提供的接口来对本驱动所需要的引脚进行相关功能的配置。
各个设备如果需要复用引脚,则在设备树的 pinctrl 对各个设备的引脚进行配置,将这些配置作为 pinctrl 的子节点,然后设备驱动在自己的设备树节点中引脚这些配置节点
一般 ARM soc 的数据手册会把 pin controller 的内容放入 GPIO controller 的章节中,各个设备可以通过自己节点的属性来指向 pinctrl 的某个子节点,也就是 pin configuration 来获取相应的引脚配置

2.1 GPIO子系统

GPIO子系统 相对于 pin control subsystem 来说是更加上层的子系统,它将 引脚 配置为 GPIO 并且控制其输入输出,所以从这方面来看,GPIO引脚 在系统软件层面并不是一个概念

三、GPIO子系统使用

3.1 应用使用方法

应用层的使用放到相对简单,可以直接通过 sysfs 来操作 GPIO口

  1. 使用命令 echo num > /sys/class/gpio/export 导出 GPIO口,其中 numGPIO口 的编号
  2. 导出后会生成节点 /sys/class/gpio/gpioN
  3. 通过读写(比如使用 echocat 等工具)生成的节点来获取 GPIO口 的信息及状态

3.2 驱动使用方法

3.2.1 获取设备树信息

获取 GPIO口 信息的设备树接口 在of_gpio.h,这里不做详细讲解,读者们可以直接通过接口函数的命名来熟悉使用方法

另外,关于 GPIO口 设备树节点的属性命名方式是一般为 name-gpios , 其中 name 通常用于指该 GPIO口在设备里的具体用途。比如用于复位,则属性可以命名为 reset-gpios,举例在设备树中表示为 reset-gpios = <&gpio1 15 1>。在驱动中使用 of_get_named_gpi函数 返回值来得到对应的 GPIO号

3.2.2 接口说明

int gpio_request(unsigned gpio, const char *label)

  1. 作用:申请GPIO
  2. 参数分析:
  • unsigned gpio:gpio端口号
  • const char *label:给该gpio端口起的名字
  1. 返回值:
  • 成功返回0
  • 失败返回负数的错误码

int gpio_direction_output(unsigned gpio, int value)

  1. 作用:GPIO的初始化为输出,并设置输出电平:
  2. 参数分析:
  • unsigned gpio:gpio端口号
  • int value:输出值

int gpio_direction_input(unsigned gpio)

  1. 作用:初始化为输入
  2. 参数分析:
  • unsigned gpio:gpio端口号

void gpio_set_value(unsigned gpio, int value)

  1. 作用:GPIO的输出电平设置:
  2. 参数分析:
  • unsigned gpio:gpio端口号
  • int value:输出值

int gpio_get_value(unsigned gpio)

  1. 作用:得到GPIO的电平
  2. 参数分析:
  • unsigned gpio:gpio端口号

void gpio_free(unsigned gpio)

  1. 作用:释放GPIO
  2. 参数分析:
  • unsigned gpio:gpio端口号

int gpio_to_irq(unsigned gpio)

  1. 作用:申请GPIO口中断,返回的值即中断编号可以传给request_irq()和free_irq()
  2. 参数分析:
  • unsigned gpio:gpio端口号

int gpio_export(unsigned gpio, bool direction_may_change)
内核可以对已经被gpio_request()申请的gpio端口的导出进行明确的管理,

  1. 参数分析:
  • unsigned gpio:gpio端口号
  • direction_may_change:表示用户程序是否允许修改gpio的方向,假如可以则参数direction_may_change为真

void gpio_unexport(unsigned gpio)

  1. 作用:撤销GPIO的导出
  2. 参数分析:
  • unsigned gpio:gpio端口号

四、参考链接

应用层使用GPIO:https://blog.csdn.net/mirkerson/article/details/8464290
gpio_direction_output 和 gpio_set_value之间的使用关系https://blog.csdn.net/zhaoqi2617/article/details/53082813

你可能感兴趣的:(linux驱动之GPIO子系统)