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.

424行,usb_stor_msg_common()这个函数再一次被调用,年年岁岁花相似,岁岁年年人不同,urb 还<br />

像上次那样被被提交,然后核心层去调度,去执行她.如果结果是提交成功了,那么返回值result 将是0.而<br />

act_len 将记录实际传输的长度.不过光看这两个函数其实看不出什么,我们必须结合上下文来看.换句话<br />

说,<br />

我们需要结合usb_stor_Bulk_transport()中usb_stor_bulk_transfer_buf 被调用的上下文,对比形<br />

参<br />

和实参来看,才能真的明白,才能拨开这浓浓的迷雾.<br />

usb_stor_Bulk_transport()函数中,978 行,usb_stor_bulk_transfer_buf()函数得到调用.第一<br />

个参数,us,无需多说,第二个参数,us->send_bulk_pipe,作为u 盘来说,她除了有一个控制管道以外,还会<br />

有两个bulk 管道,一个是In,一个是Out,经历过此前的风风雨雨,咱们已经对usb 中那些名词不再有神秘<br />

感,所谓管道无非就是一个unsigned int 类型的数.us->send_bulk_pipe 和接下来我们立刻会邂逅的<br />

us->recv_bulk_pipe 都是在曾经那个令人回味的storage_probe()中调用get_pipes()函数获得的.然<br />

后第三个参数bcb,这是什么玩艺?嘿嘿,看仔细了.<br />

950 行,定义了这么一个指针bcb,是struct bulk_cb_wrap 结构体的指针,这是一个专门为bulk only<br />

协议特别准备的数据结构,来自drivers/usb/storage/transport.h:<br />

80 /*<br />

81 * Bulk only data structures<br />

82 */<br />

156<br />

83<br />

84 /* command block wrapper */<br />

85 struct bulk_cb_wrap {<br />

86 __le32 Signature; /* contains 'USBC' */<br />

87 __u32 Tag; /* unique per command id */<br />

88 __le32 DataTransferLength; /* size <strong>of</strong> data */<br />

89 __u8 Flags; /* direction in bit 0 */<br />

90 __u8 Lun; /* LUN normally 0 */<br />

91 __u8 Length; /* <strong>of</strong> <strong>of</strong> the CDB */<br />

92 __u8 CDB[16]; /* max command */<br />

93 };<br />

眼疾手快的同志们一定已经看到,同一文件中还定义了另一个数据结构,struct bulk_cs_wrap,<br />

100 /* command status wrapper */<br />

101 struct bulk_cs_wrap {<br />

102 __le32 Signature; /* should = 'USBS' */<br />

103 __u32 Tag; /* same as original command */<br />

104 __le32 Residue; /* amount not transferred */<br />

105 __u8 Status; /* see below */<br />

106 __u8 Filler[18];<br />

107 };<br />

这两个数据结构对应于江湖中传说的CBW 和CSW,即command block wrapper 和command<br />

status wrapper.事到如今,咱们需要关注一下usb mass storage bulk only transport 协议了,因为u<br />

盘是按照这个协议规定的方式去传输数据的,Bulk only 传输方式是这样进行的,首先由host 给设备发送<br />

一<br />

个CBW,然后device 接收到了CBW,她会进行解释,然后按照CBW 里定义的那样去执行她该做的事情,然

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

Saved successfully!

Ooh no, something went wrong!