USB驱动程序的匹配分析

来源:互联网 发布:软件建账 编辑:程序博客网 时间:2024/05/05 09:10

2012-09-19 01:30:39|  分类: 韦东山视频第二轮|举报|字号 订阅

static struct usb_device_id usb_mouse_id_table [] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_MOUSE) },
{ }
};


#define USB_INTERFACE_INFO(cl, sc, pr) \
.match_flags = USB_DEVICE_ID_MATCH_INT_INFO, \
.bInterfaceClass = (cl), \
.bInterfaceSubClass = (sc), \
.bInterfaceProtocol = (pr)

#define USB_DEVICE_ID_MATCH_INT_INFO \
(USB_DEVICE_ID_MATCH_INT_CLASS | \
USB_DEVICE_ID_MATCH_INT_SUBCLASS | \
USB_DEVICE_ID_MATCH_INT_PROTOCOL)

所以:
.match_flags = USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL
.bInterfaceClass = 3
.bInterfaceSubClass =  1
.bInterfaceProtocol = 2

现在我们试着分析匹配函数:
//我们是usb接口
intf = to_usb_interface(dev);
usb_drv = to_usb_driver(drv);
usb_match_id(intf, usb_drv->id_table);
        //id->bInterfaceClass不为空
        usb_match_one_id(interface, id)
              usb_match_device(dev, id)
我们好好看看这个函数:
int usb_match_device(struct usb_device *dev, const struct usb_device_id *id)
{
if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
    id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
    id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
return 0;

/* No need to test id->bcdDevice_lo != 0, since 0 is never
   greater than any unsigned number. */
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&
    (id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice)))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&
    (id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice)))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&
    (id->bDeviceClass != dev->descriptor.bDeviceClass))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&
    (id->bDeviceSubClass != dev->descriptor.bDeviceSubClass))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&
    (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))
return 0;

return 1;
}

全都不匹配,于是继续往下走:
if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&
    (id->bInterfaceClass != intf->desc.bInterfaceClass))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) &&
    (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) &&
    (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol))
return 0;
在这几句中如果设备和驱动全部吻合的话,就匹配成功,返回1!
0 0