2011-08-26 148 views
4

我正在研究Linux的设备驱动程序。这是一个USB笔平板电脑。问题是驱动程序的探测回调从未被调用。 dmesg只是显示:Linux USB设备驱动程序未得到探测

generic-usb: probe of 0003:099A:2620.000F failed with error -22 

我永远不会连接到设备。似乎系统驱动程序以某种方式覆盖了我的驱动程序?

我的代码正在注册注销&正确用insmod/rmmod的:

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/usb.h> 
#include <linux/slab.h> 

MODULE_DEVICE_TABLE (usb, id_table); 
struct usb_device_id id_table[] = 
{ 
    {USB_DEVICE(0x099a, 0x2620)}, //Zippy Technology Corp. Digi Tablet 
    {0} 
}; 

void dt_disconnect(struct usb_interface *interface) 
{ 
    printk("dt_disconnect called\n"); 
} 

int dt_probe(struct usb_interface *interface, const struct usb_device_id *id) 
{ 
    printk("dt_probe called\n"); 
    return 0; 
} 

static struct usb_driver dt_driver = 
{ 
    .name = "Zippy Technology Corp. Digi Tablet", 
    .probe = dt_probe, 
    .disconnect = dt_disconnect, 
    .id_table = id_table 
}; 

static int __init dt_init(void) 
{ 
    //0 means success 
    int error = usb_register(&dt_driver); 
    if(error) 
     printk("dt_init failed\n"); 

    return 0; 
} 

static void __exit dt_exit(void) 
{ 
    //void 
    usb_deregister(&dt_driver); 
} 

module_init(dt_init); 
module_exit(dt_exit); 

MODULE_LICENSE("GPL"); 

dt_probe永远不会被调用。我使用的是Linux 2.6.40(Fedora 15的版本为3.0),大多数关于这个东西的文档都很旧,所以我想我会在这里问。有什么想法吗?

回答

2

是的,usbhid驱动程序会覆盖您的驱动程序。您需要从正在运行的内核中删除usbhid驱动程序。首先将您的设备从系统中取出,并使用“modprobe -r usbhid”删除usbhid模块。现在插入您的模块并连接设备,然后您的驱动程序将被采取。

+0

'modprobe -r usbhid'没有工作,但我明白了。我做了一些更多的研究,发现数位板有三个接口:HID键盘,HID鼠标和HID使用协议0x3的东西(这是我从Windows嗅探的笔模式协议)。所以它只是被这个usbhid压倒我的司机弄乱了。 usbhid似乎将鼠标和键盘安装到xinput中,但实际上并不成功。你认为我应该挖掘一个补丁的usbhid或只是试图以其他方式覆盖usbhid?我不知道usbhid需要补丁,但我不能让平板电脑工作。 – Alex

+0

http://stackoverflow.com/questions/3389192/register-bind-match-a-device-with-a-driver是完全相同的问题.. – Alex