Windows驱动_USB驱动之二

                 今天谈一下,关于离职和跳槽,众所周知,IT行业的,离职跳槽率是非常高的。这个跟很多因素相关,跟这个行业本身也相关,因为IT行业的只是更新速度太快了,所以一个公司本来准备用一种框架来开发的,忽然发现另一种框架更好,于是乎,就去招聘符合的人,如果大家都在找这样的人,工资的诱惑就上涨了,于是很多符合这样的人,就会来比较,就开始离职,跳槽。这里,我想说的是,公司都是为了赚钱为目的,这个本无可厚非,所以肯定会让你付出跟相应相等的压力或者强度,这样说,可能有点自欺欺人。我i想说的是长远的利益,短期的利益可能很可观,但是长远来说,是不是值得,这个就要根据每个人的经历自己去衡量。因为,这个跟自己之前的知识体系都很相关。如果是另外的问题,就要想一想,比如,你在这个公司解决不了的问题,到了新公司,可能更加恶劣,或者新公司有更难的问题,这个世界上,未知的东西都充满了挑战和机遇的。根据,之前我之前的经验来说,挑战大于机遇。特别是对于我们这些快30岁左右的人来说。对于,现阶段的我来说,第一,就是积累人脉。第二,寻觅合适的人。第三,积淀知识,厚积薄发。

 

                 今天,我们来看一下,关于USB的设备请求和描述符。

 

                 我们知道每一个USB设备都有一个控制端点O,也有一个控制管道,来运送设备请求的。一般请求都是8个字节。

 

                 bmRequestType:占一个字节,偏移0,字节中,第7位表示数据的方向,0=主机到设备,1=设备到主机。第6-5位:类型,0=标准,1=类,2=厂商自定义,3=保留。

第4-0位:接收者,0=对设备的请求,1=对接口的请求,2=对管道(端点)的请求,3=其他,4-31=保留。

 

                bRequest:占一个字节,偏移1,请求类别。

                   #define USB_REQUEST_GET_STATUS   0x00

                   #define USB_RQEUST_CLEAR_FEATURE    0x01

                   #define USB_REQUEST_SET_FEATURE 0x03

                   #define USB_REQUEST_SET_ADDRESS 0x05

                   #define USB_REQUEST_GET_DESCRIPTOR 0x06

                   #define USB_REQUEST_SET_DESCRIPTOR 0x07

                   #define USB_REQUEST_GET_CONFIGURATION 0x08

                   #define USB_REQUEST_SET_CONFIGURATION 0x09

                   #define USB_REQUEST_GET_INTERFACE 0x0A

                   #define USB_REQUEST_SET_INTERFACE 0x0B

 

               wValue:占用两个字节,偏移2,不同请求含义不同。

 

               wIndex:占用两个字节,偏移4,不同请求含义不同。

 

               wLength:占用两个字节,偏移6,表示需要多少数据返回。

 

              USB设备描述符:

              

              typedef struct _USB_DEVICE_DESCRIPTOR { 
                        UCHAR  
bLength ;
                        UCHAR  
bDescriptorType ;
                        USHORT  
bcdUSB ;
                        UCHAR  
bDeviceClass ;
                        UCHAR  
bDeviceSubClass ;
                        UCHAR  
bDeviceProtocol ;
                        UCHAR  
bMaxPacketSize0 ;
                        USHORT  
idVendor ;
                        USHORT  
idProduct ;
                        USHORT  
bcdDevice ;
                        UCHAR  
iManufacturer ;
                        UCHAR  
iProduct ;
                        UCHAR  
iSerialNumber ;
                        UCHAR  
bNumConfigurations ;
                   } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR ;

              

               bLength:设备描述符的长度,这里等于18.

               bDescirptorType:描述符的类型,设备描述符为1.

               bcdUSB:这个域包含该描述符遵循的USB规范的版本号(BCD编码)

               bDeviceClass:设备类型。

               bDeviceSubClass:设备的子类型。

               bDeviceProtocol:指出设备类型所使用的协议。

              bMaxPacketSize0:这个域给出了默认控制端点上的数据包含量的最大值。

              idVendor: 设备厂商代码。

              idProduct:设备厂商使用的产品代码。

              bcdDevice: 指出设备的发行版本号。

              iManufacturer,iProduct,iSerialNumber:指向一个串描述符,该串描述符用人类可读的语言描述设备生产厂商,产品和序列号。这些串是可选的,0代表没有描述串。如果在设备上放入了序列号串,建议应使每个物理设备的序列好唯一。

              bNumConfiguration:指出该设备能实现多少种配置。Microsoft的驱动程序仅工作于设备的第一种配置。

 

             USB的配置描述符:

 

             typedef struct _USB_CONFIGURATION_DESCRIPTOR { 
                            UCHAR  
bLength ;
                            UCHAR  
bDescriptorType ;
                            USHORT  
wTotalLength ;
                            UCHAR  
bNumInterfaces ;
                            UCHAR  
bConfigurationValue;
                            UCHAR  
iConfiguration ;
                            UCHAR  
bmAttributes ;
                            UCHAR  
MaxPower ;
               } USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR ;

 

              每个设备有一个或多个配置描述符,它描述了设备能实行的各种配置方式。

 

              bLength: 配置描述符的长度,这里为9.

              bDescriptorType:描述符的类型,配置描述符为2.

              wTotalLength:该配置描述符长度加上该配置内所有接口和端点描述符长度的总和。通常,主机在发出一个GET_DESCRIPTOR请求并正确接收到9字符长的配置描述符后,就会在发出一个GET_DESCRIPTOR请求并指定这个总长度。第二个请求把这个大联合描述符传输回来。

             bNumInterfaces:该配置有多少个接口。

             bConfigurationValue:该配置的索引值。

             iConfiguration:一个可选的串描述符索引,指向描述该配置的Unicode字符串。此值为0,表明该配置没有串描述符。

             bmAttributes:字节包含描述该配置中设备电源和其他特性的位掩码。

             MaxPower:指出要从USB总线上获取的最大电流量。

 

             USB的接口描述符:

 

             typedef struct _USB_INTERFACE_DESCRIPTOR { 
                                 UCHAR  
bLength ;
                                 UCHAR  
bDescriptorType ;
                                 UCHAR  
bInterfaceNumber ;
                                 UCHAR  
bAlternateSetting ;
                                 UCHAR  
bNumEndpoints ;
                                 UCHAR  
bInterfaceClass ;
                                 UCHAR  
bInterfaceSubClass ;
                                 UCHAR  
bInterfaceProtocol ;
                                 UCHAR  
iInterface ;
                  } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR ;

 

              每个配置有一个或多个接口描述符,它们描述设备提供功能的接口。

              bLength:接口描述符的长度,应该为9.

              bDescriptorType:描述为类型,接口描述符为4.

              bInterfaceNumber:接口的索引值。

              bAlternateSetting:这也是一个索引值。用在SET_INTERFACE控制事务中以指定要激活的接口。

              bNumEndpoints:指出该接口有多少个端点,不包含端点0。

              bInterfaceClass:接口类。

              bInterfaceSubClass:子接口类。

              bInterfaceProtocol:为协议。

             iinterface:是一个串描述符的索引,0表示该接口无描述串。

 

             USB的端点描述符:

 

             typedef struct _USB_ENDPOINT_DESCRIPTOR { 
                                UCHAR  
bLength ;
                                UCHAR  
bDescriptorType ;
                                UCHAR  
bEndpointAddress ;
                                UCHAR  
bmAttributes ;
                                USHORT  
wMaxPacketSize ;
                                UCHAR  
bInterval ;
               } USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR ;

 

             接口可以没有或有多个端点描述符,它们描述了处理事务的端点。

             bLength: 端点描述符的长度,这里为7.

             bDescriptorType:描述符类型,这里为5.

             bEndpointAddress:编码端点的放性和端点号。

             bmAttributes:域的低两位指出端点的类型。0表示控制端点,1表示等时端点,2表示批量端点,3表示中断端点。

             wMaxPackerSize:指出该端点在一个事务中能传输的最大数据量。

             bInterval:中断端点和等时端点描述还有一个用于指定循检间隔时间的bInterva域。


               

 

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值