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 />
上只是为了让我们能够找到端点,就相当于我们日常说的邮编地址,比如一个国家,为了通信,我们