欢迎来到天天文库
浏览记录
ID:42871072
大小:314.64 KB
页数:7页
时间:2019-09-23
《浅谈Linux输入子系统》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、浅谈Linux输入子系统输入子系统是Linux内核用于管理各种输入设备(键盘,鼠标,遥控杆,触摸屏等等)的部分,用户通过输入子系统进行内核,命令行,图形接口之间的交换。输入子系统在内核里实现,因为设备经常要通过特定的硬件接口被访问(例如串口,ps/2,usb等等),这些硬件接口由内核保护和管理。内核给用户导出一套固定的硬件无关的inputAPI,供用户空间程序使用。Linux下的输入设备(如按键、键盘、触摸屏、鼠标等)是典型的字符设备,其-般的T作机理是底层在按键、触摸等动作发送时产生一个中断(或驱动通过timer定吋查询),然后CPU通过SPI、I2C或
2、外部存储器总线读取键值、坐标等数据,放入1个缓冲区,字符设备驱动管理该缓冲区,而驱动的read()接口让用户可以读取键值、坐标等数据。输入子系统(InputSubsystem)的架构如下图所示输入子系统由输入子系统核心层(InputCore),驱动层和事件处理层(EventHandler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下,joystick的移动等等通过Driver->InputCore->Eventhandler->userspace的顺序到达用户空间传给应用程序。inputdevice的优点是统一应用程序使用外部输入设备的接口。这样简化
3、编程。Inputcore是没有缓存队列的,如果应用程序没有及时取事件,则事件被丢弃。其中InputCore即InputLayer由driver/input/input.c及相关头文件实现。对下提供了设备驱动的接口,对上提供了EventHandler层的编程接口。1.主要数据结构表1InputSubsystemmaindatastructure数据结构用途定义位置具体数据结构的分配和初始化Structinput_dev驱动层物理Input设备的基木数据结构Input.h通常在具体的设备驱动中分配和填充具体的设备结构StructEvdevStructMouse
4、devStructKeybdev...EventHandler层逻辑Mput设备的数据结构Evdev.cMousedev.cKeybdev.cEvdev.c/Mouedev.c…中分配StructInput_handlerEventHandler的结构Input.hEventHandler层,定义一个具体的EventHandleroStructInput_handle用來创建驱动层Dev和Handler链表的链表项结构Input.hEventHandler层屮分配,包含在Evdev/Mousedev...中。2.输入子系统架构示例图XW'nddtt'sJ
5、
6、5』
7、网JCuslomAppllc^lion/dev^npul^s
8、Consd^~
9、4♦♦♦[Kcrno*Space}:jn11riHartf^areiii4iiTAiiTAjcceierotneierHollerV4uinlnr输入核心提供了底层输入设备驱动程序所需的API,如分配/释放一个输入设备:structinput_dev*input_allocate_device(void):voidinput_free_device(structinput_dev*dev);input_allocate_device()返凹的是1个input_dev的结构体
10、,此结构体用于表示1个输入设备。注册/注销输入设备用的如下接口:int_must_checkinput_register_device(structinput_dev*);voidinput_unregister_device(structinput_dev*);报告输入承件用的如卞接口:/*报告指定type、code的输入事件*/voidinput_event(structinput_dev*dev,unsignedinttype,unsignedintcode,intvalue);广报告键值*/voidinput_report_key(structin
11、put_dev*dev,unsignedintcode,intvalue);广报告相窈坐标*/voidinput_report_rel(structinput_dev*dev,unsignedintcode,intvalue);广报告绝对坐标*/voidinput_report_abs(structinput_dev*dev,unsignedintcode,intvalue);广报告同昜事件*/voidinput_sync(structinput_dev*dev);Input驱动的子系统已经控制I/O,换句话read/write不需要驱动直接.驱动只需要i
12、nput_report_xxx()±传信息。它们最终调用input
此文档下载收益归作者所有