2011-07-15 45 views
4

我正在为Linux创建我的第一个USB设备驱动程序,并且我正尝试连接触摸面板设备。如何启用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。

谢谢!

Naze

+1

它不适用于'synaptics'或'wacom'驱动程序? –

+0

你的内核是否支持它? (http://lii-enac.fr/en/architecture/linux-input/multitouch-howto.html#hid-multitouch) – vines

+0

@Ignacio Vazquez-Abrams,我该如何使用wacom驱动程序?顺便说一句,这是一个ARM9嵌入式系统。 –

回答

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上应用“丢失”消息。