请教:一个关于端点的想不通的问题?

[复制链接]
4609|6
 楼主| greenbug 发表于 2008-8-11 19:23 | 显示全部楼层 |阅读模式
我目前在做usbhost代码。目前遇到几个问题,感觉上比较奇怪,想不通。<br />下面是我通过ms的usbview抓到的三个usb设备的情况。<br /><br />第一个是一个usb1.1协议的清华同方的u盘的结果。<br />Device&nbsp;Descriptor:<br />bcdUSB:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0110<br />bDeviceClass:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bDeviceSubClass:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bDeviceProtocol:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bMaxPacketSize0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40&nbsp;(64)<br />idVendor:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0204<br />idProduct:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x6025<br />bcdDevice:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0100<br />iManufacturer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />iProduct:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />iSerialNumber:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bNumConfigurations:&nbsp;&nbsp;&nbsp;0x01<br /><br />ConnectionStatus:&nbsp;DeviceConnected<br />Current&nbsp;Config&nbsp;Value:&nbsp;0x01<br />Device&nbsp;Bus&nbsp;Speed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Full<br />Device&nbsp;Address:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02<br />Open&nbsp;Pipes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br /><br />Endpoint&nbsp;Descriptor:<br />bEndpointAddress:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01<br />Transfer&nbsp;Type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bulk<br />wMaxPacketSize:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0040&nbsp;(64)<br />bInterval:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01<br /><br />Endpoint&nbsp;Descriptor:<br />bEndpointAddress:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x81<br />Transfer&nbsp;Type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bulk<br />wMaxPacketSize:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0040&nbsp;(64)<br />bInterval:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br /><br /><br />第二个是一个256m的朗科的u盘<br /><br /><br />Device&nbsp;Descriptor:<br />bcdUSB:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0200<br />bDeviceClass:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bDeviceSubClass:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bDeviceProtocol:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bMaxPacketSize0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40&nbsp;(64)<br />idVendor:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0DD8<br />idProduct:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xD202<br />bcdDevice:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0100<br />iManufacturer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01<br />iProduct:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02<br />iSerialNumber:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x03<br />bNumConfigurations:&nbsp;&nbsp;&nbsp;0x01<br /><br />ConnectionStatus:&nbsp;DeviceConnected<br />Current&nbsp;Config&nbsp;Value:&nbsp;0x01<br />Device&nbsp;Bus&nbsp;Speed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Full<br />Device&nbsp;Address:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01<br />Open&nbsp;Pipes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br /><br />Endpoint&nbsp;Descriptor:<br />bEndpointAddress:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02<br />Transfer&nbsp;Type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bulk<br />wMaxPacketSize:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0200&nbsp;(512)<br />bInterval:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br /><br />Endpoint&nbsp;Descriptor:<br />bEndpointAddress:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x82<br />Transfer&nbsp;Type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bulk<br />wMaxPacketSize:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0200&nbsp;(512)<br />bInterval:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br /><br />第三个是一个罗技鼠标的情况:<br />Device&nbsp;Descriptor:<br />bcdUSB:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0200<br />bDeviceClass:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bDeviceSubClass:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bDeviceProtocol:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bMaxPacketSize0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x08&nbsp;(8)<br />idVendor:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x046D&nbsp;(Logitech&nbsp;Inc.)<br />idProduct:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xC018<br />bcdDevice:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x4301<br />iManufacturer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01<br />iProduct:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02<br />iSerialNumber:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00<br />bNumConfigurations:&nbsp;&nbsp;&nbsp;0x01<br /><br />ConnectionStatus:&nbsp;DeviceConnected<br />Current&nbsp;Config&nbsp;Value:&nbsp;0x01<br />Device&nbsp;Bus&nbsp;Speed:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Low<br />Device&nbsp;Address:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01<br />Open&nbsp;Pipes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br /><br />Endpoint&nbsp;Descriptor:<br />bEndpointAddress:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x81<br />Transfer&nbsp;Type:&nbsp;&nbsp;&nbsp;Interrupt<br />wMaxPacketSize:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0005&nbsp;(5)<br />bInterval:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0A<br /><br /><br />大家注意到没有,上面三个设备的endpoint要么是&nbsp;01&nbsp;要么是81,就是说同一个设备的的endpoint的编号都是相同的,只是方向不同而已。这是怎末回事,不是说每个除了编号0以外的端点都是要么只能IN,要么只能out的吗?那我主机该怎么办呢?也都从这个相同的端口进出数据吗?<br />我是第一次做usb开发,有点想不通。请大侠帮忙解决下我的疑问,谢谢了。<br />
mr.king 发表于 2008-8-11 20:05 | 显示全部楼层

最高位代表方向

  
平常人 发表于 2008-8-11 21:28 | 显示全部楼层

端点0是双向的,非端点0是单向

这是USB&nbsp;1.1中的片断:<br /><br /><b>5.3.1.1&nbsp;Endpoint&nbsp;Zero&nbsp;Requirements</b><br />All&nbsp;USB&nbsp;devices&nbsp;are&nbsp;required&nbsp;to&nbsp;implement&nbsp;a&nbsp;default&nbsp;control&nbsp;method&nbsp;that&nbsp;uses&nbsp;both&nbsp;the&nbsp;input&nbsp;and&nbsp;output<br />endpoints&nbsp;with&nbsp;endpoint&nbsp;number&nbsp;zero.&nbsp;The&nbsp;USB&nbsp;System&nbsp;Software&nbsp;uses&nbsp;this&nbsp;default&nbsp;control&nbsp;method&nbsp;to<br />initialize&nbsp;and&nbsp;generically&nbsp;manipulate&nbsp;the&nbsp;logical&nbsp;device&nbsp;(e.g.,&nbsp;to&nbsp;configure&nbsp;the&nbsp;logical&nbsp;device)&nbsp;as&nbsp;the&nbsp;Default<br />Control&nbsp;Pipe&nbsp;(see&nbsp;Section&nbsp;5.3.2).&nbsp;The&nbsp;Default&nbsp;Control&nbsp;Pipe&nbsp;provides&nbsp;access&nbsp;to&nbsp;the&nbsp;device’s&nbsp;configuration<br />information&nbsp;and&nbsp;allows&nbsp;generic&nbsp;USB&nbsp;status&nbsp;and&nbsp;control&nbsp;access.&nbsp;The&nbsp;Default&nbsp;Control&nbsp;Pipe&nbsp;supports&nbsp;control<br />transfers&nbsp;as&nbsp;defined&nbsp;in&nbsp;Section&nbsp;5.5.&nbsp;The&nbsp;endpoints&nbsp;with&nbsp;endpoint&nbsp;number&nbsp;zero&nbsp;are&nbsp;always&nbsp;accessible&nbsp;once&nbsp;a<br />device&nbsp;is&nbsp;attached,&nbsp;powered,&nbsp;and&nbsp;has&nbsp;received&nbsp;a&nbsp;bus&nbsp;reset.<br /><br /><b>5.3.1.2&nbsp;Non-endpoint&nbsp;Zero&nbsp;Requirements</b><br />Functions&nbsp;can&nbsp;have&nbsp;additional&nbsp;endpoints&nbsp;as&nbsp;required&nbsp;for&nbsp;their&nbsp;implementation.&nbsp;Low-speed&nbsp;functions&nbsp;are<br />limited&nbsp;to&nbsp;two&nbsp;optional&nbsp;endpoints&nbsp;beyond&nbsp;the&nbsp;two&nbsp;required&nbsp;to&nbsp;implement&nbsp;the&nbsp;Default&nbsp;Control&nbsp;Pipe.&nbsp;Fullspeed<br />devices&nbsp;can&nbsp;have&nbsp;additional&nbsp;endpoints&nbsp;only&nbsp;limited&nbsp;by&nbsp;the&nbsp;protocol&nbsp;definition&nbsp;(i.e.,&nbsp;a&nbsp;maximum&nbsp;of&nbsp;15<br />additional&nbsp;input&nbsp;endpoints&nbsp;and&nbsp;15&nbsp;additional&nbsp;output&nbsp;endpoints).<br />Endpoints&nbsp;other&nbsp;than&nbsp;those&nbsp;for&nbsp;the&nbsp;Default&nbsp;Control&nbsp;Pipe&nbsp;cannot&nbsp;be&nbsp;used&nbsp;until&nbsp;the&nbsp;device&nbsp;is&nbsp;configured&nbsp;as&nbsp;a<br />normal&nbsp;part&nbsp;of&nbsp;the&nbsp;device&nbsp;configuration&nbsp;process&nbsp;(refer&nbsp;to&nbsp;Chapter&nbsp;9).
 楼主| greenbug 发表于 2008-8-12 08:42 | 显示全部楼层

我奇怪的就是为什么端点编号是相同的?

mr.king说的我是知道的,除0以外的端点的方向是单向的我也是知道的,可是为什么我手头上的所有的usb&nbsp;device的端点的编号都是一样的呢?比如说第一个01和81,第二个是02和82,第三个是01和81,81和82的最高位代表的是方向,而后面的1和2代表是编号,是不是说明他们都是双向的呢?在host对他们进行操作的时候该怎末处理呢?
computer00 发表于 2008-8-12 09:24 | 显示全部楼层

哪里一样了啊???明明一个是0x01,一个是0x81

0x01表示输出端点1,0x81表示输入端点1。这很容易区分啊,明白得很。<br /><br />你的主机获取配置描述符集合时,如果一个端点是0x01,你就知道有一个输出端点1,<br />可以往端点1发送数据(即可以发送一个端点号为0x01的OUT令牌包);<br />如果一个端点是0x81,你就知道它是一个输入端点1,可以从那里读取数据(即可以发送一个端点号为0x01的IN令牌包)。<br /><br />对于同一个端点号(不包括方向位),都是可以双向的,事实上端点0可以看做两个端点:0x00和0x80。<br /><br />而单说端点1时,可以包括输入端点1和输出端点1。如果已经指定了输入端点1,那么它就只能是输入一个方向了。<br /><br /><br />
chunk 发表于 2008-8-12 13:09 | 显示全部楼层

LZ认为端点1必须是OUT,端点2必须是IN?

或者反过来端点1必须是IN,端点2必须是OUT?所有做芯片的都必须遵守这样一个规则?你若有这样的想法就该努力去寻找白纸黑字写明了的这个规则的文件啊?你找不到是吗?那你就先否认有这样的规则呗?各端点是IN还是OUT都随便,做芯片的人怎么高兴就怎么来。啥?以后如果找到这样的规则那咱不就露怯了吗?不是,那仨给你做U盘的其中有人露怯啦,微软就更烂,明明不符合规范的U盘它的OS都支持!
平常人 发表于 2008-8-12 22:47 | 显示全部楼层

换一个角度考虑就很容易了

不要总是想着某个编号的端点是IN还是OUT,而是想象某个IN端点被赋予编号1,某个OUT端点也可以同时被赋予编号1或编号2。<br /><br />USB协议中说,一个USB设备最多可以有15个IN端点和15个OUT端点,而有效的端点编号是0~15,因此同一个编号可以同时赋予两个不同方向的端点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

188

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部