应用程序打开输入设备对应的设备文件,向其发起读操作,那么这个读操作获取到的
是什么样的数据呢? 其实每一次 read 操作获取的都是一个 struct input_event 结构体类型数据, 该结构体定
义在<linux/input.h>头文件中
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
type:用于描述发生了哪一类型的事件
#define EV_SYN #define EV_KEY #define EV_REL #define EV_ABS #define EV_MSC #define EV_SW #define EV_LED #define EV_SND #define EV_REP #define EV_FF #define EV_PWR #define EV_FF_STATUS 0x17 #define EV_MAX 0x1f | 0x00 0x01 0x02 0x03 0x04 0x05 0x11//LED 0x12//声音 0x14//Repeat自动重复设备 0x15//力反馈 0x16 | //同步类事件,用于同步事件 //按键类事件 //相对位移类事件(譬如鼠标) //绝对位移类事件(譬如触摸屏) //其它杂类事件 |
|
#define EV_CNT | (EV_MAX+1) |
设置支持按键事件:
set_bit(EV_KEY, input_dev.evbit);
code:表示该类事件中哪一个具体的事件,告知应用程序是哪一个按键发生了输入事件
按键类
#define KEY_RESERVED #define KEY_ESC #define KEY_1 #define KEY_2 #define KEY_TAB #define KEY_Q #define KEY_W #define KEY_E #define KEY_R | 0 | 1 2 3 15 16 17 18 19 |
//ESC 键 //数字 1 键 //数字 2 键 //TAB 键 //字母 Q 键 //字母 W 键 //字母 E 键 //字母 R 键 |
相对位移事件
#define REL_X #define REL_Y #define REL_Z #define REL_RX #define REL_RY | 0x00 //X轴 0x01 //Y轴 0x02 //Z轴 0x03 0x04 |
#define REL_RZ | 0x05 |
#define REL_HWHEEL | 0x06 |
#define REL_DIAL | 0x07 |
#define REL_WHEEL #define REL_MISC | 0x08 0x09 |
#define REL_MAX #define REL_CNT | 0x0f (REL_MAX+1) |
|
多点触控(MT)协议
ABS_MT_SLOT | 多点触控(MT)协议的一种功能,标识不同的触摸点,通知接收者准备更新所给的slot |
ABS_MT_POSITION_X | 报告触摸椭圆的中心的x坐标,用于追踪多个触点,最小值和最大值定义了设备活动区域的边界 |
ABS_MT_TRACKING_ID | 用于报告工具的跟踪ID,是一个任一的非负整数,由输入驱动生成,正值代表与之关联的slot的down事件,-1代表与之关联的slot的up事件,用于追踪已识别的触点在时间上的变化 |
绝对
结构体:
struct input_absinfo {
__s32 value; __s32 minimum; __s32 maximum; __s32 fuzz; //模糊值 __s32 flat; //平均值 | //最新的报告值 //最小值 //最大值 |
__s32 resolution; | //分辨率 |
};
存储绝对轴的信息,当前值,最大值最小值,平均值,模糊值,分辨率,是input_dev结构体的成员,通过input_alloc_absinfo函数分配
获取触摸屏支持的最大触摸点数
struct input_absinfo info;
int max_slots; //最大触摸点数
if (0 > ioctl(fd, EVIOCGABS(ABS_MT_SLOT), &info))
perror("ioctl error");
max_slots = info.maximum + 1 - info.minimum;