GPIO
GPIO 简介
GPIO(General Purpose Input/Output,通用输入输出)。可能是芯片自带的,也可能通过 I2C、SPI 接口扩展。GPIO 子系统的作用是既能支持芯片本身的 GPIO,也能支持扩展的 GPIO,为系统提供统一的、简便的访问接口,从而实现输入、输出、中断等功能。芯 片内部有很多引脚,这些引脚可以接到 GPIO 模块,也可以接到 I2C 等模块。通过 Pinctrl 子系统来选择引脚的功能 (mux function)、配置引脚。当一个引脚被复用为 GPIO 功能时,可设置其方向、读取或写入电平值。
GPIO 开发框架
Linux 内核为 GPIO 提供了开发基本框架:
核心 API
GPIO Chip 加载完成后,即可通过 Linux 内核提供的标准接口控制 GPIO。GPIOLIB 向上提供了常用的基本接口如下,这些接口定义在 linux/gpio/consumer.h 中:
| API | Function | 备注 |
|---|---|---|
gpiod_get / devm_gpiod_get | 获取 idx 为 0 的句柄,返回 gpio_desc 类型的指针,适用于单个引脚 | 示例:gpiod_get(dev, "client", 0);DTS 写法:client-gpios = <&gpio_peri MT_GPIO_GLB_NO(81) GPIO_ACTIVE_HIGH>; |
gpiod_get_index / devm_gpiod_get_index | 获取指定 idx 的句柄,返回 gpio_desc 类型的指针,适用于定义多个 GPIO 引脚 | 示例:gpiod_get_index(dev, "client", 1);DTS 写法:client-gpios = <&gpio_peri MT_GPIO_GLB_NO(81) GPIO_ACTIVE_HIGH>, <&gpio_peri MT_GPIO_GLB_NO(237) GPIO_ACTIVE_HIGH>; |
gpiod_get_array / devm_gpiod_get_array | 一次性获取多个 GPIO 引脚,返回 gpio_descs 类型数组指针,通过 descs->ndescs 获取数量 | 示例:descs = gpiod_get_array(dev, "client", 0);DTS 写法:client-gpios = <&gpio_peri MT_GPIO_GLB_NO(81) GPIO_ACTIVE_HIGH>, <&gpio_peri MT_GPIO_GLB_NO(236) GPIO_ACTIVE_HIGH>, <&gpio_peri MT_GPIO_GLB_NO(237) GPIO_ACTIVE_HIGH>; |
gpiod_get_value | 获取 GPIO 的电平值 | desc 需通过 gpiod_get_xxx 获取 |
gpiod_set_value | 设置 GPIO 的电平值 | desc 需通过 gpiod_get_xxx 获取 |
gpiod_direction_input | 设置 GPIO 为输入功能 | 示例:gpiod_direction_input(desc); desc 需通过 gpiod_get_xxx 获取 |
gpiod_direction_output | 设置 GPIO 为输出功能 | 示例:gpiod_direction_output(desc, value); desc 需通过 gpiod_get_xxx 获取 |
gpiod_put_array | 释放多个 GPIO 资源,与 gpiod_get_array 配对使用 | desc 需通过 gpiod_get_xxx 获取 |
gpiod_free | 释放单个 GPIO 资源,与 gpiod_get / gpiod_get_index 配对使用 | 示例:gpiod_free(desc); desc 需通过 gpiod_get_xxx 获取 |