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.

1079 #define PIPE_ISOCHRONOUS 0<br />

1080 #define PIPE_INTERRUPT 1<br />

1081 #define PIPE_CONTROL 2<br />

1082 #define PIPE_BULK 3<br />

咱们知道usb 有四种传输方式,等时传输,中断传输,控制传输,批量传输.一个设备能支持这四种传输中的<br />

哪一种或者哪几种是设备本身的属性,在硬件设计的时候就确定了,比如一个纯粹的u 盘,她肯定是支持<br />

Bulk 传输和Control 传输的.不同的传输要求有不同的端点,所以对于u 盘来说,她一定会有Bulk 端点和<br />

Control 端点,于是就得使用相应的pipe 来跟不同的端点联系.在这里我们看到了四个宏,其<br />

中,PIPE_ISOCHRONOUS 就是标志等时通道,PIPE_INTERRUPT 就是中断通道,PIPE_CONTROL 就<br />

是<br />

控制通道,PIPE_BULK 就是BULK 通道.<br />

另外__create_pipe 也是一个宏,由上面她的定义可以看出她为构造一个宏提供了设备号和端点号.在内<br />

核里使用一个unsigned int 类型的变量来表征一个pipe,其中8~14 位是设备号,即devnum,15~18 位<br />

是端点号,即endpoint.而咱们还看到有这么一个宏,USB_DIR_IN,她是用来在pipe 里面标志数据传输方<br />

向的,一个管道要么是只能输入要么是只能输出,鱼和熊掌不可兼得也.在include/linux/usb_ch9.h 中有<br />

的:<br />

24<br />

25 /*<br />

26 * USB directions<br />

27 *<br />

28 * This bit flag is used in endpoint descriptors' bEndpointAddress field.<br />

29 * It's also one <strong>of</strong> three fields in control requests bRequestType.<br />

30 */<br />

31 #define USB_DIR_OUT 0 /* to device */<br />

32 #define USB_DIR_IN 0x80 /* to host */<br />

在pipe 里面,第7 位(bit 7)是表征方向的.所以这里0x80 也就是说让bit 7 为1,这就表示传输方向是<br />

由设备向主机的,也就是所谓的in,而如果这一位是0,就表示传输方向是由主机向设备的,也就是所谓的out.<br />

而正是因为USB_DIR_OUT 是0,而USB_DIR_IN 是1,所以我们看到定义管道的时候只有用到了<br />

USB_DIR_IN,而没有用到USB_DIR_OUT,因为她是0,任何数和0 相或都没有意义.<br />

61<br />

这样,咱们就知道了,get_pipes 函数里741,742 行就是为us 的控制输入和控制输出管道赋了值,管道是<br />

单向的,但是有一个例外,那就是控制端点,控制端点是双向的,比如你36号楼201这个端点既可以是往外寄<br />

东西,也可以是别人给你寄东西而作为收件人地址.而usb 规范规定了,每一个usb 设备至少得有一个控制<br />

端点,其端点号为0.其它端点有没有得看具体设备而定,但这个端点是放之四海而皆准的,不管你是什么设<br />

备,只要你是usb 这条道上的,那你就得遵守这么一个规矩,没得商量.所以我们看到741,742 行里传递的<br />

endpoint 变量值为0.显然其构造的两个管道就是对应这个0 号控制端点的.而接下来几行,就是构造bulk<br />

管道和中断管道(如果有中断端点的话).<br />

对于bulk 端点和中断端点(如果有的话),在她们的端点描述符里有这么一个字段,bEndpointAddress,<br />

这个字段共八位,但是她包含了挺多信息的,比如这个端点是输入端点还是输出端点,比如这个端点的地<br />

址,(总线枚举的时候给她分配的),以及这个端点的端点号,不过要取得她的端点号得用一个掩码<br />

USB_ENDPOINT_NUMBER_MASK,让bEndpointAddress 和USB_ENDPOINT_NUMBER_MASK相<br />

与就能得到她的端点号.(就好比一份藏头诗,你得按着特定的方法才能读懂她,而这里特定的方法就是和<br />

USB_ENDPOINT_NUMBER_MASK 这个掩码相与就行了.)<br />

750 行,对于中断端点,您还得使用端点描述符中的bInterval 字段,表示端点的中断请求间隔时间.

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

Saved successfully!

Ooh no, something went wrong!