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

Naz*_*imi 5 c linux linux-device-driver linux-kernel embedded-linux

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

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

现在多点触控DISABLED原始数据头将是[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);
Run Code Online (Sandbox Code Playgroud)

另外,我使用的是Linux 2.6.24.

谢谢!

Naz*_*imi 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)
Run Code Online (Sandbox Code Playgroud)

大多数设备默认启用一键式。因此,向设备发送消息就可以了。

棘手的部分是发送什么消息。因为Win7可以做到一键或多点触摸。我所做的只是比较两者的初始化序列。并在 Linux 上应用“丢失”的消息。