关于内核多点触摸输入驱动程序的问题

关于内核多点触摸输入驱动程序的问题

我正在为多点触控设备开发 Linux 内核驱动程序。我已将 Linux-3.0 内核源代码中包含的 usbtouchscreen 驱动程序用作起点。

虽然我已经可以通过触摸移动鼠标指针,但仍然存在许多问题:

  • 正确配置后,xinput 会将我的设备列为多点触控设备还是触摸屏?到目前为止,我得到的唯一信息列在虚拟核心指针类别中

  • 我应该如何正确配置和设置输入设备?这是我的做法:

/* 对于单点触摸 */
input_set_abs_params(input_dev, ABS_X, 0, 6300, 0, 0);
input_set_abs_params(input_dev, ABS_Y, 0, 6300, 0, 0);

/* 对于多点触摸 */
input_mt_init_slots(input_dev, 6);
input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xff, 0, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, 6300, 0, 0);
input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, 6300, 0, 0);

  • 我应该如何正确注入触摸?在 Linux 多点触控输入协议中,它规定如下:

根据硬件的功能,协议分为两种类型。-对于处理匿名联系人的设备(类型 A),协议描述了如何将所有联系人的原始数据发送给接收器。对于能够跟踪可识别联系人的设备(类型 B),协议描述了如何通过事件槽发送单个联系人的更新。

匿名接触是什么意思?我的设备发送原始数据,我的跟踪是在内核上进行的。当我准备在内核子系统中注入触摸时,我已经识别并跟踪了触摸。我的设备类型到底是什么?

无论如何,我已经尝试了两种类型的报告,但似乎都没有给我多点触控输入。这就是我现在的做法:

if(touchActive)
{
    input_mt_slot(usbtouch->input, Touch->Id);
    input_mt_report_slot_state(usbtouch->input, MT_TOOL_FINGER, true);

   input_report_abs(usbtouch->input, ABS_MT_TOUCH_MAJOR, 128);
   input_report_abs(usbtouch->input, ABS_MT_POSITION_X, Touch->ReportedPosition.X);
   input_report_abs(usbtouch->input, ABS_MT_POSITION_Y, Touch->ReportedPosition.Y);

   touch++;
}

if (touch>0)
{
    input_report_key(usbtouch->input, BTN_TOUCH, true);

    input_report_abs(usbtouch->input, ABS_X, Touch->ReportedPosition.X);
    input_report_abs(usbtouch->input, ABS_Y, Touch->ReportedPosition.Y);

    input_sync(usbtouch->input);
}
  • 我如何测试用户端多点触控输入?我尝试查看 xinput 是否将我的设备列为多点触控设备。没有成功。我还尝试了 qt4-demos 中的示例,手指画图总是没有结果。是否有任何用于 ubuntu 多点触控输入测试的“官方”工具?

相关内容