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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX 驱动学习—USB驱动(一)  

2010-07-12 16:12:35|  分类: USB系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天看USB驱动程序,里面有一个表达式让偶郁闷起来,那就是static int storage_probe(struct usb_interface *intf,const struct usb_device_id *id)函数里面开始第二行的id_index=id-storage_usb_ids,前面可以知道,id是一个usb_device_id 型的结构体,后面这个storage_usb_ids可以在drivers/usb/storage/usb.c 中查到定义为:(前面那些个数字是行号,大家可以忽略)
116 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
117 vendorName, productName,useProtocol, useTransport, \
118 initFunction, flags) \
29
119 { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax) }
120
121 static struct usb_device_id storage_usb_ids [] = {
122
123 # include "unusual_devs.h"
124 #undef UNUSUAL_DEV
125 /* Control/Bulk transport for all SubClass values */
126 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC,US_PR_CB) },
127 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020,US_PR_CB) },
128 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC,US_PR_CB) },
129 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI,US_PR_CB) },
130 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070,
US_PR_CB) },
131 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI,
US_PR_CB) },
132
133 /* Control/Bulk/Interrupt transport for all SubClass values */
134 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC,
US_PR_CBI) },
135 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020,
US_PR_CBI) },
136 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC,
US_PR_CBI) },
137 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI,
US_PR_CBI) },
138 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070,
US_PR_CBI) },
139 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI,
US_PR_CBI) },
140
141 /* Bulk-only transport for all SubClass values */
142 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC,
US_PR_BULK) },
143 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020,
US_PR_BULK) },
144 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_QIC,
US_PR_BULK) },
145 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_UFI,
US_PR_BULK) },
146 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8070,
30
US_PR_BULK) },
147 #if !defined(CONFIG_BLK_DEV_UB) && !defined(CONFIG_BLK_DEV_UB_MODULE)
148 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_SCSI,
US_PR_BULK) },
149 #endif
150
151 /* Terminating entry */
152 { }
153 };
从这里我们可以看storage_usb_ids是一个usb_device_id 型的数组,这样,大家都明白了,这个里面是内存里一串,连续的usb_device_id 对象,OK,现在进入重点,为什么可以id_index=id-storage_usb_ids,我们在看内核时知道,要想知道一些USB的信息,就得知道他的位置,我们用相同的指针相减,可以得什么捏,大家回想一个C语言的基本知识,便可以清楚的明白,这个数组的指针可以看做是第一个对象的地址,(有不清楚的可以回头看看谭老师的书),嘿嘿。
这个我们就可以得到从第一个对象起到本id之间的数组的个数,也可以说是id当前的索引,OK,我们就找到了这个具体的id的小辫子,童鞋们有仇的报仇,有冤的报冤。

  评论这张
 
阅读(836)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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