注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

USB驱动程序的匹配分析  

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

  下载LOFTER 我的照片书  |
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!
  评论这张
 
阅读(967)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017