打印

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

[复制链接]
3712|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
greenbug|  楼主 | 2008-8-11 19:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我目前在做usbhost代码。目前遇到几个问题,感觉上比较奇怪,想不通。
下面是我通过ms的usbview抓到的三个usb设备的情况。

第一个是一个usb1.1协议的清华同方的u盘的结果。
Device Descriptor:
bcdUSB:             0x0110
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x40 (64)
idVendor:           0x0204
idProduct:          0x6025
bcdDevice:          0x0100
iManufacturer:        0x00
iProduct:             0x00
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x02
Open Pipes:              2

Endpoint Descriptor:
bEndpointAddress:     0x01
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x01

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00


第二个是一个256m的朗科的u盘


Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x40 (64)
idVendor:           0x0DD8
idProduct:          0xD202
bcdDevice:          0x0100
iManufacturer:        0x01
iProduct:             0x02
iSerialNumber:        0x03
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x01
Open Pipes:              2

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

第三个是一个罗技鼠标的情况:
Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x08 (8)
idVendor:           0x046D (Logitech Inc.)
idProduct:          0xC018
bcdDevice:          0x4301
iManufacturer:        0x01
iProduct:             0x02
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:      Low
Device Address:       0x01
Open Pipes:              1

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:   Interrupt
wMaxPacketSize:     0x0005 (5)
bInterval:            0x0A


大家注意到没有,上面三个设备的endpoint要么是 01 要么是81,就是说同一个设备的的endpoint的编号都是相同的,只是方向不同而已。这是怎末回事,不是说每个除了编号0以外的端点都是要么只能IN,要么只能out的吗?那我主机该怎么办呢?也都从这个相同的端口进出数据吗?
我是第一次做usb开发,有点想不通。请大侠帮忙解决下我的疑问,谢谢了。

相关帖子

沙发
mr.king| | 2008-8-11 20:05 | 只看该作者

最高位代表方向

使用特权

评论回复
板凳
平常人| | 2008-8-11 21:28 | 只看该作者

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

这是USB 1.1中的片断:

5.3.1.1 Endpoint Zero Requirements
All USB devices are required to implement a default control method that uses both the input and output
endpoints with endpoint number zero. The USB System Software uses this default control method to
initialize and generically manipulate the logical device (e.g., to configure the logical device) as the Default
Control Pipe (see Section 5.3.2). The Default Control Pipe provides access to the device’s configuration
information and allows generic USB status and control access. The Default Control Pipe supports control
transfers as defined in Section 5.5. The endpoints with endpoint number zero are always accessible once a
device is attached, powered, and has received a bus reset.

5.3.1.2 Non-endpoint Zero Requirements
Functions can have additional endpoints as required for their implementation. Low-speed functions are
limited to two optional endpoints beyond the two required to implement the Default Control Pipe. Fullspeed
devices can have additional endpoints only limited by the protocol definition (i.e., a maximum of 15
additional input endpoints and 15 additional output endpoints).
Endpoints other than those for the Default Control Pipe cannot be used until the device is configured as a
normal part of the device configuration process (refer to Chapter 9).

使用特权

评论回复
地板
greenbug|  楼主 | 2008-8-12 08:42 | 只看该作者

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

mr.king说的我是知道的,除0以外的端点的方向是单向的我也是知道的,可是为什么我手头上的所有的usb device的端点的编号都是一样的呢?比如说第一个01和81,第二个是02和82,第三个是01和81,81和82的最高位代表的是方向,而后面的1和2代表是编号,是不是说明他们都是双向的呢?在host对他们进行操作的时候该怎末处理呢?

使用特权

评论回复
5
computer00| | 2008-8-12 09:24 | 只看该作者

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

0x01表示输出端点1,0x81表示输入端点1。这很容易区分啊,明白得很。

你的主机获取配置描述符集合时,如果一个端点是0x01,你就知道有一个输出端点1,
可以往端点1发送数据(即可以发送一个端点号为0x01的OUT令牌包);
如果一个端点是0x81,你就知道它是一个输入端点1,可以从那里读取数据(即可以发送一个端点号为0x01的IN令牌包)。

对于同一个端点号(不包括方向位),都是可以双向的,事实上端点0可以看做两个端点:0x00和0x80。

而单说端点1时,可以包括输入端点1和输出端点1。如果已经指定了输入端点1,那么它就只能是输入一个方向了。


使用特权

评论回复
6
chunk| | 2008-8-12 13:09 | 只看该作者

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

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

使用特权

评论回复
7
平常人| | 2008-8-12 22:47 | 只看该作者

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

不要总是想着某个编号的端点是IN还是OUT,而是想象某个IN端点被赋予编号1,某个OUT端点也可以同时被赋予编号1或编号2。

USB协议中说,一个USB设备最多可以有15个IN端点和15个OUT端点,而有效的端点编号是0~15,因此同一个编号可以同时赋予两个不同方向的端点。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

187

帖子

0

粉丝