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. 选择设备配置

 

posted @ 2016-03-17 22:29  for_learning  阅读(466)  评论(0编辑  收藏  举报