USB模块小记

  1. USB简介

USB(Universal Serial Bus) 是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据USB采用四线电缆,分别由VCCD-D+GND等四条线构成,D+D-是差分输入线,它使用的是3.3V的电压,而电源线和地线可向设备提供5V电压,最大电流为500mA。同时USB 支持“总线供电” 和“自供电”两种供电模式。

USB总线标准主要经历以下发展:               

USB1.0——支持低速率(Low Speed) 1.5Mbps

USB1.1——支持全速率(Full Speed) 12Mbps

USB2.0——支持高速率(High Speed) 480Mbps(当前使用)

USB3.0——支持超高速率(Super Speed) 5Gbps

注:

USB2.0被设计成为向下兼容的模式,当有低速(USB 1.0)或者全速(USB 1.1)设备连接到高速(USB 2.0)主机时,主机可以通过分离传输来支持低速设备。

USB的插入检测机制

在USB Host端口的 D+和 D-上,分别接了一个 15kΩ的下拉电阻。当集线器端口没有设备插入时,输入端被这两个下拉电阻拉到了低电平。而在USB设备端,在 D+ 或者 D-上,接了一个 1.5kΩ的上拉电阻到 3.3V 的电源。对于高速设备和全速设备,上拉电阻接在 D+上,低速设备,上拉电阻接在 D-上。若是接在D+,高速设备会首先被判断为全速设备,然后通过集线器和设备两者确认,如果是高速模式,再会切换到高速模式下。

USB总线拓扑图

一个 USB HOST 最多可以同时支持128个地址,地址0作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备,因此一个USB HOST最多可以同时支持127个地址。如果一个设备只占用一个地址,那么可最多支持 127 个USB设备。USB设备可以分为USB Hub和USB function(如鼠标,键盘,打印机等)。在实际的USB体系中,如果要连接127个USB设备,必须要使用USB Hub,而USB Hub也是需要占用地址的,所以实际可支持的USB功能设备的数量将小于127。

同时还定义以HOST为起点,最多支持7层,也就是说任何一个USB系统中 最多可以允许5个USB Hub级联。

  1. USB数据流

USB逻辑通信流

从USB系统角度而言,一个逻辑上的USB设备是一个端点的集合。一个接口一般由几个端点组成,单个接口一般可以表示一种功能,除了复合设备,如UAC设备。USB系统通过默认控制管道来管理设备。用户软件使用管道来管理接口,通过 Host上的 Buffer和USB设备上的端点来请求数据,一般来说端点都有Buffer,所以也可以认为USB通讯就是应用软件Buffer和设备端点Buffer之间的数据交换,交换的通道称为管道

设备端点:

端点(Endpoint)是USB设备上可被独立识别的端口,是Host和Device通讯流的逻辑终点,是USB设备中可以进行数据收发的最小单元。当设备连入USB总线时会被分配一个唯一的地址,设备上每一个端点有唯一的端点号。设备可决定每个端点的数据传输方向(输入或输出)。因此,使得每个端点可被唯一寻址。每个端点的属性包括端点号、数据传输方向、传输类型、最大包长度和总线访问频率等。

HID端点描述符

端点0每个USB设备必须要有一个端点0,其作用为对设备枚举对设备进行一些基本的控制功能,端点 0 也被称为控制端点。并且它与其他的端点还有一个不同之处在于端点0 的数据传输方向是双向的,即端点0既可以给主机发送数据,也可以接收主机发送过来的数据,而其它端点均为单向。

非端点0除了控制端点以外,每个 USB 设备允许有一个或多个非0端点。低速设备最多只有两个非0端点。高速和全速设备最多支持15组端点。除了端点0,其余的端点在设备配置之前不能与主机通信,只有向主机报告这些端点的特性并被确认后才能被激活。

传输方式:

1.批量传输:适用于类似打印机,扫描仪等传输量大,但对传输时间和速度无要求的设备。

2.同步传输:适用于大量的,速率恒定,对实时性有要求的,比如音视频

3.中断传输:适用于数据 量小、数据不连续的但实时性高的场合,比如鼠标,键盘等。

4.控制传输:当USB设备初次连接主机时,用控制传输传送控制命令等对设备进行配置。 同时设备接入主机时,需要通过控制传输去获取USB设备的描述符以及对设备进行识别,在设备的枚举过程中都是使用控制传输进行数据交换。

  1. USB通信协议

数据在USB线里传送是由低位到高位发送的。首先二进制数据组成域(有七种);域再组成包;包再组成事务(IN、OUT、SETUP);事务最后组成传输(中断传输、同步传输、批量传输和控制传输)。

USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型:

1、同步域(SYNC),八位,值固定为0000 0001,用于本地时钟与输入同步
2、标识域(PID),由四位标识符+四位标识符反码构成,用来校验PID

3、地址域(ADDR):七位,代表了设备在主机上的地址,地址000 0000被命名为零地址,由此可知一个USB主机只能接127个设备

4、端点域(ENDP),四位,由此可知一个USB设备有的端点数量最大为15
5、帧号域(FRAM),11位,主机每发出一个帧,帧号都会自加 1,当帧号达到 0x7FF 时,将归零重新开 始计数。帧号域最大容量 0x800,对于同步传输有重要意义。
6、数据域(DATA):长度为01024个字节不等,在不同的传输类型中,数据域的长度各不相同。
7、校验域(CRC):对令牌包和数据包中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛。

是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。由域构成的包有三种类型,分别是令牌包、数据包握手包,不同包的域结构不同。

1令牌包:可分为输入包、输出包、设置包和帧起始包

输入包(IN):   用来通知设备返回一个数据包;

输出包(OUT):  用来通知设备将要输出一个数据包;

设置包(SETUP):只用在控制传输中,通知设备将要输出一个数据包;

帧起始包(SOF):在每帧开始时以广播的形式发送

输入包、输出包和设置包的格式都是一样的:
SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)

帧起始包的格式:
SYNC+PID+11FRAM+CRC5(五位的校验码)


 
2
数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包分批发送。

数据包格式如下:
SYNC+PID+DATA+CRC1616位的校验码)
 
3
握手包包括 ACK、NAK两种。

ACK 表示数据传输应答成功。

NAK 表示数据传输应答失败,要求重新传输。

握手包的格式如下:
SYNC+PID

事务USB数据信息的一次接收或发送的处理过程,是由IN、OUT 和 SETUP 三大事务组成。过程包括令牌包阶段,数据包阶段,握手包阶段。

IN事务:表示USB主机从总线上的某个USB设备接收一个数据包的过程。(设备—>主机)

OUT事务:表示USB主机把数据包输出到总线上的USB设备接收的过程。(主机—>设备)

SETUP事务:主机发送一个SETUP的输出包给设备,通知设备要接收数据。(控制传输)

  1. 总线枚举过程

当一个USB设备连接到主机端口时,将有如下检测过程:

1.检测电压变化,报告主机:USB设备上电后,主机端口检测到有电压变化,通过中断通道将信息反馈给主控制器表明有设备连接。

2.主机了解连接设备:主机在知道有设备接入后会发送一个Get_Port_Status请求,来读取端口状态,以获取更多的设备信息。

3.检测设备是高速还是低速:端口通过检测USB总线空闲时的差分线(D+,D-)的高低电压来判断所连接设备的速度类型。当主机发来Get_Port_Status请求时,端口就可以将此设备的速度类型信息回复给主机。

4.总线复位:主机一旦得知新设备连接上以后,它至少等待100ms以使得插入操作的完成以及设备电源稳定工作。然后主机控制器发出一个Set_Port_Feature命令让插上设备的端口复位。

5.检测所连设备是全速还是高速:根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed)状态运行,所以对于一个支持 USB 2.0 的高速端口,当它发现接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。

6.主机发送Get_Device_Descriptor请求,获取设备描述符:主机此时发送获取设备信息的请求是默认端点0。当完成第一次的控制传输后,系统会要求端口对设备进行再一次的复位操作,再次复位的目的是使设备进入一个确定的状态。

7.主机给设备分配地址:主机控制器通过Set_Address请求向设备分配一个唯一的地址。此后,设备就启用新地址继续与主机通信。

8. 主机获取设备的信息:主机再次发送Get_Device_Descriptor读取新地址的设备描述符。设备描述符内信息包括USB设备类型,端点0的最大包长度,VID、PID、制造商、配置描述符的个数等信息。

设备描述符

9.主机获取设备详细信息:主机发送Get_Configuration_Descriptor请求,读取配置描述符。Get_String_Descriptor请求,获取字符串描述符等,逐一了解设备更详细的信息。配置描述符总共为 9 字节。主机在获取到配置描述符后,根据里面的配置集合总长度,再获取接口描述符,端点描述符等。如果有字符串描述符,还要获取字符串描述符。另外HID设备还有HID描述符等。

10.主机给设备挂载驱动:主机获取到设备详细信息后,会选择一个最合适的驱动给设备。通过调用device_add将设备添加到usb总线的设备列表里,然后usb总线会遍历驱动列表里的每个驱动,调用usb_device_match函数查询驱动和连入的设备是否匹配,匹配的话调用 device_bind_driver 函数,将控制权交到设备驱动。对于复合设备,通常是将不同的接口配置给不同的驱动。

11.设备驱动选择一个配置:驱动根据前面设备的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置来作为工作配置,同时设备Set_Interface来配置设备各个接口的各个接口。

  1. USB描述符

当USB设备插入到主机系统中,主机系统会自动检测USB设备的相关信息,就是通过USB描述符来实现的。标准的USB设备有五种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。一个设备只有一个设备描述符,而一个设备描述符正常来说只有一个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口可以包含几个端点描述符。

以下是电容屏智能笔项目中USB设备驱动的描述符信息。此设备是一个复合设备,由USB HID设备与USB Audio设备组成的。所谓的复合设备,就是具有两个或多个独立的USB设备功能,同时集中在一个USB设备上。它只有一个设备描述符,一个配置描述符,但具有多个独立控制的接口描述符,每个接口描述符下面可以有一个或多个端点。

智能笔USB描述符架构

设备描述符下包含一个配置描述符,配置描述符下包含了3组接口, HID接口,音频控制接口,音频流接口(MIC)。同时音频流接口中定义了2个接口描述符,其中Interface 1不包含数据传输端点,Interface 2包含一个同步传输端点。为什么要定义一个不含有任何endpoint的Interface 1,是因为Interface 1是用于在设备没有被使用时的设置。如果没有利用该usb设备进行录音,则主机使用的是Interface 1,如果开始录音则使用的是Interface 2。

在Interface 1的定义中没有包含任何端点,所以与音频相关的控制信息将通过默认的控制端点0来进行信息的交互。也就是说端点0除了响应默认的控制事务(get device descriptor, set configuration等)以外,还可以响应音频类相关控制事务,如静音,音量调节等。

设备描述符:

bLength : 描述符大小.固定为0x12.
bDescriptorType : 设备描述符类型.固定为0x01.
bcdUSB : USB 规范发布号.如2.0表示USB2.0.

bDeviceClass : 类型代码(由USB指定)。当它的值是0时,表示所有接口在配置描述符里,并且所有接口是独立的.

bDeviceSubClass : 子类型代码(由USB分配).如果bDeviceClass值是0,一定要设置为0.

bDeviceProtocol : 协议代码(由USB分配).如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为FFH.

bMaxPacketSize0 : 端点0最大数据传输大小(只有8,16,32,64有效).

idVendor : 供应商ID(由USB分配).

idProduct : 产品ID(由厂商分配).

bcdDevice : 设备出产编码.由厂家自行设置.

iManufacturer : 厂商描述符字符串索引.

iProduct : :产品描述符字符串索引.
iSerialNumber : 设备序列号字符串索引.

bNumConfigurations : =1,表明只有一个配置.

配置描述符:

bLength : 描述符大小.固定为0x09.
bDescriptorType : 配置描述符类型.固定为0x02.
wTotalLength : 返回整个数据的长度.指此配置返回的配置描述符,接口描述符,HID描述符,端点描述符的全部大小
bNumInterfaces :该配置配备的接口数量 =3
bConfigurationValue : 作为Set Configuration的一个参数选择配置值.
iConfiguration : 用于描述该配置字符串描述符的索引.
bmAttributes : 供电模式选择.Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.
MaxPower : 总线供电的USB设备的最大消耗电流.以2mA为单位.

接口描述符:

bLength : 描述符大小.固定为0x09.
bDescriptorType : 接口描述符类型.固定为0x04.
bInterfaceNumber: 该接口的编号.

bAlternateSetting : 可选的接口描述符标号.为0
bNumEndpoint : 使用的端点数目.端点0除外.=2
bInterfaceClass : 类型代码(由USB分配).
bInterfaceSubClass : 接口子类型(由USB分配).=HID
bInterfaceProtocol : 协议代码(由USB分配).
iInterface : 字符串描述符的索引。

HID描述符

bLength                      描述符字节数

bDescriptorType                 0x21 = HID 描述符

bcdHID                          HID 规范版本号(BCD)

bCountryCode            硬件设备所在国家的国家代码

bNumDescriptors           类别描述符数目(至少有一个报表描述符)

bDescriptorType             类别描述符的类型

wDescriptorLength            报表描述符的总长度

报告描述符

在HID中还有一种特殊的描述符,报告描述符。报告描述符的数据本身没有任何意义,要赋于用途才能明确其为控制什么。为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。

鼠标报告描述符

端点描述符:

bLength : 描述符大小.固定为0x07.
bDescriptorType : 接口描述符类型.固定为0x05.
bEndpointAddress : USB设备的端点地址和方向.

bmAttributes : 00控制,01同步,02批量,03中断.
wMaxPacketSize : 本端点接收或发送的最大信息包大小.
bInterval : 主机通过固定的间隔(interval)对中断端点进行查询,对于中断传输的高速设置下为(2^interval-1)*125us,interval范围为1-16。对于批量传送和控制传送的端点忽略.对于同步传输,必须为1。

  1. UAC(USB Audio Class)

UAC是通过USB接口进行音频数据传输和控制的一套协议。在USB Audio Class描述符中,包含了interface,terminal和endpoint 的声明。

USB Audio Control

其中USB Audio Control接口包含若干个terminal,其中in-terminal 和out-terminal 成对出现,其表示数据流的方向,最后terminal与Endpoint IN对接。如下图所示,麦克风采集到音频流数据后,通过IT(IN terminal)进入Audio Control Interface所定义的Audio Function中,通过OT(OUT terminal)流出,最后送到Endpoint In节点。

IN/OUT Terminal:

静音/音量大小Control

USB Audio Streaming

两个Audio Streaming接口,Interface 1Alternate Setting0,端点数量为0Interface 2Alternate Setting1,端点数量为1

定义传输端点音频格式: 采样率48k,位深16bit,传输通道数为148*2=96 Byte/ms

Audio端点描述符:端点1,设备—>主机,同步传输,一次传输最大数据量96 Bytes

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴子坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值