TornadoII
驱动牛犊
驱动牛犊
  • 注册日期2002-10-15
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2228回复:15

关于Get Device Descriptor

楼主#
更多 发布于:2002-12-05 16:38
请问,这个操作应该在SetAddress之前,还是之后做?
也就是说,Get Descriptor要填写的设备地址是多少?
谢谢。

最新喜欢:

greecetinggreece... skylglskylgl
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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时才知道地址。
TornadoII
驱动牛犊
驱动牛犊
  • 注册日期2002-10-15
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-05 17:26
非常感谢dacongtou ,
我做过这样的工作:
已经检测到设备,
已经检测到设备速度,
然后我发Get_Descriptor,但收到的是0字节。why?

请问一下,
可不可以细化一下检测到设备后,在Set_Port_Status主要做了一些什么工作?

谢谢。

dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-06 09:16
不好意思啊..我现在也正在做这块.但是卡住了..所以也不是太明白..否则也不会把别人的贴给你看了.
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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灯灭
Davisfront
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2003-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-06 09:21
你发的Get_Descriptor是怎么样,贴出来看看。
你可以参考一下这个:
http://www.driverdevelop.com/forum/html_27299.html?1039137690
TornadoII
驱动牛犊
驱动牛犊
  • 注册日期2002-10-15
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-06 12:33
多谢dacongtou和Davisfront,
我在昨天已经搞定了Get_Descriptor的第一步,已经获得了头8字节,并且获知最大包长08,
然后我SetAddress,获得了0长度的数据包,
只是我再次Get_Descriptor时,还是不认我的地址
Davisfront
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2003-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-06 13:08
不好意思我只能和你探讨一下而已,因为我还没有调到那里去,你的host是什么平台,能说详细一点吗?是什么操作系统,是哪种host controller,是哪种驱动??(exm: wdm)
Davisfront
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2003-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-06 13:08
不好意思我只能和你探讨一下而已,因为我还没有调到那里去,你的host是什么平台,能说详细一点吗?是什么操作系统,是哪种host controller,是哪种驱动??(exm: wdm)。因为我认为这很可能和你的平台有关系。
TornadoII
驱动牛犊
驱动牛犊
  • 注册日期2002-10-15
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-06 13:58
从我取的名字你就知道了,而驱动我没有用,可能跟你的不太一样,我还有下面的问题:

dacongtou :
--------------------
主机再次发送得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度。因为设备每次只能发送16字节,因此它会分两次(18字节)完成此要求。
--------------------
根据你上面说的,请问:你知不知道,主机再次发给你的得到设备描述符的数据包时,使用的是以前的默认地址还是新设置好的地址2?

另外在设备设置好地址后,不是要发送一个ACK握手吗?USB1.1里说的。仅仅是一个空的数据包?

TornadoII
驱动牛犊
驱动牛犊
  • 注册日期2002-10-15
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-07 10:25
还有个问题,第一次get_descriptor,主机收到设备发来的8字节后,主机回给设备的out里有些什么?
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-07 11:00
还有个问题,第一次get_descriptor,主机收到设备发来的8字节后,主机回给设备的out里有些什么?


不好意思.正在做..还没实现那..那些还没有证实...

给你个图片参考一下.不过有点奇怪....好像和理论不太一样..
TornadoII
驱动牛犊
驱动牛犊
  • 注册日期2002-10-15
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-07 11:36
给你个图片参考一下.不过有点奇怪....好像和理论不太一样..


我也觉得奇怪,前面应该还有设置地址的呢?还有最大包长的问题??
Davisfront
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2003-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-10 13:07
我猜想是busbound截不到这个包(set address),但是这个包应该在device看得到
dacongtou
驱动中牛
驱动中牛
  • 注册日期2002-11-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-10 13:51

--------------------
主机再次发送得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度。因为设备每次只能发送16字节,因此它会分两次(18字节)完成此要求。
--------------------
根据你上面说的,请问:你知不知道,主机再次发给你的得到设备描述符的数据包时,使用的是以前的默认地址还是新设置好的地址2?

另外在设备设置好地址后,不是要发送一个ACK握手吗?USB1.1里说的。仅仅是一个空的数据包?

 


不知道你知不知道答案了..我知道了:)

1.主机第二次发的得到设备描述符的数据包,使用的是新设置好的地址
2.就是发送一个空数据包就好了..
Davisfront
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2003-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-10 19:52
所谓0长度的数据包:
SOP | SYNC(8) | PID(8) | no data | CRC (16) | EOP
游客

返回顶部