linux gpio dev,linux gpio子系统 devicetree中GPIO_ACTIVE_LOW

本文详细解释了GPIO_ACTIVE_LOW和GPIO_ACTIVE_HIGH的概念及其在实际应用中的意义,通过具体实例展示了如何根据硬件特性调整GPIO配置来实现预期的功能。
AI助手已提取文章相关产品:

一直没怎么理解GPIO_ACTIVE_LOW的作用

对于以上的dts你应该再熟悉不过,当然这里不是教你如何使用dts,而是关注gpio和irq最后一个数字可以如何利用。例如rst-gpio的OF_GPIO_ACTIVE_LOW代表什么意思呢?

可以理解为低有效。什么意思呢?举个例子,正常情况下,我们需要一个gpio口控制灯,我们认为灯打开就是active状态。对于一个程序员来说,我们可以封装一个函数,写1就是打开灯,写0就是关灯。

但是对于硬件来说,变化的是gpio口的电平状态。如果gpio输出高电平灯亮,那么这就是高有效。如果硬件设计是gpio输出低电平灯亮,那么就是低有效。对于一个软件工程师来说,我们的期望是写1就是亮灯,写0就是关灯。

我可不管硬件工程师是怎么设计的。我们可以认为dts是描述具体的硬件。因此对于驱动来说,硬件的这种变化,只需要修改dts即可。软件不用任何修改。

还有有点模糊,但大概知道是将硬件逻辑隔离开来的意思。

后来突然自己想通了

gpio_set_value(led_dev.led_no,0);

gpio_set_value(led_dev.led_no,1);

gpio_set_value 设置的是逻辑电平,1 有效 0 无效

如果GPIO_ACTIVE_LOW  那么 1 有效 就是低电平 0 无效 就是高电平 (物理电平)

如果GPIO_ACTIVE_HIGH  那么 1 有效 就是高电平 0 无效 就是低电平 (物理电平)

led-gpio = ;

/* Bit 0 express polarity */

#define GPIO_ACTIVE_HIGH 0

#define GPIO_ACTIVE_LOW 1

所以是GPIO_ACTIVE_HIGH

PCB上低电平点亮,高定平熄灭

if(sta==LEDON){

gpio_set_value(led_dev.led_no,0); //0无效低电平点亮

}else if(sta==LEDOFF){

gpio_set_value(led_dev.led_no,1); //1有效高电平熄灭

}

感觉逻辑反了

应该是GPIO_ACTIVE_LOW 低有效 点亮灯

1 是点灯 0是熄灭 1开0关

您可能感兴趣的与本文相关内容

<think>我们继续讨论设备树中GPIO属性的配置,特别是GPIO_ACTIVE_HIGH和GPIO_ACTIVE_LOW标志的作用。 用户的问题:设备树GPIO属性中GPIO_ACTIVE_HIGH和GPIO_ACTIVE_LOW的作用 根据引用[1][3][4],我们可以总结如下: 在设备树中,GPIO属性通常定义为: `<&gpio_controller phandle, GPIO引脚号, 标志>` 其中标志常用的有GPIO_ACTIVE_HIGH(0)和GPIO_ACTIVE_LOW(1)。 作用: 1. **电平极性指示**:该标志指示了GPIO的有效电平。它告诉驱动程序,当需要激活该GPIO(比如使能一个设备)时,应该输出什么电平。 - `GPIO_ACTIVE_HIGH`(0):表示高电平有效。即,当我们需要“激活”该GPIO控制的设备时,应该设置该GPIO为高电平(逻辑1);反之,设置低电平(逻辑0)来关闭设备。 - `GPIO_ACTIVE_LOW`(1):表示低电平有效。即,激活设备时需要设置低电平(逻辑0),关闭时设置高电平(逻辑1)。 2. **软件抽象层**:这个标志使得驱动代码可以忽略硬件连接上的差异。无论硬件设计是高有效还是低有效,驱动开发者都可以在代码中统一使用“1”表示激活(使能),使用“0”表示关闭。具体电平转换由GPIO子系统内部处理[^4]。 例如,引用[4]中描述: > 对于一个软件工程师来说,我们的期望是写1就是亮灯,写0就是关灯。 如果硬件设计是GPIO输出低电平时灯亮(即低有效),那么在设备树中我们就应该设置`GPIO_ACTIVE_LOW`。这样,当驱动调用`gpiod_set_value(desc, 1)`时,GPIO子系统会自动输出低电平(因为设置了ACTIVE_LOW,所以值1对应物理低电平),灯亮;反之,调用`gpiod_set_value(desc, 0)`则输出高电平,灯灭。 3. **中断边沿设置**:除了控制输出,这个标志也会影响中断的触发方式。例如,如果一个中断是低电平触发,且GPIO是低有效(ACTIVE_LOW),那么GPIO子系统会将中断配置为低电平触发。这样,当硬件信号为低电平时,触发中断。 4. **读取状态**:同样,当读取输入GPIO的状态时,GPIO子系统会根据这个标志进行转换。例如,对于ACTIVE_LOWGPIO,如果硬件电平为低,那么`gpiod_get_value()`会返回1(表示激活状态),反之返回0。 总结:`GPIO_ACTIVE_HIGH/LOW`标志是设备树提供给GPIO子系统的重要信息,用于统一硬件逻辑与软件逻辑,使得驱动代码不必关心硬件的物理连接方式(高有效还是低有效),只需关注逻辑状态(1为激活,0为关闭)[^1][^3][^4]。 --- ### 示例:设备树中的配置 ```dts // 高有效:驱动写1输出高电平,写0输出低电平 enable-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; // 低有效:驱动写1输出低电平,写0输出高电平 reset-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>; ``` 在驱动中使用: ```c struct gpio_desc *enable_gpio, *reset_gpio; enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); // 激活enable(输出高电平) gpiod_set_value(enable_gpio, 1); // 复位设备(输出低电平,因为reset是低有效,所以激活复位) gpiod_set_value(reset_gpio, 1); // 释放复位(输出高电平) gpiod_set_value(reset_gpio, 0); ``` 注意:在获取GPIO描述符时,初始化状态(如`GPIOD_OUT_LOW`)也是逻辑状态。对于ACTIVE_LOWGPIO,设置为`GPIOD_OUT_LOW`意味着输出高电平(因为逻辑0对应物理高电平)[^4]。 --- ### 相关问题 1. 设备树中如何配置一个低电平有效的GPIO中断? 2. 在Linux驱动中,如何根据设备树配置自动设置GPIO的初始状态? 3. GPIO_ACTIVE_HIGH和GPIO_ACTIVE_LOW在中断处理中有什么影响? 4. 如果设备树中未指定GPIOACTIVE标志,默认是什么? </think>### 设备树GPIO属性中GPIO_ACTIVE_HIGH/LOW的作用 在Linux设备树(DTS)中,`GPIO_ACTIVE_HIGH`和`GPIO_ACTIVE_LOW`是控制**GPIO信号极性**的关键标志,用于统一硬件物理电平与软件逻辑状态。它们的主要作用如下: #### 1. **电平极性转换(核心功能)** - **`GPIO_ACTIVE_HIGH`**: - 物理高电平 = 逻辑激活状态(1) - 物理低电平 = 逻辑关闭状态(0) - $$ \begin{cases} \text{物理高电平} \rightarrow \text{逻辑1(激活)} \\ \text{物理低电平} \rightarrow \text{逻辑0(关闭)} \end{cases} $$ - **`GPIO_ACTIVE_LOW`**: - 物理低电平 = 逻辑激活状态(1) - 物理高电平 = 逻辑关闭状态(0) - $$ \begin{cases} \text{物理低电平} \rightarrow \text{逻辑1(激活)} \\ \text{物理高电平} \rightarrow \text{逻辑0(关闭)} \end{cases} $$ #### 2. **软件逻辑统一(设计优势)** 无论硬件如何设计,驱动代码只需关注**逻辑状态**: ```c gpiod_set_value(gpio, 1); // 总是表示“激活设备” gpiod_set_value(gpio, 0); // 总是表示“关闭设备” ``` - 示例:控制LED时: - 写1亮灯,写0灭灯(与硬件设计无关) - 实际物理电平由`GPIO_ACTIVE_*`自动转换[^4] #### 3. **中断触发配置** 该标志会同步影响中断触发方式: - `GPIO_ACTIVE_HIGH` → 默认上升沿/高电平触发 - `GPIO_ACTIVE_LOW` → 默认下降沿/低电平触发[^2] #### 4. **硬件设计解耦** 解决硬件连接差异: | 硬件设计 | 设备树标志 | 驱动代码行为 | |----------------|---------------------|--------------------------| | 高电平点亮LED | `GPIO_ACTIVE_HIGH` | `set(1)`亮,`set(0)`灭 | | 低电平点亮LED | `GPIO_ACTIVE_LOW` | `set(1)`亮,`set(0)`灭 | > 通过此机制,同一驱动可兼容不同硬件方案[^4]。 #### 典型设备树配置 ```dts // 高有效:物理高电平=激活 enable-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; // 低有效:物理低电平=激活 reset-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>; ``` ### 相关问题 1. 如何在Linux驱动中正确处理`GPIO_ACTIVE_LOW`的中断触发? 2. 设备树未指定`GPIO_ACTIVE_*`时的默认行为是什么? 3. 对于开漏(Open-Drain)GPIO是否需要特殊处理极性标志? 4. 如何通过sysfs读取带有极性转换的GPIO状态?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值