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.

Bus 004 Device 001: ID 0000:0000<br />

Bus 003 Device 001: ID 0000:0000<br />

Bus 002 Device 002: ID 0624:0294 Avocent Corp.<br />

Bus 002 Device 001: ID 0000:0000<br />

Bus 001 Device 001: ID 0000:0000<br />

看这个第二行, Cypress Semiconductor Corp., 这么一长串的东西,你说哪来的?是不是应该从设备里<br />

来?<br />

设备的那几个标准描述符,整个描述符的大小也不一定放得下这么一长串,所以,一些设备专门准备了一些字<br />

符串描述符(string descriptor).就用来记这些长串的东西,我们结合刚才的518 行开始讲,如果设备描述<br />

符里边iManufacturer 不为0,那么调用usb_string,这句话具体做了什么?就是根据iManufactuer 的值<br />

得到公司名字,而iManufactuer 的第一个字母i,就表示index,它记录的是真正的公司名字保存在哪一个字<br />

符串描述符中,因为字符串描述符可以有多个,那么必然就有个号码来区分,接下来几行,iProduct 记录了产<br />

品名在第几个字符串描述符中,iSerialNumber 记录了产品序列号在第几个字符串描述中,然后调用<br />

usb_string 这个函数,就把真正的字符串描述符里的冬冬给记录了下来.我们看到,我们三次调用的时候分<br />

别传递了us->vendor,us->product,us->serial.这样函数调用结束之后,这三个里面就记录了必要的信<br />

息,于是以后我们就可以用了.<br />

得到了us->vendor,us->product,us->serial,那么下面528 直到547 行就不需要多讲了,就是说如果<br />

得到的东西是空的,(得到的是空可以有两种可能,一个是设备根本就没提供这些字符串描述符,另一种情况<br />

是usb_string 函数没能成功,但是这个函数不成功也无所谓,没影响.)那也没关系,毕竟这些信息我们可有<br />

可无,无非是打印出来给客户看看.如果unusual_dev 里边有的话,那就拷贝过来,如果也没有,那没办法,设<br />

为Unknown.而序列号这个就索性置为None 好了,最后US_DEBUGP 把这些信息给打印出来,如果你打<br />

开了debug 开关,那么你会在日志文件里看到这么一句话,在/var/log/messages 里边.<br />

47<br />

至此,get_device_info 这个函数就结束了他的使命.在usb storage 这部戏里,他将不再出场.但我想说,<br />

对于usb storage 这整个模块来说,主角配角不重要,每个函数都是画布上的一抹色彩.就像我们每一个人,<br />

不也是别人人生中的配角,但总是自己人生的主角吗?<br />

冬天来了,春天还会远吗(四)<br />

结束了get_device_info,我们继续沿着storage_probe 一步一步走下去.为了保持原汁原味,我们贴代码<br />

的原则是一个函数的每一行都贴出来.get_device_info 是962 行,我们已经贴过,所以下面从963 行开<br />

始<br />

了.<br />

963<br />

964 #ifdef CONFIG_USB_STORAGE_SDDR09<br />

965 if (us->protocol == US_PR_EUSB_SDDR09 ||<br />

966 us->protocol == US_PR_DPCM_USB) {<br />

967 /* set the configuration -- STALL is an acceptable response here */<br />

968 if (us->pusb_dev->actconfig->desc.bConfigurationValue != 1) {<br />

969 US_DEBUGP("active config #%d != 1 ??\n", us->pusb_dev<br />

970 ->actconfig->desc.bConfigurationValue);<br />

971 goto BadDevice;<br />

972 }<br />

973 result = usb_reset_configuration(us->pusb_dev);

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

Saved successfully!

Ooh no, something went wrong!