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.

131 container_<strong>of</strong>(intf->dev.parent, struct usb_device, dev)<br />

23<br />

嗬,贴这么长一段,怎么又是注释为主啊?知足吧,Linux 代码中注释实在是太少了,等你真的需要认真看某<br />

一<br />

个模块的时候你就会嫌注释少了.这个结构体是一个贯穿整个U 盘驱动程序的,所以虽然我们不用去深入了<br />

解,但是需要记住,整个U 盘驱动程序在后面任何一处提到的struct usb_interface 都是同一个变量,这个<br />

变量是在usb core 总线扫描的时候就申请好了的.我们只需贯彻鲁迅先生的拿来主义即可,直接用就是了.<br />

比如前面说过的storage_probe(struct usb_interface *intf,const struct usb_device_id<br />

*id),storage_disconnect(struct usb_interface *intf)这两个函数中的那个参数intf.<br />

而这里130 行这个宏-interface_to_usbdev,也会用得着的,顾名思义,就是从一个struct<br />

usb_interface<br />

转换成一个struct usb_device,我们说过了,有些函数需要的参数就是struct usb_device,而不是<br />

usb_interface,所以这种转换是经常会用到的,而这个宏,usb core 的设计者们也为我们准备好了,除了感<br />

激,我们还能说什么呢?<br />

从协议中来,到协议中去(下)<br />

如果你是急性子,那这时候你一定很想开始看storage_probe 函数了,因为整个U 盘的工作就是<br />

从这里开始的.不过,莎士比亚说过,磨刀不误砍柴功.不妨继续花点时间,至少把四大关键词中最<br />

后一个给弄明白了,<br />

前面我们已经了解了device,configuration,interface,还剩最后一个endpoint.USB通信的最<br />

基本的形式就是通过endpoint,道上的兄弟管这个叫做端点,一个接口有一个或多个端点,而作<br />

为像U 盘这样的存储设备吧,它至少有一个控制端点,两个bulk 端点.这些端点都是干嘛的?说来<br />

话长,真是一言难尽哪.<br />

usb 协议里规定了,usb 设备有四种通信方式,分别是控制传输,中断传输,批量传输,等时传输.其<br />

中,等时传输显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流,比如<br />

你在网上QQ 视频聊天,肯定希望每分钟传输的图像/声音速率是比较稳定的,不能说这一分钟对<br />

方看到你在向她向你深情表白,可是下一分钟却看见画面停滞在那里,只能看到你那傻样一动不<br />

动,你说这不浪费感情嘛.所以,每一个有良知的男人都应该知道,usb-storage 里边肯定不会用<br />

到等时传输.因为我们只管copy 一个文件,管它第一秒和第二秒的传输有什么区别,只要几十秒<br />

内传完了就ok.<br />

相比之下,等时传输是四种传输中最麻烦的,所以,U 盘里边用不着,那您就偷着乐去吧.不过我要<br />

说,中断传输也用不着,对于U 盘来说,的确用不着,虽然说usb mass storage 的协议里边有一<br />

个叫做CBI 的传输协议,CBI 就是Control/Bulk/Interrupt,即控制/批量/中断,这三种传输都会<br />

用到,但这种传输协议并不适用于U 盘,U 盘使用的是一个叫做Bulk-Only 的传输协议.使用这种<br />

协议的设备只有两种传输方式,一种是批量传输,另一种是控制传输,控制传输是任何一种usb 设<br />

备都必须支持的,它专门用于传输一些控制信息.比如我想查询一下关于这个interface 的一些信<br />

息,那么就用控制传输,而bulk 传输,它就是U 盘的主要工作了,读写数据,这种情况就得用bulk<br />

传输.具体的传输我们后面再讲.<br />

好了,知道了传输方式,就可以来认识endpoint 了.和endpoint 齐名的有一个叫做管道,或者有<br />

文化的人管这个叫pipe.endpoint 就是通信的发送或者接收点,你要发送数据,那你只要把数据<br />

发送到正确的端点那里就可以了.之所以U盘有两个bulk 端点,是因为端点也是有方向的,一个叫<br />

做Bulk in,一个叫做Bulk out,从usb 主机到设备称为out,从设备到主机称为in.而管道,实际<br />

上只是为了让我们能够找到端点,就相当于我们日常说的邮编地址,比如一个国家,为了通信,我们

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

Saved successfully!

Ooh no, something went wrong!