GPIO子系统API函数

本文介绍了GPIO的管理,包括使用gpio_request申请GPIO,通过gpio_free释放资源,设置gpio_direction_input为输入模式,用gpio_direction_output设定输出模式并设置默认值,以及利用gpio_get_value读取和gpio_set_value设置GPIO电平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gpio_request

申请一个GPIO

int gpio_request(unsigned gpio, const char *label)

参数一:GPIO:要申请的 gpio 标号,使用 of_get_named_gpio 函数从设备树获取指定 GPIO 属性信息,此函数会返回这个 GPIO 的标号
参数二:GPIO标签(别名)
返回值:0,申请成功;其他值,申请失败


gpio_free

释放gpio资源

void gpio_free(unsigned gpio)

参数一:要释放的 gpio 标号


gpio_direction_input

设置GPIO为输入模式

int gpio_direction_input(unsigned gpio)

参数一:要释放的 gpio 标号
返回值:0,设置成功;负值,设置失败。


gpio_direction_output

设置某个 GPIO 为输出,并且设置默认输出值

int gpio_direction_output(unsigned gpio, int value)

参数一:gpio编号
参数二:默认输出值


gpio_get_value

读取gpio电平

#define gpio_get_value __gpio_get_value
int __gpio_get_value(unsigned gpio)

参数一:gpio编号


gpio_set_value

#define gpio_set_value __gpio_set_value
void __gpio_set_value(unsigned gpio, int value)

参数一:gpip编号
参数二:要设置的值

### GPIO 子系统的工作原理 GPIO(General Purpose Input/Output)子系统是一种通用的硬件接口机制,用于控制微处理器中的引脚状态。它允许开发者通过软件编程的方式配置和操作这些引脚的状态。根据提供的引用内容[^1],GPIO 子系统依赖于 pinctrl 子系统来完成某些功能性切换。 具体来说,`pin controller` 负责管理引脚的功能性切换,比如将引脚分配给 I2C、UART 或 SPI 等外设功能。而 `GPIO Controller` 则专注于提供基本的操作能力,例如设置引脚为输入或输出模式、读取或写入引脚值等简单功能。 当需要使用某个引脚控制外部设备(如 LED),通常会经历以下几个过程: - **使能时钟**:激活相关模块所需的电源与时钟资源。 - **配置引脚功能**:利用 pinctrl 子系统将引脚复用为 GPIO 功能。 - **配置电气属性**:调整驱动强度、上拉/下拉电阻等参数。 - **初始化 GPIO 方向**:调用 `gpio_direction_output()` 或 `gpio_direction_input()` 设置引脚为输入或输出模式。 - **控制电平**:通过 `gpio_set_value()` 函数改变引脚的高低电平状态[^2]。 ### GPIO 子系统的实现细节 在 Linux 内核中,GPIO 子系统的核心结构围绕着 `struct gpio_chip` 展开。这个数据结构定义了一个 GPIO 控制器的行为模型,并提供了多个回调函数指针以便实现特定平台的需求。以下是几个重要的成员及其作用: #### 1. `request()` 此函数负责申请指定编号的 GPIO 引脚供应用程序使用。如果成功,则返回零;否则返回错误码表示失败原因。需要注意的是,在实际应用过程中可能还需要额外处理一些特殊情况,因为并非所有平台上都完全支持这一标准接口[^3]。 #### 2. `direction_output() / direction_input()` 这两个方法分别用来设定目标 GPIO 的工作方向——即作为输出端还是输入端。它们内部可能会进一步调用底层硬件寄存器访问逻辑或者借助 pin control framework 完成最终转换。 ```c void rockchip_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value) { rockchip_gpio_set(gc, offset, value); pinctrl_gpio_direction_output(gc->base + offset); } ``` 上述代码片段展示了如何在一个典型的 Rockchip 平台上执行 output 模式的切换动作。这里不仅修改了具体的 bit 值还通知了 pinctrl subsystem 关于此变化的信息。 ### 使用方法总结 对于开发人员而言,最常用的 API 包括但不限于以下几种形式: - 请求并释放单条线路:`int gpio_request(unsigned gpio, const char *label)` 和 void gpio_free(unsigned gpio). - 配置出入类型:int gpio_direction_[output|input](unsigned gpio,int val). - 获取当前数值:int gpio_get_value(unsigned gpio),以及相应地更新新状态:void gpio_set_value(unsigned gpio,int value). 以上便是关于Linux环境下典型嵌入式架构下的GPIO子系统介绍.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuiStar_李什么恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值