![关于内核多点触摸输入驱动程序的问题](https://linux22.com/image/1036889/%E5%85%B3%E4%BA%8E%E5%86%85%E6%A0%B8%E5%A4%9A%E7%82%B9%E8%A7%A6%E6%91%B8%E8%BE%93%E5%85%A5%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E9%97%AE%E9%A2%98.png)
我正在为多点触控设备开发 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 多点触控输入测试的“官方”工具?