Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1183322
  • 博文数量: 221
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2139
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-27 19:53
个人简介

JustForFun

文章分类

全部博文(221)

文章存档

2024年(6)

2023年(8)

2022年(2)

2021年(2)

2020年(29)

2019年(11)

2018年(23)

2017年(41)

2016年(76)

2015年(23)

我的朋友
最近访客

分类: LINUX

2017-09-12 10:11:21

 转载自原文:用bus hound分析usb的枚举过程 (本人有修改)
http://blog.chinaunix.net/uid-25909619-id-3335199.html
http://blog.sina.com.cn/s/blog_76550fd70100zyyl.html
配合<圈圈教你玩usb>这本书看
说明:由于分析时是在记事本上分析的,贴到这里出现了格式有点乱,看时请复制到记事本中,可以看到完整的格式。

Bus Hound 5.00 capture. Complements of

  Device - Device ID (followed by the endpoint for USB devices)
            (22) Qualcomm HS-USB Diagnostics 9025 (COM5)
  Phase  - Phase Type
            CTL   USB control transfer      
            DO    Data out                  
            LEN   Data length               
            RSET  bus reset                 
            URB   USB request block         
  Data   - Hex dump of the data transferred
  Descr  - Description of the phase
  Cmd... - Position in the captured data
  Delta  - Elapsed time from the previous phase to the current phase
  Time   - Time the phase occurred in hour:minute:second.millisec form
  Date   - Date the phase occurred in year/month/day form
 
/*说明*/
1.1.0第一个命令的第一个阶段
1.2.0第一个命令的第二个阶段
1.3.0第一个命令的0字节偏移
1.3.16第一个命令的16个字节偏移

22.0解释:22为设备加入系统的顺序号,0为端点号
22.d解释:22为设备加入系统的顺序号,d为端点号
22.9解释:22为设备加入系统的顺序号,9为端点号


Device  Phase  Data                                                Description       Cmd.Phase.Ofs(rep)  Delta  Time          Date     
------  -----  --------------------------------------------------  ----------------  ------------------  -----  ------------  ----------
  22.0  CTL    80 06 00 01  00 00 12 00             GET DESCRIPTOR         
 (80 方向:设备至主机 种类:标准 接收者:设备
 (06 获得描述符GetDescriptor
 (00 01 获得的是设备描述符
 (00 00 偏移为0
 (12 00 要求设备返回18字节

06         取得描述符请求Get Descriptor


0100     01表示的设备描述符 00描述符的索引

0000     读取描述符时 字符串的语言ID号

0012     18字节 需要返回取得的字节数

本人《usb标准设备请求的结构》对此有详细介绍
 
  22.0  LEN    12 00 00 00               18                     
 (返回的字节数
 
  22.0  DO   12 01 00 02  00 00 00 40  d1 12 00 40  27 02 01 09  .......@...@'...    
               03 01                                               ..                 
 (设备的应答刚好18个字符
 (bLength:12 ,此设备描述符的长度是18字节
 (bDecriptorType:01 ,参照表5得知是设备描述符
 (bcdUSB:00 02 ,代表USB协议的版本号,此处2.0版
 (bDeviceClass:00  设备使用的类代码 一般这里定义为0 协议在接口描述符中定义
 (bDeviceSubClass:00,表述设备类码由接口文件给出,可能是为了每个接口独立实现不同的功能。子类代码
 (bDevicePortocol:00,跟前两个字节紧密联系,这里指还是等待在接口文件里再说明使用的设备协议 设备使用的协议
 (bMaxPacketSize0:40,指端点0最大可接受的包大小。

 (idVendor:d1 12 ,VID其实是0x12D1,字节序问题不在赘述
 (idProduct:00 40 ,PID 0x4000
 (bcdDevice:27 02,这个似乎没什么通用的意义
 (iManufacturer:01, 描述厂商的字符串的索引值 
 (iProduct:09,  产品的字符串索引值
 (iSerialNumber:03,  设备的序列号字符串索引值   0表示没有序列号字符串
 (bNumConfigurations:01   设备有多少种配置
这几个数字都是索引值,如果以后主机想向设备端索要这些字符串信息(包含在字符串描述符里),就用这些值填充wIndex

                                       
  22.0  URB  50 00 0b 00  00 00 00 00  56 00 69 00  64 00 5f 00  GET DEVICE DESCR       
           31 00 32 00  64 00 31 00  12 00 00 00  88 a1 77 8a                         
                             
                                                      
  22.0  CTL    80 06 00 02  00 00 09 00        GET DESCRIPTOR        
 (80 方向:设备至主机 种类:标准 接收者:设备
 (06 获得描述符
 (00 02 获得的是配置描述符
 (00 00 偏移为0
 (09 00 要求设备返回9字节
 
 
  22.0  LEN    09 00 00 00             9                     
  22.0  DO     09 02 20 00  01 01 00 a0  fa          .. ......             
 (bLength:09
 (bDescriptorType:02 这跟设备描述符都没什么区别 configuration descriptor
 (wTotalLength: 20 00 ,表示包括此配置描述符、接口描述符、端点描述符和设备类及厂商定义的描述符的总长为0x0020=32个字节。(另外的博客解释) 配置描述符总长度32字节
 (bNumInterfaces: 01 ,支持的接口数为1 鼠标是一个接口,一个接口代表一个功能
 (bCongfigurationValue:01,  SetConfiguration请求中用作参数来选定此配置
 (iConfiguration:00,描述此配置的字串描述表索引
 (bmAttributes:A0,10100000B,只看得出是D5: 远程唤醒 ,D7是保留位
a0对应的二进制位10100000D71是必须的,D61表示为设备自供电,为0表示总线供电 D51表示支持远程唤醒 0表示不支持 其余位为0
 (MaxPower:fa,总线耗电量为250x2=500mA.

   
  22.0  URB  50 00 0b 00  00 00 00 00  56 00 69 00  64 00 5f 00  GET DEVICE DESCR       
           31 00 32 00  64 00 31 00  09 00 00 00  60 23 5a 8a                       
              
                               
  22.0  CTL 80 06 00 02  00 00 20 00     GET DESCRIPTOR         
 (80 方向:设备至主机 种类:标准 接收者:设备
 (06 获得描述符
 (00 02 获得的是配置描述符
 (00 00 偏移为0
 (20 00 要求设备返回32字节 在上一个描述中得到的
 
  22.0  LEN  20 00 00 00               32                     
  22.0  DO   09 02 20 00  01 01 00 a0  fa 09 04 00  00 02 08 06  .. .............       
             50 09 07 05  8d 02 00 02  00 07 05 09  02 00 02 01  P...............      

第一部分(配置描述符)09 02 20 00  01 01 00 a0  fa
 (bLength:09
 (bDescriptorType:02 这跟设备描述符都没什么区别
 (wTotalLength: 20 00 ,表示包括此配置描述符、接口描述符、端点描述符和设备类及厂商定义的描述符的总长为0x0020=32个字节。
 (bNumInterfaces: 01 ,支持的接口数为1
 (bCongfigurationValue:01,  SetConfiguration请求中用作参数来选定此配置
 (iConfiguration:00,描述此配置的字串描述表索引
 (bmAttributes:A0,10100000B,只看得出是D5: 远程唤醒 ,D7是保留位
 (MaxPower:fa,总线耗电量为250x2=500mA.
 
第二部分(接口描述符)09 04 00  00 02 08 06 50 09 是接口描述符(Interface Descriptor),见表10
bLength:09
bDescriptorType:04,接口描述符
bInterfaceNumber:00 ,当前配置的是0号接口(第一个接口)
bAlternateSetting:00,可选设置的索引值,还不清楚具体意义
bNumEndpoints:02,此接口用的端点数量为2
bInterfaceClass:08 ,
bInterfaceSubClass:06,
bInterfaceProtocol:50 ,
iInterface:09, 是一个字符串索引

第三部分07 05  8d 02 00 02  00是端点描述符(EndPont Descriptor)
bLength:07
bDescriptorType:05 端点描述符类型
bEndpointAddress:8d,10001101端点地址0xd,D7表示传输方向 1为输入 D6~D4 reservedD3~D0为端点号 端点号为d
bmAttributes:02 ,批量传送  端点的属性 D1~D0表示端点的传输类型 11表示为中断传输 10批量传输 01等时传输 00控制传输 非等时传输D7~D20
wMaxPacketSize:00 02 ,当前配置下此端点能够接收或发送的最大数据包的大小为512
bInterval:00 表示端点查询的时间 对于中断端点 表示查询的帧间隔数

第四部分07 05 09  02 00 02 01是端点描述符(EndPont Descriptor)
bLength:07
bDescriptorType:05
bEndpointAddress:09,端点地址0x9,出端点
bmAttributes:02 ,位图,批量传送
wMaxPacketSize:00 02 ,当前配置下此端点能够接收或发送的最大数据包的大小为512
bInterval:01 轮询的间隔为1ms,就是说1ms发生一次中断

////////////////////////////////////
看另外一个bus hound抓出来的
09 02 22 00  01 01 00 a0  64
09 04 01  00 01 03 01 02 00
09 21  10 01 00 01  22 a9 00
07  05 82 03 08 00 08
以上是一串,我分开方便查看,09 21  10 01 00 01  22 a9 00 这个数据串看下面的解释就清楚了

类描述符(HID类)

09 21 11 01 0001 22 3e 00

09 类描述长度

21HID描述符

0111 使用的HID协议1.11

00  设备适用的国家

01 下级描述符的数量 至少为1,报告描述符或者物理描述符

22  下级描述符的类型 0x22报告描述符 0x23物理描述符

003e 下级描述符的长度 当有多个下级描述符时,上述两值交替下去


///////////////////////////////////
          
                                       
  22.0  URB 50 00 0b 00  00 00 00 00  56 00 69 00  64 00 5f 00  GET DEVICE DESCR          
           31 00 32 00  64 00 31 00  20 00 00 00  a0 47 c4 8a                                           

  22.0  CTL  00 09 01 00  00 00 00 00    SET CONFIG       
(00 D7: 传输方向;0=主机至设备 种类;0=标准 接受者;0=设备
(09为set config
(01 00为配置值
(00 00
(00 00

  22.0  URB  50 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  SELECT CONFIG     
            a0 47 c4 8a  f8 c8 81 8a  38 00 00 00  08 06 50 00                                              
  22.0  CTL  00 03 01 00  00 00 00 00       SET FEATURE       
  (00 D7: 传输方向;0=主机至设备 种类;0=标准 接受者;0=设备
 (03为set feature
 (01 00为特性选择符,设备
 (00 00
 (00 00
 
  22.0  URB  50 00 08 00  00 00 00 00  00 82 52 8a  20 00 00 00  CONTROL TRANSFER      
           18 82 52 8a  0a 00 00 00  00 00 00 00  00 00 00 00                                             
  22.d  RSET                                                             
  (重启端点d
  22.d  URB  18 00 1e 00  00 00 00 00  00 82 52 8a  10 00 00 00  RESET PIPE            
           1c 24 10 8a  73 00 00 00                                                                   
  22.9  RSET                                                                
  (重启端点9
  22.9  URB  18 00 1e 00  00 00 00 00  00 82 52 8a  10 00 00 00  RESET PIPE     
            3c 24 10 8a  73 00 00 00 
/////////////////////////////////////////////////////////
getdescriptor

81 06 00 22 0000 7e 00                 

81的后五位D4~D0表示请求的接收者

0 设备

1 接口

2 端点

3 其他

4~31 保留

22 请求的描述符为HID的报告描述符 0x23为物理描述符

007e 请求的报告描述符长度(不懂为啥是这个,需要看主设备驱动和文档)
////////////////////////////////////////////////////////////
<
linux-2.6.35.3/include/linux/usb/g_hid.h> 
g_hid.h -- Header file for USB HID gadget driver 

struct hidg_func_descriptor {
    unsigned char        subclass;
    unsigned char        protocol;
    unsigned short        report_length;
    unsigned short        report_desc_length;
    unsigned char        report_desc[];
};


static struct hidg_func_descriptor my_hid_data = {
    .subclass        = 0, /* No subclass */
    .protocol        = 1, /* Keyboard */
    .report_length        = 8,
    .report_desc_length    = 63,
                 //据说.report_desc的数据可以通过把设备插上,用bus hound来查看获取到。
    .report_desc        = {
        0x05, 0x01,    /* USAGE_PAGE (Generic Desktop)              */
        0x09, 0x06,    /* USAGE (Keyboard)                       */
        0xa1, 0x01,    /* COLLECTION (Application)               */
        0x05, 0x07,    /*   USAGE_PAGE (Keyboard)                */
        0x19, 0xe0,    /*   USAGE_MINIMUM (Keyboard LeftControl) */
        0x29, 0xe7,    /*   USAGE_MAXIMUM (Keyboard Right GUI)   */
        0x15, 0x00,    /*   LOGICAL_MINIMUM (0)                  */
        0x25, 0x01,    /*   LOGICAL_MAXIMUM (1)                  */
        0x75, 0x01,    /*   REPORT_SIZE (1)                      */
        0x95, 0x08,    /*   REPORT_COUNT (8)                     */
        0x81, 0x02,    /*   INPUT (Data,Var,Abs)                 */
        0x95, 0x01,    /*   REPORT_COUNT (1)                     */
        0x75, 0x08,    /*   REPORT_SIZE (8)                      */
        0x81, 0x03,    /*   INPUT (Cnst,Var,Abs)                 */
        0x95, 0x05,    /*   REPORT_COUNT (5)                     */
        0x75, 0x01,    /*   REPORT_SIZE (1)                      */
        0x05, 0x08,    /*   USAGE_PAGE (LEDs)                    */
        0x19, 0x01,    /*   USAGE_MINIMUM (Num Lock)             */
        0x29, 0x05,    /*   USAGE_MAXIMUM (Kana)                 */
        0x91, 0x02,    /*   OUTPUT (Data,Var,Abs)                */
        0x95, 0x01,    /*   REPORT_COUNT (1)                     */
        0x75, 0x03,    /*   REPORT_SIZE (3)                      */
        0x91, 0x03,    /*   OUTPUT (Cnst,Var,Abs)                */
        0x95, 0x06,    /*   REPORT_COUNT (6)                     */
        0x75, 0x08,    /*   REPORT_SIZE (8)                      */
        0x15, 0x00,    /*   LOGICAL_MINIMUM (0)                  */
        0x25, 0x65,    /*   LOGICAL_MAXIMUM (101)                */
        0x05, 0x07,    /*   USAGE_PAGE (Keyboard)                */
        0x19, 0x00,    /*   USAGE_MINIMUM (Reserved)             */
        0x29, 0x65,    /*   USAGE_MAXIMUM (Keyboard Application) */
        0x81, 0x00,    /*   INPUT (Data,Ary,Abs)                 */
        0xc0        /* END_COLLECTION                         */
    }
};




阅读(2072) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~