记录一些关于多点触控的信息:
一、配置
在TP模块的probe函数里有如下设置:
1)配置该设备支持的事件或是按键类型
set_bit(EV_SYN, rmi4_data->input_dev->evbit);
set_bit(EV_KEY, rmi4_data->input_dev->evbit);
set_bit(EV_ABS, rmi4_data->input_dev->evbit);
set_bit(BTN_TOUCH, rmi4_data->input_dev->keybit);
set_bit(BTN_TOOL_FINGER, rmi4_data->input_dev->keybit);
2)配置值的范围
input_set_abs_params(rmi4_data->input_dev,ABS_MT_POSITION_X, rmi4_data->disp_minx,rmi4_data->disp_maxx, 0, 0);
input_set_abs_params(rmi4_data->input_dev,ABS_MT_POSITION_Y, rmi4_data->disp_miny,rmi4_data->disp_maxy, 0, 0);
input_set_abs_params(rmi4_data->input_dev,ABS_PRESSURE, 0, 255, 0, 0);
input_set_abs_params(rmi4_data->input_dev,ABS_MT_TOUCH_MAJOR, 0,rmi4_data->max_touch_width, 0, 0);
input_set_abs_params(rmi4_data->input_dev,ABS_MT_TOUCH_MINOR, 0,rmi4_data->max_touch_width, 0, 0);
3)配置最多支持同时触摸的点的个数
input_mt_init_slots(rmi4_data->input_dev,rmi4_data->num_of_fingers);
二、报点
1)从传感器读取从硬件报上来的点的相关数据并进行处理
x = (finger_data->x_msb << 8) | (finger_data->x_lsb);
y = (finger_data->y_msb << 8) | (finger_data->y_lsb);
2)创建一个slot并初始化
input_mt_slot(rmi4_data->input_dev, finger);
input_mt_report_slot_state(rmi4_data->input_dev,MT_TOOL_FINGER, finger_status != 0);
3)向上报点
input_report_key(rmi4_data->input_dev,BTN_TOUCH, 1);
input_report_key(rmi4_data->input_dev,BTN_TOOL_FINGER, 1);
input_report_abs(rmi4_data->input_dev,ABS_MT_POSITION_X, x);
input_report_abs(rmi4_data->input_dev,ABS_MT_POSITION_Y, y);
input_report_abs(rmi4_data->input_dev,ABS_MT_TOUCH_MAJOR, max(wx, wy));
input_report_abs(rmi4_data->input_dev,ABS_MT_TOUCH_MINOR, min(wx, wy));
以上的1)、2)、3)步是在一个循环里面的,如果同时多点(N个点)触摸的话,上面的三个步骤就会走N次
4)完成,开始上报
input_sync(rmi4_data->input_dev);