title: usb描述符简述

tags: linux

date: 2018/12/18/ 18:25:23

toc: true

usb描述符简述

转载自cnblog

具体描述符 https://blog.csdn.net/hushiganghu/article/details/54929066


在USB描述符中,从上到下分为四个层次:

  • USB设备描述符(usb_device_descriptor)

    • USB配置描述符(usb_config_descriptor)、

      • USB接口描述符(usb_interface_descriptor)、

        • USB端点描述符(usb_endpoint_descriptor)、

一个设置描述符可以有多个配置描述符

一个配置描述符可以有多个接口描述符(比如声卡驱动,就有两个接口:录音接口和播放接口)

一个接口描述符可以有多个端点描述符,一个USB接口代表一个逻辑上的设备,比如声卡驱动,就有两个接口:录音接口和播放接口

一个端点只有一个方向,端点0可读可写

比如集成了键盘和鼠标的USB设备,里面就是两个interface,一个是键盘,另一个是鼠标。Interface之间通常是隔离的,互相不干扰。

每个Interface(接口)下面有一个或者多个Endpoint(端点),这也是逻辑概念,比如QQ要通信,可能开好几个端口,同样U盘要跟主机通信,要有控制信号和数据信号,这些都是不同的端点。端点是USB设备通信的基本单位,所有通信几乎都是从端点发起的。

设备描述符

  1. struct usb_device_descriptor {
  2. __u8 bLength; //本描述符的size
  3. __u8 bDescriptorType; //描述符的类型,这里是设备描述符DEVICE
  4. __u16 bcdUSB; //指明usb的版本,比如usb2.0
  5. __u8 bDeviceClass; //类
  6. __u8 bDeviceSubClass; //子类
  7. __u8 bDeviceProtocol; //指定协议
  8. __u8 bMaxPacketSize0; //端点0对应的最大包大小
  9. __u16 idVendor; //厂家ID
  10. __u16 idProduct; //产品ID
  11. __u16 bcdDevice; //设备的发布号
  12. __u8 iManufacturer; //字符串描述符中厂家ID的索引
  13. __u8 iProduct; //字符串描述符中产品ID的索引
  14. __u8 iSerialNumber; //字符串描述符中设备序列号的索引
  15. __u8 bNumConfigurations; //配置描述符的个数,表示有多少个配置描述符
  16. } __attribute__ ((packed));

USB设备描述符位于USB设备结构体usb_device中的成员descriptor中

同样地,配置、接口、端点描述符也是位于USB配置、接口、端点结构体中,不过这3个对于我们写驱动的不是很常用

usb_device结构体如下所示:

  1. struct usb_device {
  2.    int devnum;           //设备号,是在USB总线的地址
  3.    char devpath [16];       //用于消息的设备ID字符串
  4.    enum usb_device_state state; //设备状态:已配置、未连接等等
  5.    enum usb_device_speed speed; //设备速度:高速、全速、低速或错误
  6.   
  7.    struct usb_tt *tt;       //处理传输者信息;用于低速、全速设备和高速HUB
  8.    int ttport;           //位于tt HUB的设备口
  9.   
  10.    unsigned int toggle[2];    //每个端点的占一位,表明端点的方向([0] = IN, [1] = OUT)  
  11.    struct usb_device *parent;  //上一级HUB指针
  12.    struct usb_bus *bus;       //总线指针
  13.    struct usb_host_endpoint ep0; //端点0数据
  14.    struct device dev;         //一般的设备接口数据结构
  15.  
  16.    struct usb_device_descriptor descriptor; //USB设备描述符,
  17.    struct usb_host_config *config;       //设备的所有配置结构体,配置结构体里包含了配置描述符
  18.    struct usb_host_config *actconfig;     //被激活的设备配置
  19.    struct usb_host_endpoint *ep_in[16];     //输入端点数组
  20.    struct usb_host_endpoint *ep_out[16];     //输出端点数组
  21.   
  22.    char **rawdescriptors;             //每个配置的raw描述符
  23.   
  24.    unsigned short bus_mA;         //可使用的总线电流
  25.    u8 portnum;               //父端口号
  26.    u8 level;                //USB HUB的层数
  27.   
  28.    unsigned can_submit:1;         //URB可被提交标志
  29.    unsigned discon_suspended:1;      //暂停时断开标志
  30.    unsigned persist_enabled:1;       //USB_PERSIST使能标志
  31.    unsigned have_langid:1;         //string_langid存在标志
  32.    unsigned authorized:1;
  33.    unsigned authenticated:1;
  34.    unsigned wusb:1;             //无线USB标志
  35.    int string_langid;             //字符串语言ID
  36.   
  37.    /* static strings from the device */ //设备的静态字符串
  38.    char *product;               //产品名
  39.    char *manufacturer;             //厂商名
  40.    char *serial;                 //产品串号
  41.   
  42.    struct list_head filelist;         //此设备打开的usbfs文件
  43.   #ifdef CONFIG_USB_DEVICE_CLASS
  44.    struct device *usb_classdev;       //用户空间访问的为usbfs设备创建的USB类设备
  45.   #endif
  46.   #ifdef CONFIG_USB_DEVICEFS
  47.    struct dentry *usbfs_dentry;        //设备的usbfs入口
  48.   #endif
  49.   
  50.    int maxchild;                     //(若为HUB)接口数
  51.    struct usb_device *children[USB_MAXCHILDREN];//连接在这个HUB上的子设备
  52.    int pm_usage_cnt;                 //自动挂起的使用计数
  53.    u32 quirks;
  54.    atomic_t urbnum;                   //这个设备所提交的URB计数
  55.   
  56.    unsigned long active_duration;         //激活后使用计时
  57.   #ifdef CONFIG_PM                 //电源管理相关
  58.    struct delayed_work autosuspend;       //自动挂起的延时
  59.    struct work_struct autoresume;       //(中断的)自动唤醒需求
  60.    struct mutex pm_mutex;           //PM的互斥锁 
  61.  
  62.    unsigned long last_busy;         //最后使用的时间
  63.    int autosuspend_delay;
  64.    unsigned long connect_time;       //第一次连接的时间
  65.   
  66.    unsigned auto_pm:1;           //自动挂起/唤醒
  67.    unsigned do_remote_wakeup:1;     //远程唤醒
  68.    unsigned reset_resume:1;       //使用复位替代唤醒
  69.    unsigned autosuspend_disabled:1;   //挂起关闭
  70.    unsigned autoresume_disabled:1;   //唤醒关闭
  71.    unsigned skip_sys_resume:1;     //跳过下个系统唤醒
  72.   #endif
  73.    struct wusb_dev *wusb_dev;     //(如果为无线USB)连接到WUSB特定的数据结构
  74.   };

配置描述符

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

接口描述符

USB接口只处理一种USB逻辑连接。一个USB接口代表一个逻辑上的设备,比如声卡驱动,就有两个接口:录音接口和播放接口

这可以在windows系统中看出,有时插入一个USB设备后,系统会识别出多个设备,并安装相应多个的驱动。

  1. struct usb_interface_descriptor {
  2. __u8 bLength; //描述符的长度
  3. __u8 bDescriptorType; //描述符类型的编号
  4. __u8 bInterfaceNumber; //接口的编号
  5. __u8 bAlternateSetting; //备用的接口描述符编号,提供不同质量的服务参数.
  6. __u8 bNumEndpoints; //要使用的端点个数(不包括端点0), 表示有多少个端点描述符,比如鼠标就只有一个端点
  7. __u8 bInterfaceClass; //接口类型,与驱动的id_table
  8. __u8 bInterfaceSubClass; //接口子类型
  9. __u8 bInterfaceProtocol; //接口所遵循的协议
  10. __u8 iInterface; //描述该接口的字符串索引值
  11. } __attribute__ ((packed)

它位于usb_interface->cur_altsetting->desc 这个成员结构体里,

usb_interface结构体如下所示:

  1. struct usb_interface {
  2. struct usb_host_interface *altsetting; /* 包含所有可用于该接口的可选设置的接口结构数组。每个 struct usb_host_interface 包含一套端点配置(即struct usb_host_endpoint结构所定义的端点配置。这些接口结构没有特别的顺序。*/
  3. struct usb_host_interface *cur_altsetting; /* 指向altsetting内部的指针,表示当前激活的接口配置*/
  4. unsigned num_altsetting; /* 可选设置的数量*/
  5. /* If there is an interface association descriptor then it will list the associated interfaces */
  6. struct usb_interface_assoc_descriptor *intf_assoc;
  7. int minor; /* 如果绑定到这个接口的 USB 驱动使用 USB 主设备号, 这个变量包含由 USB 核心分配给接口的次设备号. 这只在一个成功的调用 usb_register_dev后才有效。*/
  8. ... ...
  9. }

cur_altsetting成员的结构体是usb_host_interface,如下: 

  1. struct usb_host_interface {
  2. struct usb_interface_descriptor desc; //当前被激活的接口描述符
  3. struct usb_host_endpoint *endpoint;   /* 这个接口的所有端点结构体的联合数组*/
  4. char *string;                /* 接口描述字符串 */
  5. unsigned char *extra;           /* 额外的描述符 */
  6. int extralen;
  7. };

端点描述符

  1. struct usb_endpoint_descriptor {
  2. __u8 bLength; //描述符的长度
  3. __u8 bDescriptorType; //描述符类型的编号
  4. __u8 bEndpointAddress; //端点编号,比如端点1,就是1
  5. __u8 bmAttributes; //端点的属性, 比如中断传输类型,输入类型
  6. __le16 wMaxPacketSize; //一个端点的最大包大小,
  7. __u8 bInterval; //间隔时间,用在中断传输上,比如间隔时间查询鼠标的数据
  8. /* NOTE: these two are _only_ in audio endpoints. */
  9. /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
  10. __u8 bRefresh;
  11. __u8 bSynchAddress;
  12. } __attribute__ ((packed));

比如端点0,就位于usb_interface->cur_altsetting->desc->endpoint[0].desc

其中endpoint的结构体为usb_host_endpoint,如下所示:

  1. struct usb_host_endpoint {
  2. struct usb_endpoint_descriptor desc; //端点描述符
  3. struct usb_ss_ep_comp_descriptor ss_ep_comp;//超快速端点描述符
  4. struct list_head urb_list; //本端口对应的urb链表
  5. void *hcpriv;
  6. struct ep_device *ep_dev; /* For sysfs info */
  7. unsigned char *extra; /* Extra descriptors */
  8. int extralen;
  9. int enabled;//使能的话urb才能被提交到此端口
  10. };

usb描述符简述(二)的更多相关文章

  1. USB学习笔记连载(十二):USB描述符

    USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.H ...

  2. USB描述符解析-->枚举.

    枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源.一般都是使用中断传输方式通信. 常用的描述符有以下几种:01H.设备描述符  02H ...

  3. 2.6 USB摄像头驱动之USB描述符

    学习目标:分析USB摄像头驱动的描述符: 一.USB设备描述符 在usb设备驱动分析那一节,也用到了usb描述符. usb描述符可分为: USB设备描述符(usb_device_descriptor) ...

  4. USB描述符概述

    在USB总线接口协议中,规定了一些标准的USB描述符,如表所示. 对于USB设备来说,有些USB描述符是必需的,例如: 设备描述符 配置描述符 字符串描述符 接口描述符 端点描述符 其余一些描述符并非 ...

  5. USB 描述符

    标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符. // Standard Device Descriptor typedef struct { u8 ...

  6. USB描述符【整理】

    USB描述符 USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主 ...

  7. USB描述符(转)

    //============================================================================// 文件名: USBDESC.C// 用 ...

  8. linux一切皆文件之Unix domain socket描述符(二)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...

  9. Python属性描述符(二)

    Python存取属性的方式特别不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但如果实例未曾定义过该属性,就会获取类属性,而为实例的属性赋值时,通常会在实例中创建属性,而不会影响到类本身.这 ...

随机推荐

  1. Lcd(一)显示原理

    一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...

  2. iOS UITextField 响应键盘的return 事件

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(, , , )] textField.returnKeyT ...

  3. MFC自绘菜单

    自绘控件问题多多.本文以菜单为例. ①当要使用顶层菜单资源.对话框资源.状态栏资源等这3种资源的任何一种.那么CWinApp::InitInstance函数内部必须使用LoadFrame函数来加载资源 ...

  4. RX 和 TX

    我们在ifconfig 查看网卡配置时或者嵌入式开发的时候,经常会看到rx/tx缩写,其含义如下: RX==receive,接收,从开启到现在接收封包的情况,是下行流量. TX==Transmit,发 ...

  5. Cs231n课堂内容记录-Lecture 8 深度学习框架

    Lecture 8  Deep Learning Software 课堂笔记参见:https://blog.csdn.net/u012554092/article/details/78159316 今 ...

  6. https协议详解

    HTTPS协议建立过程 1) 客户端首次发送请求时,由于客户端(浏览器等)对一些加解密算法的支持程度不一样,但是在TLS传输中必须使用相同的加解密算法,所以在TLS握手的阶段,客户端告诉服务器端自己支 ...

  7. Django组件--forms组件(注册用)

    一.forms组件--校验类的使用 二.form组件--校验类的参数 三.forms组件校验的局部钩子--自定义校验规则(要看源码理解) 四.forms组件校验的全局钩子--校验form表单两次密码输 ...

  8. 日志学习系列(三)——NLog基础知识

    前边我们解释了log4net的学习,我们再介绍一下NLog 一.什么是NLog NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog是一个简单 ...

  9. 洛谷P1238 走迷宫题解

    题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示 ...

  10. Linux利用mysql建立数据库

    安装数据库: sudo   apt-get  install  mysql-server   启动服务: sudo  service  mysql  start  连接数据库:sudo    mysq ...