2011-07-15 64 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上應用「丟失」消息。