打印

请教ComputerOO关于USB键盘的问题?

[复制链接]
2899|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlsong|  楼主 | 2007-10-3 23:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ComputerOO你好,我把你的USB键盘程序用在ARM板上,插上USB数据线后,串口显示设置地址是“1”而不是“2”,往后运行就挂起了,请问是什么问题?
USB总线挂起................................

USB总线复位................................

USB总线挂起................................

USB总线挂起................................

USB总线复位................................

USB标准请求................................

    获取描述符................................

        获取设备描述符................................

USB总线复位................................

USB标准请求................................

    设置地址........................

        地址为:  1

USB标准请求................................

    获取描述符................................

        获取设备描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

        获取配置描述符................................

USB标准请求................................

    获取描述符................................

        获取字符串描述符................................

            获取语言ID................................

USB标准请求................................

    获取描述符................................

        获取字符串描述符................................

            获取设备序列号................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

        获取配置描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

        获取字符串描述符................................

            获取语言ID................................

USB标准请求................................

    获取描述符................................

        获取字符串描述符................................

            获取产品字符串................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

        获取字符串描述符................................

            获取语言ID................................

USB标准请求................................

    获取描述符................................

        获取字符串描述符................................

            获取产品字符串................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

        获取设备描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

        获取配置描述符................................

USB标准请求................................

    获取描述符................................

        获取配置描述符................................

USB标准请求................................

    获取描述符................................

USB标准请求................................

    获取描述符................................

USB总线挂起................................

相关帖子

沙发
computer00| | 2007-10-4 00:02 | 只看该作者

设置地址为1没什么关系。也许是大小端或者对齐的问题

你用bus hound抓包来分析看看。

使用特权

评论回复
板凳
wlsong|  楼主 | 2007-10-4 20:42 | 只看该作者

bus hound捕捉的数据

设备管理器已经显示“USB人体学输入设备“,但该设备不能使用。好像PC没有给D12发送配置信息。大小端已经注意,没有用SWAP16。

Bus Hound 5.00 capture. Complements of www.perisoft.net

  Device - Device ID (followed by the endpoint for USB devices)
            (10) VIA Rev 5 or later USB Universal Host Controller
            (11) USB Root Hub
  Phase  - Phase Type
            CTL   USB control transfer       
            DI    Data in                    
  Data   - Hex dump of the data transferred
  Descr  - Description of the phase
  Cmd... - Position in the captured data


Device  Phase  Data                                                Description       Cmd.Phase.Ofs(rep)
------  -----  --------------------------------------------------  ----------------  ------------------
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               1.1.0(2)     
  11.0  DI     01 01 01 00                                         ....                     1.2.0        
  11.0  CTL    23 01 10 00  02 00 00 00                            CLEAR FEATURE            3.1.0        
  11.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               4.1.0        
  11.0  DI     00 03 00 00                                         ....                     4.2.0        
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               5.1.0(2)     
  11.0  DI     01 01 00 00                                         ....                     5.2.0        
  11.0  CTL    23 03 04 00  02 00 00 00                            SET FEATURE              7.1.0        
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               8.1.0        
  11.0  DI     03 01 10 00                                         ....                     8.2.0        
  11.0  CTL    23 01 14 00  02 00 00 00                            CLEAR FEATURE            9.1.0        
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              10.1.0(2)     
  11.0  DI     03 01 00 00                                         ....                    10.2.0        
  11.0  CTL    23 03 04 00  02 00 00 00                            SET FEATURE             12.1.0        
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              13.1.0        
  11.0  DI     03 01 10 00                                         ....                    13.2.0        
  11.0  CTL    23 01 14 00  02 00 00 00                            CLEAR FEATURE           14.1.0        
  11.0  CTL    80 06 00 03  00 00 ff 00                            GET DESCRIPTOR          15.1.0        
  11.0  DI     04 03 09 04                                         ....                    15.2.0        
  11.0  CTL    80 06 03 03  09 04 ff 00                            GET DESCRIPTOR          16.1.0        
  11.0  DI     16 03 32 00  30 00 30 00  37 00 2d 00  30 00 33 00  ..2.0.0.7.-.0.3.        16.2.0        
               2d 00 32 00  33 00                                  -.2.3.                  16.2.16       
  11.0  CTL    80 06 00 02  00 00 ff 00                            GET DESCRIPTOR          17.1.0        
  11.0  DI     0a 02 2e 00  01 01 00 a0  32 00 09 04  00 00 02 03  ........2.......        17.2.0        
               01 01 00 00  0a 21 01 00  00 01 22 00  3f 00 08 05  .....!....".?...        17.2.16       
  11.0  CTL    23 01 01 00  02 00 00 00                            CLEAR FEATURE           18.1.0        



使用特权

评论回复
地板
computer00| | 2007-10-4 21:17 | 只看该作者

你贴的这个不完整,

  11.0  DI     0a 02 2e 00  01 01 00 a0  32 00 09 04  00 00 02 03  ........2.......        17.2.0        
               01 01 00 00  0a 21 01 00  00 01 22 00  3f 00 08 05  .....!....".?...        17.2.16    

这里只看到一部分,去设置里改一下,就可以看到全部了。


由于ARM是32位的,所以存在对齐问题,这样的话用sizeof取结构体大小会跟实际的字节数不一样,
并且不设置按字节包装的话,中间可能会填充0。

使用特权

评论回复
5
wlsong|  楼主 | 2007-10-4 23:05 | 只看该作者

麻烦再看看

Device  Phase  Data                                                Description       Cmd.Phase.Ofs(rep)  Delta  Date        Time        
------  -----  --------------------------------------------------  ----------------  ------------------  -----  ----------  ------------
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               1.1.0(2)     3.2mn  2006-10-04  15:23:12.365  
  11.0  DI     01 01 01 00                                         ....                     1.2.0         22us  2006-10-04  15:23:12.365  
  11.0  CTL    23 01 10 00  02 00 00 00                            CLEAR FEATURE            3.1.0         45us  2006-10-04  15:23:12.365  
  11.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               4.1.0         49us  2006-10-04  15:23:12.365  
  11.0  DI     00 03 00 00                                         ....                     4.2.0         13us  2006-10-04  15:23:12.365  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               5.1.0(2)      11us  2006-10-04  15:23:12.365  
  11.0  DI     01 01 00 00                                         ....                     5.2.0         13us  2006-10-04  15:23:12.365  
  11.0  CTL    23 03 04 00  02 00 00 00                            SET FEATURE              7.1.0        116ms  2006-10-04  15:23:12.481  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               8.1.0         26ms  2006-10-04  15:23:12.508  
  11.0  DI     03 01 10 00                                         ....                     8.2.0         32us  2006-10-04  15:23:12.508  
  11.0  CTL    23 01 14 00  02 00 00 00                            CLEAR FEATURE            9.1.0          6us  2006-10-04  15:23:12.508  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              10.1.0(2)      26ms  2006-10-04  15:23:12.534  
  11.0  DI     03 01 00 00                                         ....                    10.2.0         39us  2006-10-04  15:23:12.534  
  11.0  CTL    23 03 04 00  02 00 00 00                            SET FEATURE             12.1.0         39ms  2006-10-04  15:23:12.574  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              13.1.0         26ms  2006-10-04  15:23:12.600  
  11.0  DI     03 01 10 00                                         ....                    13.2.0         31us  2006-10-04  15:23:12.600  
  11.0  CTL    23 01 14 00  02 00 00 00                            CLEAR FEATURE           14.1.0          6us  2006-10-04  15:23:12.600  
  11.0  CTL    80 06 00 03  00 00 ff 00                            GET DESCRIPTOR          15.1.0        128ms  2006-10-04  15:23:12.728  
  11.0  DI     04 03 09 04                                         ....                    15.2.0         26ms  2006-10-04  15:23:12.755  
  11.0  CTL    80 06 03 03  09 04 ff 00                            GET DESCRIPTOR          16.1.0         38us  2006-10-04  15:23:12.755  
  11.0  DI     16 03 32 00  30 00 30 00  37 00 2d 00  30 00 33 00  ..2.0.0.7.-.0.3.        16.2.0         36ms  2006-10-04  15:23:12.792  
               2d 00 32 00  33 00                                  -.2.3.                  16.2.16                                        
  11.0  CTL    80 06 00 02  00 00 ff 00                            GET DESCRIPTOR          17.1.0         35us  2006-10-04  15:23:12.792  
  11.0  DI     0a 02 2e 00  01 01 00 a0  32 00 09 04  00 00 02 03  ........2.......        17.2.0         40ms  2006-10-04  15:23:12.833  
               01 01 00 00  0a 21 01 00  00 01 22 00  3f 00 08 05  .....!....".?...        17.2.16                                        
  11.0  CTL    23 01 01 00  02 00 00 00                            CLEAR FEATURE           18.1.0        344ms  2006-10-04  15:23:13.177  

修改的配置,接口,端点等描述符结构体
DEVICE_DESCRIPTOR_STRUCT device_descriptor=     //设备描述符
{
 sizeof(DEVICE_DESCRIPTOR_STRUCT),                   //设备描述符的字节数大小
 DEVICE_DESCRIPTOR,                                     //设备描述符类型编号
 0x0001,    //0x0110,    //0x1001,                                             //USB版本号
 0x00,                                               //USB分配的设备类代码
 0x00,                                               //USB分配的子类代码
 0x00,                                               //USB分配的设备协议代码
 0x10,                                               //端点0的最大包大小
 0x8304,    //0x3412,                                             //厂商编号VID,这里只是作为测试用,请使用自己的VID
 0x0100,    //0x7856,                                             //产品编号PID,这里只是作为测试用,请使用自己的PID
 0x0401,    //0x0100,                                             //设备出厂编号
 0x01,                                               //设备厂商字符串的索引
 0x02,                                               //描述产品字符串的索引
 0x03,                                               //描述设备序列号字符串的索引
 0x01                                                //可能的配置数量
};

//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
{
 CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
 INTERFACE_DESCRIPTOR_STRUCT  interface_descriptor;
 HID_DESCRIPTOR_STRUCT hid_descriptor;
 ENDPOINT_DESCRIPTOR_STRUCT  endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;

CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor                                          //配置描述符
{
 sizeof(CONFIGURATION_DESCRIPTOR_STRUCT),                           //配置描述符的字节数大小
 CONFIGURATION_DESCRIPTOR,                                          //配置描述符类型编号
 sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT),    //SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
 0x01,                                                            //只包含一个接口
 0x01,                                                            //该配置的编号
 0x00,                                                            //iConfiguration字段
 0xA0,                                                            //采用总线供电,支持远程唤醒
 0x32,    //0xC8                                                            //从总线获取最大电流400mA
},
//interface_descritor                                             //接口描述符
{
 sizeof(INTERFACE_DESCRIPTOR_STRUCT),                             //接口描述符的字节数大小
 INTERFACE_DESCRIPTOR,                                            //接口描述符类型编号
 0x00,                                                            //接口编号为0
 0x00,                                                            //该接口描述符的编号
 ENDPOINT_NUMBER,                                                 //非0端点数量为2,只使用端点主端点输入和输出
 0x03,                                                            //人机接口设备(HID)类
 0x01,                                                            //使用的子类:支持BIOS根启动Boot的子类
 0x01,                                                            //使用的协议:键盘
 0x00                                                             //接口描述符字符串索引
},
//hid_descriptor
{
 sizeof(HID_DESCRIPTOR_STRUCT),                                   //HID描述符的字节数大小
 HID_DESCRIPTOR,                                                  //HID描述符类型编号
 0x0001,    //0x0110,    //0x1001,                                                          //HID类协议版本号,为1.1
 0x00,    //0x21,                                                            //固件的国家地区代号,0x21为美国
 NUM_SUB_DESCRIPTORS,                                             //下级描述符的数量
 {
  {
   REPORT_DESCRIPTOR,                                             //下级描述符为报告描述符
   sizeof(KeyBoardReportDescriptor)    //SWAP16(sizeof(KeyBoardReportDescriptor))                       //下级描述符的长度
  }
 },
},
//endpoint_descriptor[]
{
 {                                                                //主端点输入描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  MAIN_POINT_IN,                                                  //端点号,主输入端点
  ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
  0x0040,    //0x4000,                                                         //该端点支持的最大包尺寸,64字节
  0x20,    //0x0A                                                            //中断扫描时间:设置为10ms
 },
  
 {                                                                //主端点输出描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  MAIN_POINT_OUT,                                                 //端点号,主输出端点
  ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
  0x0040,    //0x4000,                                                         //该端点支持的最大包尺寸,64字节
  0x20,//0x0A                                                            //中断扫描时间:设置为10ms
 }
}
};

使用特权

评论回复
6
wlsong|  楼主 | 2007-10-4 23:09 | 只看该作者

重新设置后捕捉到的

Device  Phase  Data                                                Description       Cmd.Phase.Ofs(rep)  Delta  Time        
------  -----  --------------------------------------------------  ----------------  ------------------  -----  ------------
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               1.1.0(2)     2.1sc  15:29:48.777  
  11.0  DI     01 01 01 00                                         ....                     1.2.0         21us  15:29:48.777  
  11.0  CTL    23 01 10 00  02 00 00 00                            CLEAR FEATURE            3.1.0         45us  15:29:48.777  
  11.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               4.1.0         48us  15:29:48.777  
  11.0  DI     00 03 00 00                                         ....                     4.2.0         13us  15:29:48.777  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               5.1.0(2)      11us  15:29:48.777  
  11.0  DI     01 01 00 00                                         ....                     5.2.0         13us  15:29:48.777  
  11.0  CTL    23 03 04 00  02 00 00 00                            SET FEATURE              7.1.0        116ms  15:29:48.893  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS               8.1.0         26ms  15:29:48.920  
  11.0  DI     03 01 10 00                                         ....                     8.2.0         32us  15:29:48.920  
  11.0  CTL    23 01 14 00  02 00 00 00                            CLEAR FEATURE            9.1.0          7us  15:29:48.920  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              10.1.0(2)      26ms  15:29:48.946  
  11.0  DI     03 01 00 00                                         ....                    10.2.0         44us  15:29:48.946  
  11.0  CTL    23 03 04 00  02 00 00 00                            SET FEATURE             12.1.0         39ms  15:29:48.985  
  11.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              13.1.0         26ms  15:29:49.011  
  11.0  DI     03 01 10 00                                         ....                    13.2.0         32us  15:29:49.012  
  11.0  CTL    23 01 14 00  02 00 00 00                            CLEAR FEATURE           14.1.0          5us  15:29:49.012  
  11.0  CTL    80 06 00 03  00 00 ff 00                            GET DESCRIPTOR          15.1.0        127ms  15:29:49.140  
  11.0  DI     04 03 09 04                                         ....                    15.2.0         26ms  15:29:49.166  
  11.0  CTL    80 06 03 03  09 04 ff 00                            GET DESCRIPTOR          16.1.0         24us  15:29:49.166  
  11.0  DI     16 03 32 00  30 00 30 00  37 00 2d 00  30 00 33 00  ..2.0.0.7.-.0.3.        16.2.0         36ms  15:29:49.203  
               2d 00 32 00  33 00                                  -.2.3.                  16.2.16                            
  11.0  CTL    80 06 00 02  00 00 ff 00                            GET DESCRIPTOR          17.1.0         26us  15:29:49.203  
  11.0  DI     0a 02 2e 00  01 01 00 a0  32 00 09 04  00 00 02 03  ........2.......        17.2.0         40ms  15:29:49.244  
               01 01 00 00  0a 21 01 00  00 01 22 00  3f 00 08 05  .....!....".?...        17.2.16                            
               82 03 40 00  20 00 08 05  02 03 40 00  20 00        ..@. .....@. .          17.2.32                            
  11.0  CTL    23 01 01 00  02 00 00 00                            CLEAR FEATURE           18.1.0        340ms  15:29:49.585  

使用特权

评论回复
7
computer00| | 2007-10-4 23:39 | 只看该作者

是你没设置按字节对齐的缘故,中间有0填充,

你将bus hound抓到的数据跟你的配置描述符集合一个个对比可以看出中间多了些0。

如果你觉得结构体不好弄的话,干脆换成char型的数组算了。

使用特权

评论回复
8
wlsong|  楼主 | 2007-10-5 00:48 | 只看该作者

设备管理器中已经显示“电脑圈圈做的USB键盘”,

看不懂bus hound的数据,我的设备描述符
DEVICE_DESCRIPTOR_STRUCT device_descriptor=     //设备描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT),                   //设备描述符的字节数大小
DEVICE_DESCRIPTOR,                                     //设备描述符类型编号
0x0001,    //0x0110,    //0x1001,                                             //USB版本号
0x00,                                               //USB分配的设备类代码
0x00,                                               //USB分配的子类代码
0x00,                                               //USB分配的设备协议代码
0x10,                                               //端点0的最大包大小
0x8304,    //0x3412,                                             //厂商编号VID,这里只是作为测试用,请使用自己的VID
0x0100,    //0x7856,                                             //产品编号PID,这里只是作为测试用,请使用自己的PID
0x0401,    //0x0100,                                             //设备出厂编号
0x01,                                               //设备厂商字符串的索引
0x02,                                               //描述产品字符串的索引
0x03,                                               //描述设备序列号字符串的索引
0x01                                                //可能的配置数量
};

0x0040,    //0x4000,   //该端点支持的最大包尺寸,64字节

实在看不懂,请您明示。

使用特权

评论回复
9
computer00| | 2007-10-5 09:16 | 只看该作者

这个只是字符串描述符正确而已,你看你的配置描述符

这个是你返回的配置描述符,
 11.0  DI     0a 02 2e 00  01 01 00 a0  32 00 09 04  00 00 02 03  ........2.......        17.2.0         40ms  15:29:49.244  
               01 01 00 00  0a 21 01 00  00 01 22 00  3f 00 08 05  .....!....".?...        17.2.16                            
               82 03 40 00  20 00 08 05  02 03 40 00  20 00        ..@. .....@. .          17.2.32      

第一个0a表示配置描述符的长度,实际上应该为09的,而你的是0a,这是因为结构体中对齐填充的原因;
02是配置描述符的编号;002e是配置-接口-端点集合的总长度;前一个01表示有多少个接口;后一个01
该配置的编号;00表示iConfiguration字段;a0表示总线供电,支持远程唤醒;32表示从总线最大
获取100mA电流;后面还填充了一个00,这是错误的。

按照上面的,你依次对后面的数据分析,就可以找出哪些数据返回是错误的了。关于对齐还是
比较麻烦的,建议你按照它的返回顺序,改成char型的数组吧,这样不会遇到填充的问题。

使用特权

评论回复
10
michael_li| | 2007-10-5 10:56 | 只看该作者

晕 我怎么看不懂。。。

使用特权

评论回复
11
wlsong|  楼主 | 2007-10-5 21:27 | 只看该作者

感谢Computer00,按您说的问题已解决,佩服。

使用特权

评论回复
12
computer00| | 2007-10-8 15:37 | 只看该作者

其实也没啥的,多注意观察就可以找到原因了。

使用特权

评论回复
13
tyrone3000| | 2007-10-13 10:42 | 只看该作者

想问个问题,怎么读Bus Hound输出的信息?

使用特权

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

本版积分规则

4

主题

11

帖子

0

粉丝