博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux输入子系统 input_dev 概述
阅读量:4052 次
发布时间:2019-05-25

本文共 2118 字,大约阅读时间需要 7 分钟。

Linux 系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动,因此,12.1~12.2节的按键和触摸屏设备驱动都可以作为input设备驱动而实现。

Linux 内核中,input设备用input_dev 结构 体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按 键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构 体描述),不再需要关心文件操作接口,因为input子系统已经完成了文 件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。

通过input子系统,具体的输入设备驱动只需要完成如下工作。

在模块加载函数中告知input子系统它可以报告的事件。

设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:

set_bit(EV_KEY, button_dev.evbit);

在模块加载函数中注册输入设备。

注册输入设备的函数为:

int input_register_device(struct input_dev *dev);

在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过input_ report_xxx()报告发生的事件及对应的键值/坐标等状态。

主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏和操纵杆,它们工作在绝对坐标系统)。

用于报告EV_KEY、EV_REL和EV_ABS事件的函数分别为:

void input_report_key(struct input_dev *dev, unsigned int code, int value); void input_report_rel(struct input_dev *dev, unsigned int code, int value); void input_report_abs(struct input_dev *dev, unsigned int code, int value);

input_sync()用于事件同步,它告知事件的接收者驱动已经发出了一个完整的报告。

例如,在触摸屏设备驱动中,一次坐标及按下状态的整个报告过程如下:

input_report_abs(input_dev, ABS_X, x);  //X坐标 input_report_abs(input_dev, ABS_Y, y);   //Y坐标 input_report_abs(input_dev, ABS_PRESSURE, pres); //压力 input_sync(input_dev);  //同步

在模块卸载函数中注销输入设备。注销输入设备的函数为:

void input_unregister_device(struct input_dev *dev);

代码清单12.28给出了一个最简单的使用input接口实现按键设备驱动的范例,它在中断服务程序中向系统报告按键及同步事件。

代码清单12.28 最简单的input设备驱动

1  2  static void button_interrupt(int irq, void *dummy, struct pt_regs *fp) 3  {
4 input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) &1); 5 input_sync(&button_dev); 6 } 7 8 static int _ _init button_init(void) 9 {
10 11 if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) 12 {
13 printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq); 14 return - EBUSY; 15 } 16 17 button_dev.evbit[0] = BIT(EV_KEY); //支持EV_KEY事件 18 button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0); 19 20 input_register_device(&button_dev); //注册input设备 21 } 22 23 static void _ _exit button_exit(void) 24 {
25 input_unregister_device(&button_dev); //注销input设备 26 free_irq(BUTTON_IRQ, button_interrupt); //释放中断 27 } 

转载地址:http://jmsci.baihongyu.com/

你可能感兴趣的文章
container_of()传入结构体中的成员,返回该结构体的首地址
查看>>
ipconfig,ifconfig,iwconfig
查看>>
opensuse12.2 PL2303 minicom
查看>>
网络视频服务器移植
查看>>
Encoding Schemes
查看>>
移植QT
查看>>
如此调用
查看>>
计算机的发展史
查看>>
带WiringPi库的交叉编译如何处理一
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Spring事务的七种传播行为
查看>>
ES写入找不到主节点问题排查
查看>>
Java8 HashMap集合解析
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
自定义 select 下拉框 多选插件
查看>>