首页 > 其他分享 >USB协议基础篇

USB协议基础篇

时间:2024-08-05 16:27:28浏览次数:14  
标签:协议 USB 主机 基础 描述符 端点 class 设备

初次接触USB的同学,可能会被里面各种名词给搞晕,下面就来梳理一下这些知识,希望能帮助大家理解USB。

一,从最常见的名词说起

1.1 什么是USB

这个我就不多解释了,直译就是通用串行总线。再不明白的就百度。

1.2 USB协议版本

  • USB 1.0/1.1(low/full speed),传输速率最大为12Mbps

  • USB 2.0(high speed),传输速率最大480Mbps

  • USB 3.0(super speed),传输速率最大5Gbps

协议版本向下兼容

1.3 USB接口分类

  • Type A,即使我们电脑上的那种接口。

  • Type B,不太常见,比较方正的T型接口,有的嵌入式开发板会用。

  • Type C,现在开始流行起来了,最大的好处就是可以盲插,而不用区分正反。

  • Micro/mini,手机上比较常见。

不管哪种接口,用的线都是4根,只是形状不同而已。

1.4 PIPE

usb通信的最基本形式是通过USB设备里的endpoint,而主机和endpoit之间的数据传输就是通过pipe

1.5 endpoint

端点是有方向的,主机到从机成为out端点,从机到主机成为in端点。从这个说明看出端点是单方向的。(除了0端点)

1.6 管道通信方式

pipe中的数据通信方式有两种,一种是stream一种是messagemessage要求进出进出方向必须要求同一个管道,默认就使用ep0作为message管道。message要求进出进出方向必须要求同一个管道,默认就使用ep0作为message管道

1.7 传输方式

USB endpiont有四种类型,分别对应了不同的数据传输方式,分别为control transfers控制传输interrupt transfers中断传输Bluk Data transfers批量传输Isochronous Data Tranfers等时传输

控制传输通常用于配置设备,获取设备信息,发送命令到设备

1.7 逻辑设备

逻辑设备就是一系列端点的组合,逻辑设备与主机之间的通信发生在一个主机的缓冲区和设备的一个端点之间。

举个例子,如果你有一个 USB 存储设备,当你将文件从电脑复制到设备时,数据会从主机的缓冲区通过 USB 总线传输到设备的 OUT 端点,然后存储在设备的存储介质上。

1.8 interface

一个逻辑设备可能包含若干个接口,每个接口包含1个或多个端点。每个接口表示一种功能。一个接口对应一个驱动程序。例如usb扬声器就包含一个键盘接口和一个音频流接口

1.9 class协议

USB协议中除了定义一些通用软硬件电气特性,还包含各种各样的class协议,用来为不同的功能定义各自的标准接口和具体总线上的数据交互内容和格式。例如u盘的Mass storage class、通用数据交换CDC class

1.10 host/device

二,USB框架/拓扑结构



USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。

三. 重要概念

3.1 描述符(description)

谈到USB描述符,不得不说USB最强悍的地方就在这里。一个口可以插很多的设备,可以插U盘、上网卡、音频设备、还有的是复合设备,一个设备插上后可以虚拟出多个设备出来

主设备之所以能区分不同的从设备,靠的就是描述符。 于是USB协议里就规定了各种不同的USB描述符。让我们先看一下USB协议里四大描述符之间的关系

+------设备描述符
        +----------配置描述符1
            +----------接口描述符1
                +----------端点描述符1
                +----------端点描述符2
                +....
            +----------接口描述符2
                +----------端点描述符1
                +....
            +....
        +----------配置描述符2
            +----------接口描述符1
                +----------端点描述符1
                +----------端点描述符2
                +....
            +....
        +....

3.1.1 设备描述(device description)

故名思意用来描述USB设备的,一个设备只有一个设备描述符,包含了设备类型、设备遵循的协议、厂商ID、产品id、序列号等,一个完整的设备描述符如下:

DEVICE DESCRIPTOR
    bLength: 18
    bDescriptorType: 0x01 (DEVICE)
    bcdUSB: 0x0200
    bDeviceClass: Vendor Specific (0xff)
    bDeviceSubClass: 255
    bDeviceProtocol: 255
    bMaxPacketSize0: 64
    idVendor: Marvell Semiconductor, Inc. (0x1286)
    idProduct: Unknown (0x812a)
    bcdDevice: 0x0000
    iManufacturer: 3
    iProduct: 2
    iSerialNumber: 0
    bNumConfigurations: 1

3.1.2 配置描述符(configrue description)

配置描述就是用来配置设备的,没错,就是这么简单。但是要记住一点:一个设备同一时刻只能有一种配置生效,而且要区分配置和设置的区别。还是来看一下配置描述符的内容

ONFIGURATION DESCRIPTOR
    bLength: 9
    bDescriptorType: 0x02 (CONFIGURATION)
    wTotalLength: 121
    bNumInterfaces: 4
    bConfigurationValue: 1
    iConfiguration: 0
    Configuration bmAttributes: 0xc0  SELF-POWERED  NO REMOTE-WAKEUP
        1... .... = Must be 1: Must be 1 for USB 1.1 and higher
        .1.. .... = Self-Powered: This device is SELF-POWERED
        ..0. .... = Remote Wakeup: This device does NOT support remote wakeup
    bMaxPower: 250  (500mA)

3.1.3 接口描述符(interface description)

一个interface就代表一个设备。USB interface用来处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口。也就是复合设备,例如一个 USB 扬声器可能有 2 个接口: 一个 USB 键盘给按钮和一个 USB 音频流。

INTERFACE DESCRIPTOR (2.0): class Vendor Specific
    bLength: 9
    bDescriptorType: 0x04 (INTERFACE)
    bInterfaceNumber: 2
    bAlternateSetting: 0
    bNumEndpoints: 2
    bInterfaceClass: Vendor Specific (0xff)
    bInterfaceSubClass: 0x00
    bInterfaceProtocol: 0x00
    iInterface: 8 

一个interface包含多个endpoint

3.1.4 端点描述符(endpoint description)

USB通信的基本物理单位,一个endpiont只能承载一个方向的数据。endpiont分为如下几种:

  • CONTROL

控制端点被用来允许对 USB 设备的不同部分存取. 通常用作配置设备, 获取关于设备的信息, 发送命令到设备, 或者获取关于设备的状态报告. 这些端点在尺寸上常常较小.每个 USB 设备有一个控制端点称为"端点 0", 被 USB CORE用来在插入时配置设备. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.

  • INTERRUPT

中断端点传送小量的数据, 以固定的速率在每次 USB 主请求设备数据时. 这些端点对 USB 键盘和鼠标来说是主要的传送方法. 它们还用来传送数据到 USB 设备来控制设备, 但通常不用来传送大量数据. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.

  • ISOCHRONOUS

同步端点也传送大量数据, 但是这个数据常常不被保证它完成. 这些端点用在可以处理数据丢失的设备中, 并且更多依赖于保持持续的数据流. 实时数据收集, 例如音频和视频设备, 一直都使用这些端点.

BULK端点描述符数据内容如下:

ENDPOINT DESCRIPTOR
    bLength: 7
    bDescriptorType: 0x05 (ENDPOINT)
    bEndpointAddress: 0x86  IN  Endpoint:6
        1... .... = Direction: IN Endpoint
        .... 0110 = Endpoint Number: 0x6
    bmAttributes: 0x02
        .... ..10 = Transfertype: Bulk-Transfer (0x2)
    wMaxPacketSize: 512
        .... ..10 0000 0000 = Maximum Packet Size: 512
    bInterval: 0

3.2 class

class用来描述设备属于哪种设备,例如音频、键盘、U盘等。设备通过class来确认和加载相应的驱动。class分为device class 和interface class。具体的class值以及含义,参考define class

Defined Class Codes | USB-IF

class 包含

  1. class
  2. subclass
  3. protocol

组合在一起,用来指出设备具体功能。

device class举例

DEVICE DESCRIPTOR
    bLength: 18
    bDescriptorType: 0x01 (DEVICE)
    bcdUSB: 0x0200
    bDeviceClass: Miscellaneous (0xef)
    bDeviceSubClass: 2
    bDeviceProtocol: 1 (Interface Association Descriptor)
    bMaxPacketSize0: 64
    idVendor: Marvell Semiconductor, Inc. (0x1286)
    idProduct: Unknown (0x4e31)
    bcdDevice: 0x0100
    iManufacturer: 1
    iProduct: 2
    iSerialNumber: 3
    bNumConfigurations: 1

interface class举例

INTERFACE DESCRIPTOR (1.0): class CDC-Data
    bLength: 9
    bDescriptorType: 0x04 (INTERFACE)
    bInterfaceNumber: 1
    bAlternateSetting: 0
    bNumEndpoints: 2
    bInterfaceClass: CDC-Data (0x0a)
    bInterfaceSubClass: 0x00
    bInterfaceProtocol: No class specific protocol required (0x00)
    iInterface: 5

class值如图下所示:





四,USB数据传输过程



4.1 基本概念

  • 一个【传输(Transfer)】(控制、批量、中断、等时):由多个【事务(Transaction)】组成
  • 一个【事务(Transaction)】(IN、OUT、SETUP):由一多个【Packet】组成。

USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。

4.2 枚举

  • 上电状态(usb device插入host)插入host后,host的每个hub对应端口上都有供电,连接着的设备就进入供电状态

  • host检测到device插入

hub通过检测USB总线空闲时的差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。USB 2.0规范要求速度检测要先于复位(Reset)操作。

根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口。如下图。



  • Host了解连接的设备hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型

  • host复位设备(不是正的复位设备,是复位USB通信)hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms

  • 主机发送Get_Descriptor请求获取默认管道的最大包长度默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,设备描述符的第8字节代表设备端点0的最大包大小

  • 设置地址主机给设备分配一个地址,在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。

  • 获取设备配置主机获取设备的信息

枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。

一旦获悉有新设备连接上来,主机就会发送一系列的请求(Resqusts)给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道。然后主机以控制传输(Control Transfer)的方式,通过端点0(Endpoint 0)对设备发送各种请求,设备收到主机发来的请求后回复相应的信息,进行枚举(Enumerate)操作。所有的USB设备必须支持标准请求(StandardRequests),控制传输方式(Control Transfer)和端点0(Endpoint 0)。

在讲解枚举之前,先大概说说USB的一种传输模式——控制传输。这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。

控制传输分为三个阶段:①建立阶段。②数据阶段。③确认阶段。

建立(setup)阶段:都是由USB主机发起,它是一个setup数据包,里面包含一些数据请求的命令以及一些数据。如果建立阶段是输入请求,那么数据阶段就要输入数据;如果建立阶段是输出请求,那么数据阶段就要输出数据。如果在数据阶段,即便不需要传送数据,也要发一个0长度的数据包。数据阶段过后就是确认阶段。确认阶段刚好跟数据阶段相反,如果是输入请求,则它是一个输出数据包;如果是输出请求,则它是一个输入数据包。

确认阶段用来确认数据的正确传输。

4.3 数据传输

usb host与usbfunction之间采用的是一种“非对称”的传输,也就是说,无论usb接受数据还是发送数据,都是由usb host首先发起。

首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。其次,主机发第2个至第n个packet载有实际数据最后,从机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样主机就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

控制传输一个Usb的控制式传输分为两个或三个阶段进行传输:setup stage,data stage(视情况而定),status stage。 首先发起setup,之后发起以data0为起始的setup data,最后usb function回应ack结束一次交互。



数据传输USB除了EP0外,其它的EP都是有方向的,如果从机有数据要上发,先放到对应的EP的buf中,最迟等一个frame就会被host主动读走。

标签:协议,USB,主机,基础,描述符,端点,class,设备
From: https://www.cnblogs.com/linhaostudy/p/18343514

相关文章

  • java基础 之 重写equals时为什么要重写hashCode
    文章目录前言回答了解哈希hashCode()总结前言了解equals戳这里→java基础之equals和==的区别请记住这句话:两个对象相同,哈希码一定相同。哈希码相同,两个对象不一定相同。回答只重写equals()方法,不重写hashCode()方法:存在A.equals(B)为true,但是hashCode不......
  • 云原生数据基础设施之kubeblocks
    一、kubeblocks简介参考文档:https://kubeblocks.io/docs/release-0.9/user_docs/overview/introduction1.KubeBlocks是什么?​KubeBlocks是基于Kubernetes的云原生数据基础设施,将顶级云服务提供商的大规模生产经验与增强的可用性和稳定性改进相结合,帮助用户轻松构建容器化......
  • linux 基础知识汇总
    1、Linux文件系统概述Linux文件系统是指操作系统用来控制文件如何存储和检索的结构和逻辑。文件系统结构根目录:/Linux文件系统从根目录(/)开始,这是所有文件和目录的起点。目录结构:Linux使用层次化目录结构,每个目录包含文件和子目录。挂载点:各种文件系统通过挂载点(mo......
  • Arcgis基础知识-地理信息系统基本概念
    Arcgis基础知识-地理信息系统基本概念​一、基本概念地理信息系统(GeographicInformationSystem,简称GIS)是一种采集、存储、管理、分析、显示与应用地理信息的计算机系统,是分析和处理海量地理数据的通用技术。简单来说对空间数据的显示,编辑处理,分析应用,打印输出的系统。......
  • 【Java基础知识4】反射
    一、反射机制Java反射机制是指在程序的运行过程中,对于任意一个类,都能够知道它的所有属性和方法;对于任意一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为JAVA语言的反射机制二、反射的核心内容反射的核心内容是JVM在运行时动态......
  • 【Java基础知识3】泛型
    一、泛型的意义泛型的本质是将类型参数化,从而达到代码复用。即:在不创建新的类型下,通过泛型指定不同类型来控制形参具体类型,简单来讲就是,当我们不知道用什么数据类型接收数据的情况下,可以使用泛型来接收。代码示例:未使用泛型情况下:privatestaticintadd(inta,intb){......
  • 【Java基础知识5】异常
    一、什么是异常?正常程序所不能处理或没有处理的不正常行为称为异常。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。二、异常的层次结构三、异常的分类1.Throwable异常体系的顶层类,其派生出两个重要的子类, Error 和......
  • java面对对象基础
    1.对象的内存布局类实例化为对象:类实例化为对象的语句一定要加括号,否则编译不通过//类名生成对象名=new类名()//类名生成对象名=new类名()ToolMytool=newTool();classTool{ publicbooleanoddOreven(intnum){ if(num%2!=0){ returntrue; }else{ retur......
  • Java基础语法
    关键字和保留字在Java编程语言中,关键字和保留字是语言的基本组成部分。它们有特定的含义并在Java程序中扮演着重要的角色。理解这些关键字和保留字对于编写有效的Java代码至关重要。1.关键字(Keywords)关键字是Java语言中具有特殊含义的词,它们在编译器中被预定义并用于执行特定......
  • lg省选计划笔记-基础优化技巧1
    基础优化技巧1三分求单峰函数极值点丢弃极值点一定不在的点,注意不能用于非严格单调的函数。由于区间长度可以随便取,可以把分段点取得很近,这个时候就相当于二分斜率前面比0大,极值点处等于0,后面小于001分数规划略。模型特征:答案是比率形式(取对数可以把根式和次方转换为乘......