您的位置 首页 FPGA

具体解读Linux的输入子系统

详细解读Linux的输入子系统-这时一组驱动的集合,它们可以用于所有的基于linux的输入设备,虽然目前它只是用于USB输入设备,将来(2.5、2.6版本)它们将会被扩展并替换掉现存的多数输入系统,这就是为什么它们被放在drivers/input/目录下,而不是drivers/usb/。

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代表主动重复。

 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/90578.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部