1. 简介
这时一组驱动的调集,它们能够用于一切的依据linux的输入设备,尽管现在它仅仅用于USB输入设备,将来(2.5、2.6版别)它们将会被扩展并替换掉现存的大都输入体系,这便是为什么它们被放在drivers/input/目录下,而不是drivers/usb/。
输入设备驱动的中心是input模块,它需求在其他输入模块之前被加载–它是输入体系其它两个模块之间通讯的桥梁:
1.1 设备驱动(Device drivers)
这些模块担任和实践的硬件打交道(例如经过USB),给input模块供给相应的事情(按键,鼠标移动)
1.2 事情处理模块(Event handlers)
这些模块从input模块取得事情信息,并依据需求经过不同的接口传递这些事情–往kernel传递按键事情,或许经过模仿的PS/2接口给GPM和X传递鼠标移动事情,等等。
2. 一个简略的比如
一般,关于大大都装备来说,体系有一个USB鼠标和一个USB键盘,你需求加载以下几个模块(或许把它们编译到内核中):
input
mousedev
keybdev
usbcore
uhci_hcdor ohci_hcd or ehci_hcd
usbhid
在这之后,USB键盘直接就能够作业了,USB鼠标会作为一个字符设备,主次设备号分别为13和63:
crw-r–r– 1 root root 13, 63 Mar 28 22:45 mice
你需求主动创立该鼠标设备节点,创立的指令如下:
cd/dev
mkdirinput
mknodinput/mice c 13 63
之后,你有必要告知GPM和XFree你要运用这个鼠标设备 – 关于GPM,应该象以下的指令:
gpm-t ps2 -m /dev/input/mice
关于X:
Section”Pointer”
Protocol “ImPS/2″
Device “/dev/input/mice”
ZAxisMapping 4 5
EndSecTIon
做完以上过程今后,你就能够正常地运用USB鼠标和键盘了。
3. 具体描述
~~~~~~~~~~~~~~~~~~~~~~~
3.1 设备驱动(Device drivers)
~~~~~~~~~~~~~~~~~~
设备驱动模块产生输入事情,这些事情在没有经过处理之前是没有什么用途的,所以你需求用到3.2节的某些模块。
3.1.1 usbhid
~~~~~~~~~~~~
usbhid能够说是最巨大和杂乱的驱动了。它处理一切的HID设备,他之所以这么杂乱和巨大,原因是设备类型品种繁复,USB HID的标准也适当不简略。
现在,它处理USB鼠标,游戏操控杆,方向盘,键盘,轨迹球和数字化仪。
并且,USB也运用HID来完结监视器操控,扬声器操控,UPSs,LCDs等等许多外设。
监视器和扬声器操控比较简略增加到hid/input接口中,可是UPSs和LCDs就不是这么简略,为此,规划了hiddev接口,具体的信息请参阅DocumentaTIon/hid/hiddev.txt。
usbhid模块十分易于运用,它没有任何参数,主动检测刺进的HID设备,是的,它能用适宜的办法进行检测。
不过,由于设备实在是太过于多样性了,你或许遇到某些设备作业的欠好。这时你能够在hid-core.c的开端加上#defineDEBUG,把syslog traces发给我。
3.1.2 usbmouse
~~~~~~~~~~~~~~
关于嵌入式体系,只为了运用鼠标功用而参加整个巨大的usbhid明显不是一个好的挑选,这时能够只运用usbmouse驱动,它只处理usb鼠标。它运用了简易的HIDBP协议。当然这要求你的鼠标有必要也要支撑这一简易协议。最好,假如你没有很激烈地理由,请运用usbhid。
3.1.3 usbkbd
~~~~~~~~~~~~
就像usbmouse相同,这个模块用简易的HIDBP协议与键盘通讯。它很小,但不支撑任何额定的按键。没有特别的原因时,也请运用usbhid。
3.1.4 wacom
~~~~~~~~~~~
这是Wacom Graphire和Intuos tablets的驱动。它不是用于Wacom PenPartner,一个由HID驱动处理的设备。尽管Intuos 和Graphiretablets宣称他们是HID tablets,但实践上不是,所以需求这个特别的驱动。
3.1.5 iforce
~~~~~~~~~~~~
用于I-Force游戏杆和滚轮的驱动,经过USB和RS232衔接。现在它包含了ForceFeedback的支撑,尽管Immersion公司以为该协议是商业秘要并且没有揭露它的任何信息。
3.2 Event handlers
~~~~~~~~~~~~~~~~~~
Eventhandlers依据实践需求,把设备的事情分发到用户空间或许内核中。
3.2.1 keybdev
~~~~~~~~~~~~~
keybdev现在是一个不太好的骇客东西,它把输入事情转换为体系相关的键盘raw形式(x86中的Xlated AT Set2),然后传递给keyboard.c模块中的handle_scancode函数。当体系的keybdev能产生rawmode时,它会作业得很好,其他体系也能增加进来。
正确地办法是直接把输入事情传递到keyboard.c中,最好的是keyboard.c自身便是一个event handler。这一作业由下面说到的网页供给了一个input patch来完结。
3.2.2 mousedev
~~~~~~~~~~~~~~
mousedev也是一个骇客东西,它使得那些需求运用鼠标的程序能够作业。它从鼠标或许数字化仪获取事情,然后生成了一个PS/2类型(例如/dev/psaux)的鼠标设备来让用户空间的程序运用。抱负的情况下,程序应该运用一个愈加合理的接口,例如evdev。
上面说到的Mousedev设备在/dev/input中的出现如下:
crw-r–r– 1 root root 13, 32 Mar 28 22:45 mouse0
crw-r–r– 1 root root 13, 33 Mar 29 00:41 mouse1
crw-r–r– 1 root root 13, 34 Mar 29 00:41 mouse2
crw-r–r– 1 root root 13, 35 Apr 1 10:50 mouse3
…
…
crw-r–r– 1 root root 13, 62 Apr 1 10:50 mouse30
crw-r–r– 1 root root 13, 63 Apr 1 10:50 mice
除了最终的'mice',每个'mouse'设备被分配给单一的鼠标或许是数字化仪。最终的'mice',这个单一的字符设备由一切的鼠标和数字化仪同享,就算没有任何真实的鼠标衔接进来,这个设备也仍然存在。这一特性对USB鼠标的热插拔功用很有用。这样尽管没有鼠标衔接,程序仍然能够翻开该设备。
在XFree86中,内核的装备项:CONFIG_INPUT_MOUSEDEV_SCREEN_[XY],指定了屏幕的像素。假如你想在X中运用数字化仪,这点是必要的,由于她的移动会被经过虚拟的PS/2鼠标发送到X中,这时需求核算正确地份额。假如你仅仅运用鼠标,这个装备值是没有用途的。
依赖于程序期望读取什么数据,Mousedev会生成PS/2, ImPS/2(Microsoft IntelliMouse) 或许
ExplorerPS/2 (IntelliMouse Explorer)协议格局的数据。你能够把GPM和X设置成这儿的任一种。假如你想运用USB鼠标上的滚轮,你能够装备为ImPS/2,而当你期望运用额定的按键时,就运用ExplorerPS/2。
3.2.3 joydev
~~~~~~~~~~~~
Joydev完结了Linux joysTIck 的v0.x和v1.x版的api,有点相似之前内核运用的驱动:drivers/char/joysTIck/joystick.c。细节请进一步参阅内核文档:joystick-api.txt。一旦有joystick衔接到体系中,咱们能够经过/dev/input中的以下节点拜访它:
crw-r–r– 1 root root 13, 0 Apr 1 10:50 js0
crw-r–r– 1 root root 13, 1 Apr 1 10:50 js1
crw-r–r– 1 root root 13, 2 Apr 1 10:50 js2
crw-r–r– 1 root root 13, 3 Apr 1 10:50 js3
…
一向能够到:js31.
3.2.4 evdev
~~~~~~~~~~~
evdev是一个通用的输入事情接口,它把内核产生的事情,连同时刻戳一同,直接传递到用户空间的运用程序中。该接口的API还在不断完善中,但现在现已能够运用它们。该接口咱们会在下面的第5节阐明。
GPM和X能够经过该办法来获取键盘和鼠标的事情。无需内核特别支撑,它就能够答应X对它进行多线程的拜访。事情编码对一切渠道都是一致的并且是硬件无关的。
设备节点坐落 /dev/input:
crw-r–r– 1 root root 13, 64 Apr 1 10:49 event0
crw-r–r– 1 root root 13, 65 Apr 1 10:50 event1
crw-r–r– 1 root root 13, 66 Apr 1 10:50 event2
crw-r–r– 1 root root 13, 67 Apr 1 10:50 event3
…
一向能够到:event31.
4. 验证是否能够正常作业
~~~~~~~~~~~~~~~~~~~~~~~~
在键盘上敲几个键就足以查看USB键盘是否作业正常,也能查看是否内核的驱动是否作业正常。
敲入指令:”cat /dev/input/mouse0″ (c, 13, 32)能够验证鼠标是否被正确地枚举,当你移动鼠标时,屏幕会显现一些字符。
你能够用jstest东西来测验joystick是否正常作业,该东西在joystick包中(拜见文档:Documentation/input/joystick.txt)
能够运用evtest东西对event设备进行测验,该东西能够从LinuxConsole项目的CVS中获取(见下面的URL)
5. Event interface
~~~~~~~~~~~~~~~~~~
假如你期望在你的任何运用中(X,gpm,svgalib …)增加event设备的支撑,我(vojtech@ucw.cz)十分愿意尽我所能供给协助。这儿我阐明一下当时的发展情况,尽管还在不断地扩展中,可是根本的接口是不会改动而导致不兼容的问题:
你能够在/dev/input/eventX设备上运用堵塞,非堵塞的读操作,也能够用select()操作。你会在一次读取中回来一个完好的输入事情,它的结构如下:
struct input_event {
structtimeval time;
unsignedshort type;
unsignedshort code;
unsignedint value;
};
'time'字段是时刻戳,它回来时刻产生时的时刻。关于type字段,EV_REL代表回来的是相对移动值,EV_KEY代表的是按键按下或开释,更多的类型界说能够拜见:include/linux/input.h。
'code'字段是事情的编码,例如能够是REL_X或KEY_BACKSPACE,你也能够从include/linux/input.h中得到完好的列表。
'value'字段是该事情带着的参数值。能够是EV_REL事情的相对改变量,EV_ABS事情的一个新的绝对值(joysticks…),关于EV_KEY事情,该值是0代表按键开释,为1代表按键按下,为2代表主动重复。