usb audio--异步传输方式描述符说明(2)
2017-07-20 15:45
357 查看
很多人都以为usb audio 1.0不支持异步,如XMOS的驱动,都是是usb audio 2.0的版本,其实usb audio 1.0中已经支持了反馈。现有的操作系统中,win10以前都只支持USB audio 1.0,并且windows下的usb audio 1.0都不支持异步方式。Linux 支持 usb audio 1.0与2.0,支持1.0,2.0下的异步方式。这里讲的异步方式的实现主要是 device端的usb 固件实现。
Usb audio 1.0 描述符介绍
该描述符定义了一个speeker设备,该设备支持双声道,16bit数据格式,支持44.1K及48K采样率,支持Asynchronous同步方式 ,拓扑图如下:
描述符的说明:
1. 包含两个interface,接口0用于audio 控制接口,接口1用于audio流接口,接口1定义了2个setting,其中setting 0不包含传输endpoint,setting 1都包含同步传输endpoint。这里要说明的是,之所以要定义一个不含有任何传输endpoint(除了默认端点0)的setting,是由usb audio设备特性决定的,该setting不可省略,该setting用于在设备没有被使用时作为usb设备的设置
反馈端点
定义了两个端点,端点1为同步OUT端点,端点2为同步反馈IN端点,且端点1描述符的同步端点字段要指向端点2的地址。这里反馈端点描述符中的bRefres指定host 获取反馈值的间隔,如定义为3,表示每个8ms,主机获取一次反馈值。
Feature Unit
如果要加入音量控制,可以在feature Unit中加入,上述只定义了一个Mute feature。
多采样率支持
Class-Specific AS Isochronous Audio Data Endpoint Descriptor 中的bmAttributes字段的bit0决定了设备是否支持多采样率,为0表示只支持1种采样率。
Usb audio 1.0 描述符介绍
/* Configuration 1 */ 0x09, /* bLength */ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */ LOBYTE(AUDIO_CONFIG_DESC_SIZE), /* wTotalLength 109 bytes*/ HIBYTE(AUDIO_CONFIG_DESC_SIZE), 0x02, /* bNumInterfaces */ 0x01, /* bConfigurationValue */ 0x00, /* iConfiguration */ 0xC0, /* bmAttributes BUS Powred*/ 0x32*5, /* bMaxPower = 100 mA*/ /* 09 byte*/ /* USB Speaker Standard interface descriptor */ AUDIO_INTERFACE_DESC_SIZE, /* bLength */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ 0x00, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x00, /* bNumEndpoints */ USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ 0x00, /* iInterface */ /* 09 byte*/ /* USB Speaker Class-specific AC Interface Descriptor */ AUDIO_INTERFACE_DESC_SIZE, /* bLength */ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ 0x00, /* 1.00 */ /* bcdADC */ 0x01, 0x27, /* wTotalLength = 39*/ 0x00, 0x01, /* bInCollection */ 0x01, /* baInterfaceNr */ /* 09 byte*/ /* USB Speaker Input Terminal Descriptor */ AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ 0x01, /* bTerminalID */ 0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */ 0x01, 0x00, /* bAssocTerminal */ 0x02, /* bNrChannels */ 0x03, /* wChannelConfig 0x0000 Mono */ 0x00, 0x00, /* iChannelNames */ 0x00, /* iTerminal */ /* 12 byte*/ /* USB Speaker Audio Feature Unit Descriptor */ 0x09, /* bLength */ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ AUDIO_OUT_STREAMING_CTRL, /* bUnitID */ 0x01, /* bSourceID */ 0x01, /* bControlSize */ AUDIO_CONTROL_MUTE, /* bmaControls(0) */ 0x00, /* bmaControls(1) */ 0x00, /* iTerminal */ /* 09 byte*/ /*USB Speaker Output Terminal Descriptor */ 0x09, /* bLength */ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ 0x03, /* bTerminalID */ 0x01, /* wTerminalType 0x0301*/ 0x03, 0x00, /* bAssocTerminal */ 0x02, /* bSourceID */ 0x00, /* iTerminal */ /* 09 byte*/ /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */ /* Interface 1, Alternate Setting 0 */ AUDIO_INTERFACE_DESC_SIZE, /* bLength */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ 0x01, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x00, /* bNumEndpoints */ USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ 0x00, /* iInterface */ /* 09 byte*/ /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */ /* Interface 1, Alternate Setting 1 */ AUDIO_INTERFACE_DESC_SIZE, /* bLength */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ 0x01, /* bInterfaceNumber */ 0x01, /* bAlternateSetting */ 0x02, /* bNumEndpoints */ USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ 0x00, /* iInterface */ /* 09 byte*/ /* USB Speaker Audio Streaming Interface Descriptor */ AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ 0x01, /* bTerminalLink */ 0x01, /* bDelay */ 0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001*/ 0x00, /* 07 byte*/ /* USB Speaker Audio Type I Format Interface Descriptor */ 0x0B+3, /* bLength */ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ AUDIO_FORMAT_TYPE_I, /* bFormatType */ 0x02, /* bNrChannels */ 0x02, /* bSubFrameSize : 2 Bytes per frame (16bits) */ 16, /* bBitResolution (16-bits per sample) */ 0x02, /* bSamFreqType only one frequency supported */ SAMPLE_FREQ(USBD_AUDIO_MAX_FREQ), /* Audio sampling frequency coded on 3 bytes */ SAMPLE_FREQ(44100), /* Audio sampling frequency coded on 3 bytes */ /* 11 byte*/ /* Endpoint 1 - Standard Descriptor */ AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_OUT_EP, /* bEndpointAddress 1 out endpoint*/ USB_ENDPOINT_TYPE_ISOCHRONOUS | 0x04, /* bmAttributes */ (u8)(USB_OTG_MAX_RX_SIZE & 0xff),(u8)((USB_OTG_MAX_RX_SIZE>>8)&0xff), 0x01, /* bInterval */ 0x0, /* bRefresh */ AUDIO_FEED_UP_EP, /* bSynchAddress */ /* 09 byte*/ /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor */ AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ 0x01, /* bmAttributes */ 0x00, /* bLockDelayUnits */ 0x00, /* wLockDelay */ 0x00, /* 07 byte*/ /* ##Endpoint 2 for feedback - Standard Descriptor */ AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ AUDIO_FEED_UP_EP, /* bEndpointAddress 2 in endpoint*/ 0x11, /* bmAttributes */ 3,0, /* wMaxPacketSize in Bytes 3 */ 1, /* bInterval 1ms*/ FEED_RATE, /* bRefresh 1 ~ 9,power of 2*/ 0x00, /* bSynchAddress */ /* 09 byte*/
该描述符定义了一个speeker设备,该设备支持双声道,16bit数据格式,支持44.1K及48K采样率,支持Asynchronous同步方式 ,拓扑图如下:
描述符的说明:
1. 包含两个interface,接口0用于audio 控制接口,接口1用于audio流接口,接口1定义了2个setting,其中setting 0不包含传输endpoint,setting 1都包含同步传输endpoint。这里要说明的是,之所以要定义一个不含有任何传输endpoint(除了默认端点0)的setting,是由usb audio设备特性决定的,该setting不可省略,该setting用于在设备没有被使用时作为usb设备的设置
反馈端点
定义了两个端点,端点1为同步OUT端点,端点2为同步反馈IN端点,且端点1描述符的同步端点字段要指向端点2的地址。这里反馈端点描述符中的bRefres指定host 获取反馈值的间隔,如定义为3,表示每个8ms,主机获取一次反馈值。
Feature Unit
如果要加入音量控制,可以在feature Unit中加入,上述只定义了一个Mute feature。
多采样率支持
Class-Specific AS Isochronous Audio Data Endpoint Descriptor 中的bmAttributes字段的bit0决定了设备是否支持多采样率,为0表示只支持1种采样率。
相关文章推荐
- usb audio -- 异步方式介绍(1)
- usb 音频类描述符及其说明(usb audio descriptor)
- usb 音频类描述符及其说明(usb audio descriptor)
- 基于OHCI的USB主机 —— OHCI(传输描述符)
- 求助:usb audio hid 设备的配置描述符无效:4个接口,1个AC,2个AS,1个HID。播放是双通道的,录音是单通道的。原本配置描述符里录音也是双通道
- 关于USB2.0和USB高速传输模式的一点说明
- usb传输方式
- USB Audio&hid 混合设备的描述符详解
- 关于Android设备USBHID通信控制传输相关接口说明
- usb的传输和四种传输方式
- Linux Windows下USB RNDIS网络传输方式详解
- 对于服务器返回的JSON字符串,如果 jQuery 异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理
- usb2-描述符和传输
- 基于OHCI的USB主机 —— OHCI(传输描述符)
- 五、无线信息传递——通过ssid传递对hostapd传输方式的具体说明
- usb audio --异步反馈的实现(3)
- usb传输方式
- USB数据传输方式
- 我来说说究竟什么是“USB异步传输” (Asynchronous USB)吧
- (比较WXS师兄的)USB 同步传输和异步传输固件的区别