四种usb描述符:设备描述符,配置描述符,接口描述符和端点描述符。还有另外一种描述符:字符描述符。
协议里规定一个usb设备是必须支持这四大描述符的,字符描述符可有可无。
这些描述符信息存放在何处:当然是在设备里。等待主机访问读取。通常usb设备中会有eeprom,这些描述符信息 即存放在这里。
我们由上一篇文章 Linux--usb(6)usb_interface 知道一个接口可以有多个设置,使用不同的设置,描述接口的信息会有些不同,所以接口描述符并没有放在struct usb_interface结构里,而是放在表示接口设置的struct usb_host_interface结构里。
Linux--usb(6)usb_interface 中我们详解了各元素含义,其中的 struct usb_host_interface *altsetting;我们解读为当前接口设置。
struct usb_host_interface {
struct usb_interface_descriptor desc; // usb 接口描述符,保存了
usb设备的各种属性还有相关信息。此描述符结构体定义也在本文中粘贴了。
int extralen; //额外描述符长度
unsigned char *extra; /* Extra descriptors */ // 额外描述符。
厂商为设备特别定义的描述符
/* array of desc.bNumEndpoints endpoints associated with this
* interface setting. these will be in no particular order.
*/
struct usb_host_endpoint *endpoint; //
一个数组,表示这个设置所使用到端点.
char *string; /* iInterface string, if present */ // 设备接口字符描述符,
字符串描述符可有可无,那这里的指针也有可能为空
}
usb接口描述符结构体:
struct usb_interface_descriptor {
__u8 bLength; //
描述符的字节长度,
#define USB_DT_INTERFACE_SIZE 9
__u8 bDescriptorType; //
bDescriptorType,描述符的类型,
对于接口描述符来说,值为USB_DT_INTERFACE,也就是0x04。描述符类型在文件linux\usb\ch9.h
// 中定义。
__u8 bInterfaceNumber; //
接口号。每个配置可以包含多个接口,这个值就是它们的索引值
__u8 bAlternateSetting; //
接口使用的是哪个可选设置。协议里规定,接口默认使用的设置总为0号设置
__u8 bNumEndpoints; //
接口拥有的端点数量,
不包括端点0.
__u8 bInterfaceClass; // 接口类值,由这个值 可知接口属于哪一个usb接口类。eg:
mass storage 的Class就是0x08,hub的Class就是0x09
__u8 bInterfaceSubClass; // 接口子类值,由这个值可知属于接口类下的哪一个子类。
__u8 bInterfaceProtocol; // 接口遵循的协议编号值。
__u8 iInterface; //
接口对应的字符串描述符的索引值,这个字符串描述符却是可有可无.字符串描述符主要就是提供一些设备接口相关的描述性信息,比如厂商的名字,产
//品序列号等等。字符串描述符当然可以有多个,这里的索引值就是用来区分它们的。
} __attribute__ ((packed)); //
__attribute__,意思就是告诉编译器,这个结构的元素都是1字节对
阅读(4925) | 评论(0) | 转发(0) |