输入子系统之events消息数据传递
来源:互联网 发布:linux ping命令 编辑:程序博客网 时间:2024/06/05 11:26
参考链接:http://book.51cto.com/art/200803/66870.htm
在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。
通过input子系统,具体的输入设备驱动只需要完成如下工作。
l 在模块加载函数中告知input子系统它可以报告的事件。
设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:
set_bit(EV_KEY, button_dev.evbit);
l 在模块加载函数中注册输入设备。
注册输入设备的函数为:
int input_register_device(struct input_dev *dev);
l 在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过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);
代码清单给出了一个最简单的使用input接口实现按键设备驱动的范例,它在中断服务程序中向系统报告按键及同步事件。
代码清单 最简单的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 }
- 输入子系统之events消息数据传递
- Android输入子系统之应用程序注册消息监听过程分析
- Android输入子系统之InputReader读取键盘消息过程分析
- Android输入子系统之InputDispatcher分发键盘消息过程分析
- linux驱动子系统之输入子系统(1)
- linux驱动子系统之输入子系统(2)
- linux驱动子系统之输入子系统(3)
- linux驱动子系统之输入子系统(4)
- linux驱动子系统之输入子系统(5)
- linux驱动子系统之输入子系统(5)
- Linux驱动子系统之输入子系统
- Linux驱动子系统之输入子系统
- linux驱动子系统之输入子系统(5)
- linux驱动子系统之输入子系统(1)
- linux驱动子系统之输入子系统(2)
- linux驱动子系统之输入子系统(3)
- linux驱动子系统之输入子系统(4)
- linux驱动子系统之输入子系统(5)
- 欢迎使用CSDN-markdown编辑器
- 经典算法分析与设计——最短加法链
- Android中通过Socket直接与RILD进行通信
- java项目集合
- 什么是uuid以及uuid在java中的使用
- 输入子系统之events消息数据传递
- java 获取两颜色值的中间值
- 01背包的动态规划解法(史无前例的详细)
- HDU 1874 迪杰斯特拉
- Volatile和Synchronized关键字
- IEEE 802.3以太网帧封装
- TCP协议的3次握手和4次挥手
- JavaScript 读写Cookie扩展
- Get Curve Length