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

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

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

一直没怎么理解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>我们正在讨论的是RV1126平台上使用Linux自带的gpio-keys驱动来配置和使用GPIO按键。 根据用户的问题,他想要了解如何配置和使用Linux自带的gpio_key功能,而不是自己从头编写驱动。 因此,我们将重点放在设备树配置和系统自带驱动的使用上。 参考引用: [1] 提到了在设备树中配置,并修改驱动源码(但这里我们尽量使用系统自带的驱动,避免修改驱动源码) [2] 提到按键驱动和LED驱动类似,都是操作GPIO,但按键使用输入子系统(input subsystem) [3] 提供了一个设备树配置的示例,在rp-rv1126.dts中配置gpio0b7作为按键,并设置中断类型为下降沿触发 [4] 提到了手动创建设备节点,但gpio-keys驱动会自动创建,所以不需要手动创建 因此,我们的回答将围绕设备树配置和测试方法展开。 步骤: 1. 设备树配置(使用gpio-keys驱动) 2. 编译设备树并更新 3. 测试按键事件 注意:RV1126的GPIO编号规则,例如GPIO0_B7对应的编号是0*32 + 1*8 + 7 = 15(但实际在设备树中我们使用宏RK_PB7,它会自动计算) 在驱动中,我们使用gpio-keys驱动,它已经在内核中,我们只需要在设备树中配置好即可。 设备树配置示例(参考引用[3]并修改为符合标准gpio-keys的方式):</think>### RV1126 Linux系统配置GPIO按键驱动指南 #### 一、设备树配置(关键步骤) 在设备树中正确配置是使用Linux自带gpio-keys驱动的基础: 1. **基础配置框架** (在`rp-rv1126.dts`中添加) ```dts keys { compatible = "gpio-keys"; pinctrl-names = "default"; pinctrl-0 = <&key_pins>; // 关联pinctrl配置 power { label = "Power Key"; gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>; // GPIO0_B7 linux,code = <KEY_POWER>; // 按键键值 debounce-interval = <20>; // 20ms消抖时间 wakeup-source; // 支持唤醒系统 }; }; ``` 2. **Pinctrl配置** (在pinctrl节点中添加) ```dts &pinctrl { key_pins: key-pins { rockchip,pins = <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>; }; }; ``` - `RK_FUNC_GPIO`:配置为GPIO功能[^3] - `&pcfg_pull_up`:启用内部上拉电阻(防止悬空状态) - `GPIO_ACTIVE_LOW`:低电平有效(按下时GPIO为低电平) #### 二、驱动启用与编译 1. **内核配置**(确保启用gpio-keys驱动): ```bash make menuconfig ``` 路径: ``` Device Drivers ---> Input device support ---> [*] Keyboards ---> <*> GPIO Buttons ``` 2. **编译并更新设备树**: ```bash make rp-rv1126.dtb cp arch/arm/boot/dts/rp-rv1126.dtb /boot/ ``` #### 三、系统启动后验证 1. **检查驱动加载**: ```bash dmesg | grep gpio-keys # 成功输出示例:input: Power Key as /devices/platform/keys/input/input0 ``` 2. **查看输入设备**: ```bash ls /sys/class/input/input*/name # 应显示配置的按键名称:"Power Key" ``` 3. **测试按键事件**: ```bash # 安装测试工具 sudo apt install evtest # 检测按键事件 sudo evtest ``` 选择对应设备后,按下按键应看到类似输出: ``` Event: time 167248.123456, type 1 (EV_KEY), code 116 (KEY_POWER), value 1 Event: time 167248.125678, -------------- SYN_REPORT ------------ Event: time 167248.128901, type 1 (EV_KEY), code 116 (KEY_POWER), value 0 ``` #### 四、高级功能配置 1. **多按键配置**: ```dts keys { // ... volume_up { label = "Volume Up"; gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_LOW>; linux,code = <KEY_VOLUMEUP>; }; volume_down { label = "Volume Down"; gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>; linux,code = <KEY_VOLUMEDOWN>; }; }; ``` 2. **自定义消抖时间**(根据硬件特性调整): ```dts power { // ... debounce-interval = <30>; // 30ms消抖时间 }; ``` 3. **唤醒功能调试**: ```bash # 查看唤醒能力 cat /sys/devices/platform/keys/power/wakeup # 测试唤醒功能 echo enabled > /sys/devices/platform/keys/power/wakeup echo mem > /sys/power/state # 进入睡眠 ``` #### 五、常见问题解决 1. **按键无响应**: - 检查GPIO复用:`cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins` - 测量电压:按下时应<0.8V,释放时>2.0V - 验证GPIO方向:`cat /sys/class/gpio/gpio55/direction` 应为"in" 2. **按键连击问题**: ```dts power { debounce-interval = <50>; // 增加消抖时间 linux,code = <KEY_POWER>; gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>; }; ``` 3. **驱动未加载**: - 检查内核配置:`zcat /proc/config.gz | grep CONFIG_KEYBOARD_GPIO` - 确保设备树节点名与`compatible`匹配 > 完整实现参考:[Rockchip GPIO按键文档](https://github.com/rockchip-linux/kernel/blob/develop-5.10/Documentation/devicetree/bindings/input/gpio-keys.txt)[^1] #### 六、应用层交互示例 ```c #include <linux/input.h> #include <fcntl.h> int main() { int fd = open("/dev/input/event0", O_RDONLY); struct input_event ev; while(1) { read(fd, &ev, sizeof(ev)); if(ev.type == EV_KEY && ev.code == KEY_POWER) { printf("Power key %s\n", ev.value ? "pressed" : "released"); } } close(fd); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值