UAC协议基础第一篇: UAC类设备相关的描述符

目录

一、描述符

1. 设备描述符

2. 配置描述符

2.1 配置描述符集合的总长度

3. 音频控制(AC)接口描述符

3.1 标准AC接口描述符

3.2 类特有AC接口描述符

3.2.1 类特有AC接口头描述符(AC Interface Header Descriptor)

3.2.2 输入终端描述符(ITD)

3.2.3 输出终端描述符(OTD)

3.2.4 单元描述符(UID)

3.2.4.1特征单元描述符

3.3 AC中断端点描述符

3.3.1标准AC中断端点描述符

3.3.2 类特有AC中断端点描述符

4. 音频流(AS)接口描述符

4.1 标准AS接口描述符

4.2 类特有AS接口描述符

4.3 类特有音频流数据格式描述符

4.4 音频流数据传输端点描述符

4.4.1 标准音频流数据传输端点

4.4.1.1 标准音频流数据传输端点描述符

4.4.1.2 标准音频流数据同步端点描述符

4.4.2 类特有音频流数据传输端点


USB音频设备是最难开发的设备,官方文档描述特别复杂。结合自己的开发经历,这里分享一些个人见解。

一、描述符

1. 设备描述符

跟其他USB设备类一样,USB音频设备由标准设备描述符来定义。设备描述符里面的bDeviceClass、bDeviceSubClassbDeviceProtoco这三个字段设置为0,类定义的相关信息在接口层(接口描述符)里面去定义。

2. 配置描述符

音频类设备的配置描述符并没有特殊的定义,所以使用的也还是标准配置描述符。其中字段wTotalLength是整个配置描述符集合的总长度,配置描述符集合就包括:配置描述符自身、接口描述符、类特殊描述符、端点描述符等。

2.1 配置描述符集合的总长度

总长度 = 配置描述符自身的长度(固定为9字节) + 类特殊描述符长度(长度视具体情况而定) + 端点描述符长度(固定是7字节) + 接口描述符长度(长度视具体情况而定)。

(1)类特殊描述符:比如HID设备的HID描述符

(2)接口描述符:标准接口描述符,和类特定接口描述符:比如UAC里面的控制接口头描述符 + 流接口描述符;

(3)控制接口头描述符 = 单元描述符长度(长度视具体情况而定) + 终端描述符长度(长度视具体情况而定)

(4)单元描述符:比如UAC里面的选择单元、控制单元、混音单元等描述符

(5)终端描述符:输入+输出终端描述符

在构造设备描述符的时候,有的设备描述符总长度是可变的,这是需要注意的地方,要明确描述符的层次结构,即构成情况,才能正确构造出设备描述符。

3. 音频控制(AC)接口描述符

英文名词:

AC: Audio Control

Standard AC Interface Descriptor         

Standard Audio Control Interface Descriptor:标准音频控制接口描述符

3.1 标准AC接口描述符

标准音频控制接口描述符本质上就是一个接口描述符,所以UAC_2.0_spe里所定义的标准音频控制接口描述符的结构 USB_2.0_spec里所定义的标准设备接口描述符是一样的,需要注意的是UAC协议对描述符里面的某些字段的赋值有特殊定义,如下表:

Table: Standard AC Interface Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小(9 Byte)

1

bDescriptorType

1

常量

描述符的类型:接口描述符(0x04)

2

bInterfaceNumber

1

数值

接口ID号:编号从该接口所属的配置的接口0开始递增

3

bAlternateSetting

1

数值

该接口下的可替换设置号

4

bNumEndpoints

1

数值

除了端点0以外,该接口所使用的端点数目。如果使用了可选的中断端点,则值设为1

5

bInterfaceClass

1

音频接口类代码:0x01

6

bInterfaceSubClass

1

音频控制接口子类代码:0x01

7

bInterfaceProtocol

1

不使用,设置为0

8

iInterface

1

描述该接口的字符串的索引值,没有描述符字符串就设置为0

说明:

(1)描述符里面bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol这三个字段的组合就能说明当前的描述符是一个音频接口描述符。

(2)如果该接口使用中断端点返回设备状态,则bNumEndpoints设置为1,否则bNumEndpoints设置为0.

3.2 类特有AC接口描述符

类特有音频接口控制描述并不是指某个特定的描述符,而是一系列描述音频功能的描述符集合的总称。

这些描述符包括:单元描述符(UD)、以及终端描述符(TD)。这些描述符是UAC类特有的描述符,由UAC协议定义。因此,描述符集合的总长度与音频功能中定义的时钟实体、单元实体和终端的个数有关。

类特有AC接口描述符集合用一个头描述符作为开头,头描述符描述了集合的总长、音频设备类规范版本、功能类型等。所以,首先要解析的是类特有AC接口头描述符。

3.2.1 类特有AC接口头描述符(AC Interface Header Descriptor)

Table: Class-Specific AC Interface Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:(8+n),n:该控制接口包含的音频流接口数目

1

bDescriptorType

1

常量

描述符的类型:音频类接口,代码为:0x24

2

bDescriptorSubtype

1

常量

描述符子类型,属于音频控制头子类,代码为:0x01

3

bcdADC

2

BCD

该音频设备所属的音频标准规范。BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码

4

wTotalLength

2

数值

所定义的所有的音频类控制接口描述符的长度总和,包括:该头描述符自身的长度 + 单元描述符长度 + 终端描述符的长度

注:这个长度仅仅指的是控制接口(AC)的长度,并不包含控制接口下的流接口(AS)。

5

bInCollection

1

数值

该音频控制接口所拥有的音频流接口总数,也就是n

6

baInterfaceNr(1)

1

数值

所拥有的第一个音频流接口号

8+(n-1)

baInterfaceNr(n)

1

数值

所拥有的最后一个音频流接口号

说明:

(1)字段wTotalLength是所有的音频类控制接口描述符的总长度,等于:音频类头接口描述符、输入/输出终端描述符、以及各种单元描述符的总长。

(2)字段bInCollection代表音频控制接口中所包含的音频流接口总数;baInterfaceNr字段需要一一列举bInCollection集合中音频流的接口号。

例1:USB麦克风和USB扬声器功能各自使用一个音频流接口来实现,则bInCollection就是2。麦克风为第一个音频流接口,假如设置接口号为1,扬声器为第二个音频流接口,假如设置接口号为2,则baInterfaceNr(1)=1 ,baInterfaceNr(2)=2

(3)单元描述符以及终端描述符根据需要,定义在头描述符的后面。头描述符后面定义的描述符,顺序上没有要求,只要各个描述符之间的字段能对应得上。

3.2.2 输入终端描述符(ITD)

音频类输入终端描述符(Input Terminal Descriptor)向USB主机提供有关输入终端功能的相关信息;“输入”这个概念是相对实体来说的,也就是数据的流向。

输入终端描述符就是一个输入物理实体的抽象表示,例如输入终端是一个麦克风,则音频数据流入麦克风,麦克风再把数据发给主机。

输入终端也可以是一个USB输出端点(USB OUT),这种情况下,数据来自主机。

Table: Input Terminal Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:12 字节

1

bDescriptorType

1

常量

描述符的类型:音频类接口,代码为:0x24

2

bDescriptorSubtype

1

常量

描述符子类型,属于输入终端描述符子类,代码为:0x02

3

bTerminalID

1

常量

该输入终端的编号(ID),所有跟终端相关的请求(主机发送到终端的请求)都会通过这个值来访问此终端

4

wTerminalType

2

常量

见下表:输入终端类型表

6

bAssocTerminal

1

常量

与输入终端相关联的输出终端的ID号。输入输出终端是两个端点,配对的。

7

bNrChannels

1

数值

此终端的输出声道簇中所包含的逻辑输出通道数目(逻辑通道数目)。

8

wChannelConfig

2

位映射

描述逻辑声道的空间位置

10

iChannelNames

1

索引值

描述第一个逻辑声道的字符串的索引号,一般填0。

11

iTerminal

1

索引值

描述该输入终端的字符串的索引号,一般填0。

说明:

(1)字段bTerminalID是终端的唯一标识,可自行定义。

(2)字段wTerminalType表示输入终端所代表的物理实体类型。 如下表:

Table: 输入终端类型表

终端类型

取值

字段描述

USB Undefined

0x0100

未定义的USB终端类型

USB streaming

0x0101

USB流终端

USB vendor specific

0x01FF

厂商自定义的终端类型

Input Undefined

0x0200

未定义的输入终端类型

Microphone

0x0201

通用麦克风类型

Desktop

0x0202

桌面麦克风

Headset microphone

0x0203

头戴式麦克风

Omnidirectional microphone

0x0204

全向麦克风

Microphone array

0x0205

麦克风阵列

例:USB扬声器设备输入终端的wTerminalType一般定义为USB streaming(0x0101),数据从PC流入。而USB麦克风设备输入终端的wTerminalType一般设置为Microphone(0x0201),数据从ADC流入。

(3)bNrChannels表示该输入终端的输出声道簇中所包含的逻辑通道数。所谓的逻辑通道,指的就是声道。是具有相同的采样率、位分辨率等一系列的音频流传输通道。通道0表示主通道,非0通道表示逻辑通道。在主通道上进行静音、调节音量等音频设置会生效到所有的逻辑通道,而对某个逻辑通道的设置只会生效于该通道本身(比如:单独调节左声道的音量)。

(4)bNrChannels、wChannelConfig、iChannelNames这三个字段构成输出声道簇。声道簇定义如下:

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bNrChannels

1

数值

声道簇中的逻辑通道(声道)个数

1

wChannelConfig

2

位映射

各个逻辑声道的空间位置

5

iChannelNames

1

序号

字符串描述符序列号,用于描述第一个逻辑声道

其中wChannelConfig指明声道簇中声道的空间位置,根据逻辑通道被用户听到是不同的空间分布来进行定义,一共有12种逻辑通道,用2字节表示(12个bit)。比如有:左前声道、右前声道、左环绕声道、右环绕声道等。如果wChannelConfig中某个位取值为1,则说明簇中就有一个声道和这个位所定义的空间位置相关联。

wChannelConfig

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

取值

0/1

0/1

0/1

0/1

0/1

0/1

0/1

0/1

0/1

0/1

0/1

0/1

D0:前左声道

D1:前右声道

……………………………………………………………………………//更详细的,可参考官方spec

(5)声道簇分为两类:逻辑声道簇 和 物理声道簇。他们的结构相同(三个字段都是相同的),声道簇不能独立存在,必须依附于实体。逻辑声道簇一般会嵌入在以下描述符里面:输入终端描述符、混音单元描述符、处理单元描述符、扩展单元描述符;物理声道簇总是嵌入到类特有音频流(AS)接口描述符中。

(6)bAssocTerminal字段描述了与此输入终端相关联的输出终端,实现一个终端对,如果没有关联的输出终端,则设置为0。

3.2.3 输出终端描述符(OTD)

音频类输出终端描述符(Output Terminal Descriptor)向USB主机提供有关输出终端功能的相关信息。

Table: Output Terminal Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:9 字节

1

bDescriptorType

1

常量

描述符的类型:音频类接口,代码为:0x24

2

bDescriptorSubtype

1

常量

描述符子类型,属于输出终端描述符子类,代码为:0x03

3

bTerminalID

1

常量

该输出终端的编号(ID),所有跟终端相关的请求(主机发送到终端的请求)都会通过这个值来访问此终端

4

wTerminalType

2

常量

输出终端的类型:

0x0300:未定义的输出终端类型

0x0301:通用扬声器

0x0302:头戴式耳机

0x0303:VR头盔听筒

0x0304:桌面扬声器

0x0305:室内扬声器

6

bAssocTerminal

1

常量

与此输出终端相关联的输入终端的ID号

7

bSourceID

1

常量

该输出终端的前序连接实体(可以是终端,也可以是单元)的ID

8

iTerminal

1

索引值

描述该输出终端的字符串的索引号

说明:

(1)字段bTerminalID是终端的唯一标识,用户可自行定义。

(2)字段wTerminalType表示输出终端所代表的物理实体类型。 可以是USB IN端点或者扬声器(数据是往外流)。

(3)字段bSourceID代表输出终端的前序连接实体(终端或单元),如果它的前序连接实体是特征单元,就把特征单元的bUnitID作为该输出终端的bSourceID;如果它的前序连接实体是终端,就把终端的bTerminalID作为该输出终端的bSourceID。

3.2.4 单元描述符(UID)

单元实现了USB音频的基本功能,音频设备的整体功能是由一个个单元级联起来实现的。

单元描述符分为:混音单元描述符、选择单元描述符、特征单元描述符、采样率转换单元描述符、效果单元描述符、处理单元描述符和扩展单元描述符。

效果单元描述符又可以细分为:参数均衡器效果单元描述符、回响效果单元描述符、调制延迟效果单元描述符、动态范围压缩效果描述符。

处理单元描述符又可分为:上/下混合处理单元描述符、杜比音效逻辑处理单元描述符、立体声扩展处理单元描述符。

特征单元描述符(Feature Unit Descriptor)描述了该特征单元前序连接的输入终端上每个通道(声道)可被配置的功能列表。比如:音量控制、静音、声道平衡等等,这是开发USB 音频设备最常用的描述符。所以,在众多的单元描述符中,先重点解读这个描述符。

3.2.4.1特征单元描述符

Table: Feature Unit Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:7+(要控制的声道数目 *n) 字节

要控制的声道数目:主声道肯定要有。

所以描述符的大小可以表示成:

7 + (ch) * n

1

bDescriptorType

1

常量

描述符的类型:音频类特征单元,代码为:0x24

2

bDescriptorSubtype

1

常量

描述符子类型,属于特征单元描述符子类,代码为:0x06

3

bUnitID

1

数值

该特征单元的ID号

4

bSourceID

1

常量

该特征单元前序连接的实体ID号;前序连接实体可以是终端也可以是单元。和输出终端里面的bSourceID类似。

5

bControlSize

1

数值

bmaControls()数组元素的字节大小:n

元素大小用多少个字节来表示。在规范中,规定了10种功能,所以n最大值为2。也就是16位,足以描述这10种功能。

所以 n要么取1,要么取2。

一般来说,USB音频不会配置太复杂的控制,n取1,即一个字节就可以表示位映射

6

bmaControls(0)

n

位映射

通道0的功能特性位图描述。通道0是主通道。

每个通道(包括主通道0和非0的逻辑通道)的控制位映射如下:

D0:Mute 静音

D1:Volume 音量控制

D2:Bass 低音控制

D3:Mid中音控制

D4:Treble高音控制

D5:Graphic Equalizer图形均衡器控制

D6:Automatic Gain自动增益控制

D7:Delay延迟控制

D8:Bass Boost低音增强控制

D9:Loudness 响度控制

D10:保留,设置为0

….. :保留,设置为0

D15:保留,设置为0

所以,n要么取1,要么取2。

最多取2,两字节,16bit。

6+n

bmaControls(1)

n

位映射

通道1的功能特性位图描述;某位设置为1,则表示该通道支持对应的控制功能

6+(ch*n)

bmaControls(ch)

n

位映射

通道ch的功能特性位图描述,通道1的功能特性位图描述;某位设置为1,则表示该通道支持对应的控制功能

6+(ch+1)*n

iFeature

1

索引值

描述该特征单元的字符串描述符的索引号

说明:

(1)字段bUnitID是特征单元的唯一标识,可自行定义。

(2)字段bSourceID是该特征单元前序连接的实体ID号;前序连接实体可以是终端也可以是单元,和输出终端里面的bSourceID类似,构成描述符拓扑结构。

(3)字段bmaControls代表通道的功能特征位图,每一位都代表一个对应的功能,共有10种控制功能。

3.3 AC中断端点描述符

音频控制中断端点描述符:AC Interrupt Endpoint Descriptors

3.3.1标准AC中断端点描述符

标准音频控制中断端点描述符结构和标准端点描述符结构是一样的,区别在于某些字段的特殊定义。

Table: AC Interrupt Endpoint Descriptors

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:9 字节

1

bDescriptorType

1

常量

描述符的类型:端点描述符

2

bEndpointAddress

1

端点

端点的地址:

D7:方向位,1表示这是一个数据输入端点,0表示这是一个数据输出端点。

D6~D4:保留,设置为0

D3~D0:端点号,自由设定

3

bmAttributes

1

位映射

D3~D2:同步类型,设置为00,则不需要同步

D1~D0:传输类型,设置为11,是终端传输

4

wMaxPacketSize

2

数值

端点最大数据包长

6

bInterval

1

数值

主机查询此端点是否有数据的间隔时间

7

bRefresh

1

数值

设置为0

8

bSynchAddress

1

端点

设置为0

3.3.2 类特有AC中断端点描述符

没有类特有音频控制中断端点描述符,也就是说,UAC设备的端点描述符结构和标准端点描述符结构是一样的,只是某些字段的取值有所有不同。

4. 音频流(AS)接口描述符

音频流接口用于主机和设备之间交换音频数据流,接口下一般会存在两个这样的端点:

(1)音频传输端点:用于传输音频流

(2)音频同步端点:传输同步信息

为了支持多种音频流格式、采样率、传输带宽和其他属性,一个USB音频设备的音频流接口描述符都包含多个接口可替换设置(Alternate Setting)。

例:有一个音频设备,其控制接口(AC)用来控制音量的;音频流接口(AS)用来传输音频数据。那么音频流接口可以有多种可替换设置:

(1)可替换设置0:单声道模式,16KHZ采样率,24位量化,在该设置的音频类数据格式描述符中设置这些值,然后在音频流传输端点上就可以传输对应格式的单通道的音频数据。

(2)可替换设置1:立体声双声道模式,48KHZ采样率,16位量化,在该设置的音频类数据格式描述符中设置这些值,然后在音频流传输端点上就可以传输对应格式的单通道的音频数据。

(3)音频流接口描述符包括:标准音频流接口描述符 和 音频类特有音频流接口描述符。

4.1 标准AS接口描述符

标准音频流接口描述符:Standard AS Interface Descriptor

与标准接口描述符的结构相同,需要注意的是某些字段取值的特殊定义。

Table: Standard AS Interface Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:9 字节

1

bDescriptorType

1

常量

描述符的类型:标准音频流接口描述符(标准接口描述符),代码:0x04

2

bInterfaceNumber

1

数值

接口号,从0开始递增。是配置的并发接口数组中的索引号。

3

bAlternateSetting

1

数值

该接口的可替换设置号

4

bNumEndpoints

1

数值

除了端点0外,该接口所使用的的端点数目,除反馈端点之外,最多只能有一个数据传输端点。

所以:

值为0,表示没有数据端点;

值为1,表示有一个数据端点;

值为2,表示有一个数据端点和一个反馈端点。

5

bInterfaceClass

1

常量

音频接口类代码:0x01

6

bInterfaceSubClass

1

常量

音频流接口子类代码:0x02

7

bInterfaceProtocol

1

数值

没有用到,设置为0

8

iInterface

1

索引

描述该接口的字符串描述符的索引

4.2 类特有AS接口描述符

类特有AS接口描述符:Class-Specific AS Interface Descriptor

类特有音频流接口描述符里面包含:该音频流的数据格式、音频流接口和哪个终端相连等信息。

Table: Class-Specific AS Interface Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

长度:7 字节

1

bDescriptorType

1

常量

描述符类型,音频类接口,代码:0x24

2

bInterfaceNumber

1

数值

描述符子类型,代码:0x01

3

bTerminalLink

1

数值

如果该音频流接口有音频传输端点,则bTerminalLink代表该传输端点所对应的的终端号,那么这里填入的就是终端的ID。[接口下某个端点与终端的对应]

4

bDelay

1

数值

数据通路上的延时

5

wFormatTag

2

常量

音频流编码格式

说明:

  1. wFormatTag代表接口中传输的音频流的编码格式,音频流编码格式如下表:

数据格式

TYPE_I_UNDEFINED

0x0000

PCM

0x0001

PCM8

0x0002

IEEE_FLOAT

0x0003

ALAW

0x0004

MULAW

0x0005

4.3 类特有音频流数据格式描述符

类特有数据格式描述符:Class-Specific AS Format Type Descriptor

数据格式描述符主要描述音频流的通道数、位分辨率、采样率等信息。

Table: Class-Specific AS Format Type Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:( 8 + 3*n )字节

1

bDescriptorType

1

常量

描述符的类型:音频类数据格式描述符,代码:0x24

2

bDescriptorSubtype

1

数值

描述符的子类型:数据格式子类描述符,代码:0x02

3

bFormatType

1

数值

音频流数据格式类型

4

bNrChannels

1

数值

该接口声道簇中的物理通道个数

5

bSubframeSize

1

常量

该接口的子帧中有几个字节的音频数据

6

bBitResolution

1

常量

位分辨率:接口的子帧中有几位的音频数据是有效的

7

bSamFreqType

1

数值

音频流接口的同步传输端点支持几种采样率(n

8

tSamFreq[1]

3

索引

同步传输端点所支持的第1种采样率

……

……

…..

……

……

tSamFreq[n]

3

同步传输端点所支持的第n种采样率

说明:

(1)bFormatType指的是音频数据流数据格式,和音频数据流编码格式是不一样的概念。数据流格式可选值如下表:

数据格式

FORMAT_TYPE_UNDEFINED

0x00

FORMAT_TYPE_I

0x01

FORMAT_TYPE_II

0x02

FORMAT_TYPE_III

0x03

开发USB音频设备使用最多的是Type I。

Type I数据流格式简介:

按照物理时序,对音频流进行采样,每一个采样点用一个数据表示,最终的音频信号是把这些连续的采样数据进行AD转换后得到的波形。典型的Type I信号就是标准的PCM码。所以,如果音频流的编码格式选定为PCM,那么这里音频流数据格式就是对应的Type I

(2)音频子帧(Audio Subframe)是传输音频的最基本单位[单位:字节],一个音频子帧就是一个采样点,大小一般是1、2、3或者4个字节(量化之后的量化值,编码的时候,用几个字节来表示),使用字段bSubframeSize来表示。

(3)一个音频子帧数据,使用二进制表示的时候,二进制的位数就是bBitResolution(bBitResolution的单位是:bit---位)。所以,bBitResolution和bSubframeSize存在如下关系:

bBitResolution ≤ bSubframeSize * 8

(4)字段bSamFreqType代表音频流接口的ISO端点(同步传输端点)支持几种采样率,根据采样率的数目,就可以得到tSamFreq的布局。这里还需要特别注意的是,采样率是使用三个字节来表示的!

4.4 音频流数据传输端点描述符

AS数据流传输端点分为: 标准传输端点和 类特有传输端点

4.4.1 标准音频流数据传输端点

标准音频流端点描述符:Standard AS Isochronous Audio Data Endpoint Descriptor

标准音频流数据传输端点又分为:音频流数据传输端点(传音频数据) 和 音频流数据同步端点(传同步信息)

4.4.1.1 标准音频流数据传输端点描述符

标准音频流数据传输端点描述符:Standard AS Isochronous Audio Data Endpoint Descriptor,它其实就是个端点描述符。

数据流传输端点、数据流同步端点、和标准端点描述符的结构是一样的,需要注意的某些特殊字段的取值定义。

Table: Standard AS Isochronous Audio Data Endpoint Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

描述符的大小:9 字节

1

bDescriptorType

1

常量

描述符的类型:端点描述符,代码:0x05

2

bEndpointAddress

1

端点

USB端点的地址:

  1. D7:方向位,1表示这是一个数据输入端点,0表示这是一个数据输出端点。
  2. D6~D4:保留,设置为0
  3. D3~D0:端点号,自由设定

3

bmAttributes

1

位映射

该字段代表USB端点的属性:

  1. D1~D0:传输类型

01:代表传输类型是同步传输

 同步传输也叫等时传输

  1. D3~D2:代表同步的方式

00:没有同步

01:使用异步的方式同步信息

10:使用自适应的方式同步信息

11:表示使用同步的方式同步信息

  1. D5~D4:端点类型

00:数据端点

10:反馈端点

4

wMaxPacketSize

2

数值

该端点发送/接收的包的最大字节数,取决于音频带宽限制

6

bInterval

1

数值

该端点的传输数据间隔/主机查询此端点的间隔时间,单位是毫秒,这里必须设置为,这是USB1.0协议的规定。代表1传输间隔是1帧

7

bRefresh

1

数值

设置为0 或 1~9

8

bSynchAddress

1

端点

这是一个地址,是一个端点的地址,该端点用来传输同步信息。即:如果有同步端点,则bSynchAddress

字段就是对应的同步端点号;如果没有同步端点,就设置为0

说明:

(1)bmAttributes反映音频传输端点的同步类型和用法。

例子:

标准音频同步传输端点的bmAttributes为0x01:这个端点是一个同步传输端点,没有同步信息。

使用异步方式去同步信息的标准传输端点的bmAttributes为0x05:这个端点是一个同步传输端点,使用异步的方式去同步信息。

用同步调节时钟的方式去同步信息的标准传输端点的bmAttributes为0x0D:这个端点是一个同步传输端点,使用同步调节时钟的方式进行同步信息。

如果没有设定同步的方式,那么该端点就是标准传输端点(只传数据);如果设定了同步的方式,那么该端点就是标准同步端点(传同步信息)。

(2)对于标准同步端点,wMaxPacketSize设定为3。

(3)bInterval的计算公式:2bInterval-1;bInterval为1,则代表间隔1帧。

(4)对于标准传输端点,bRefresh只能设置为0;如果端点是一个同步端点,则取值为1~9。

(5)如果端点是一个标准传输端点,bSynchAddress代表其所使用的同步端点号,如果不具备同步端点,则设置该字段为0;对于同步端点,bSynchAddress设置为0。

4.4.1.2 标准音频流数据同步端点描述符

标准音频流数据同步端点描述符:结构和数据流传输端点描述符一样。

4.4.2 类特有音频流数据传输端点

类特有音频流数据传输端点:Class-Specific AS Isochronous Audio Data Endpoint Descriptor。描述了标准音频传输端点的属性。

Table: Class-Specific AS Isochronous Audio Data Endpoint Descriptor

偏移量/字节

字段

大小/字节

数值类型

字段的描述

0

bLength

1

数值

长度:7 字节

1

bDescriptorType

1

常量

描述符类型,音频类传输端点,代码:0x25

2

bInterfaceNumber

1

数值

描述符子类型,属于音频类端点子类描述符,代码:0x01

3

bmAttributes

1

位映射

对应的位设置为1,则说明该端点支持对应的操作

D0:是否支持采样率调整

D1:是否支持高音调整

D6~D2:保留,设为0

D7:该端点是否只支持wMaxPacketSize的传输。设置为0,表示可以传输短包(包长小于wMaxPacketSize);设置为1,则表示只能传输大小为wMaxPacketSize的数据包。

4

bLockDelayUnits

1

数值

字段wLockDelay所使用的单位:

0:未定义的单位

1:毫秒

2:解码的PCM采样率

其余位保留

5

wLockDelay

2

数值

稳定产生/消耗音频数据前需要等待的时间。

说明:

1)字段bLockDelayUnits、wLockDelay代表该USB设备在主机设置后需要多久时间才能达到时钟稳定,然后以固定速率产生/消耗音频数据。

下一篇:UAC协议基础第二篇: UAC类请求_卡卡的博客-CSDN博客

你可能感兴趣的:(设备类驱动层之UAC类,音视频,usb)