touchscreen的B协议上报部分

static void ftxxxx_report_value(struct ftxxxx_ts_data *data)
{
struct ts_event *event = &data->event;//先获取event
int i;
int uppoint = 0;//抬起的点的数量
static u8 last_touchpoint; //为了防止有数据没有上报导致在屏幕上有小白点
printk(KERN_WARNING "[Focal][Touch] matt-event->touch_point=%d\n",event->touch_point);
printk(KERN_WARNING "[Focal][Touch] matt-event->Cur_touchpoint=%d\n",event->Cur_touchpoint);
/*protocol B*/
for (i = 0; i < event->touch_point; i++) {
input_mt_slot(data->input_dev,event->au8_finger_id[i]);

// B类在使用input_mt_slot()的时候会带有一个slot的参数,在每个数据包开始时 产生一个ABS_MT_SLOT事件,提示接收器更新数据

[zh] 对于type B设备的驱动程序,在开始上报某个触摸点信息的时候,
[zh] 调用input_mt_slot()用于区分是哪一个触摸点的信息,传递slot作为参数。
[zh] 通过调用input_mt_slot()会产生一个SYN_MT_REPORT消息,
[zh] 这个消息告诉接收者正在针对哪个slot更新信息

if (event->au8_touch_event[i]== 0 || event->au8_touch_event[i] == 2) {
//上面的参数等于0的时候是down事件。1---contact;2----contact
input_mt_report_slot_state(data->input_dev,MT_TOOL_FINGER,true);
input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]);
input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]);
input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]);
input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]);


} else {
uppoint++;//如果不是down事件则加1
input_mt_report_slot_state(data->input_dev,MT_TOOL_FINGER,false);

}
}
printk(KERN_WARNING "[Focal][Touch] matt-last_touchpoint1=%d\n",last_touchpoint);
if((last_touchpoint>0)&&(event->Cur_touchpoint==0))
//当Cur_touchpoint=0的时候说明没有触点但是偶尔会发生有触电没有取消导致小白点的问题
//所以再看last_touchpoint是否大于0,有的话全部清空
{
for(i=0;i{
input_mt_slot(data->input_dev,i);
input_mt_report_slot_state(data->input_dev,MT_TOOL_FINGER,false);
}
last_touchpoint=0;
}
printk(KERN_WARNING "[Focal][Touch] matt-uppoint=%d\n",uppoint);
if(event->touch_point == uppoint) {//当还有按键按着的时候这两者不相等
input_report_key(data->input_dev, BTN_TOUCH, 0);
} else {
input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0);
}
input_sync(data->input_dev);
last_touchpoint=event->Cur_touchpoint;
printk(KERN_WARNING "[Focal][Touch] matt-last_touchpoint2=%d\n",last_touchpoint);

}


接下来看看这个函数

void input_mt_report_slot_state(struct input_dev *dev,
				unsigned int tool_type, bool active)
{
	struct input_mt *mt = dev->mt;
	struct input_mt_slot *slot;
	int id;

	if (!mt)
		return;

	slot = &mt->slots[mt->slot];
	slot->frame = mt->frame;

	if (!active) {
		input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
		return;
	}

	id = input_mt_get_value(slot, ABS_MT_TRACKING_ID);
	if (id < 0 || input_mt_get_value(slot, ABS_MT_TOOL_TYPE) != tool_type)
		id = input_mt_new_trkid(mt);

	input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, id);
	input_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, tool_type);
}
通过修改slot的ABS_MT_TRACKING_ID,可以实现新增加、替换,去除触摸点。
[zh] 非负数的 ID 被认为是触摸点, -1 的 ID被认为是未使用的slot。
[zh] 一个以前不存在的 ID 出现了表示是一个新的,一个 ID 不存在了表示 删除了。
[zh] 因为只有变化的信息被上报,因此每一个触摸点的完整信息必须放在接收端进行维护。
[zh] 根据接收到的MT(MultiTouch)消息,应用程序更新当前slot的相关属性。


也就是先报了slot,再报tracking id,然后是具体的触摸数据

你可能感兴趣的:(linux驱动)