07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

这里用宏US_PR_BULK 所代表的.(224 行和225 行.)关于US_SC_DEVICE 和US_PR_DEVICE 我<br />

们<br />

之前讲那个三星的数码相机的时候已经看到了,它就表示subclass和protocol 得从设备的描述符里边读出<br />

来.这样做看起来很滑稽,因为三星完全可以把subclass 和protocol 在UNUSUAL_DEV 中写清楚,何必<br />

让<br />

我们再去读设备描述符呢.然而,我们可以想象,它这样的好处是定义一个UNUSUAL_DEV 可以代表几种<br />

设<br />

备,即它可以让几个不同subclass 的设备共用这么一个宏,或者几个不同protocol 的设备共用这么一个<br />

宏.<br />

能省一点就省一点吧,这里体现了开源社区人们勤俭节约的高尚品德. 需要特别指出的是us->flags,对于<br />

U 盘来说,它当然没有什么flags 需要设定,但是unusual_devs.h 中的很多设备都设置了各种flags,稍后<br />

在代码中我们会看到,时不时我们就得判断一下是否某个flag 设置了,通常是如果设置了,就要多执行某段<br />

代码,以满足某种要求.<br />

490 至515 行,这是一段纯粹的调试代码,对我们理解usb 没有任何意义的.这段代码检查<br />

unusual_devs.h,看是否这个文件定义了一行没有意义的句子.什么叫没有意义?我们刚才看见了,如果这<br />

个设备设了US_SC_DEVICE,那么其subclass 将从描述符中读出来,如果不然,则让<br />

subclass=unusual_dev->useProtocol,但是如果后者又真的和描述符里读出来的一样,那么这个设备<br />

就没有必要把自己的useProtocol 定义在unusual_devs.h 中了,因为反正也可以从描述符里读出来.还<br />

不<br />

如和大众一样设为US_SC_DEVICE 得了.就比如我们来看下面这行代表一个Sony 的Memory Stick 产<br />

品的代码:<br />

371 UNUSUAL_DEV( 0x054c, 0x0069, 0x0000, 0x9999,<br />

372 "Sony",<br />

373 "Memorystick MSC-U03",<br />

374 US_SC_UFI, US_PR_CB, NULL,<br />

375 US_FL_SINGLE_LUN ),<br />

46<br />

我们看到其useProtocol 这一栏里写了US_SC_UFI,这表明它自称是属于UFI 这个subclass 的,但是如<br />

果我们从它的描述符里边读出来也是这个,那就没有必要注明在这里了,这里直接写成US_SC_DEVICE 好<br />

了.当然,总的来说这段代码有些傻.写代码的是希望能够更好的管理unusual_devs.h,希望它不要不断的<br />

增加,他总希望能够从这个文件里删除一些行,并且即使不能删除一行,也希望每一行都看上去整齐一点,让<br />

这个文件看上去更加小巧玲珑,更加精致.而不是无休的增加,不息的扩充.于是我们也只能对其良苦用心多<br />

一份理解吧.<br />

518 至526 行,这里调用了一个来自usb core 的函数,usb_string,这个函数的作用是获得一个设备的字<br />

符串描述符.咦?怎么跳出来一个叫做字符串描述符的冬冬?之前不是只讲了四种描述符吗?没错,设备描述<br />

符,配置描述符,接口描述符,端点描述符,这是每个设备都有的,而还有些描述符是可有可无的,字符串描述<br />

符就是这么一种情况,有的设备有,有的设备没有.又比如,hub,它就有一个hub 描述符,这当然是一般的设<br />

备没有的.那么字符串描述符是干嘛的呢?有些东西模糊一些也未偿不是一件好事,看得太透彻了才知道很<br />

残酷.如果你一定要知道的话,举个例子,我的机器里很多usb 设备,有一个和lspci 类似的命令,可以查看一<br />

下,这个命令就是lsusb.你也可以试一下,安装一个软件包usbutils,然后就可以使用这个命令.我们看:<br />

localhost:~/test # lsusb<br />

Bus 004 Device 003: ID 0ea0:1001 Ours Technology, Inc.<br />

Bus 004 Device 002: ID 04b4:6560 Cypress Semiconductor Corp. CY7C65640 USB-2.0<br />

"TetraHub"

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

Saved successfully!

Ooh no, something went wrong!