1. 简介

1.1 Architecture

输入子系统是一组驱动程序,旨在支持Linux下的所有输入设备。大多数驱动程序驻留在驱动程序/输入中,即使相当一部分程序实体驻留在驱动程序/隐藏和驱动程序/平台中。
输入子系统的核心是输入模块,他用作两个模块之间的通讯,因此必须在其他任何输入模块之前加载该输入模块。

1.1.1 设备驱动程序

这些模块与硬件通信(例如,通过USB),并向输入模块提供事件(按键,鼠标移动),当然,屏幕的触摸也是属于事件一类的,那么与屏幕通讯的模块一般是 I2C。在这里我们可以理解到输入子系统的核心了。负责两个模块之间的通讯。

1.1.2 事件处理程序

这些模块从输入模块得到事件,然后通过(各种)接口来将信息传递到需要的地方, —- keystrokes to the kernel 。

1.2 简单用法

对于最通常的配置就是一个USB鼠标和一个USB键盘,您将必须加载以下模块(或将其内置到内核中):

  1. input
  2. mousedev
  3. usbcore
  4. uhci_hcd or ohci_hcd or ehci_hcd
  5. usbhid
  6. hid_generic

启动以后,USB模块开始工作,USB鼠标将在主号13,次号63上用作字符设备:

  1. [root@imx6ull:/]# ls /dev/input/ -al | grep mice
  2. crw-rw---- 1 root input 13, 63 Mar 2 12:17 mice
  3. # 该设备通常手动建立
  4. cd /dev
  5. mkdir input
  6. mknod input/mice c 13 63

1.3 详细说明

事件处理程序根据需要将事件从设备分发到用户空间和内核使用者。

1.3.1 evdev

evdev是通用输入事件接口。它将带有时间戳的内核中生成的事件直接传递给程序。事件代码在所有体系结构上都是相同的,并且与硬件无关。

  1. [root@imx6ull:/]# ls /dev/input/ -al | grep event
  2. crw-rw---- 1 root input 13, 64 Mar 2 12:17 event0
  3. crw-rw---- 1 root input 13, 65 Mar 2 12:17 event1
  4. crw-rw---- 1 root input 13, 66 Mar 2 12:17 event2

其,次设备号有两个范围,64 through 95 ,若是数量超出了 就以256开始。

2. 输入事件代码

2.1 Event types

  1. /*Used as markers to separate events. Events may be separated in time or in space, such as with the multitouch protocol.*/
  2. #define EV_SYN 0x00
  3. /*Used to describe state changes of keyboards, buttons, or other key-like devices.*/
  4. #define EV_KEY 0x01
  5. /*Used to describe relative axis value changes, e.g. moving the mouse 5 units to the left*/
  6. #define EV_REL 0x02
  7. /*Used to describe absolute axis value changes, e.g. describing the coordinates of a touch on a touchscreen.*/
  8. #define EV_ABS 0x03
  9. /*Used to describe miscellaneous input data that do not fit into other types.*/
  10. #define EV_MSC 0x04
  11. /*Used to describe binary state input switches.*/
  12. #define EV_SW 0x05
  13. /*Used to turn LEDs on devices on and off*/
  14. #define EV_LED 0x11
  15. /*Used to output sound to devices.*/
  16. #define EV_SND 0x12
  17. /*Used for autorepeating devices*/
  18. #define EV_REP 0x14
  19. /*Used to send force feedback commands to an input device.*/
  20. #define EV_FF 0x15
  21. /*A special type for power button and switch input.*/
  22. #define EV_PWR 0x16
  23. /*Used to receive force feedback device status.*/
  24. #define EV_FF_STATUS 0x17
  25. /*nothing*/
  26. #define EV_MAX 0x1f
  27. #define EV_CNT (EV_MAX+1)

3. Multi-touch (MT) Protocol

4. Linux Gamepad Specification

文章来源

https://www.kernel.org/doc/html/latest/input/index.html