本文基于mstar801平台Linux2.6.35.11内核版本。
前些天调试一个elan的USB触摸板,发现插上USB dongle后、加载的驱动总是不对。
后经同事分析,是加载了错误的驱动导致;USB发现机制里边根据设备VID和PID匹配了USBHID设备。
因此,要解决这个问题需要在USBHID忽略列表里边添加自己elan USB触摸板的VID和PID;具体做法如下:
1.获得本设备VID和PID
通过插入USB dongle后看串口输出的VID和PID;
或在驱动代码中查找:
kernel2.6.35.11/drivers/input/elan_tp/elan_tp.c
#define VENDOR_ID 0x1D5A #define PRODUCT_ID 0xC0B3 #define VENDOR_ID_1 0x201e #define PRODUCT_ID_1 0x003c #define VENDOR_ID_2 0x04f3 #define PRODUCT_ID_2 0x0726
2.在USBHID设备忽略列表中加上这些VID和PID
kernel2.6.35.11/driver/hid/usbhid/hid-core.c
static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id) { ...... dbg_hid("HID probe called for ifnum %d\n", intf->altsetting->desc.bInterfaceNumber); //add by tank if ((dev->descriptor.idVendor == 0x1D5A)&&(dev->descriptor.idProduct == 0xC0B3)) { return -ENODEV ; } if ((dev->descriptor.idVendor == 0x201e)&&(dev->descriptor.idProduct == 0x003c)) { return -ENODEV ; } if ((dev->descriptor.idVendor == 0x04f3)&&(dev->descriptor.idProduct == 0726)) { return -ENODEV ; } printk("hid-core.c idVendor = %x , idProduct=%x\n",dev->descriptor.idVendor,dev->descriptor.idProduct); printk("hid-core.c interface->desc.bInterfaceNumber:%d desc.bNumEndpoints:%d\n",interface->desc.bInterfaceNumber,interface->desc.bNumEndpoints); //end by tank for (n = 0; n < interface->desc.bNumEndpoints; n++) if (usb_endpoint_is_int_in(&interface->endpoint[n].desc)) has_in++; ...... }
或kernel2.6.35.11/driver/hid/hid-core.c
static const struct hid_device_id hid_ignore_list[] = { ..... //add by tank { HID_USB_DEVICE(0x1D5A, 0xC0B3) }, { HID_USB_DEVICE(0x201e, 0x003c) }, { HID_USB_DEVICE(0x04f3, 0x0726) }, //end by tank { } }
3.补充-HID设备支持情况
kernel2.6.35.11/drivers/hid/hid-id.h