阅读:1301回复:14
有关仿真器与枚举
我在2k下进行枚举时,能收到get_descriptor(80 06 00 01 00 00 40 00)、set_address(00 05 02 00 00 00 00 00)请求,但是get_configuration(80 06 00 02 00 00 09 00)却有的时候能收到,有的时候收不到,但是我只要在这个请求的处理函数前设个断点,就大部分时候能收到,不知道这个仿真器有什么关系吗?
另外,我收到这个请求后,返回了要求的数据09 02 00 20 01 01 00 c0 32,而且确定数据已经写到了端点0的fifo中,可是枚举到这里下面的就没有了,正常情况下,下面应该是80 06 00 02 00 00 ff 00。请各位大虾给点建议吧。偶不胜感激呀! 补充一点:我在98下已经枚举通过了,但是在get_config时直接收到的是80 06 00 02 00 00 ff 00,没有收到09 00 [编辑 - 5/6/03 by jinghuiren] |
|
最新喜欢:![]() |
沙发#
发布于:2003-05-06 19:17
你可能没有处理好get_configration的命令,我发现在win2k下和win98有很多不同的,可能是驱动的写法不同引起的!
|
|
板凳#
发布于:2003-05-06 21:49
现在问题就集中在get_config请求上,对于80 06 00 02 00 00 09 00请求,我回复的数据准确地说其实是10个字节(我把这10个字节拼成了5个16位的),因为我的数据线是16位的,即使我写了九个字节进去,那最后一个字节的高位自动是0,其实端点fifo中的数据还是10个字节,不知道是不是这里的影响,如果是的话我可真不知道如何做了
但是我象既然usb能用于16位的数据线,那就不应该有这样的问题呀,我也检查了我的发送函数,发送的数据是下面全部配置描述符中的前5个字: unsigned short ConfigDescr_H[] = { 0x0209, // 09 Length of the configuration Descriptor ………………// 02 Configuration Descriptor 0x0020, // 002e Total length of the configurations,interface and class/endpoint 0x0101, // 01 No. of interface supported ………………// 01 Configuration Value 0xc000, // 00 Index of string descriptor ………………// 80 Configurations Characteristic 0x0932, // 32 Maximun Power ………………// 09 Length of standard interface descriptor 0x0104, // 04 Standard Interface Type ………………// 01 No of Interface 0x0400, // 00 Alternate Setting Selector ………………// 04 No of Endpoints 0x0000, // 00 Interface Class ………………// 00 ATAPI Interface Sub Class 0x0000, // 00 Bulk Only Interface Protocol ………………// 00 Index of interface string desriptor /*BULK ENDPOINT*/ 0x0507, // 07 Length of Standard Endpoint Descriptor ………………// 05 Standard Endpoint Type 0x0281, // 81 Set Bulk endpoint to 1 for ATAPI mode ………………// 02 Endpoint Characteristic 0x0200, // 0200 Endpoint Max Packet Size 0x0700, // 00 Interval for Polling Endpoint for data transfer ………………// 07 Length of Standard Endpoint Descriptor 0x0105, // 05 Standard Endpoint Type ………………// 01 Set Bulk endpoint to 1 for ATAPI mode 0x0002, // 02 Endpoint Characteristic ………………// 0200 Endpoint Max Packet Size 0x0002 //00 Interval for Polling Endpoint for data transfer }; usb数据的发送规则是按照低字节在前高字节在后,对于结构中的两个8位的元素,应该把前一个放在低字节,对于16位的元素不需改变。 NewTech兄,你觉得98和2k有哪些不同和我的问题有关呢,还往提点小弟一下,不胜感激!不胜感激!!! |
|
地板#
发布于:2003-05-07 01:21
1、首先你不能发送多于请求长度的数据
2、不同的mcu对于高低字节的存放的定义是不同的,你要好好检查一下你的硬件关于高低字节的定义。 另外我现在遇到一个大问题,我发到你的信箱里了。谢谢! |
|
地下室#
发布于:2003-05-07 14:15
我用的描述符在98下是通过了的,同一个设备拿到2k下就不行,我的发送函数和高低字节都没有问题,要是必须发9个字节那我可真是没办法,我只能发8个或者10个!
对于你的问题我看了,我看我也帮不了你什么,我连read10是什么东西都不知道,让你见笑了。 |
|
5楼#
发布于:2003-05-08 02:39
我觉得一个usb的控制器,因该不会设计成这样的,你仔细查看datasheet,是否有这方面的说明,另外你的硬件可否改为8位的总线呢!
|
|
6楼#
发布于:2003-05-08 02:42
对了,有件事情忘记了,有的编译器要求数据结构以word方式对齐,会在奇数地址时,自动添加一个0(长度就不对了,数据结构也不对了),难道你的也是这样!
|
|
7楼#
发布于:2003-05-08 13:35
我记得曾经也遇到过这种情况,你查一下驱动程序中的处理发送GET_CONFIG请求的例程处是否在IoCallDriver调用之后,使用了带有超时退出的KeWaitSingleObject函数。如果使用了该函数的话,你就把它的时限设置的长一些,应该就可以了,毛病可能出在这地方;如果没有使用就得视情况而判断了。
|
|
8楼#
发布于:2003-05-08 20:43
对了,有件事情忘记了,有的编译器要求数据结构以word方式对齐,会在奇数地址时,自动添加一个0(长度就不对了,数据结构也不对了),难道你的也是这样! 我用的是16位的总线,可以用8位的,但是我想芯片既然允许用16为的总线,那就应该没问题才是呀,我的情况和你说的一样,如果是写1个字节到端点fifo中,控制器会自动在高字节添0。真是郁闷,要不我试试发送8个字节过去试试,反正我用的是自供电,config的最后一个字节没有用处。 |
|
9楼#
发布于:2003-05-08 20:53
我记得曾经也遇到过这种情况,你查一下驱动程序中的处理发送GET_CONFIG请求的例程处是否在IoCallDriver调用之后,使用了带有超时退出的KeWaitSingleObject函数。如果使用了该函数的话,你就把它的时限设置的长一些,应该就可以了,毛病可能出在这地方;如果没有使用就得视情况而判断了。 老哥,我的枚举还没有到载入我自己的驱动的时候呢,应该是等完成了80 06 00 02 00 00 ff 00后才会要求重新载入我自己的驱动,这时候我就可以用软件来调试了,现在问题是没到这里,所以主机收到了什么我也无法知道,除非有协议分析仪,可是这东西太贵了 :( |
|
10楼#
发布于:2003-05-09 02:21
我现在的问题也是最好要有catc,好贵啊。。。
大家一起努力把! |
|
11楼#
发布于:2003-05-09 13:40
各位老哥,先谢谢各位了,我终于收到FF 00命令了,原来原因真的是我多发了一个字节,现在我只发送8个字节到主机,主机马上就发送FF 00命令给我了,之后的事情就简单了,
哈哈,太好了,放分了!!!!!!!!!!!!!!!!! |
|
12楼#
发布于:2003-05-09 14:24
恭喜你了!
:D |
|
13楼#
发布于:2003-05-09 14:48
可是虽然这样通过了,我用的是自供电,config的最后一个字节无关紧要,要是用总线供电的方式不知道会不会有问题,管它呢,反正现在能用了,到时候有问题再说吧
多谢各位了,感激涕零呀,这个问题困扰了两个星期了! :) :) :) |
|
14楼#
发布于:2003-05-10 00:46
希望对你有所帮助,大家共同进步!谢谢你的分数!
|
|