多指触摸代码

1. 初始化

	const struct f1ltouch_platform_data *pdata = data->pdata;
	struct device *dev = &data->client->dev;
	struct input_dev *input_dev;
	int error;
	unsigned int num_mt_slots;
	unsigned int mt_flags = 0;

		/* Handle default values and orientation switch */
	if (data->max_x == 0)
		data->max_x = 1919;

	if (data->max_y == 0)
		data->max_y = 719;

	if (data->xy_switch)
		swap(data->max_x, data->max_y);
	
	dev_info(dev, "Touchscreen size X%uY%u\n", data->max_x, data->max_y);
	
		/* Register input device */
	input_dev = input_allocate_device();
	if (!input_dev) {
		dev_err(dev, "Failed to allocate memory\n");
		return -ENOMEM;
	}

	input_dev->name = "ads f1ltouch Touchscreen";
	input_dev->phys = data->phys;
	input_dev->id.bustype = BUS_I2C;
	input_dev->dev.parent = dev;


	//  1 config 
	__set_bit(EV_SYN, input_dev->evbit);
	__set_bit(EV_ABS, input_dev->evbit);
	__set_bit(EV_KEY, input_dev->evbit);
	__set_bit(BTN_TOUCH, input_dev->keybit);


	input_set_capability(input_dev, EV_KEY, KEY_VOLUMEUP);
	input_set_capability(input_dev, EV_KEY, KEY_VOLUMEDOWN);	
	input_set_capability(input_dev, EV_KEY, KEY_MUTE);

	// For single touch 
	input_set_abs_params(input_dev, ABS_X,0, data->max_x, 0, 0);
	input_set_abs_params(input_dev, ABS_Y,0, data->max_y, 0, 0);
	input_set_abs_params(input_dev, ABS_PRESSURE,0, 255, 0, 0);


	// for mutli touch 
	input_mt_init_slots(input_dev, 5, INPUT_MT_DIRECT);
	input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, data->max_x, 0, 0);
	input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, data->max_y, 0, 0);

	
#ifdef FUNC_PRESSURE_MAJOR_VETOR		
	input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, data->max_x, 0, 0);
	input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, data->max_y, 0, 0);
	input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
	input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
#endif

	input_set_drvdata(input_dev, data);

	error = input_register_device(input_dev);
	if (error) {
		dev_err(dev, "Error %d registering input device\n", error);
		goto err_free_mem;
	}

	data->input_dev = input_dev;

	return 0;

err_free_mem:
	input_free_device(input_dev);
	return error;
	

 2, 处理上报

		int i,j;
		struct ads_touch_key_data key_data[5];
		static struct my_prev_key_status ads_prev_key_status[10];
		static u8 prev_key_status[10]={0};
		u8 touch_sync=0;
	
		
		for(j=0;j<key_count;j++){
				key_data[j].pos_x = key_data_raw[j*6+2]*0xFF + key_data_raw[j*6+3];
				key_data[j].pos_y = key_data_raw[j*6+4]*0xFF + key_data_raw[j*6+5];
				key_data[j].status = key_data_raw[j*6+1];
				
			}
		for(i=0;i < key_count;i++)
		{
			
			if((key_data[i].status == press_status)||(key_data[i].status == release_status)||(key_data[i].status == move_status))
			{
				//printk(KERN_ERR "prev_key_status:%d %d %d %d",prev_key_status[0], prev_key_status[1], prev_key_status[2],MT_TOOL_FINGER);
				if((prev_key_status[i]!=1) && (key_data[i].status == press_status)
					|| (key_data[i].status == move_status))			
				{						
							printk(KERN_ERR "linken1 i:%d status:0x%x pos_x:0x%x pos_y:0x%x",i, key_data[i].status,key_data[i].pos_x, key_data[i].pos_y);
							
							
							if(key_data[i].status == press_status){
								printk(KERN_ERR "linken2 i:%d status:0x%x pos_x:0x%x pos_y:0x%x",i, key_data[i].status,key_data[i].pos_x, key_data[i].pos_y);
								
								input_report_key(data->input_dev, BTN_TOUCH, 1);
								//input_report_abs(data->input_dev, ABS_MT_TRACKING_ID,i);
								prev_key_status[i] = 1;
							/*	ads_prev_key_status[i].pos_x = key_data[i].pos_x;
								ads_prev_key_status[i].pos_y = key_data[i].pos_y;*/
							}
							input_mt_slot(data->input_dev, i);
							input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true);
							input_report_abs(data->input_dev, ABS_MT_POSITION_X,key_data[i].pos_x);
							input_report_abs(data->input_dev, ABS_MT_POSITION_Y,key_data[i].pos_y);
							

							//input_mt_sync(data->input_dev);
							touch_sync=1;
				}
	
				else if(key_data[i].status == release_status)
				{

					if(prev_key_status[i] == 1)
					{

							
							input_report_key(data->input_dev, BTN_TOUCH, 0);		
							prev_key_status[i] = 0;
							touch_sync=1;

					}
					input_mt_slot(data->input_dev, i);
					input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false);		
					
					if(key_count == 1)
					{
						for(j=0;j<5;j++)
						{
	
							input_report_key(data->input_dev, BTN_TOUCH, 0);	
							input_mt_slot(data->input_dev, j);
							input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, 0);
									
							prev_key_status[j] = 0;
							touch_sync=1;

						}
					}
				
				}
	
			}
		}
	
		if(touch_sync==1)
		{
			input_mt_report_pointer_emulation(data->input_dev, true);
			input_sync(data->input_dev);
			touch_sync=0;
		}

参考博客:android 电容屏(四):驱动调试之驱动程序分析篇 -- FocalTech_wh_19910525的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值