Linux 驱动开发 六十:《input.txt》翻译
文档路径:
linux-imx-4.1.15\Documentation\input\input.txt
。
一、介绍
这是一个驱动进程集合,旨在支持 Linux
下的所有输入设备。虽然它目前仅用于 USB
输入设备,但未来的使用(例如 2.5 / 2.6
)预计将扩展到取代大多数现有的输入系统,这就是为什幺它位于 drivers/input/
而不是 drivers/usb/
中的原因。
输入驱动器的中心是输入模块,它必须在任何其他输入模块之前加载 - 它用作两组模块之间的通信方式:
1、设备驱动进程
这些模块与硬件通信(例如通过 USB
),并向输入模块提供事件(击键、鼠标移动)。
2、事件处理进程
这些模块从输入中获取事件,并通过各种接口将它们传递到需要的地方 - 击键到内核,鼠标通过模拟的 PS/2
接口移动到 GPM
和 X
等等。
二、简单用法
对于最常见的配置,使用一个 USB
鼠标和一个 USB
键盘,您必须加载以下模块(或将它们内置到内核中):
input
mousedev
keybdev
usbcore
uhci_hcd or 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
mkdir input
mknod input/mice c 13 63
之后,您必须将 GPM
(文本模式鼠标剪切/粘贴工具)和 XFree
指向此设备才能使用它 GPM
v应该像这样调用:
gpm -t ps2 -m /dev/input/mice
在 X
中:
Section "Pointer"
Protocol "ImPS/2"
Device "/dev/input/mice"
ZAxisMapping 4 5
EndSection
完成上述所有操作后,您可以使用 USB
鼠标和键盘。
三、详细说明
1、设备驱动进程
设备驱动进程是生成事件的模块。但是,如果不处理这些事件,这些事件就没有用处,因此您还需要使用 3.2
节中的一些模块。
1、usbhid
usbhid
是整个套件中最大,最复杂的驱动进程。它处理所有 HID
设备,并且由于它们种类繁多,并且由于 USB HID
规范并不简单,因此它需要如此之大。
目前,它处理 USB
鼠标,操纵杆,手柄,方向盘键盘,轨迹球和数字记录仪。
然而,USB
也将 HID
用于显示器控制、扬声器控制、ups
、lcd
和许多其他用途。
显示器和扬声器控件应该很容易添加到 hid/input
界面中,但对于 UPS
和 LCD
来说,这没有多大意义。为此,设计了隐藏式界面。有关它的详细信息,请参阅 Documentation/hid/hiddev.txt
。
usbhid
模块的使用非常简单,它不需要参数,自动检测所有内容,当插入 HID
设备时,它会适当地检测到它。
然而,由于设备的差异很大,您可能碰巧有一个设备不能很好地工作。在这种情况下,\#define DEBUG
在 hide -core.c
的开始,并发送给我 syslog
跟踪。
2、usbmouse
对于嵌入式系统,对于具有损坏的 HID
描述符的小鼠以及当 usbhid
不是一个好的选择时的任何其他用途,都有 usbmouse
驱动进程。它仅处理 USB
鼠标。它使用更简单的 HIDBP
协议。这也意味着鼠标必须支持这种更简单的协议。并非所有人都这样做。如果您没有任何强烈的理由使用此模块,请改用 usbhid
。
3、usbkbd
与 usbmouse
非常相似,该模块使用简化的 HIDBP
协议与键盘通信。它较小,但不支持任何额外的特殊键。如果没有任何特殊原因使用它,请改用 usbhid
。
4、wacom
这是 Wacom Graphire
和 Intuos
平板电脑的驱动程序。Wacom
的 PenPartner
不是,那个是由 HID
驱动程序处理的。尽管 Intuos
和 Graphire
平板电脑声称它们也是 HID
平板电脑,但它们不是,因此需要这个特定的驱动程序。
5、iforce
I-Force
操纵杆和轮子的驱动程序,通过 USB
和 RS232
。它现在包含了对 ForceFeedback
的支持,尽管 Immersion Corp
认为该协议是商业机密,不会透露任何信息。
2、事件处理进程
事件处理进程根据需要将事件从设备分发到用户空间和内核。
1、keybdev
keybdev
目前是一个相当难看的 hack
,它将输入事件转换为特定于体系结构的键盘原始模式(x86
上的 xlatated AT Set2
),并将它们传递给 keyboardc
模块的句柄扫描码函数。这在 keybdev
可以生成 rawmode
的所有体系结构上都能很好地工作,其他体系结构也可以添加到其中。
正确的方法是直接将事件传递给 keyboardc
,最好是 keyboardc
本身是一个事件处理程序。这是在输入补丁中完成的,可以在下面提到的网页上找到。
2、mousedev
Mousedev
也是一个让使用鼠标输入的程序工作的 hack
。它从鼠标或 digitizerstablet
中获取事件,并将 PS/2-style
(/dev/psaux
)鼠标设备提供给用户域。理想情况下,程序可以使用更合理的接口,例如 evdev
。
/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
每个 “mouse”
设备都被分配到一个单独的鼠标或数字化设备上,除了最后一个 “mice”
。这个单一字符设备由所有鼠标和数字化设备共享,即使没有连接,设备也存在。这对于热插拔 USB
鼠标非常有用,这样即使在没有鼠标的情况下,程序也可以打开设备。
内核配置中的 MOUSEDEV SCREEN [XY]
是 XFree86
中屏幕的大小(像素)。如果你想在 X
中使用数字化器,这是必要的,因为它的移动是通过虚拟 PS/2
鼠标发送到X,因此需要相应地缩放。如果只使用鼠标,则不会使用这些值。
鼠标指令将生成 PS/2
、ImPS/2
(微软智能鼠标)或资源管理器 PS/2
(智能鼠标资源管理器)协议,具体取决于读取数据的进程希望的内容。您可以将 GPM
和 X
设置为其中任何一个。如果要使用 USB
鼠标上的滚轮,则需要 ImPS/2
,如果要使用额外的(最多 5
个)按钮,则需要 ExplorerPS/2
。
3、joydev
Joydev
实现了 v0.x
和 v1.x Linux
操纵杆 API
,这与早期版本中的 drivers/char/joystick/joystick.c
非常相似。有关详细信息,请参阅文档子目录中的 joystick-api.txt
。 只要连接了任何操纵杆,就可以在 /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
。
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
...
以此类推,直到事件 31
。
4、验证它是否有效
在键盘上输入几个键应该足以检查 USB
键盘是否工作,并正确连接到内核键盘驱动程序。
执行 "cat /dev/input/mouse0"
(c
, 13
, 32
) 将验证鼠标是否也被模拟;如果你移动它,字符应该出现。
您可以使用 “jstest”
实用程序测试操纵杆模拟,该实用程序可在操纵杆包中获得(参见 Documentation/input/joystick.txt
)。
您可以使用 LinuxConsole
项目 CVS
存档中提供的 “evtest”
实用进程测试事件设备(请参阅下面的 URL
)。
5、事件接口
如果你想添加事件设备支持到任何应用程序(X, gpm, svgalib…)
vojtech@ucw.cz
将很高兴为您提供任何我能提供的帮助。这里是对事物当前状态的描述,它将被扩展,但不会随着时间的推移而发生不兼容的变化:
您可以使用阻止和非阻止读取,也可以在 /dev/input/eventX
设备上选择,并且读取时将始终获得大量输入事件。它们的布局是:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
“time”
是时间戳,它返回事件发生的时间。例如,类型是相对时刻的EV_REL
,EV_KEY
是按键或释放。在包含 /linux/input.h
中定义了更多类型。
“code”
是事件代码,例如 REL_X
或 KEY_BACKSPACE
,完整列表同样在包含 /linux/input.h
中。
“value”
是事件承载的值。EV REL
的相对变化,EV ABS
(操纵杆…)的绝对新值,或释放的 EV KEY
为 0
,按键为 1
,自动重复为 2
。