驱动开发之USB设备基本概念

链接:https://blog.csdn.net/zqixiao_09/article/details/50984074

一、USB设备由3个功能模块组成,USB总线接口、USB逻辑设备和功能单元:

  • USB总线接口:USB设备中的串行接口引擎SIE
  • USB逻辑设备:被USB系统软件看作是一个端点的集合
  • 功能单元:被客户软件看作是一个接口的集合

二、从设备架构的角度来看,USB设备由一些配置、接口和端点组成,即一个USB设备对应一个设备描述符,它可以含有一个或多个配置,每个配置可以含有一个或多个接口,每个接口可以含有若干个端点。其中配置和接口是对USB设备功能的抽象,而实际的数据传输是由端点完成,在USB枚举时必须指明其采用的配置和接口

三、USB设备使用各种描述符来说明其设备架构,比如设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,它们通常被保存在USB设备的固定程序中;

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

 1 struct usb_device_descriptor
 2 {
 3     _ _u8 bLength; //描述符长度
 4     _ _u8 bDescriptorType; //描述符类型编号
 5  
 6     _ _le16 bcdUSB; //USB版本号
 7     _ _u8 bDeviceClass; //USB分配的设备类code
 8     _ _u8 bDeviceSubClass;// USB分配的子类code
 9     _ _u8 bDeviceProtocol; //USB分配的协议code
10     _ _u8 bMaxPacketSize0; //endpoint0最大包大小
11     _ _le16 idVendor; //厂商编号
12     _ _le16 idProduct; //产品编号
13     _ _le16 bcdDevice; //设备出厂编号
14     _ _u8 iManufacturer; //描述厂商字符串的索引
15     _ _u8 iProduct; //描述产品字符串的索引
16     _ _u8 iSerialNumber; //描述设备序列号字符串的索引
17     _ _u8 bNumConfigurations; //可能的配置数量
18 } _ _attribute_ _ ((packed));

2 配置描述符:USB设备的高功耗模式和低功耗模式可分别对应一个配置,它用于说明USB设备中各个配置的特性,比如所含接口的个数;

 1 struct usb_config_descriptor
 2 {
 3     _ _u8 bLength; //描述符长度
 4     _ _u8 bDescriptorType; //描述符类型编号
 5     
 6     _ _le16 wTotalLength; //配置所返回的所有数据的大小
 7     _ _u8 bNumInterfaces; // 配置所支持的接口数
 8     _ _u8 bConfigurationValue; //Set_Configuration命令需要的参数值
 9     _ _u8 iConfiguration; //描述该配置的字符串的索引值
10     _ _u8 bmAttributes; //供电模式的选择
11     _ _u8 bMaxPower; //设备从总线提取的最大电流
12 } _ _attribute_ _ ((packed));

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

 1 struct usb_interface_descriptor
 2 {
 3     _ _u8 bLength;           //描述符长度
 4     _ _u8 bDescriptorType; //描述符类型
 5     
 6     _ _u8 bInterfaceNumber;   // 接口的编号
 7     _ _u8 bAlternateSetting; //备用的接口描述符编号
 8     _ _u8 bNumEndpoints;      //该接口使用的端点数,不包括端点0
 9     _ _u8 bInterfaceClass;    //接口类型
10     _ _u8 bInterfaceSubClass; //接口子类型
11     _ _u8 bInterfaceProtocol; //接口所遵循的协议
12     _ _u8 iInterface; //描述该接口的字符串索引值
13 } _ _attribute_ _ ((packed));

4 端点描述符;端点是USB设备中的实际物理单元,即USB数据传输就是主机和USB设备各个端点之间进行的。每一个端点都有唯一的端点号,每个端点所支持的数据传输方向一般而言也是确定的,即输入IN和输出OUT,利用设备地址、端点号和传输方向就可以指定一个端点。0号端点比较特殊,它有数据输入IN和数据输出OUT两个物理单元,且只能支持控制传输,所有的USB设备都必须含有一个0号端点,用作默认控制管道,USB系统软件就是利用该管道和USB逻辑设备进行配置通信的;而非0号端点必须要在配置以后才可以使用。USB设备可以含有多个非0端点,对于低速设备最多含有2个附加端点数,对于全速/高速设备最多含有15个附加端点数;

 1 struct usb_endpoint_descriptor
 2 {
 3     _ _u8 bLength; //描述符长度
 4     _ _u8 bDescriptorType; //描述符类型
 5     _ _u8 bEndpointAddress; //端点地址:0~3位是端点号,第7位是方向(0-OUT,1-IN)
 6     _ _u8 bmAttributes; //端点属性:bit[0:1] 的值为00表示控制,为01表示同步,为02表示批量,为03表示中断
 7     _ _le16 wMaxPacketSize; //// 本端点接收或发送的最大信息包的大小
 8     _ _u8 bInterval;//轮询数据传送端点的时间间隔
 9                            //对于批量传送的端点以及控制传送的端点,此域忽略
10                         //对于同步传送的端点,此域必须为1
11     _ _u8 bRefresh;
12     _ _u8 bSynchAddress;
13 } _ _attribute_ _ ((packed));

5 字符串描述符:说明一些专用信息,比如制造商的名称、设备的序列号,它的内容已Unicode的形式给出,可以被客户软件所读取,字符串描述符是可选的;

1 struct usb_string_descriptor
2 {
3     _ _u8 bLength; //描述符长度
4     _ _u8 bDescriptorType; //描述符类型
5     
6     _ _le16 wData[1];
7 } _ _attribute_ _ ((packed));

四、USB端点分类:一个USB端点只能向一个方向传输数据(从主机到设备(输出OUT)或从设备到主机(输入IN)),端点可被看作一个单向的管道,如果一个USB设备含有N个端点,那么该设备和主机通信时就可以使用N条管道,且端点的类型决定了管道中数据的传输类型,比如中断端点对应中断管道,那么该管道只能进行中断传输;

1 控制端点Control:控制对USB设备的不同部分访问,通常用作配置设备、获取设备信息、发送命令到设备或获取设备状态报告;

2 中断端点Interrupt:每当主机向USB设备请求数据时,中断端点以固定的速率传送小量数据,比如USB鼠标、键盘;

3 批量端点Bulk:用来传送大量数据,若数据量太大可以分包传送,必须保证不能有任何数据丢失的情况,但不保证在特定时间范围内完成传输,比如打印机、USB网络设备等;

4 等时端点Isochronous:用来传送大量数据,可以允许数据丢失,但是要保证在特定时间内完成传输,比如音频、视频设备等;

五、未完待续~

posted @ 2019-08-28 15:29  博1990  阅读(1300)  评论(0编辑  收藏  举报