阅读:2229回复:15
关于Get Device Descriptor
请问,这个操作应该在SetAddress之前,还是之后做?
也就是说,Get Descriptor要填写的设备地址是多少? 谢谢。 |
|
沙发#
发布于:2002-12-05 16:54
这是一个网友回答另一个网友的一段..你看看就明白了..(不算我侵权吧....:))
------------------------------------------------------------ 你好,现已明白你的意思了,我觉得问题是你并没有完成真正的列举。首先要知道一个列举的过程: 1。插入usb设备; 2。集线器检测到这个设备; 3。主机知道了这个新设备,发送Get_Port_Status; 4。集线器重新设置这个设备,发送Set_Port_Status; 5。集线器在设备和总线之间建立一个信号通路; 6。集线器检测设备速度; 7。主机发送一个Get_Descriptor请求来知道默认流程的最大报的大小。 8。主机分配一个地址。(注意这时才分配地址) 9。主机通过发送Get_Descriptor请求知道了设备的能力。 10。主机分配和载入一个设备驱动。 11。主机的设备驱动选择了一个配置。 注意上面的过程,从3开始主机就已经知道了这个设备,但直到8时才知道地址。 |
|
板凳#
发布于:2002-12-05 17:26
非常感谢dacongtou ,
我做过这样的工作: 已经检测到设备, 已经检测到设备速度, 然后我发Get_Descriptor,但收到的是0字节。why? 请问一下, 可不可以细化一下检测到设备后,在Set_Port_Status主要做了一些什么工作? 谢谢。 |
|
地板#
发布于:2002-12-06 09:16
不好意思啊..我现在也正在做这块.但是卡住了..所以也不是太明白..否则也不会把别人的贴给你看了.
|
|
地下室#
发布于:2002-12-06 09:19
这是一个网友回答我的问题.你看看肯定有帮助了..
--------------------------------------------------- 呵呵,你真走运,我正好这几天在做枚举这部分,并且已经成功了。下面告诉你我的过程: 根集线器检查到设备连接后,激活主机USB总线驱动程序,USBD发出一系列的SETUP包。这过程中并不要用到你自己编的驱动,会由系统的总线驱动来自动处理,所以你要自己还没编主机那的驱动,也能调枚举过程。 主机的第一个命令要求得到设备描述符,此SETUP包为8个字节数据(80,06,00,01,00,00,40,00),其具体含义自己看资料。40表示返回数据长度最大为40H个字节。实际上,你只只返回一个包,即数组DEV_DESC[]中的前8个字节。用于说明设备的描述符的真实长度和设备的类型。 接着是设置设备地址处理事件,主机发送一个含有指定地址的数据包(00,05,02,00,00,00,00,00),设备需返回一个0数据包(这一步一定要做)。在主机只有一个USB设备的时候,这个地址一般会是2。设置地址事件处理结束后,设备进入地址状态,主机会在指定地址处访问设备。 主机再次发送得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度。因为设备每次只能发送16字节,因此它会分两次(18字节)完成此要求。 接着主机要求得到设备的配置描述符(80,06,00,02,00,00,09,00),包中数据“09”指定设备发送9个字节,这正是设备配置描述符的长度。 接着主机要求得到设备的配置描述符、接口描述符和节点描述符(80,06,00,02,00,00,FF,00),由于不知道设备描述符的真实长度,因此它要求得到256个字节, 以上过程主机都是总线驱动层在处理,你用USBVIEW能看到你发出的东西,下面的一步(最后一步)就需要你的设备驱动来做了: 最后主机发送设置设备配置SETUP包(00,09,01,00,00,00,00,00),设备处理此事件,将允许所有节点进入工作状态。 如果D12固件没问题,则只收到: 1,get_descriptor;d12发送8字节的设备描述符信息 2.set_address; 3,get_descriptor;获取全部设备描述符 4,get_decriptor:9byte配置描述符 5,get_decriptor:整个配置描述符,包括interface,endpoit 6,找驱动程序->终止,d12灯灭 |
|
5楼#
发布于:2002-12-06 09:21
你发的Get_Descriptor是怎么样,贴出来看看。
你可以参考一下这个: http://www.driverdevelop.com/forum/html_27299.html?1039137690 |
|
6楼#
发布于:2002-12-06 12:33
多谢dacongtou和Davisfront,
我在昨天已经搞定了Get_Descriptor的第一步,已经获得了头8字节,并且获知最大包长08, 然后我SetAddress,获得了0长度的数据包, 只是我再次Get_Descriptor时,还是不认我的地址 |
|
7楼#
发布于:2002-12-06 13:08
不好意思我只能和你探讨一下而已,因为我还没有调到那里去,你的host是什么平台,能说详细一点吗?是什么操作系统,是哪种host controller,是哪种驱动??(exm: wdm)
|
|
8楼#
发布于:2002-12-06 13:08
不好意思我只能和你探讨一下而已,因为我还没有调到那里去,你的host是什么平台,能说详细一点吗?是什么操作系统,是哪种host controller,是哪种驱动??(exm: wdm)。因为我认为这很可能和你的平台有关系。
|
|
9楼#
发布于:2002-12-06 13:58
从我取的名字你就知道了,而驱动我没有用,可能跟你的不太一样,我还有下面的问题:
dacongtou : -------------------- 主机再次发送得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度。因为设备每次只能发送16字节,因此它会分两次(18字节)完成此要求。 -------------------- 根据你上面说的,请问:你知不知道,主机再次发给你的得到设备描述符的数据包时,使用的是以前的默认地址还是新设置好的地址2? 另外在设备设置好地址后,不是要发送一个ACK握手吗?USB1.1里说的。仅仅是一个空的数据包? |
|
10楼#
发布于:2002-12-07 10:25
还有个问题,第一次get_descriptor,主机收到设备发来的8字节后,主机回给设备的out里有些什么?
|
|
11楼#
发布于:2002-12-07 11:00
还有个问题,第一次get_descriptor,主机收到设备发来的8字节后,主机回给设备的out里有些什么? 不好意思.正在做..还没实现那..那些还没有证实... 给你个图片参考一下.不过有点奇怪....好像和理论不太一样.. |
|
12楼#
发布于:2002-12-07 11:36
给你个图片参考一下.不过有点奇怪....好像和理论不太一样.. 我也觉得奇怪,前面应该还有设置地址的呢?还有最大包长的问题?? |
|
13楼#
发布于:2002-12-10 13:07
我猜想是busbound截不到这个包(set address),但是这个包应该在device看得到
|
|
14楼#
发布于:2002-12-10 13:51
不知道你知不知道答案了..我知道了:) 1.主机第二次发的得到设备描述符的数据包,使用的是新设置好的地址 2.就是发送一个空数据包就好了.. |
|
15楼#
发布于:2002-12-10 19:52
所谓0长度的数据包:
SOP | SYNC(8) | PID(8) | no data | CRC (16) | EOP |
|