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<CFG_MAX_TOUCH_POINTS;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,然后是具体的触摸数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值