linux /dev/下设备节点创建

linux kernel从 2.6 到 3.0 3.4  ...    devfs已经被抛弃。  kernel交互的方式有 sysfs procfs 还有就是/dev下的节点, 这些节点是如何被创建出来的呢。
研究了半天,在kernel device_create代码看了遍,也只是发现创建了一堆sysfs节点和一些link。
最后才发现是用户空间创建的。 android系统在
system/core/init/ueventd.c
if (ufds[0].revents == POLLIN)
handle_device_fd(device_fd);
system/core/init/devices.c: handle_device_event->make_device
通过接收uevent来动态添加/dev下节点

对于 linux pc 是采用udev来代替早期的devfs 在一个守护进程中实现/dev下节点的动态添加。
嵌入式linux中,busybox继承了一个简化版的udev,叫mdev。

 

<think>嗯,用户问的是/dev/input/下有哪些设备节点。之前他问过关于输入子系统事件声明的问题,现在可能是在进一步了解输入设备的结构。我需要先回想一下Linux输入子系统的相关知识。 首先,/dev/input/目录下通常包含eventX、mouseX、jsX这些设备节点。eventX是通用的事件设备,所有输入设备都会在这里有对应的节点,应用程序通过它们读取输入事件。然后mouseX是传统鼠标设备,提供相对移动数据,可能有些老程序还在使用。jsX是游戏手柄,支持摇杆和按钮事件。 用户可能想知道这些节点的区别和用途,特别是为什么会有不同类型的节点存在。比如,为什么既有eventX又有mouseX?可能需要解释历史原因和兼容性考虑。同时,用户可能在进行设备调试或开发驱动,需要了解如何选择正确的设备节点进行交互。 另外,用户可能遇到了设备识别的问题,比如插入新设备后如何确定对应的节点。这时候可以提到工具如evtest或者查看/proc/bus/input/devices文件来获取详细信息。需要确保回答清晰,分点说明每种节点的用途,并给出实际例子和调试技巧,帮助用户实际应用。 还要注意用户的技术水平,可能对Linux设备模型有一定了解,但需要详细说明每个节点的作用和使用场景。比如,eventX是主流的,而mouseX和jsX更多是为了向后兼容。最后总结一下查看设备信息的方法,帮助用户实际操作。</think>在 Linux 系统中,`/dev/input/` 目录下的设备节点是**输入子系统**的核心接口,用户空间程序通过它们与输入设备(如键盘、鼠标、触摸屏等)交互。以下是这些设备节点的分类及作用详解: --- ### **1. 主要设备节点类型** | 设备节点名称 | 作用描述 | 典型设备示例 | |--------------------|--------------------------------------------------------------------------|-----------------------------| | **`eventX`** | **通用输入事件接口**,所有输入设备均会生成此类节点,提供原始事件流 | 键盘、鼠标、触摸屏、游戏手柄| | **`mouseX`** | **传统鼠标设备接口**,仅支持相对位移(`REL_X`, `REL_Y`)和基础按键事件 | PS/2 鼠标、USB 鼠标 | | **`jsX`** | **游戏手柄/摇杆专用接口**,支持轴(`ABS_*`)和按钮(`BTN_*`)事件 | 游戏手柄、飞行摇杆 | --- ### **2. 设备节点详解** #### **`eventX`(如 `event0`, `event1`)** - **核心特性**: - 统一的事件模型,支持所有输入设备类型。 - 通过 `EVIOCGBIT` ioctl 可查询设备支持的事件类型(如 `EV_KEY`, `EV_ABS`)。 - 使用 `read()` 读取 `struct input_event` 结构体数据流,包含时间戳、事件类型、编码和值。 - **使用场景**: - **现代应用程序的首选接口**(如 GUI 框架、`libinput`)。 - 示例:通过 `evtest` 工具调试触摸屏事件: ```bash sudo evtest /dev/input/eventX ``` #### **`mouseX`(如 `mouse0`, `mouse1`)** - **设计背景**: 为兼容早期仅支持相对位移的应用程序(如某些命令行工具)。 - **局限性**: - 仅支持 `EV_REL`(相对坐标)和 `EV_KEY`(基础按键)事件。 - **无法处理绝对坐标设备**(如触摸屏)。 - **使用场景**: - 传统鼠标驱动(如 `psmouse` 模块)的兼容接口。 - 示例:通过 `cat` 直接读取鼠标移动数据: ```bash cat /dev/input/mouse0 | hexdump # 输出二进制位移数据 ``` #### **`jsX`(如 `js0`, `js1`)** - **专用设计**: 为游戏手柄、摇杆等设备提供标准化轴和按钮事件。 - **特性**: - 支持 `EV_ABS`(绝对轴,如摇杆)、`EV_KEY`(按钮)事件。 - 提供校准和力反馈(`EV_FF`)支持。 - **使用场景**: - 游戏引擎或手柄调试工具(如 `jstest`): ```bash jstest /dev/input/js0 # 查看手柄轴和按钮状态 ``` --- ### **3. 节点生成规则** - **动态分配**: 设备节点编号(如 `event0`、`mouse1`)由内核在设备注册时动态分配,与设备插入顺序相关。 - **持久化命名(可选)**: 通过 `udev` 规则可为设备创建持久化符号链接(如 `/dev/input/by-id/usb-Logitech_鼠标-event-mouse`),避免编号变化导致的问题。 --- ### **4. 查看设备节点信息** #### **方法 1:通过 `evtest` 工具** ```bash evtest --info # 列出所有输入设备及其支持的 eventX 节点 ``` 输出示例: ``` Available devices: /dev/input/event0: Logitech USB Keyboard /dev/input/event1: Logitech USB Mouse /dev/input/event2: SynPS/2 Synaptics TouchPad ``` #### **方法 2:解析 `/proc/bus/input/devices`** ```bash cat /proc/bus/input/devices ``` 输出示例: ``` I: Bus=0011 Vendor=0002 Product=0007 Version=01b1 N: Name="SynPS/2 Synaptics TouchPad" P: Phys=isa0060/serio1/input0 S: Sysfs=/devices/platform/i8042/serio1/input/input5 U: Uniq= H: Handlers=mouse0 event2 B: PROP=5 B: EV=b B: KEY=420 0 70000 0 0 0 0 0 0 0 0 B: ABS=6608000 11000003 ``` - **关键字段**: - `Handlers`: 显示设备关联的节点(如 `event2`、`mouse0`)。 - `EV`: 事件类型位掩码(十六进制)。 - `ABS`/`KEY`: 具体编码位掩码。 --- ### **5. 实际应用示例** #### **场景:调试触摸屏事件** 1. 通过 `evtest` 找到触摸屏对应的 `eventX` 节点: ```bash sudo evtest ``` 2. 使用 `evtest` 监听事件流: ```bash sudo evtest /dev/input/event2 ``` 3. 触摸屏幕时观察输出的 `ABS_X` 和 `ABS_Y` 坐标值。 --- ### **总结:节点类型对比** | 节点类型 | 兼容性 | 事件支持 | 典型用户程序 | |----------|--------------|------------------------------|----------------------------| | `eventX` | 通用 | 所有事件类型(`EV_*`) | GUI 框架、输入监控工具 | | `mouseX` | 传统鼠标 | 仅 `EV_REL` 和基础 `EV_KEY` | 旧终端工具 | | `jsX` | 游戏设备 | `EV_ABS`、`EV_KEY`、`EV_FF` | 游戏引擎、手柄配置工具 | 通过理解这些设备节点的差异,开发者可以更高效地调试输入设备或编写兼容性更强的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值