Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
0,那么表明命令执行成功了.关于bcs->Status 的取值,usb mass storage bulk only spec 里面规定的<br />
很清楚,参考下面这幅图<br />
我们前面看到,我们定义了三个宏US_BULK_STAT_OK / US_BULK_STAT_FAIL /<br />
US_BULK_STAT_PHASE ,分别对应00h,01h,02h.所以这里我们就用这三个宏来进行判断.先来看后两<br />
个,如果是US_BULK_STAT_FAIL,那么返回USB_STOR_TRANSPORT_FAILED,如果是<br />
US_BULK_STAT_PHASE,那么返回USB_STOR_TRANSPORT_ERROR.这俩没啥好说的,我们在<br />
drivers/usb/storage/transport.h 中一共定义了四个这样的宏:<br />
131 /*<br />
132 * Transport return codes<br />
133 */<br />
134<br />
135 #define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command<br />
good */<br />
136 #define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command<br />
failed */<br />
137 #define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no<br />
auto-sense */<br />
138 #define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead)<br />
*/<br />
171<br />
其意思都很明显,从字面上就能看出来.相信受过九年制义务教育的你不会看不明白.至于这里返回这些值<br />
以后上面如何处理那我们稍后从这个函数返回了就知道了.另一个问题,FAILED 和ERROR 的区别也很明<br />
显,一个是说传输没问题,但是命令执行的时候有错误,另一个是传输本身就有错.<br />
现在我们来看看US_BULK_STAT_OK 的情况了,这种情况说明,传输成功了.但是这里需要判断<br />
fake_sense.什么是fake_sense?我们下一节再来专门讨论这个问题,需要知道的是,这里这三个return<br />
就意味着usb_stor_Bulk_transport()函数将结束了(当然,还有一个return,1094 行,就是说如果以上情<br />
况都不属于,那当然更加是出错了,所以直接返回USB_STOR_TRANSPORT_ERROR).我们将返回<br />
usb_stor_invoke_transport(),而这更加意味着一次Bulk 传输的结束.至此我们就算是把这个迷雾重重<br />
的Bulk 传输给从头到尾讲了一遍.而回到usb_stor_invoke_transport()之后所需要做的就是一些错误<br />
处理了,或者说秋后算账.<br />
跟着感觉走(一)<br />
接下来的时间里我们会接触两个变量,fake_sense 和need_auto_sense,sense 顾名思义,感觉.所以<br />
就让我们跟着感觉走.我们前面提到过,如果设备想发送比期望值更多的数据,那么我们前面就设了<br />
fake_sense 为1.这里就来看看设为1 之后怎么办.这里咱们看到了这个一个冬<br />
冬,usb_stor_sense_invalidCDB,她是谁?<br />
让我们把镜头对准drivers/usb/storage/scsiglue.c,<br />
479 /* To Report "Illegal Request: Invalid Field in CDB */<br />
480 unsigned char usb_stor_sense_invalidCDB[18] = {<br />
481 [0] = 0x70, /* current error */<br />
482 [2] = ILLEGAL_REQUEST, /* Illegal Request = 0x05 */<br />
483 [7] = 0x0a, /* additional length */<br />
484 [12] = 0x24 /* Invalid Field in CDB */