首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

input_system输入子系统解析(4)

input_system输入子系统解析(4)

开启这个线程的目的是读取坐标,上报坐位给上层使用;它会在循环内轮询触摸事件,但触摸事件是随机的,所以用等待队列实现阻塞。

只有当触摸事件的中断到来,才唤醒队列,通过I2C通信gtp_i2c_read读取数据,之后通过input_report_xx和input_sync函数上报坐标。

补充:TP input_report_xx上报的内容一般有(从TP驱动ft6336s/focaltech_core.c截取部分代码):

static void tpd_down(int x, int y,int press, int id)
{
if ((!press) && (!id))
{
input_report_abs(tpd->dev, ABS_MT_PRESSURE, 100);
input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 100);
}
else
{
input_report_abs(tpd->dev, ABS_MT_PRESSURE, press); //上报手指按下还是抬起的状态
input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, press);
/* track id Start 0 */
input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, id);//id可以不用上报,上层可以自动匹配
}

input_report_key(tpd->dev, BTN_TOUCH, 1); //上报按键状态

input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); //上报x轴坐标
input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y);//上报y轴坐标

input_mt_sync(tpd->dev);//同步上报事件,通知上层完成一次上报
TPD_DEBUG_SET_TIME;
TPD_EM_PRINT(x, y, x, y, id, 1);
tpd_history_x=x;
tpd_history_y=y;
#ifdef TPD_HAVE_BUTTON
if (FACTORY_BOOT == get_boot_mode()|| RECOVERY_BOOT == get_boot_mode())
{
tpd_button(x, y, 1);//虚拟按键的处理,x和y的数据还有按键状态:按下和释放
}
#endif
TPD_DOWN_DEBUG_TRACK(x,y);
}

窗体顶端
1.tp driver的tpd_down()和tpd_up()函数中不需要上报id号,上层会自动进行匹配;
2.tpd_up()函数中只需要上报BTN_TOUCH和mt_sync信息,其他信息不用上报,如下:
窗体顶端
static void tpd_up(int x, int y,int *count)
{
input_report_key(tpd->dev, BTN_TOUCH, 0);
//printk("U[%4d %4d %4d] ", x, y, 0);
input_mt_sync(tpd->dev);
TPD_EM_PRINT(x, y, x, y, 0, 0);
if (FACTORY_BOOT == get_boot_mode()|| RECOVERY_BOOT == get_boot_mode())
{
tpd_button(x, y, 0);
}
}
返回列表