UAC开发调试笔记
+ -

UAC1.0麦克风端点描述符wMaxPacketSize的问题分析

2022-06-07 19 0

同事搞了一个UAC麦克风,将输入端点设置如下:

        ----------------- Endpoint Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x05 (Endpoint Descriptor)
bEndpointAddress         : 0x83 (Direction=IN EndpointID=3)
bmAttributes             : 0x0D (TransferType=Isochronous  SyncType=Synchronous  EndpointType=Data)
wMaxPacketSize           : 0x0B00 
bInterval                : 0x04(1ms)
bRefresh                 : 0x00
bSynchAddress            : 0x00
Data (HexDump)           : 09 05 83 0D C0 00 01 00 00

这里使用的是USB2.0高速传输,所以这里通过USB规范可以分析出,最点的最大长度为768字节,可以进行一次额外传输,所以总共可以传输768x2=1536字节。
其实这里的麦克风参数为48K采样率,16通道,每通道2字节的PCM数据,所以48x16x2=1536字节。
可是实际在通过BUSHOUND抓包的时候,出现如下错误:

33.1 USTS   c0000b00                                                                   isoc req failed
33.1 URB                                                                                ISOC TRANSFER 
10 01 0a 00  00 0b 00 c0  18 c4 df 8b  70 7f 00 00  00 00 00 00  00 00 00 00  40 56 b5 6e  8f 80 ff ff
05 00 00 00  00 00 00 00  10 1f 86 79  8f 80 ff ff  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00
02 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00
00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00
71 89 93 06  0a 00 00 00  0a 00 00 00  00 00 00 00  00 00 00 00  12 00 00 c0  00 0b 00 00  00 00 00 00
12 00 00 c0  00 16 00 00  00 00 00 00  12 00 00 c0  00 21 00 00  00 00 00 00  12 00 00 c0  00 2c 00 00
00 00 00 00  12 00 00 c0  00 37 00 00  00 00 00 00  12 00 00 c0  00 42 00 00  00 00 00 00  12 00 00 c0
00 4d 00 00  00 00 00 00  12 00 00 c0  00 58 00 00  00 00 00 00  12 00 00 c0  00 63 00 00  00 00 00 00
12 00 00 c0  00 00 00 00  00 00 00 00  00 00 00 00

通过在 http://www.usbzh.com/article/detail-645.html 查询为 c0000b00的错误信息
USBD_STATUS_BABBLE_DETECTED:the device returned a babble detected error (defined for backward compatibility with the USB 1.0).
通过可以看到,这是一个不清楚的错误信息。

但是在实际将端点描述符配置成wMaxPacketSize=1536的时候,这时usbtreeviewer虽然会显示错误的值,但实际工作上是可以正常工作的。

从上面对比来看,这里不科学啊。遵循规范的不能正常工作,不遵循的又可以正常工作。
经过深入的分析,其实这里有一段孽缘在这里。

  • UAC1.0规范发布于1998年。
  • USB2.0规范发布于2000年

所以可以看到,UAC1.0这里可能就不遵循USB2.0相关的规范,因为UAC1.0更早,所以应该是:

  • UAC1.0高速设备,端点的大小可配置大于1024字节长度,但在实际传输时可能会使用1024字节进行传输
  • UAC1.0端点的大小的值与实际传输的长度关系不大,不过影响了URB每个ISO包的大小,因为我们分析URB时可以看到
_URB_ISOCH_TRANSFER        
_URB_HEADER    Hdr    
USHORT    Length    10 01 
USHORT    Function    0A 00 
USBD_STATUS    Status    00 0B 00 C0 
PVOID    UsbdDeviceHandle    18 C4 DF 8B 70 7F 00 00 
ULONG    UsbdFlags    00 00 00 00 
ULONG    reversed    00 00 00 00 

PVOID    PipeHandle    40 56 B5 6E 8F 80 FF FF 
ULONG    TransferFlags    05 00 00 00 
ULONG    TransferBufferLength    00 00 00 00 
PVOID    TransferBuffer    10 1F 86 79 8F 80 FF FF 
PVOID    TransferBufferMDL    00 00 00 00 00 00 00 00 
PVOID    UrbLink*    00 00 00 00 00 00 00 00 
_URB_HCD_AREA    hca    
PVOID    Reserved[8]
02 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 

ULONG    StartFrame    71 89 93 06 
ULONG    NumberOfPackets    0A 00 00 00 
ULONG    ErrorCount    0A 00 00 00 
_USBD_ISO_PACKET_DESCRIPTOR    IsoPacket[10]

ULONG    Offset    00 00 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 0B 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 16 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 21 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 2C 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 37 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 42 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 4D 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 58 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0 


ULONG    Offset    00 63 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    12 00 00 C0

0 篇笔记 写笔记

USB-UAC麦克风 音频控制接口
音频控制接口描述符描述了设备的结构(拓扑结构),并通过特定类请求对音频的控制。UAC麦克风 音频控制接口描述符偏移地址字段长度值描述0bLength10x09接口描术符的长度1bDescriptorType10x04描述符的类型接口描述符2bInterfaceNumber10x00接口ID号3bA......
USB音箱 UAC设备描述符分析
这里看到,USB规范采用的是USB1.1版本,不过字符串中又显示的是”USB2.0 Device”,所以这里就有点迷~关于设备描述符各字段的详细解释,详见USB规范中设备描述符一节。从bDeviceClass,bDeviceSubClass和bDeviceSubClass都被置为0来看,这是一个典......
UAC 类特定音频控制接口头描述符
UAC类特定音频控制头接口描述符这个名字有点绕,其实这个描述符是前接标准的音频控制接口描述符,后续关于音频控制的所有相关描述符,起着承上起下的作用。当然也可以认为是音频控制相关描述符的前导。这是因为UAC类特定音频控制接口描述符含有一个关键的字段wTotalLength,用于包含音频控制所有接口描述......
华为UAC耳机 音频控制接口
音频控制接口占用接口ID=0,音频控制接口的描述符结构布局如下:USB标准接口描述符UAC音频控制接口头描述符IDSId描述    音频控制输入终端描述符1USB Streaming   ......
华为UAC耳机的工作过程数据分析
华为UAC耳机工作时,首先需要打开设备,然后读取数据,播放过程后,需要关闭设备。这里我们使用BusHound抓包(省略掉重复的数据包:由于这些特定类请求是发给UAC音频控制终端/实体或接口的,所以我们先回顾一下UAC音频控制单元的一些ID,然后对照其选择子进行分析。UAC音频控制接口头描述符ID描述......
UAC 文档下载
UAC规范1.0文档下载地址:https://www.usb.org/sites/default/files/audio10.pdfUAC规范2.0文档下载地址:https://www.usb.org/sites/default/files/Audio2.0_final.zipUAC规范3.0及3.......
UAC 音频数据格式FORMAT_TYPE_3
下面来介绍USB Audio Data Formats 的第一类音频数格式 FORMAT_TYPE_III = 0x03Audio Data Format Type III Codes 其下又分为5种,分别为:NamewFormatTagTYPE_III_UNDEFINED0x2000IEC1937......
UAC 音频控制
一个USB设备可能包含多个配置。像手机一样,当手机通过USB线缆接入PC机后,会弹出一个选择对话框:让用户选择。当然一个USB设备只能工作在一种配置描述符下。对于每一个USB配置描述符,可能含有多个USB接口描述描述符,同时这些接口描述符可能每个接口描述符又包含多个转换接口描述符。这些接口描述符可能......
USB音箱 UAC Speaker 概述
手头有一个USB Speaker,插入电脑后在设备管理器中如下:从设备管理器中来看,这是一个单一功能的Usb Speaker。其硬件设备ID如下:USBVID_1908&PID_2070&REV_0100(USB Composite Device)USBVID_1908&......
USB音箱 UAC配置描述符分析
该USB音箱的配置描述符和普通USB设备描述符结构体一致,并无特别区别。该配置描述符的总长度(包括后续的所有其它描述符)为110字节,这里相对华为耳机的要少了很多,这是因为少了像麦克风和HID。从配置描述符的字段bmAttributes来看,并不支持远程唤醒功能。 ------------......
华为UAC耳机 配置描述符
配置描述符的大小其实不光包括配置描述符自身,也包括后续的所有描述符。这里我们只先介绍一下配置描述符,后续的接口描述符和其它UAC相关描述符在后续一节介绍。配置描述符的内容如下: ------------------ Configuration Descriptor --------------......
UAC 其它速率配置描述符
UAC规范中,并没有定义特别的其它速率配置描述符,故UAC音频设备的其它速率描述符应符合USB规范中的其它速率配置描述符。......
UAC Feedback端点
下面转一段对USB feedback的理解:这段时间一直在做USB Audio Device(UAC)设备的开发工作。由于UAC采用的是isochronous endpoint来传输数据,对时钟的要求较高。但无奈我们的嵌入式平台的时钟并不准,数据同步就成了问题。经过研究,发现只能使用异步模式来解决这......
USB-UAC麦克风 配置描述符
UAC麦克风采用的配置描述符结构和USB配置描述符的结构一致.偏移地址字段长度值描述0bLength10x09配置描述符的长度1bDescriptorType10x02描述符类型,配置描述符类型2wTotalLength20x0064配置描述符的总长度(包括后续的UAC音频控制和UAC音频流接口描述......
华为UAC麦克风的工作过程数据分析
看完了耳机的数据分析,再来分析麦克风,就相对来说很简单了,这是因为:第一:麦克风没有音频控制特效单元描述符,所以少了很多特定类请求。第二:麦克风只有一个音频流转换接口,且只支持采样率为48000HZ 16位。具体的过程见下:Length Phase Data-------- ----- ......
作者信息
USB中文网
B站搜索 站长漫谈 看视频。
pnpon内核开网,USB中文网,
busrom硬核技术网站长
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!