Linux下 INPUT子系统

知识点一:input_dev结构体

1.申请input_dev结构体变量

在编写 input 设备驱动的时候我们需要先申请一个 input_dev 结构体变量,使用input_allocate_device 函数来申请一个 input_dev

函数原型:

struct input_dev *input_allocate_device(void)

2.释放input_dev

 使用 input_free_device 函数来释放掉前面申请到的input_dev

函数原型:

void input_free_device(struct input_dev *dev)

3.注册input_dev

申请好一个 input_dev 以后就需要初始化这个 input_dev,需要初始化的内容主要为事件类型(evbit)和事件值(keybit)这两种。input_dev 初始化完成以后就需要向 Linux 内核注册 input_dev了,需要用到 input_register_device 函数,此函数原型如下:

int input_register_device(struct input_dev *dev)

4.注销input_dev

注销 input 驱动的时候也需要使用 input_unregister_device 函数来注销掉前面注册
的 input_dev,input_unregister_device 函数原型如下:

void input_unregister_device(struct input_dev *dev)

问题一:input_dev 申请注册过程?

使用input_allocate_device申请一个input_dev

初始化input_dev

使用input_register_device注册input_dev

问题二:input_dev 注销释放过程?

使用input_unregister_device注销input_dev

使用input_free_device 释放input_dev

知识点二:上报输入事件

当我们向 Linux 内核注册好 input_dev 以后还不能使用 input 设备,input 设备都是具有输入功能的,但是具体是什么样的输入值 Linux 内核是不知道的,我们需要获取到具体的输入值,或者说是输入事件,然后将输入事件上报给 Linux 内核。我们需要在按
键中断处理函数,或者消抖定时器中断函数中将按键值上报给 Linux 内核,这样 Linux 内核才能获取到正确的输入值。不同的事件,其上报事件的 API 函数不同。

 input_event 函数用于上报指定的事件以及对应的值

void input_event(struct input_dev *dev,
    unsigned int type,
    unsigned int code,
    int value)

 

dev:需要上报的 input_dev。
type: 上报的事件类型,比如 EV_KEY。
code :事件码,也就是我们注册的按键值,比如 KEY_0、KEY_1 等等。
value:事件值,比如 1 表示按键按下,0 表示按键松开。

上报按键事件一般使用input_report_key函数,函数原型如下

static inline void input_report_key(struct input_dev *dev,
unsigned int code, int value)
{
input_event(dev, EV_KEY, code, !!value);
}

当我们上报事件以后还需要使用 input_sync 函数来告诉 Linux 内核 input 子系统上报结束,函数原型如下:

void input_sync(struct input_dev *dev)

dev:需要上报同步事件的 input_dev。

问题三:驱动如何告诉内核有按键触发事件

当按键按下后使用input_report_key函数上报按键事件

使用input_sync函数告诉内核上报结束

知识点三:input_event结构体

struct input_event {
    struct timeval time;
    __u16 type;
    __u16 code;
    __s32 value;
};

time:时间,也就是此事件发生的时间此成员变量为 32 位。

type :事件类型,比如 EV_KEY,表示此次事件为按键事件,此成员变量为 16 位。

code :事件码,比如在 EV_KEY 事件中 code 就表示具体的按键码,如:KEY_0、KEY_1等等这些按键。此成员变量为 16 位。

value :值,比如 EV_KEY 事件中 value 就是按键值,表示按键有没有被按下,如果为 1 的话说明按键按下,如果为 0 的话说明按键没有被按下或者按键松开了。

问题四:用户如何获取按键事件

所有的输入设备最终都是按照 input_event 结构体呈现给用户的,用户应用程序可以通过 input_event 来获取到具体的输入事件或相关的值,比如按键值等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值