一、文件概述
Linux系统提供了 input 子系统,鼠标、键盘、触摸屏等设备都可以通过 input 接口函数来实现设备驱动,而/proc/bus/input/devices文件会记录已注册的 input 设备信息。可以使用 cat 命令直接查看该文件内容。一般内容如下,我这里接了一个鼠标和一个键盘。
~ # cat /proc/bus/input/devicesI: Bus=0003 Vendor=093a Product=2510 Version=0111N: Name="PixArt USB Optical Mouse"P: Phys=usb-hiusb-xhci.0-1/input0S: Sysfs=/devices/platform/hiusb-xhci.0/usb3/3-1/3-1:1.0/input/input0U: Uniq=H: Handlers=mouse0 event0 B: PROP=0B: EV=17B: KEY=ff0000 0 0 0 0 0 0 0 0B: REL=103B: MSC=10I: Bus=0003 Vendor=1c4f Product=0002 Version=0110N: Name="SIGMACHIP USB Keyboard"P: Phys=usb-hiusb-ohci-1/input0S: Sysfs=/devices/platform/hiusb-ohci.0/usb2/2-1/2-1:1.0/input/input1U: Uniq=H: Handlers=kbd event1 B: PROP=0B: EV=120013B: KEY=10000 7 ff800000 7ff febeffdf f3cfffff ffffffff fffffffeB: MSC=10B: LED=7
二、/proc/bus/input/devices 内容详解
从内容来看,每个设备信息的内容都有 I、N、P、S、U、H、B 几个字段,下面对每个字段解释
I :设备ID(struct input_id)
这个字段的四个值对应的是/usr/include/linux/input.h中的 input_id 结构体,对应关系如下:
struct input_id {__u16 bustype; // Bus__u16 vendor; // Vendor__u16 product; // Product __u16 version; // Version};
N:设备名称【Name】P:系统层次结构中设备的物理路径【Physical path】S:系统文件路径【Sysfs path】U:设备的唯一识别码,可以为空【Unique identification code】H:与设备关联的输入句柄列表【Handles】B:位掩码,以十六进制表示【Bitmasks】 PROP:设备属性【Properties】EV :设备支持的事件类型【Events】KEY :设备拥有的键盘、按键MSC :设备支持的杂项事件LED :设备上的 LED
上面是各个字段表示的意思,前面几个字段都比较好理解,下面对位掩码进一步解释
1、PROP对应的属性定义在input-event-codes.h或input.h中
2、EV对应的类型也定义在input-event-codes.h或input.h中
/** Event types*/#define EV_SYN 0x00 #define EV_KEY 0x01 //按键#define EV_REL 0x02 //相对坐标(轨迹球)#define EV_ABS 0x03 //绝对坐标#define EV_MSC 0x04 //其他、杂项#define EV_SW 0x05 //软件#define EV_LED 0x11 //LED#define EV_SND 0x12 //声音#define EV_REP 0x14 //repeat、会自动发出重复按键#define EV_FF 0x15#define EV_PWR 0x16 //电源开关、按键#define EV_FF_STATUS0x17#define EV_MAX 0x1f#define EV_CNT (EV_MAX+1)
以上面的 EV=17 和 EV=120013 举例:
EV=17:
首先把 17 转换为二进制表示:0001 0111,然后从右往左数,起始位是第0位,0001 0111的第 0、1、2、4 位都是1,再对应Event types 的定义,可知该设备支持EV_SYN、EV_KEY、EV_REL、EV_MSC 这几个类型。
EV=120013:
120013 是十六进制,转为二进制表示为:0001 0010 0000 0000 0001 0011,从右向左数,起始位是第0位,第 0、1、4、17、20 位都是1,对照 Event types 的定义,得知该设备支持EV_SYN、EV_KEY、EV_MSC、EV_LED、EV_REP 这 5 个类型。
3、KEY对应的类型也定义在input-event-codes.h或input.h中,这里截出鼠标对应值
以前面 KEY=ff0000 0 0 0 0 0 0 0 0 举例:
注意 KEY 的值的表达方式,每个空格后面对应的是8个十六进制位,所以KEY=ff0000 0 0 0 0 0 0 0 0 实际上对应的十六进制数位KEY=ff0000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000,再转换为二进制数后,得到第 272 到 280 位为1。而272转成十六进制是 0x110 ,是 BTN_MOUSE 的值。所以KEY=ff0000 0 0 0 0 0 0 0 0 对应的按键类型就是上面截图的类型 0x110~0x117。
其他的也都是用类似的方法进行转换即可。
参考资料:linux - Explain EV in /proc/bus/input/devices data - Unix & Linux Stack Exchange