Linux USB device driver not getting probed

Alex picture Alex · Aug 26, 2011 · Viewed 7.2k times · Source

I'm working on a device driver for Linux. It's a USB pen tablet. The problem is that the driver's probe callback never gets called. dmesg just shows:

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

and i never get to connect to the device. It seems like the systems drivers are overriding my driver in some way?

My code is registering & unregistering correctly using 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 is never called. I'm using Linux 2.6.40 (Fedora 15's version of 3.0) and most documentation about this stuff is very old so I thought I'd ask here. Any thoughts?

Answer

rulingminds picture rulingminds · Aug 26, 2011

Yes, usbhid driver overrides your driver. You need to remove the usbhid driver from the running kernel. First deattach your device from the system and use "modprobe -r usbhid" to remove the usbhid module. Now insert your module and attach the device, then your driver will be taken.