- 论坛徽章:
- 0
|
srb 这也非常重要,但是它们并不唯一,也许每次遇上都不一样,就像演戏一样.前边这几个数据结构的变量
就像那些主角,而之后遇见的urb 啊,srb 啊,虽然频繁露面,但是只是群众演员,只不过这次是路人甲,下次是
路人乙. 所以,以后我们将只说us,不再说struct us_data *us,struct usb_interface * intf 也将只用
intf 来代替.
us 之所以重要,是因为接下来很多函数都要用到它以及它的各个成员.实际上目前这个函
数,associate_dev 所做的事情就是为us 的各成员赋值,毕竟此刻us 和我们之前提到的那些struct
usb_device 啊,struct usb_interface 啊,还没有一点关系.因而,这个函数,以及这之后的好几个函数都是
为了给us 的各成员赋上适当的值,之所以如此兴师动众去为它赋值,主要就是因为后面要利用它.所谓天下
没有免费的午餐.
432 行,本来无须多讲,因为只是一个debug 语句,不过提一下__FUNCTION__ 这个"宏",gcc 2.95 以
后的版本支持这么一个冬冬,这个"宏"在编译的时候会被转换为函数名(字符串),这里自然就是
"associate_dev" 这么一个字符串,于是函数执行到这里就会打印一句话告诉世人我们执行到这个函数来
了,这种做法显然会有利于咱们调试程序.不过这个冬冬实际上不是宏,因为预处理器对她一无所知.她的心
只有编译器才懂.
435 行,pusb_dev, 就是point of usb device 的意思.struct us_data 中的一个成员,按照我们刚才
约定的规矩,此刻我将说us 的一个成员,us->pusb_dev= interface_to_usbdev(intf),
interface_to_usbdev 我们前面已经讲过,其含义正如字面表示的那样,把一个struct interface 结构体的
指针转换成一个struct usb_device 的结构体指针.前面我们说过,struct usb_device 对我们没有什么用,
但是usb core 层的一些函数要求使用这个参数,所以我们不得已而为止,正所谓人在江湖身不由己.
436 行,把intf 赋给us 的pusb_intf.
437 行,us 的ifnum, 先看intf 的cur_altsetting, 这个容易令外行混淆.usb 设备有一个
configuration 的概念,这个我们前面讲协议的时候说了,而这里又有一个setting, 咋一看有些奇怪,这两个
词不是一回事吗.这时候,就体现出外语水平了,上过新东方没上过新东方,背没背过俞敏洪的GRE 红宝书,
在这时候就体现出差距了.还是拿我们最熟悉的手机来打比方,configuration 不说了,setting, 一个手机可
能各种配置都确定了,是振动还是铃声已经确定了,各种功能都确定了,但是声音的大小还可以变吧,通常手
机的音量是一格一格的变动,大概也就5,6 格,那么这个可以算一个setting 吧.这里cur_altsetting 就是表
示的当前的这个setting, 或者说设置.cur_altsetting 是一个struct usb_host_interface 的指针,这个结
构体定义于include/linux/usb.h:
51 /* host-side wrapper for one interface setting's parsed descriptors */
52 struct usb_host_interface {
53 struct usb_interface_descriptor desc;
54
55 /* array of desc.bNumEndpoint endpoints associated with this
56 * interface setting. these will be in no particular order.
57 */
58 struct usb_host_endpoint *endpoint;
59
60 unsigned char *extra; /* Extra descriptors */
61 int extralen; |
|