07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

87<br />

258 行,usb_pipeendpoint,定义于include/linux/usb.h 中,<br />

1091 #define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)<br />

很简单,右移15 位,然后与0xf 相与,得到的自然就是原来pipe 里边的15 至18 位. 我们曾经讲过,一个<br />

pipe 的15 位至18 位是endpoint 号,(一共16 个endpoint,)所以很显然,这里就是得到endpoint 号.<br />

然后把她赋给了endp.然后usb_pipein()也定义于同一文件中,<br />

1088 #define usb_pipein(pipe) ((pipe) & USB_DIR_IN)<br />

1089 #define usb_pipeout(pipe) (!usb_pipein(pipe))<br />

显然,就是判断她是不是IN 的管道.如果是IN,那么她返回1,反之,返回0.usb_pipeout 则相反.261 行,<br />

如果是,就或上.<br />

263 行,再一次调用usb_stor_control_msg 来传递信息了.USB_REQ_CLEAR_FEATURE 对应的<br />

usb spec 的一个标准请求命令CLEAR_FEATURE(即凡是usb 设备就应该支持的命令),表示清除一个设<br />

备的某种特征,而USB_ENDPOINT_HALT 则对应usb 的端点特征,每个端点都有这么一个特<br />

征,ENDPOINT_HALT,她指出端点是否处于停止状态.CLEAR_FEATURE 命令用来清除该端点的停止状<br />

态.说明了CLEAR_FEATURE 清除的是端点的特征.结合usb_stor_control_msg 形参实参来看,usb<br />

spec(Table 9-3)规定对于这个请求,wValue 要被设置为被Feature Selector,赋值为<br />

USB_ENDPOINT_HALT,即选择的Feature 是ENDPOINT_HALT,而w<strong>Index</strong> 要被设置为指定一个<br />

Endpoint,参考usb2.0 规范,在指定一个Endpoint 时w<strong>Index</strong> 的格式,可知,低四位为端点号<br />

(D3~D0),D7 为方向,(IN/OUT),其余各位为保留位.实际上赋值为endp,正是包含了方向和端点号这两<br />

个信息.wLength 要求被设置为0,data 设置为NULL,这些都没错.超时设了3s.酱紫,就可以清除这个<br />

Endpoint 的ENDPOINT_HALT 这个flag.关于usb_stor_control_msg 我们当然就不用再讲了,忘记<br />

了<br />

的回头去看吧,反正一样的天一样的脸,一样的函数就在你面前.唯一不同的只是传递的参数不同罢了,也许<br />

这就是曾经沧海难为水吧,我们的人生也是如此,只能是一条不归路,走上去,就回不了头,谁也没有办法重走<br />

一遍曾经的路.<br />

需要特别注意一下,上次GETMaxLUN 调用usb_stor_control_msg 的时候,我们倒数第四个参数是设<br />

了0,而这里我们传递了一个endp,这是因为不同的请求spec 里边规定好了的,虽然这两个命令控制的对象<br />

不一样,但是作为控制传输,主机总是和控制端点在发生关系.并不因为这里是清楚bulk 端点的Halt<br />

Feature 就要发送给bulk 端点,控制传输永远都只是发生在主机和控制端点之间.而真正要控制bulk 端<br />

点,<br />

正是通过我们这里这个endp 这么一传递,设备自然就知道该干嘛了.<br />

接下来,269 行,又是一个定义于include/linux/usb.h 中的宏,<br />

1101 #define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] =<br />

((dev)->toggle[out] & ~(1

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

Saved successfully!

Ooh no, something went wrong!