输入体系协议用类型types和编码codecs来标明输入设备的值并用此来告诉用户空间的运用程序。这篇文档对这些类型和编码进行了阐明而且指出什么时分和怎么运用这些类型和编码。
一个单一的硬件事情能够产生多个输入事情,每个输入事情包含一个单一数据项的新的数据值。EV_SYN是一个特别的事情类型,它用来把同一时间产生的多个输入数据切割为多个数据包。鄙人面的描绘中,术语事情(event)是指一个包含类型,编码和参数值的单一输入事情。
input协议是一个根据状况的协议,只有当相应事情编码对应的参数值产生改变时才会发送该事情。不过,状况是由Linux的输入子体系进行保护,驱动程序无需保护输入的状况,就算参数值没有改变时向输入子体系宣布事情也不会有问题。用户空间能够用linux/input.h 中界说的EVIOCG*ioctls来取得当时事情编码和参数的状况。设备的所支撑的上报事情品种也能够经过sysfs的class/input/event*/device/capabilities/来获取,设备的特性和能够经过class/input/event*/device/properTIes来获
Kernel版别:V3.4.10
Event types:
types对应于一个相同逻辑输入结构的一组Codes。每个type都有一组可用的codes用于产生输入事情。每个type可用的codes的详细信息请参阅Codes一节的内容。
* EV_SYN:
– 用于事情间的切割标志。事情或许准时间或空间进行切割,就像在多点接触协议中的比方。
* EV_KEY:
– 用来描绘键盘,按键或许相似键盘设备的状况改变。
* EV_REL:
– 用来描绘相对坐标轴上数值的改变,例如:鼠标向左方移动了5个单位。
* EV_ABS:
-用来描绘相对坐标轴上数值的改变,例如:描绘接触屏上坐标的值。
* EV_MSC:
– 当不能匹配现有的类型时,运用该类型进行描绘。
* EV_SW:
– 用来描绘具有两种状况的输入开关。
* EV_LED:
– 用于操控设备上的LED灯的开和关。
* EV_SND:
– 用来给设备输出提示声响。
* EV_REP:
-用于能够主动重复的设备(autorepeaTIng)。
* EV_FF:
– 用来给输入设备发送强制回馈指令。(轰动?)
* EV_PWR:
– 特别用于电源开关的输入。.
* EV_FF_STATUS:
– 用于接纳设备的强制反应状况。
Event codes:
Event codes 用于对事情的type进行更准确的界说
EV_SYN:
EV_SYN 事情没有对values进行详细的界说, 它们的运用办法仅在发送evdev的事情串中有界说。
* SYN_REPORT:
– 当多个输入数据在同一时间产生改变时,SYN_REPORT用于把这些数据进行打包和包同步。例如,一次鼠标的移动能够上报REL_X和REL_Y两个数值,然后宣布一个SYN_REPORT。下一次鼠标移动能够再次宣布REL_X和REL_Y两个数值,然后经跟这另一个SYN_REPORT。
* SYN_CONFIG:
-TBD
* SYN_MT_REPORT:
– 用于同步和别离接触事情。更多的信息请参阅内核文档:mulTI-touch-protocol.txt。
* SYN_DROPPED:
– 用来指出evdev客户的事情队列的的缓冲区溢出。客户端顶盖疏忽一切的事情,包含下一个SYN_REPORT事情,而且要查询设备来取得它的状况(运用EVIOCG* ioctls)。
EV_KEY:
EV_KEY事情采纳KEY_
几个 EV_KEY的 codes具有特别的含义:
* BTN_TOOL_
– 这些codes用于合作触控板,平板和接触屏这些设备的输入,这些设备能够运用手指,笔或许其它东西。当一个事情产生而且检测到某种东西在运用时,相应的BTN_TOOL_
* BTN_TOUCH:
BTN_TOUCH用于接触接触事情。当一个输入东西被判定为有含义的物理接触时,这一特性的value值应该设为1。所谓有含义的物理接触能够是任何的接触,又或许是满意某种界说条件的接触。例如,接触板能够当接触的压力到达某一个值以上时才把value设为1,一个用笔的平板当笔划过但没有接触到平板的外表时,把BTN_TOOL_PEN的value设为1,而把BTN_TOUCH的value设为0.
留意:为了合作一些老的传统mousedev模仿驱动程序能够作业,BTN_TOUCH有必要作为一个同步帧的第一个evdevcode宣布。
留意:出于前史的原因,用户空间会把带有BTN_TOOL_FINGER和 BTN_TOUCH的接触设备解释为接触板,而相似的不带BTN_TOOL_FINGER的接触设备则被解释为接触屏。为了与现在的用户空间运用向后兼容,主张遵从这一区别准则。今后,这一区别办法将会失效,而会运用设备特点ioctl EVIOCGPROP(界说在linux/input.h)来传送设备的类型。
* BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP:
– 这些codes标明一个,两个,三个和四个手指参加接触板和接触屏的操作。例如,假如用户运用两只手指在接触板上企图翻滚屏幕上的内容,在运动期间,应该发送value为1的BTN_TOOL_DOUBLETAP。留意的是一切的BTN_TOOL_
留意:出于前史原因,一些驱动会在同一个同步帧内发送多个value为1的上报手指数的codes,可是这一办法现在现已过期了(不再运用)。
留意:在多手指接触驱动中,应该运用input_mt_report_finger_count()函数来宣布以上这些codes,详情请参看内核文档:mulTI-touch-protocol.txt。
EV_REL:
———-
EV_REL事情描绘了某种特性的相对改变量。例如,鼠标向左方移动了几个单位间隔,可是他的肯定方位是不知道的。假如咱们能够知道肯定方位,那咱们应该运用EV_ABS而不是EV_REL。
下面这些归于EV_REL的codes有特别的含义:
* REL_WHEEL, REL_HWHEEL:
– 这两个codes用于对应的笔直方向和水平方向的滚轮。
EV_ABS:
———-
EV_ABS事情描绘了某一特性的肯定改变值,例如,接触板会用它宣布当时方位的肯定坐标值。
以下这些归于EV_ABS的 codes有特别的含义:
* ABS_DISTANCE:
– 用来描绘接触东西离接触外表的间隔。这一事情应该只有当接触东西在外表悬空滑过期宣布,也便是说,在靠经接触外表,可是BTN_TOUCH的value是0的时分。假如输入设备能够作业在3维坐标时,应该考虑运用ABS_Z会更好。
* ABS_MT_
– 用于描绘多手指接触输入设备。详情请参阅内核文档:multi-touch-protocol.txt。
EV_SW:
———-
EV_SW事情用于描绘一个两态开关的状况,比方,SW_LID code用来指出笔记本电脑的屏幕现已合上了。
当绑定一个设备或许从suspend状况中resuming回来,驱动程序有必要上报开关的当时状况。然后保证设备,内核和用户空间的状况坚持同步。
在resume时,假如开关的状况和suspend之前相同,input子体系会这一重复的状况上报音讯。驱动程序任何时分都无需记住开关的状况。
EV_MSC:
———-
当事情不能用其它事情类型描绘时,运用EV_MSC是将进行输入和输出事情的上报。
EV_LED:
———-
EV_LED事情用来设置或查询设备上LED的状况。
EV_REP:
———-
EV_REP 用来指出主动重复事情(autorepeating)。
EV_SND:
———-
EV_SND用于对那些简略的发声设备宣布发音指令。
EV_FF:
———-
EV_FF事情用来初始化具有强制反应才能的设备,并能够让这些设备宣布反应动作。
EV_PWR:
———-
EV_PWR事情是一个特别的类型,它是电源办理的专用事情,现在没有对它做出杰出的界说,将来会完善这一事情。
设备特性(Device properties):
=================
正常情况下,用户空间根据设备宣布的数据(比方事情的types)来树立一个输入设备,当两个设备都宣布相同的事情types时,这时设备特性就能够供给额定的辨认信息。
INPUT_PROP_DIRECT + INPUT_PROP_POINTER:
————————————–
INPUT_PROP_DIRECT特性标明设备的坐标直接和屏幕坐标向对应(无需琐碎的转化操作,像缩放,回转,旋转等)。非直接输入设备则需求一些必要的改换,比方接触板上肯定到相对的改换。典型的直接输入设备有:接触屏,手写板;非直接输入设备有:接触板,鼠标。
INPUT_PROP_POINTER特性标明设备不是运用屏幕来获取输入信息,然后需求一个屏幕上的指针来盯梢用户的移动。典型的指针设备有:触控板,鼠标;非指针设备:接触屏。
假如INPUT_PROP_DIRECT或许 INPUT_PROP_POINTER都没有设置,设备将会被认为是未界说,它的类型需求按传统的办法运用事情的types推导出来。
INPUT_PROP_BUTTONPAD:
——————–
有些接触板,它的按键坐落接触板的底部,这样按下接触板会产生一次按键音讯,关于这种设备,应该设置该特性。自2009年以来,装备这种触控板的notebooks和macbooks变多越来越遍及。
开始,这种按键特性是在bcm5974的驱动中经过姓名的版别字段来进行编码,为了向后兼容性,用户空间有必要按这两种办法都进行检查。
INPUT_PROP_SEMI_MT:
——————
在2008年至2011年之间,许多接触板只能检测到多个接触点,可是不知道它们的独立方位,仅仅知道触点的数量和围住它们的一个矩形。关于这样的设备,应该设置这个半多点接触特性。
不同的设备,这个矩形或许围住一切的触控点,就像鸿沟框相同,也或许仅仅围住了一部分触控点,比方最终的两个触控点。这种不确定性约束了这个矩形的用途,仅仅有些手势辨认会对它进行剖析。
假如没有设置INPUT_PROP_SEMI_MT特性,该设备被假设为全多点触控设备。
运用指引:
==========
以下的运用指引保证了单点接触和多点接触能够正常地作业,更翔实的信息请参阅文档:multi-touch-protocol.txt。
鼠标:
———-
当鼠标移动时,REL_{X,Y}有必要被上报。主键被按下时,BTN_LEFT有必要被上报。 其它按键按下时,BTN_{MIDDLE,RIGHT,4,5,etc.}应该被上报。鼠标上的滚轮翻滚时,REL_WHEEL and REL_HWHEEL事情应该被上报。
接触屏:
———-
接触产生时,有必要要用ABS_{X,Y}上报接触的方位。接触有用时,BTN_TOUCH有必要被上报,而不用用BTN_{MOUSE,LEFT,MIDDLE,RIGHT}来标明一次接触事情。有或许的话,BTN_TOOL_
关于新的硬件,应该设置INPUT_PROP_DIRECT特性。
触控板:
———-
传统的触控板仅仅想上面鼠标所说那样上报相对方位信息即可。
具有肯定方位信息的触控板需求经过ABS_{X,Y}上报触控点的方位信息。相同,接触有用时应该上报BTN_TOUCH事情。假如支撑多点接触,应该经过BTN_TOOL_
关于新的硬件,应该设置INPUT_PROP_POINTER特性。
Tablets:
———-
当笔或其它东西被有用检测后,有必要上报BTN_TOOL_
关于新的硬件,INPUT_PROP_DIRECT和 INPUT_PROP_POINTER都应该被设置。