gpio 介绍

观看视频了解更多
gpio 指通用输入/输出Pin,包括SOC 外围pin 或 外接扩展pin(比如I2C 转GPIO,电源管理芯片扩展gpio)。

  • 输入/输出,对应高低电平
  • 中断pin,通常边沿触发,可用于快速处理事件

gpio 接口

  • 新版本内核GPIO重新设计后,采用基于描述符的接口 了解更多
    用户空间接口: /dev/gpiochipn
  • 基于整数的老版本接口同样可以使用(Legacy GPIO Interfaces),以下文档介绍。
    用户空间接口: /sys/class/gpioN

虽然gpio 可以在用户空间(应用程序)中使用,但不建议在产品中直接使用,可以用于快速建立原型。

sysfs

用户程序可以通过sysfs 接口直接操作gpio。

1
2
3
4
cd /sys/class/gpio/
echo 100 > export
echo "out" > gpio100/direction
echo 1 > gpio100/value

驱动接口

旧接口采用整数描述PIN,0~MAX_INT, 不同模块上的pin 线性映射到系统中,比如soc pin、 iic转gpio-pin、FPGA pin。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <linux/gpio.h>

// 判断PIN 是否可用
int gpio_is_valid(int number);

// 申明使用GPIO,防止使用冲突
int gpio_request(unsigned gpio, const char *label);
//释放gpio
void gpio_free(unsigned gpio);


// 设置pin 输入输出方向
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);

// 设置、或取pin 脚状态
int gpio_get_value(unsigned gpio);
void gpio_set_value(unsigned gpio, int value);

gpiolib设计

待更新

gpio irq

GPIO 可以发生中断事件,以下常用接口,拿到irq num 后即可采用irq接口注册中断函数处理中断事件。

1
2
3
4
5
// gpio 编号转irq 中断号
int gpio_to_irq(unsigned gpio);

// irq 中断号转GPIO 编号
int irq_to_gpio(unsigned irq);

gpio 子系统

采用gpio 模拟设计

  • i2c-gpio: gpio 模拟iic 协议时序
  • gpio-keys: gpio 按键设计
  • leds-gpio: led灯控制
  • spi_gpio : gpio 模拟spi 协议时序

gpio pinctrl

pin 脚除了用作输入输出使用,还可以复用为spi,iic,adc 功能,内核设计为pinctrl 子系统(这里省略细节)。