Linux驱动学习(TP)(三)
多点电容触摸协议(Multi-Touch)
多点电容触摸协议分为两种:Type A和Type B
Type A协议
该协议用于触摸点不能被区分或者追踪,一般不使用了。
在每个数据包的结尾用input_mt_sync()对多个触控包进行分割,这将会产生一个SYN_MT_REPORT事件,它通知接收者接受当前的触控信息并准备接收下一个信息。
目前使用最多的还是Type B协议。
Type B协议
适用于硬件追踪并且能够区分触摸点的触摸设备;
通过slot更新某一个触摸点的信息;
项目中使用的均为该协议
在上报触摸点信息的时候使用的函数是:input_mt_slot(struct input_dev *dev, int slot)
该函数中包含两个参数:
第一个参数表示的是input_dev()设备,即输入设备
第二个参数slot表示的是当前上报的触摸点信息位置(是哪个位置触摸点)
上报时序
1、上报ABS_MT_SLOT事件
即上报触摸点对应的slot。每次上报一个触摸点坐标之前需要先使用input_mt_slot()函数上报当前触摸点的SLOT。
2、SLOT对应的关联函数操作
根据Type B协议的要求,每个SLOT必须关联一个ABS_MT_TRACKING_ID,通过修改SLOT关联的ABS_MT_TRACKING_ID完成对触摸点的添加,删除或者替换等。通过input_mt_report_slot_state()函数实现上述操作。
input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, true)
参数一:输入设备
参数二:触摸方式
MT_TOOL_FINGER:手指触摸
MT_TOOL_PEN:笔触
参数三:active,表示是否添加新的触摸点,true表示添加第三个触摸点,linux 内核会自动分配一个 ABS_MT_TRACKING_ID 值,不需要用户去指定具体的 ABS_MT_TRACKING_ID 值。
3、上报触摸点的信息
使用input_report_abs()函数:
e.g.
input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, events[i]. area);
input_report_abs(input_dev, ABS_MT_POSITION_X, events[i].x);
input_report_abs(input_dev, ABS_MT_POSITION_Y, events[i].y);
参数一:表示输入设备
参数二:表示事件类型,
ABS_MT_TOUCH_MAJOR表示上报触摸点面积信息,
ABS_MT_POSITION_X和ABS_MT_POSITION_Y分别表示X坐标和Y坐标信息
参数二的其他标志信息可以看https://www.cnblogs.com/linhaostudy/p/11046425.html。
其他常见使用的上报信息函数
上报键值信息
Input_report_key()
上报坐标信息(绝对坐标)
Input_report_abs()
上报坐标信息(相对坐标)
Input_report_rel()
4、发送SYN_REPORT事件
当所有的触摸点信息都上传完毕之后,发送SYN_REPORT事件,使用的函数是input_sync()函数,
input_sync(input_dev);