Linux USB基础之描述符(一)

Linux USB基础之描述符(一)

1 USB描述符

1.1 设备描述符:struct usb_device_descriptor

设备代表一个USB设备,它由一个或多个配置组成。设备描述符用于说明设备的总体信息,并指明其所含的配置的个数。一个USB设备只能有一个设备描述符。

struct usb_device_descriptor {
    __u8  bLength; ///长度
    __u8  bDescriptorType; ///描述符类型

    __le16 bcdUSB; //USB spec的版本号,一个设备如果能够进行高速传输,那么它设备描述符里的bcdUSB这一项就应该为0200H。
    __u8  bDeviceClass;///设备类型
    __u8  bDeviceSubClass;///设备子类型
    __u8  bDeviceProtocol;///协议
    __u8  bMaxPacketSize0;///最大传输大小
    __le16 idVendor;///厂商 ID
    __le16 idProduct;///设备 ID
    __le16 bcdDevice;/// 设备版本号
    __u8  iManufacturer;
    __u8  iProduct;
    __u8  iSerialNumber;///序列号
    __u8  bNumConfigurations;/// 设备当前速度模式下支持的配置数量。有的设备可以在多个速度模式下操作,这里包括的只是当前速度模式下的配置数目,不是总的配置数目
} __attribute__ ((packed));

1.2 配置描述符:struct usb_config_descriptor

一个USB设备可以包含一个或多个配置,如USB设备的低功耗模式和高功耗模式可分别对应一个配置。在使用USB设备前,必须为其选择一个合适的配置。配置描述符用于说明USB设备中各个配置的特性,如配置所含接口的个数等。USB设备的每一个配置都必须有一个配置描述符。

struct usb_config_descriptor {
__u8  bLength;
__u8  bDescriptorType;    	//这里的值并不仅仅可以为USB_DT_CONFIG,还可以为USB_DT_OTHER_SPEED_CONFIG
    __le16 wTotalLength;     	//使用GET_DESCRIPTOR请求从设备里获得配置描述符信息时,返回的数据长度
    __u8  bNumInterfaces;   	//这个配置包含的接口数量
    __u8  bConfigurationValue;	//对于拥有多个配置的幸运设备来说,可以拿这个值为参数,使用SET_CONFIGURATION请求来改变正在被使用的 USB配置,bConfigurationValue就指明了将要激活哪个配置。咱们的设备虽然可以有多个配置,但同一时间却也只能有一个配置被激活。捎带着提一下,SET_CONFIGURATION请求也是标准的设备请求之一,专门用来设置设备的配置。
    __u8  iConfiguration;  	//描述配置信息的字符串描述符的索引值
    __u8  bmAttributes;     	//这个字段表征了配置的一些特点,比如bit 6为1表示self-powered,bit 5为1表示这个配置支持远程唤醒。另外,它的bit 7必须为1
    __u8  bMaxPower;      	//设备正常运转时,从总线那里分得的最大电流值,以2mA为单位。设备可以使用这个字段向hub表明自己需要的的电流,但如果设备需求过于旺盛,请求的超出了hub所能给予的,hub就会直接拒绝还记得struct usb_device结构里的bus_mA吗?它就表示hub所能够给予的。计算机的usb端口可以提供最多500mA的电流
} __attribute__ ((packed));

1.3 接口描述符:struct usb_interface_descriptor

一个配置可以包含一个或多个接口,例如对一个光驱来说,当用于文件传输时,使用其大容量存储接口;而当用于播放CD时,使用其音频接口。接口是端点的集合,可以包含一个或多个可替换设置,用户能够在USB处于配置状态时改变当前接口所含的个数和特性。接口描述符用于说明设备中各个接口的特性,如接口所属的设备类及其子类等。USB设备的每个接口都必须有一个接口描述符。

struct usb_interface_descriptor   
{  
 	__u8  bLength;//接口描述符长度  
    __u8 bDescriptorType;//接口描述符类型  
  
    __u8 bInterfaceNumber;//接口号。每个配置可以包含多个接口,这个值就是它们的索引值。  
    __u8 bAlternateSetting;//接口使用的是哪个可选设置。协议里规定,接口默认使用的设置总为0号设置。  
    __u8 bNumEndpoints;//接口拥有的端点数量。这里并不包括端点0,因为端点0是控制传输,是所有的设备都必须提供的,所以这里就没必要多此一举的包括它了。对于hub,因为它的传输是中断传输,所以此值为1(不包括端点0)  
    __u8 bInterfaceClass;  
    __u8 bInterfaceSubClass;//对于hub,这个值是零  
    __u8 bInterfaceProtocol;  
    __u8 iInterface;  
} __attribute__ ((packed));

1.4 端点描述符:struct usb_endpoint_descripto

端点是USB设备中的实际物理单元,USB数据传输就是在主机和USB设备各个端点之间进行的。端点一般由USB接口芯片提供,例如Freescale公司的MC68HC908JB8和MC9S12UF32。USB设备中的每一个端点都有唯一的端点号,每个端点所支持的数据传输方向一般而言也是确定的:或是输入(IN),或是输出(OUT)。也有些芯片提供的端点的数据方向是可以配置的,例如MC68HC908JB8包含有两个用于数据收发的端点:端点1和端点2。其中端点1只能用于数据发送,即支持输入(IN)操作;端点2既能用于数据发送,也可用于数据接收,即支持输入(IN)和输出(OUT)操作。而MC9S12UF32具有6个端点。

 利用设备地址、端点号和传输方向就可以指定一个端点,并与它进行通信。端点的传输特性还决定了其与主机通信是所采用的传输类型,例如控制端点只能使用控制传输。根据端点的不同用途,可将端点分为两类:0号端点和非0号端点。

  0号端点比较特殊,它有数据输入IN和数据输出OUT两个物理单元,且只能支持控制传输。所有的USB设备都必须含有一个0号端点,用作默认控制管道。USB系统软件就是使用该管道与USB逻辑设备进行配置通信的。0号端点在USB设备上的以后就可以使用,而非0号端点必须要在配置以后才可以使用。

 根据具体应用的需要,USB设备还可以含有多个除0号端点以外的其他端点。对于低速设备,其附加的端点数最多为2个;对于全速/高速设备,其附加的端点数最多为15个。
struct usb_endpoint_descriptor {   ///USB 端点描述符(每个USB设备最多有16个端点)
__u8  bLength;			 ///描述符的字节长度
    __u8  bDescriptorType;		///描述符类型,对于端点就是USB_DT_ENDPOIN
    __u8  bEndpointAddress;	///bit0~3表示端点地址,bit8 表示方向,输入还是输出
    __u8  bmAttributes;		///属性(bit0、bit1构成传输类型,00--控制,01--等时,10--批量,11--中断)
   __le16 wMaxPacketSize;		///端点一次可以处理的最大字节数
   __u8  bInterval;			///希望主机轮询自己的时间间隔
 
 	/* NOTE:  these two are _only_ in audio endpoints. */
  	/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
  	__u8  bRefresh;
    __u8  bSynchAddress;
} __attribute__ ((packed));
发布了47 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u013836909/article/details/104886273