1. 简介
1.1 Architecture
输入子系统是一组驱动程序,旨在支持Linux下的所有输入设备。大多数驱动程序驻留在驱动程序/输入中,即使相当一部分程序实体驻留在驱动程序/隐藏和驱动程序/平台中。
输入子系统的核心是输入模块,他用作两个模块之间的通讯,因此必须在其他任何输入模块之前加载该输入模块。
1.1.1 设备驱动程序
这些模块与硬件通信(例如,通过USB),并向输入模块提供事件(按键,鼠标移动),当然,屏幕的触摸也是属于事件一类的,那么与屏幕通讯的模块一般是 I2C。在这里我们可以理解到输入子系统的核心了。负责两个模块之间的通讯。
1.1.2 事件处理程序
这些模块从输入模块得到事件,然后通过(各种)接口来将信息传递到需要的地方, —- keystrokes to the kernel 。
1.2 简单用法
对于最通常的配置就是一个USB鼠标和一个USB键盘,您将必须加载以下模块(或将其内置到内核中):
input
mousedev
usbcore
uhci_hcd or ohci_hcd or ehci_hcd
usbhid
hid_generic
启动以后,USB模块开始工作,USB鼠标将在主号13,次号63上用作字符设备:
[root@imx6ull:/]# ls /dev/input/ -al | grep mice
crw-rw---- 1 root input 13, 63 Mar 2 12:17 mice
# 该设备通常手动建立
cd /dev
mkdir input
mknod input/mice c 13 63
1.3 详细说明
事件处理程序根据需要将事件从设备分发到用户空间和内核使用者。
1.3.1 evdev
evdev是通用输入事件接口。它将带有时间戳的内核中生成的事件直接传递给程序。事件代码在所有体系结构上都是相同的,并且与硬件无关。
[root@imx6ull:/]# ls /dev/input/ -al | grep event
crw-rw---- 1 root input 13, 64 Mar 2 12:17 event0
crw-rw---- 1 root input 13, 65 Mar 2 12:17 event1
crw-rw---- 1 root input 13, 66 Mar 2 12:17 event2
其,次设备号有两个范围,64 through 95 ,若是数量超出了 就以256开始。
2. 输入事件代码
2.1 Event types
/*Used as markers to separate events. Events may be separated in time or in space, such as with the multitouch protocol.*/
#define EV_SYN 0x00
/*Used to describe state changes of keyboards, buttons, or other key-like devices.*/
#define EV_KEY 0x01
/*Used to describe relative axis value changes, e.g. moving the mouse 5 units to the left*/
#define EV_REL 0x02
/*Used to describe absolute axis value changes, e.g. describing the coordinates of a touch on a touchscreen.*/
#define EV_ABS 0x03
/*Used to describe miscellaneous input data that do not fit into other types.*/
#define EV_MSC 0x04
/*Used to describe binary state input switches.*/
#define EV_SW 0x05
/*Used to turn LEDs on devices on and off*/
#define EV_LED 0x11
/*Used to output sound to devices.*/
#define EV_SND 0x12
/*Used for autorepeating devices*/
#define EV_REP 0x14
/*Used to send force feedback commands to an input device.*/
#define EV_FF 0x15
/*A special type for power button and switch input.*/
#define EV_PWR 0x16
/*Used to receive force feedback device status.*/
#define EV_FF_STATUS 0x17
/*nothing*/
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)