STM32F103C8T6蓝莓派上,用HAL库GPIO模拟SPI驱动MAX31865读取PT1000温度(附完整代码)
2026/6/2 3:28:31
Linux 输入子系统(Input Subsystem)是 Linux 内核中专门负责处理输入设备(按键、触摸屏、鼠标、键盘、游戏手柄等)的框架。
如果没有这个子系统,每个硬件厂家都会发明自己的协议。
"MOUSE: LEFT CLICK"0x01 0x00X=100, Y=200作为应用开发者(写 APP 的人),你会疯掉,因为你需要适配成千上万种硬件。
Linux 输入子系统的作用: “统一语言”。
无论底层是鼠标、键盘还是触摸屏,到了应用层,Linux 都把它们统一封装成 struct input_event 结构体。应用程序只需要读取这个结构体,就能知道发生了什么。
整个框架可以想象成一个“三层汉堡包”:
drivers/input/input.cinput_register_device)。input_register_handler)。/dev/input/event0)。read()时,发给 APP。evdev(Event Device)。它通吃所有输入设备,我们在开发中 99% 都是和/dev/input/eventX打交道。Plaintext
+-------------------------------+ | 用户空间应用程序 (APP) | (也就是你写的 read/scanf/Qt) +-------------------------------+ ^ | read() | v +-------------------------------+ | 设备节点 /dev/input/event0 | +-------------------------------+ ^ | (evdev.c) +-------------------------------+ | 事件处理层 (Event Handler) | <-- 标准化接口 +-------------------------------+ ^ | +-------------------------------+ | 输入核心层 (Input Core) | <-- 负责撮合匹配 +-------------------------------+ ^ | input_report_key() +-------------------------------+ | 设备驱动层 (Device Driver) | <-- 你需要写代码的地方 +-------------------------------+ ^ | (中断/轮询) +-------------------------------+ | 硬件 (按键/触摸屏) | +-------------------------------+struct input_event这是整个子系统的“通用货币”。无论什么设备,最终你在 APP 里读到的都是这个结构体(定义在<linux/input.h>):
C
struct input_event { struct timeval time; // 事件发生的时间戳 __u16 type; // 事件类型 (按键? 相对位移? 绝对位移?) __u16 code; // 事件代码 (具体哪个键? X轴还是Y轴?) __s32 value; // 事件值 (按下了还是松开了? 坐标是多少?) };type(类型):EV_KEY: 按键(键盘、鼠标左键、触摸屏点击)。EV_REL: 相对位移(鼠标移动)。EV_ABS: 绝对位移(触摸屏坐标)。EV_SYN: 同步事件(告诉系统这一组信号发完了)。code(代码):EV_KEY,code 可能是BTN_LEFT(鼠标左键) 或KEY_A(键盘A)。EV_ABS,code 可能是ABS_X(X轴) 或ABS_Y(Y轴)。value(值):1(按下),0(松开),2(长按重复)。在嵌入式 Linux (如你的 I.MX6ULL) 上,调试输入设备非常方便。
使用ls命令查看设备节点:
Bash
ls -l /dev/input/你会看到event0,event1等。
查看更详细的信息(看看 event0 到底是谁):
Bash
cat /proc/bus/input/devices或者
Bash
ls -l /sys/class/input/event*这能帮你确定:触摸屏是event0还是event1。
hexdump查看原始数据假设触摸屏是 /dev/input/event1。
你可以直接读它:
Bash
hexdump /dev/input/event1然后在屏幕上点一下。你会看到一堆十六进制数据哗啦啦地打印出来。
evtest工具(神器,强烈推荐)大多数嵌入式文件系统(Buildroot)都自带这个工具。
evtest。它会把二进制结构体翻译成人话:
Plaintext
Event: time 16843.22, type 3 (EV_ABS), code 0 (ABS_X), value 500 Event: time 16843.22, type 3 (EV_ABS), code 1 (ABS_Y), value 300 Event: time 16843.22, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1这表示:在坐标 (500, 300) 的位置,按下了触摸屏。
你需要像操作文件一样操作它:
open("/dev/input/event1", O_RDONLY)read(fd, &my_event, sizeof(struct input_event))printf打印结构体里的内容。struct input_event(时间、类型、代码、值)。cat /proc/bus/input/devices找设备,再用evtest抓数据。