input 子系统框架

input子系统由driver,input core, eventhandler 三部分组成。

8640c3c41a054ada88fb7ec7151076ca.jpg

例如一个设备按键是通过driver——》inputcore——》eventhandler——》 userspace 的,具体每一部分的作用如下。

driver 设备驱动层:负责和底层的硬件设备打交道,将底层硬件设备对用户输入的响应转换为标准的输入事件以后再向上发送给输入子系统核心层(Input Core)。

inputcore (子系统核心层):由driver/input/input.c及相关头文件实现,它对下提供了设备驱动层的接口,对上提供了事件处理层(Event Handler)的编程接口

eventhandler(事件处理层):事件处理层将硬件设备上报的事件分发到用户空间和内核

Input设备驱动编写

static void button_interrupt(int irq, void *dummy, struct pt_regs *fp)

{

input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) & 1);   // 上报键值

input_sync(&button_dev);   //键值上报成功

}    //按键中断服务程序

static int __init button_init(void)

{

if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) {

printk(KERN_ERR "button.c: Can\'\'t allocate irq %d\\n", button_irq);

return -EBUSY;

}      //请求一个中断

button_dev.evbit[0] = BIT(EV_KEY);

button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0);   //设置上报的键值

input_register_device(&button_dev);    //注册一个inputdev

}

static void __exit button_exit(void)

{

input_unregister_device(&button_dev);

free_irq(BUTTON_IRQ, button_interrupt);

}

module_init(button_init);

module_exit(button_exit);

这是个最简单使用input子系统的例子,权且引出这input子系统,这个驱动中主要涉及input子系统的函数下面一一列出,后面会有详细的介绍:

1)set_bit(EV_KEY, button_dev.evbit);

set_bit(BTN_0, button_dev.keybit);

分别用来设置设备所产生的事件以及上报的按键值。Struct iput_dev中有两个成员,一个是evbit.一个是keybit,分别用表示设备所支持的动作和按键类型。

2)input_register_device(&button_dev);

用来注册一个input device.

3) input_report_key()

用于给上层上报一个按键动作

4)input_sync()

用来告诉上层,本次的事件已经完成了.

5) input_unregister_device()

用来注销一个input_dev设备

更多推荐