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"