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 里定义的那样去执行她该做的事情,然