input子系统
input子系统
输入设备包括鼠标、键盘、触摸屏、按钮等,它们都能产生输入事件,产生输入数据给计算机系统。
Linux 系统为了统一管理输入设备,实现了一套能够兼容所有输入设备的框架,这个框架就是input 子系统。
驱动开发人员基于input 子系统开发输入设备的驱动程序,input 子系统可以屏蔽硬件的差异,向应用层提供一套统一的接口。
查看input 子系统注册的输入设备
基于input 子系统注册成功的输入设备,都会在/dev/input 目录下生成对应的设备节点(设备文件),
设备节点名称通常为eventX( X 表示一个数字编号0、1、2、3 等)
查看输入设备对应的设备节点
cat /proc/bus/input/devices
读取数据
如果我们要读取触摸屏的数据,假设触摸屏设备对应的设备节点为/dev/input/event0 , 那么数据读取流程如下:
1.应用程序打开/dev/input/event0 设备文件;
2.应用程序发起读操作(例如调用read),如果没有数据可读则会进入休眠(阻塞I/O 情况下;
3.当有数据可读时,应用程序会被唤醒,读操作获取到数据返回;
4.应用程序对读取到的数据进行解析。
获取到的数据格式 <linux/input.h>
struct timeval {
__time_t tv_sec; // 秒
long int tv_usec; // 微秒(1 微秒 = 10-3毫秒 = 10-6秒)
};
struct input_event {
struct timeval time; // 表示输入时的时间
__u16 type; // 表示输入设备时那个东西,常用的有鼠标,键盘等
__u16 code; // 根据不同的type有code,类型比如键盘的那个按键,鼠标的那个按键等
__s32 value; // 根据不同的type和code决定,比如键盘A键按下和松开,鼠标的移动方向等
};
types
#define EV_SYN 0x00 // 同步事件,通常一个输入事件结束都会有一个同步事件,作为分隔两个输入事件
#define EV_KEY 0x01 // 按键类事件,作为描述设备的键值
#define EV_REL 0x02 // relative相对输入事件,主要是用来描述鼠标类设备这次移动相对上次移动的偏移值
#define EV_ABS 0x03 // absoluate绝对输入事件,主要是用来描述触摸屏类设备的按键值
#define EV_MSC 0x04 // 其它事件
#define EV_SW 0x05 // 开关事件
#define EV_LED 0x11 // 灯光事件
#define EV_SND 0x12 // 声音事件,比如:hey,Siri
#define EV_REP 0x14 // 重复类事件
#define EV_FF 0x15 // 力反馈事件,比如指纹识别
#define EV_PWR 0x16 // 电源事件,比如我按了电源按键,手机就应该处于待机状态
#define EV_FF_STATUS 0x17 // 受力状态事件,比如按下电源键5s,就应该关机
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
EV_REL // 相对位置类(主要是用于鼠标和笔记本电脑的触控板)
#define REL_X 0x00 /* x轴相对上次的x轴的偏移坐标 */
#define REL_Y 0x01 /* y轴相对上次的y轴的偏移坐标 */
#define REL_Z 0x02 /* z轴相对上次的z轴的偏移坐标 */
#define REL_RX 0x03
#define REL_RY 0x04
#define REL_RZ 0x05
#define REL_HWHEEL 0x06
#define REL_DIAL 0x07
#define REL_WHEEL 0x08
#define REL_MISC 0x09
#define REL_MAX 0x0f
#define REL_CNT (REL_MAX+1)
驱动 https://blog.csdn.net/weixin_42031299/article/details/125111946
应用 https://blog.csdn.net/gdut_liujiangyi/article/details/123880416
https://blog.csdn.net/wkd_007/article/details/126729030