zoukankan      html  css  js  c++  java
  • usb设备驱动描述,王明学learn

                    usb设备驱动

      本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构

    一、USB总线介绍

    1.1USB发展史

        USB(Universal Serial Bus)通用串行总线,是一种外部总线标准用于规范电脑与外部设备的连接和通讯。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后已成功替代串口和并口,成为当今个人电脑和大量智能设备的必配接口之一。

    1. USB 1.0出现在1996年的,速度只有1.5Mb/s1998年升级为USB 1.1,速度也提升到12Mb/s,称之为”full speed”
    2. USB2.0规范是由USB1.1规范演变而来的。它的传输速率480Mbps ”high speed”达到了480Mbps称之为”high speed”
    3. USB3.0提供了十倍于USB 2.0的传输速度和更高的节能效率,被称为”super speed”

    二、USB硬件接口

    2.1USB硬件接口主要包括:标准A口,标准B口,mini-usb口,micro-usb口

          

                             

    2.2USB信号线

      USB接口有4根线,两根电源线,两根信号线。USB接口的输出电压和电流是:+5V 500mA

      USB电源:标有VCC,power,5v,5vSB字样。

      USB数据线:(正)DATA+,USBD+,PD-,USBDT+等字样。

      USB数据线:(负)DATA-,USB-,PD-,USBDT-等字样。

      地线:GND,ground

    2.3USB拓扑结构 

    2.3.1系统拓扑结构

              

     

       对于每个USB系统来说,都有一个称为主机控制器的设备,该控制器和一个根Hub作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。 每条USB总线上最多可以接127个设备。 

    2.3.2USB主控制器规格

      OHCI:主要是非PC系统上的USB芯片

      UHCI:大多是Intel和Via主板上的USB控制器芯片。他们都是由USB1.1规格的。

      器芯片。他们都是由USB1.1规格的。

      EHCI是有Intel等几个厂商研发,兼容OHCI UHCI ,遵循USB2.0规范。

    三、USB协议分析

      在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点。

     

     

    3.1设备逻辑结构

      每个USB设备都可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集

      一个USB播放器带有音频,视频功能,还有旋钮和按钮。
      配置1: 音频(接口)+旋钮(接口)
      配置2: 视频(接口)+旋钮(接口)
      频接口,视频接口,按钮接口,旋钮接口均需要一个驱动程序。

      USB设备中的唯一可寻址的部分是设备端点,端点的作用类似于寄存器。每个端点在设备内部有唯一的端点号,这个端点是在设备设计时给定的。主机和设备的通信最终都作用于设备上的各个端点。每个端点所支持的操作都是单向的,要么只读,要么只写。 

    3.1.1USB设备描述符

      当我们把USB设备如:USB鼠标)插到我们的PC时,主机能够自动识别出我们的USB设备类型。

        在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型、生产厂商等信息。这些固定格式的数据,我们就称之为USB描述符。标准的USB设备有5种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。

      一个USB设备只有一个设备描述符,设备描述符长度为18个字节,这也是由USB协议所决定的。

      linux内核使用struct usb_device_descriptor来对应usb描述符中的设备描述符

    struct usb_device_descriptor {
        __u8  bLength;描述符长度,固定为0x12
        __u8  bDescriptorType;设备描述符类型,固定为0x01
        __le16 bcdUSB;规范发布号。表示本设备能适用哪种协议,如2.0=0200
        __u8  bDeviceClass;类型代码
        __u8  bDeviceSubClass;子类型代码
        __u8  bDeviceProtocol;协议代码
        __u8  bMaxPacketSize0;端点0最大分组大小
        __le16 idVendor;供应商ID
        __le16 idProduct;产品ID,由厂家自行设置
        __le16 bcdDevice;设备出厂编码,由厂家自行设置
        __u8  iManufacturer;厂商描述符字符串索引,索引到对应的字符串描述符。为0表示没有。
        __u8  iProduct;产品描述符字符串索引
        __u8  iSerialNumber;设备序列号字符串索引
        __u8  bNumConfigurations;可能的配置数。
    } __attribute__ ((packed));     按字节对齐

    3.1.2配置描述符

    bLength : 描述符长度,固定为0x09。

    bDescriptorType : 配置描述符类型,固定为0x02。

    wTotalLength : 返回整个数据的长度,指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小。

    bConfigurationValue : 作为SetConfiguration的一个参数选择配置值。

    bNumInterfaces : 配置所支持的接口数,指该配置配备的接口数量,也表示该配置下接口描述符数量。

    iConfiguration : 用于描述该配置字符串描述符的索引。

    bmAttributes : 供电模式选择。Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.

    MaxPower : 总线供电的USB设备的最大消耗电流,以2mA为单位。

     linux内核使用struct usb_config_descriptor来对应usb描述符中的配置描述符---->当然这也是有USB协议决定的。

    struct usb_config_descriptor {
        __u8  bLength;
        __u8  bDescriptorType;
        __le16 wTotalLength;
        __u8  bNumInterfaces;
        __u8  bConfigurationValue;
        __u8  iConfiguration;
        __u8  bmAttributes;
        __u8  bMaxPower;
    } __attribute__ ((packed));

     

    3.1.3接口描述符

    USB接口描述符长度为8个字节

    bLength : 描述符长度,固定为0x09。

    bDescriptorType : 接口描述符类型,固定为0x04。

    bInterfaceNumber: 该接口的编号。

    bAlternateSetting: 用于为上一个字段选择可供替换的设置。

    bNumEndpoint : 使用的端点数目,端点0除外。

    bInterfaceClass : 类型代码(由USB组织分配)。

    bInterfaceSunClass : 子类型代码(由USB组织分配)。

    bInterfaceProtocol : 议代码(由USB组织分配)。

    iInterface : 字符串描述符的索引。

    struct usb_interface_descriptor {
        __u8  bLength;
        __u8  bDescriptorType;
        __u8  bInterfaceNumber;
        __u8  bAlternateSetting;
        __u8  bNumEndpoints;接口包含的端点个数,不包含0号端点,它是控制端点。
        __u8  bInterfaceClass;
        __u8  bInterfaceSubClass;
        __u8  bInterfaceProtocol;
        __u8  iInterface;
    } __attribute__ ((packed));

    3.1.4端点描述符 

    USB端点描述符长度为7个字节。

      bLength : 描述符大小,固定为0x07。

      bDescriptorType : 接口描述符类型,固定为0x05。

      bEndpointType : USB设备的端点地址。Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT。Bit6-4,保留。BIt3-0:端点号

      bmAttributes : 端点属性,Bit7-2,保留。BIt1-0:00控制,01同步,02批量,03中断。

      wMaxPacketSize : 本端点接收或发送的最大信息包大小。

      bInterval : 轮训数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255。

     

    struct usb_endpoint_descriptor 

    {
        __u8  bLength;
        __u8  bDescriptorType;
        __u8  bEndpointAddress;
        __u8  bmAttributes;
        __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));

    3.2USB数据通讯

      这里主要包含:通讯模型,传输,事物,包,域的内容。

     

       USB的数据通讯首先是基于传输(Transfer)的,传输的类型有:中传输、批量传输、同步传输、控制传输

     3.2.1数据通讯-传输

     3.2.2数据通讯-事务

       一次传输由一个或多个事务(transaction)构成,事务可分为:In事务,Out事务,Setup事务

     

    3.2.3数据通讯-包

     一个事务由一个或多个包(packet)构成,包可分为:令牌包(setup)、数据包(data)、握手包(ACK)和特殊包

     

    3.2.4数据通讯-域 

       一个包由多个域构成,域可分为:同步域(SYNC),标识域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)。

     

     3.3USB设备枚举

      USB设备在正常工作以前, 第一件要做的事就是枚举。枚举是让主机认得这个USB设备, 并且为该设备准备资源,建立好主机和设备之间的数据传递通道。

      1. 获取设备描述符

      2. 复位

      3. 设置地址

      4. 再次获取设备描述符

      5. 获取配置描述符

      6. 获取接口、端点描述符

      7. 获取字符串描述符

      8. 选择设备配置

     

  • 相关阅读:
    gitlab 搭建(基于现有nginx)
    CENTOS 7平滑升级PHP到最新版7.3
    zabbix 5.0安装
    禅道 基于原lnmp 搭建
    mysql5.5升级至5.7 或升级至8.0
    gitlab搭建
    Autoboxing an autounboxing in genral
    java concurrency
    Why use interface type to declare a collectio
    Java coding style
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5289766.html
Copyright © 2011-2022 走看看