cat /proc/bus/input/devices 文件内容详解

简介: cat /proc/bus/input/devices 文件内容详解

一、文件概述

Linux系统提供了 input 子系统,鼠标、键盘、触摸屏等设备都可以通过 input 接口函数来实现设备驱动,而 /proc/bus/input/devices 文件会记录已注册的 input 设备信息。可以使用 cat 命令直接查看该文件内容。一般内容如下,我这里接了一个鼠标和一个键盘。

~ # cat /proc/bus/input/devices
I: Bus=0003 Vendor=093a Product=2510 Version=0111
N: Name="PixArt USB Optical Mouse"
P: Phys=usb-hiusb-xhci.0-1/input0
S: Sysfs=/devices/platform/hiusb-xhci.0/usb3/3-1/3-1:1.0/input/input0
U: Uniq=
H: Handlers=mouse0 event0 
B: PROP=0
B: EV=17
B: KEY=ff0000 0 0 0 0 0 0 0 0
B: REL=103
B: MSC=10
I: Bus=0003 Vendor=1c4f Product=0002 Version=0110
N: Name="SIGMACHIP USB Keyboard"
P: Phys=usb-hiusb-ohci-1/input0
S: Sysfs=/devices/platform/hiusb-ohci.0/usb2/2-1/2-1:1.0/input/input1
U: Uniq=
H: Handlers=kbd event1 
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff800000 7ff febeffdf f3cfffff ffffffff fffffffe
B: MSC=10
B: LED=7

二、/proc/bus/input/devices 内容详解

从内容来看,每个设备信息的内容都有 I、N、P、S、U、H、B 几个字段,下面对每个字段解释

这个字段的四个值对应的是/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.hinput.h

2018122814580746.png

2、EV 对应的类型也定义在 input-event-codes.hinput.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_STATUS      0x17
#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 中,这里截出鼠标对应值

2018122814580746.png

以前面 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

目录
相关文章
|
1月前
|
Java
Files.find 去除部分目录/dev/fd,/proc如何操作
在使用 `Files.find` 方法时,如果你想在搜索过程中排除特定目录,如 `/dev/fd` 和 `/proc`,可以在 `BiPredicate` 实现中添加相应的逻辑。以下是一个示例,演示如何在 `Files.find` 中排除这些目录: ```java import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; imp
|
11月前
|
Linux
【Linux】关于Bad magic number in super-block 当尝试打开/dev/sda1 时找不到有效的文件系统超级块
【Linux】关于Bad magic number in super-block 当尝试打开/dev/sda1 时找不到有效的文件系统超级块
203 0
|
12月前
|
网络协议
VFS: Cannot open root device "nfs" or unknown-block(0,255)错误解决
VFS: Cannot open root device "nfs" or unknown-block(0,255)错误解决
293 0
文件系统里面没有 /dev/input/mice 文件的解决办法
文件系统里面没有 /dev/input/mice 文件的解决办法
229 0
文件系统里面没有 /dev/input/mice 文件的解决办法
|
内存技术
嵌入式 VFS: Cannot open root device "mtdblock2" or unknown-block(2,0)
系统启动后,虽然nand驱动表现正常,但是最后挂载rootfs时候出错: Kernel command line: root=/dev/mtdblock2 rw init=/linuxrc console=ttyAMA1,115200 mem=64M rootfstype=yaffs2。
2203 0
|
Docker 容器 Kubernetes
解决kubeadm init /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决kubeadm init /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1 记录
17414 0
|
Oracle IDE 关系型数据库
How to Dynamically Add and Remove SCSI Devices on Linux (文档 ID 603868.1)
How to Dynamically Add and Remove SCSI Devices on Linux (文档 ID 603868.1)
1979 0
|
JavaScript 前端开发