今天谈一下,关于离职和跳槽,众所周知,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域。