20251202 - Linux输入系统的基础知识 - tslib

1. 什么是 tslib?

tslib (Touch Screen Library) 是一个运行在用户空间(User Space)的开源 中间件库

它的核心作用:

在嵌入式 Linux 中,触摸屏驱动(Kernel Driver)直接报上来的数据往往是"不完美"的,特别是对于电阻屏(虽然电容屏好很多,但有时也需要):

  1. 坐标不准:驱动报上来的可能是电压值或原始ADC值(比如 0~4095),而不是屏幕分辨率(比如 800x480)。
  2. 抖动:手按着不动,数值却在乱跳。
  3. 误触:快速点击产生的毛刺信号。

tslib 就是一个"翻译官"和"过滤器"。 它位于 内核驱动应用程序(如 Qt) 之间。

主要功能:
  • 校准 (Calibration):通过 5 点校准法,将原始坐标转换为屏幕像素坐标。
  • 去噪 (De-noise):滤除毛刺。
  • 去抖 (Debounce):防止一次点击被识别为多次。
  • 平滑 (Linear):让划线更平滑。
常用工具:
  • ts_calibrate:屏幕校准程序(第一次开机通常都要运行它)。
  • ts_test:测试屏幕画线、点击是否准确。
  • 配置文件:/etc/ts.conf(配置各种插件)。

2. 标准输入事件:struct input_event

这是 Linux 输入子系统的 "通用数据包" 。无论你是鼠标、键盘、游戏手柄还是触摸屏,内核发给应用程序的数据格式 永远是这个结构体

它定义在头文件 <linux/input.h> 中:

c 复制代码
struct input_event {
    struct timeval time;  // 事件发生的时间戳
    __u16 type;           // 事件的类型 (你是哪一类事件?)
    __u16 code;           // 事件的代码 (具体是哪个键/轴?)
    __s32 value;          // 事件的值   (按下了还是松开了?坐标是多少?)
};
详细字段解析:
字段 含义 常见取值示例
time 时间戳 包含 tv_sec (秒) 和 tv_usec (微秒)。用来判断连击或滑动速度。
type 大分类 EV_KEY (0x01): 按键事件(键盘/鼠标键/触摸点击) EV_REL (0x02): 相对位移(鼠标移动) EV_ABS (0x03): 绝对位移(触摸屏/摇杆) EV_SYN (0x00): 同步信号(用来分割每一组完整的事件)
code 具体对象 如果是 EV_KEY : KEY_A (键盘A), BTN_TOUCH (触摸屏按下) 如果是 EV_ABS : ABS_X (X轴坐标), ABS_Y (Y轴坐标), ABS_PRESSURE (压力)
value 具体数值 如果是 KEY : 1(按下), 0(松开), 2(长按重复) 如果是 ABS: 具体的坐标数值(如 512)
举个例子:点击触摸屏一次会发生什么?

这通常是一组连续的事件包:

  1. EV_ABS, ABS_X, 100 (X轴在100)

  2. EV_ABS, ABS_Y, 200 (Y轴在200)

  3. EV_KEY, BTN_TOUCH, 1 (手指按下了)

  4. EV_SYN, SYN_REPORT, 0(同步,以上是一组,即手指在屏幕坐标(100,200)按下了,处理吧!)

    ... (手指抬起) ...

  5. EV_KEY, BTN_TOUCH, 0 (手指松开了)

  6. EV_SYN, SYN_REPORT, 0 (同步)


3. 多种 Handler (事件处理器)

Input Handler 是内核中负责将驱动层的数据 分发 给用户空间的模块。不同的 Handler 会创建不同的设备节点,提供不同的数据格式。

以下是常见的 Handler:

1. evdev (Event Device Handler) ------ 最重要
  • 节点/dev/input/event0, /dev/input/event1, ...
  • 全称:Generic Event Interface (通用事件接口)。
  • 特点这是现代 Linux 的标准接口。 它原封不动地将 struct input_event 发送给用户。tslib、Qt5、Android 底层都读取这个接口。
  • 调试hexdump /dev/input/event0 看到的就是它的数据。
2. mousedev (Mouse Device Handler)
  • 节点/dev/input/mouse0, /dev/input/mice
  • 全称:PS/2 Mouse Interface (PS/2 鼠标模拟接口)。
  • 特点:它把所有输入设备(包括触摸屏)模拟成一个古老的 PS/2 鼠标。
  • 用途 :主要用于兼容旧的桌面系统(X11)。它输出的数据不是 input_event,而是类似 dx, dy 的鼠标协议数据。嵌入式开发中通常不直接用它读取数据。
3. joydev (Joystick Device Handler)
  • 节点/dev/input/js0
  • 全称:Joystick Interface (游戏摇杆接口)。
  • 特点 :专门用于处理游戏手柄、摇杆数据。不过现在的游戏手柄通常也推荐直接走 evdev
4. keybdev / kbd (Keyboard Handler)
  • 节点 :无直接对应的 /dev 文件(直接作用于 TTY)。
  • 全称:Console Keyboard Handler (控制台键盘处理器)。
  • 特点:它是内核内部使用的。它把键盘的扫描码(Scan Code)转换成 ASCII 码,发给当前的终端(TTY)。这就为什么你按键盘,屏幕上会出字。

总结图谱

  • 硬件:触摸屏
  • 驱动:I2C/SPI 驱动
  • Input Core:内核核心层
  • Handler (分流)
    • --> evdev (/dev/input/event0) --> tslib (校准/去噪) --> Qt/APP (最终使用) (这是现在的标准路径)
    • --> mousedev (/dev/input/mouse0) --> 旧式程序
    • --> kbd --> 终端控制台 (TTY)
相关推荐
羽获飞12 小时前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
wotaifuzao15 小时前
STM32 + FreeRTOS 的订阅通知组件架构
stm32·嵌入式硬件·架构·freertos·事件驱动·嵌入式架构
小龙报16 小时前
【51单片机】深度解析 51 串口 UART:原理、配置、收发实现与工程化应用全总结
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·51单片机
Lester_11011 天前
STM32 高级定时器PWM互补输出模式--如果没有死区,突然关闭PWM有产生瞬间导通的可能吗
stm32·单片机·嵌入式硬件·嵌入式软件
小李独爱秋1 天前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
宵时待雨1 天前
STM32笔记归纳8:时钟
笔记·stm32·单片机·嵌入式硬件
JJRainbow1 天前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
不做无法实现的梦~1 天前
PX4编译环境配置和qgc配置安装教程(2)
linux·stm32
宁静致远20211 天前
STM32模拟IIC读取PCF8563
stm32·单片机·嵌入式硬件
听风吹雨yu1 天前
STM32F407-MD5码计算/Digest认证计算
stm32·单片机·嵌入式硬件