struct usb_device_id不包含USB设备信息

时间:2016-01-15 17:01:55

标签: c linux linux-kernel operating-system linux-device-driver

我是Linux内核的新手,我正在学习USB设备驱动程序。 我写了一个简单的USB驱动程序,带有探针回调和断开回调函数。

在探测回调中,我尝试显示传递给它的struct usb_device_id参数的值。问题是结构变量将产品ID和供应商ID显示为0。

这是什么原因?我做得还好吗?

来自驱动程序的代码片段是

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

int probe_callback(struct usb_interface *intf, const struct usb_device_id *id);
void disconnect_callback(struct usb_interface *intf);

struct usb_device_id usb_ids[]={
    {.driver_info=42},
    {}
};

struct usb_driver USB_DRIVER={
    .name="NEW USB",
    .id_table=usb_ids,
    .probe=probe_callback,
    .disconnect=disconnect_callback
};

//PROBLEM IS IN THE FUNCTION BELOW .....................

int probe_callback(struct usb_interface *intf, const struct usb_device_id *id)
{
    printk(KERN_ALERT "probe callback\n");
    __u16 vendor_id=id->idVendor;
    __u16 product_id=id->idProduct;
    printk("product id : %x vendor id : %x\n", product_id, vendor_id);
    return 0;
}

//..........................

void disconnect_callback(struct usb_interface *intf)
{
    printk(KERN_ALERT "disconnect callback\n");
}

static int start(void)
{
    printk(KERN_ALERT "module registered\n");
    int result;
    result=usb_register(&USB_DRIVER);
    if(result)
    {
            printk("error in registering usb driver...Error code = %d\n", result);
    }
    return result;
}

static void stop(void)
{
    printk(KERN_ALERT "module unregistered\n");
    usb_deregister(&USB_DRIVER);
}

module_init(start);  
module_exit(stop);

执行dmesg时得到的日志是

[ 1539.714265] probe callback
[ 1539.714277] product id : 0 vendor id : 0

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:2)

您的usb_id表格不包含供应商和产品ID。传递给id的{​​{1}}指针指向与被探测设备匹配的probe_callback元素。

您需要正确填写usb_id表的元素以匹配您感兴趣的设备,例如使用usb_id宏。