如何启用USB设备多点触控?

时间:2011-07-15 09:27:32

标签: c linux linux-kernel linux-device-driver embedded-linux

我正在为Linux制作我的第一个USB设备驱动程序,我正在尝试连接触摸屏设备。

我在Win7中尝试使用Win7的默认触摸面板驱动程序。 使用线路监视器/阅读器,我能够通过多点触摸 ENABLED 获取原始数据。 我们只是为了样本而说,多点触控数据头是 [0x8301] [0x8701] 分别为第一次和第二次触摸。

现在,通过多点触控禁用,原始数据标题将为 [0x8101]

现在有了我为Linux制作的驱动程序,我只能输出 [0x8101] ,这是一个单点数据头。

所以我猜这个初始化代码的某个部分,我不得不对设备说它是一个多点触控设备。或者我可能错误地初始化它。

    struct input_dev *input_dev;
input_dev = input_allocate_device();
input_dev->name = usb_mtouch->name;
input_dev->phys = usb_mtouch->phys;
usb_to_input_id(usb_mtouch->udev, &input_dev->id);
input_dev->dev.parent = &interface->dev;

input_set_drvdata(input_dev, usb_mtouch);

input_dev->open = mtouchdrv_open;
input_dev->close = mtouchdrv_close;

input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) |
    BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS);
input_set_abs_params(input_dev, ABS_X, usb_mtouch->x_min, usb_mtouch->x_max, 0, 0);
input_set_abs_params(input_dev, ABS_Y, usb_mtouch->y_min, usb_mtouch->y_max, 0, 0);
input_set_abs_params(input_dev, ABS_PRESSURE, 0, usb_mtouch->press_max, 0, 0);
input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC);

另外,我使用的是Linux 2.6.24。

谢谢!

1 个答案:

答案 0 :(得分:3)

我明白了。您必须向设备发送控制消息。

int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
                     __u8 requesttype, __u16 value, __u16 index, void *data,
                     __u16 size, int timeout)

默认情况下,大多数设备都是单触式启用的。因此,向设备发送消息就可以了。

棘手的部分是要发送的消息。由于Win7可以实现一键式或多点式触控。我所做的只是比较两者的初始化顺序。并在Linux上应用“缺失”消息。