linux驱动之按键输入实验(基于系统自带gpio-keys.c驱动)

概述

采用Linux自带的按键驱动gpio-keys.c,实现按键输入读取。与上一章实现leds-gpio类似。

修改设备树文件

在根节点‘/’下创建key节点,节点名称为keys。节点内容如下(可参考别的平台的key节点编写):

keys:
{
	compatible = "gpio-keys";
	key1{
		label = "volume-up"
		linux,code = <114>;
		gpios = <&pioC 0 GPIO_ACTIVE_LOW>;	/* PC0*/
		debounce-interval = <10>;
	};
	key2{
		label = "volume-down"
		linux,code = <115>;
		gpios = <&pioC 2 GPIO_ACTIVE_LOW>;	/* PC2*/
		debounce-interval = <10>;
	};
}

对于以上属性的功能不清楚,可以在gpio-keys.c中查找到,例如debounce-interval值提取过后,存放在结构体为gpio_keys_button的button中,查看结构体释义,可知道配置的参数是消抖时间,单位为ms。同理,linux,code的值表示输入事件的代码。当然,也可以在\Documentation\devicetree\bindings\input\gpio-keys.txt中了解属性的含义。
在这里插入图片描述
在这里插入图片描述
写完之后,执行make dtbs可以单独进行设备树进行编译。

编译驱动

(一)把驱动编译进内核
通过搜索compatible匹配内容,可以找到”gpio-keys”位于/drivers/input/keyboard/gpio-keys.c中。
打开/drivers/input/keyboard/Makefile可找到obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o,所以需要在根目录下的.config设置CONFIG_KEYBOARD_GPIO=y,或者通过menuconfig进行配置。
(二)编译下载
下载过后,可以在系统设备树中看到增加的key1和key2节点。
在这里插入图片描述
在/dev/input/目录下新增了一个event1是我们注册的驱动所对应的设备文件,可以通过hexdump命令来查看/dev/input/event1文件内容。可以通过按下按键或释放来测试内容变化。
在这里插入图片描述

应用测试

应用程序通过读取/dev/input/event1设备来判断按键是否按下。驱动如下:

#include <linux/input.h>                                                                                                                                                                                     
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>

#define INPUT_DEV "/dev/input/event1"

int main(int argc, char * const argv[])
{
    int fd = 0;
    struct input_event event;
    int ret = 0;
    fd = open(INPUT_DEV, O_RDONLY);

	if(fd <= 0)
	{
		perror("open err\r\n");
		exit(1);
	}
    while(1){
        ret = read(fd, &event, sizeof(event));
	    if(ret == -1) {
            perror("Failed to read.\n");
            exit(1);
        }
        if(event.type != EV_SYN) 
		{
            printf("type:%d, code:%d, value:%d\n", event.type, event.code, event.value);
        }
    }   
    return 0;
}

测试现象如下:
在这里插入图片描述

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Android 12系统中,gpio_keys驱动按键按下后会执行gpio_keys_irq函数。当GPIO按键被按下时,相应的GPIO输入引脚会产生一个中断信号,然后中断处理程序会调用gpio_keys_irq函数来处理中断事件。 gpio_keys_irq函数的主要功能是将GPIO按键事件转换为相应的输入事件,并通过输入系统向用户空间发送输入事件。具体来说,gpio_keys_irq函数会完成以下操作: 1. 获取gpio_keys_data结构体指针,该结构体包含了GPIO按键GPIO编号等信息。 2. 获取GPIO输入引脚的状态,判断GPIO按键是按下还是释放。 3. 如果GPIO按键是按下状态,则将输入事件报告给输入系统,并上报按键按下事件。 4. 如果GPIO按键是释放状态,则将输入事件报告给输入系统,并上报按键释放事件。 gpio_keys_irq函数的具体实现可以参考以下代码: ``` static irqreturn_t gpio_keys_irq(int irq, void *dev_id) { struct gpio_keys_data *gpio_data = dev_id; unsigned long flags; spin_lock_irqsave(&gpio_data->lock, flags); if (gpio_get_value(gpio_data->gpio) == 0) { // GPIO按键被按下,报告按键按下事件 gpio_data->state = KEY_PRESSED; input_report_key(gpio_data->input, gpio_data->code, 1); } else { // GPIO按键被释放,报告按键释放事件 gpio_data->state = KEY_RELEASED; input_report_key(gpio_data->input, gpio_data->code, 0); } input_sync(gpio_data->input); spin_unlock_irqrestore(&gpio_data->lock, flags); return IRQ_HANDLED; } ``` 通过以上操作,gpio_keys_irq函数能够将GPIO按键事件转换为相应的输入事件,并通过输入系统向用户空间发送输入事件,从而实现对GPIO按键的响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值