07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

802 int number_<strong>of</strong>_packets; /* (in) number <strong>of</strong> ISO packets */<br />

803 int interval; /* (modify) transfer interval (INT/ISO) */<br />

804 int error_count; /* (return) number <strong>of</strong> ISO errors */<br />

805 void *context; /* (in) context for completion */<br />

806 usb_complete_t complete; /* (in) completion routine */<br />

807 struct usb_iso_packet_descriptor iso_frame_desc[0]; /* (in) ISO ONLY<br />

*/<br />

808 };<br />

我们常常抱怨,Linux 内核源代码中注释太少了,以至于我们常常看不懂那些代码究竟是什么含义.<br />

但,urb 让开发人员做足了文章,结构体struct urb 的定义不过30 行,而说明文字却用了足足160 余行.可<br />

见urb 的江湖地位.有时候我真的怀疑这些写代码的人是不是以为自己的代码是按行计费的,这么一大串的<br />

注释他写得不累我们看得还累呢.当然我们这里贴出来主要还是为了保持原汁原味,另一方面这个注释也说<br />

得很清楚,对于每一个成员都解释了,而我们接下来将必然要用到urb 的许多个成员.<br />

此刻,我们暂时不去理会这个结构体每一个元素的作用,只需要知道,一个urb 包含了执行usb 传输所需<br />

要的所有信息.而作为驱动程序,要通信,就必须创建这么一个数据结构,并且为她赋好值,显然不同类型的传<br />

输,需要对urb赋不同的值,然后将她提交给底层,完了底层的usb core会找到相应的usb host controller,<br />

从而具体去实现数据的传输,传输完了之后,usb host controller 会通知设备驱动程序.<br />

总之我们知道,760 行就是调用usb_alloc_urb()申请了一个struct urb 结构体.关于<br />

usb_alloc_urb()这个函数,我们不打算讲,它是usb core 所提供的一个函数,来自<br />

drivers/usb/core/urb.c,usb 开发人员的确是给足了urb 的面子,专门把和这个数据结构相关的代码整<br />

理<br />

在这么一个文件中了.我们可以在include/linux/usb.h 中找到这个函数的声明,<br />

917 extern struct urb *usb_alloc_urb(int iso_packets, int mem_flags);<br />

这个函数的作用很明显,就是为一个urb结构体申请内存,它有两个参数,其中第一个iso_packets用来<br />

在等时传输的方式下指定你需要传输多少个包,对于非等时模式来说,这个参数直接使用0.另一个参数<br />

mem_flags 就是一个flag,表征申请内存的方式,这个flag 将最终传递给kmalloc 函数,我们这里传递的<br />

是GFP_KERNEL,这个flag 是内存申请中最常用的,我们之前也用过,在为us 申请内存的时<br />

候.usb_alloc_urb 最终将返回一个urb 指针,而us 的成员current_urb 也是一个struct urb 的指针,<br />

所<br />

以就赋给它了,不过需要记住,usb_alloc_urb 除了申请内存以外,还对结构体作了初始化,结构体urb 被<br />

初<br />

69<br />

始化为0,虽然这里我们没有把这个函数的代码贴出来,但你也千万不要以为写代码的人跟你我似的,申请变<br />

量还能忘了初始化.同时,struct urb 中还有一个引用计数,以及一个自旋锁,这些也同样被初始化了.<br />

所以,接下来我们就将和us->current_urb 打交道了.如果你对urb 究竟怎么用还有些困惑的话,可以<br />

看看host controller 的代码,如果你不想看,那么我可以用一种你最能接受的方式告诉你,usb 是一种总<br />

线,<br />

是总线它就要通信,我们现实生活中真正要使用的是设备,但是光有设备还不足以实现usb通信,于是世界上<br />

有了usb host controller(usb 主机控制器),它来负责统一调度,这就好比北京的交警,北京这个城市里真<br />

正需要的本来是车辆和行人,而光有车辆和行人,没有交警,那么这个城市里的车辆和行人必将乱套,于是诞<br />

生了交警这么一个行业,交警站在路口统一来管理调度那混乱的交通.假如车辆和行人可以完全自觉遵守某<br />

种规矩而来来往往于这个城市的每一个角落,每一个路口,那么交警就没有必要存在了.同样,假如设备能够<br />

完全自觉的传递信息,每一个数据包都能到达它应该去的地方,那么我们根本就不需要有主机控制器这么一<br />

个东西.然而,事实是,在北京,遵守交通规则的人不多,我相信每一个来过北京的人都会发现,在北京,闯红灯

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!