input子系统
Posted 牛man
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了input子系统相关的知识,希望对你有一定的参考价值。
input 子系统框架
input子系统由driver,input core, eventhandler 三部分组成。
例如一个设备按键是通过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设备
以上是关于input子系统的主要内容,如果未能解决你的问题,请参考以下文章