文章目录
- 1 名词解释
- 2 输入设备编程框架
- 2.1 input子系统
- 2.2 读取数据流程
- 2.3 input_event结构体
- 2.3.1 type(哪类事件)
- 2.2 code(具体事件)
- 2.3 value(数值)
- 2.4 数据同步
- 2.5 读取start input_event数据
1 名词解释
1)输入设备:能够产生输入时间的设备,例如鼠标、键盘、触摸屏等
2)input子系统:用于统一管理linux中所有输入设备的框架。
2 输入设备编程框架
2.1 input子系统
上面介绍input子系统是一套统一的输入设备框架。驱动开发人员基于input子系统开发设备驱动,input子系统可以屏蔽硬件差异,向应用层提供统一接口。
基于input子系统注册成功的输入设备,都会在/dev/input
目录下生成对应的设备节点,设备节点名称通常为eventX
(X为数字编号0、1等)。具体那个设备对应那个编号需要查找。
确定设备文件
使用od
命令
sudo od -x /dev/input/eventX
2.2 读取数据流程
1)打开设备文件(/dev/input/eventX
)
2)读数据(read
)
3)数据解析
- 打开设备文件
使用open
函数 打开设备文件,操作类型为O_RDONLY
- 读取数据
数据读取时会有两种情况,一个是有数据,一个是没有数据。
当有数据可读取的时候,应用程序会被唤醒,读操作获取数据返回;
当没有数据可读的时候,程序会进入休眠模式(阻塞I/O情况下) - 解析数据
读取到的数据会放在input_event
类型的结构体中,该结构体定义在<linux/input.h>
头文件中,结构体成员变量以及具体解析形式在下面介绍。
2.3 input_event结构体
struct input_event {
struct timeval time; // 事件上报事件
__u16 type; // 事件类型
__u16 code; // 该类事件的具体事件
__u16 value; // 事件值
}
2.3.1 type(哪类事件)
type用于描述输入事件属于哪类事件,例如按键类(键盘),位移类(鼠标)等,具体类型如下表所示:
宏 | 数值 | 含义 |
---|---|---|
EV_SYN | 0x00 | 同步类型事件 |
EV_KEY | 0x01 | 按键类事件 |
EV_REL | 0x02 | 相对位移事件 |
EV_ABS | 0x03 | 绝对位移事件 |
EV_MSC | 0x04 | 其他事件 |
EV_SW | 0x05 | |
EV_LED | 0x11 | |
EV_SND | 0x12 | |
EV_REP | 0x14 | |
EV_FF | 0x15 | |
EV_PWR | 0x16 | |
EV_FF_STATUS | 0x17 | |
EV_MAX | 0x1f | |
EV_CNT | EV_MAX + 1 |
2.2 code(具体事件)
code表示该类事件中的哪一个具体事件,type中的每中类型事件都包含一系列的具体事件,例如按键类,就包含A、B、C、D等具体事件。
按键类事件
#define KEY_RESERVED 0
#define KEY_ESC 1 //ESC 键
#define KEY_1 2 //数字 1 键
#define KEY_2 3 //数字 2 键
#define KEY_TAB 15 //TAB 键
#define KEY_Q 16 //字母 Q 键
#define KEY_W 17 //字母 W 键
#define KEY_E 18 //字母 E 键
#define KEY_R 19 //字母 R 键
……
相对位移事件
#define REL_X 0x00 //X 轴
#define REL_Y 0x01 //Y 轴
#define REL_Z 0x02 //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)
绝对位移事件
触摸屏设备是一种绝对位移设备,产生绝对位移事件,对于触摸屏来说,一个触摸点所包含的信息有很多中,例如触摸点坐标(x,y,z)、按压力大小、接触面积等。绝对位移事件如下:
#define ABS_X 0x00 //X 轴
#define ABS_Y 0x01 //Y 轴
#define ABS_Z 0x02 //Z 轴
#define ABS_RX 0x03
#define ABS_RY 0x04
#define ABS_RZ 0x05
#define ABS_THROTTLE 0x06
#define ABS_RUDDER 0x07
#define ABS_WHEEL 0x08
#define ABS_GAS 0x09
#define ABS_BRAKE 0x0a
#define ABS_HAT0X 0x10
#define ABS_HAT0Y 0x11
#define ABS_HAT1X 0x12
#define ABS_HAT1Y 0x13
#define ABS_HAT2X 0x14
#define ABS_HAT2Y 0x15
#define ABS_HAT3X 0x16
#define ABS_HAT3Y 0x17
#define ABS_PRESSURE 0x18
#define ABS_DISTANCE 0x19
#define ABS_TILT_X 0x1a
#define ABS_TILT_Y 0x1b
#define ABS_TOOL_WIDTH 0x1c
......
2.3 value(数值)
value值的含义会随着code的变化而变化,对于按键事件来说,如果code=2(KEY_1),value的含义如下:
0:KEYZ_1松开
1:KEYZ_1按下
2:KEYZ_1长按
如果code=1,此时value的值为坐标值
2.4 数据同步
对于触摸屏来说,一个触摸点的信息包含x坐标和y坐标以及其他信息,但是,一次read只能读取一个信息,此时就遇到一个问题,那就是用户如何知道一个触摸点信息已经读取完毕了呢?
同步事件类型就是来解决这个问题的,当触摸点的所有信息全部读取完毕之后,内核会产生一个同步事件类型,已告知应用程序本轮数据已完整,可以进行同步了。同步事件的code值如下:
#define SYN_REPORT 0
#define SYN_CONFIG 1
#define SYN_MT_REPORT 2
#define SYN_DROPPED 3
#define SYN_MAX 0xf
#define SYN_CNT (SYN_MAX+1)
2.5 读取start input_event数据
1)程序:读取input数据
该程序使用的是阻塞式读取,在没有数据时,程序会等待数据
2)流程图
注:设备文件不同于普通文件,读写设备文件之前不需要设置读写位置的偏移量
程序验证