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博客