文档路径: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 。
|