USB Audio拓扑
输入端点地址:0x81(Microphone)
输出端点地址:0x02(Speaker)
/* EN_EP: 0x80(64) 0x81(Microphone 64) 0x82(NULL fill 64)*/
HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 16 + 16 * 2);
/* OUT_EP:0x00(64) 0x01(NULL fill 64) 0x02(Speaker 64) */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 16);
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 16);
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 16);
#define USBD_MAX_NUM_INTERFACES 5U
http://www.linux-usb.org/usb.ids
#define USBD_PID_FS 0x5740
尝试过将PID改为0x5730或者0x5731,都只能识别对应的设备,而改成0x5740(改成单一的扬声器或者麦克风)都能自动的识别对应的设备
宏定义如下
#define AUDIO_PORT_CHANNEL_NUMS 2U /**< MIC音频通道数 */
#define MONO_CHANNEL_SEL 2U /**< 单通道时,0使用L声道 1使用R声道 2配置MONO */
#define AUDIO_PORT_USBD_AUDIO_FREQ 16000 /**< 设置音频采样率 */
#define AUDIO_PORT_IF_NUM 3 /**< 接口数目 2 or 3 */
#define USB_AUDIO_CONFIG_DESC_SIZ (192U)
/* @ref:https://www.usbzh.com/article/detail-253.html */
/* Microphone */
#define AUDIO_PORT_USE_MICROPHONE 1 /**< 是否配置Microphone */
#define AUDIO_PORT_INPUT_TERMINAL_ID_1 0x01
#define AUDIO_PORT_OUTPUT_TERMINAL_ID_3 0x03
#define AUDIO_PORT_INPUT_FEATURE_ID_2 0x02
/* 音频类终端类型定义 */
#define AUDIO_PORT_MICRO_PHONE_TERMINAL_L 0x01U
#define AUDIO_PORT_MICRO_PHONE_TERMINAL_H 0x02U
#define AUDIO_PORT_IN_EP_DIR_ID 0x81 /**< (Direction=IN EndpointID=1) */
#define AUDIO_PORT_OUT_EP_DIR_ID 0x01 /**< (Direction=OUT EndpointID=1) */
/* Speaker */
#define AUDIO_PORT_USE_SPEAKER 1 /**< 是否配置Speaker */
#define AUDIO_PORT_INPUT_TERMINAL_ID_4 0x04
#define AUDIO_PORT_INPUT_FEATURE_ID_5 0x05
#define AUDIO_PORT_OUTPUT_TERMINAL_ID_6 0x06
/* 音频类终端类型定义 */
#define AUDIO_PORT_SPEAKE_TERMINAL_TYPE_L 0x01U
#define AUDIO_PORT_SPEAKE_TERMINAL_TYPE_H 0x03U
#define AUDIO_PORT_STREAM_TERMINAL_TYPE_L 0x01U
#define AUDIO_PORT_STREAM_TERMINAL_TYPE_H 0x01U
#define AUDIO_PORT_IN_EP_DIR_ID2 0x82 /**< (Direction=IN EndpointID=2) */
#define AUDIO_PORT_OUT_EP_DIR_ID2 0x02 /**< (Direction=OUT EndpointID=2) */
/* 立体声配置 */
#if AUDIO_PORT_CHANNEL_NUMS == 2
/* 使用L+R声道 */
#define AUDIO_PORT_CHANNEL_CONFIG_L 0x03U
#define AUDIO_PORT_CHANNEL_CONFIG_H 0x00U
/* 单声道配置 */
#elif AUDIO_PORT_CHANNEL_NUMS == 1
#if MONO_CHANNEL_SEL == 0
/* 使用L声道 */
#define AUDIO_PORT_CHANNEL_CONFIG_L 0x01U
#define AUDIO_PORT_CHANNEL_CONFIG_H 0x00U
#elif MONO_CHANNEL_SEL == 1
/* 使用R声道 */
#define AUDIO_PORT_CHANNEL_CONFIG_L 0x02U
#define AUDIO_PORT_CHANNEL_CONFIG_H 0x00U
#elif MONO_CHANNEL_SEL == 2
/* 使用默认MONO声道 */
#define AUDIO_PORT_CHANNEL_CONFIG_L 0x00U
#define AUDIO_PORT_CHANNEL_CONFIG_H 0x00U
#endif
#endif
/* 轮询时间间隔 */
#define AUDIO_PORT_FS_BINTERVAL 1U /**< 1ms一次轮询 */
/* 音频传输大小设置 */
#define AUDIO_PORT_PACKET_SZE(frq) (uint8_t)(((frq * 2U * 2U)/(1000U/AUDIO_PORT_FS_BINTERVAL)) & 0xFFU), \
(uint8_t)((((frq * 2U * 2U)/(1000U/AUDIO_PORT_FS_BINTERVAL)) >> 8) & 0xFFU)
#define AUDIO_PORT_OUT_SIZE ((AUDIO_PORT_USBD_AUDIO_FREQ * 2U * 2U)/(1000U/AUDIO_PORT_FS_BINTERVAL)) /**< 音频发送大小Byte */
#define AUDIO_PORT_BUF_SIZE AUDIO_PORT_OUT_SIZE*4 /**< 音频缓冲区大小 大于3的倍数 */
/* Configuration 1 */
0x09, /* bLength */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType 配置描述符*/
LOBYTE(USB_AUDIO_CONFIG_DESC_SIZ), /* wTotalLength USB_AUDIO_CONFIG_DESC_SIZ bytes*/
HIBYTE(USB_AUDIO_CONFIG_DESC_SIZ),
AUDIO_PORT_IF_NUM, /* bNumInterfaces 2 or 3个接口 AC与AS(1Microphone or 2Speaker) */
0x01, /* bConfigurationValue 配置需要参数的值 */
0x00, /* iConfiguration 配置描述符的字符串说明索引号,为0则不使用*/
#if (USBD_SELF_POWERED == 1U)
0xC0, /* bmAttributes: Bus Powered according to user configuration */
#else
0x80, /* bmAttributes: Bus Powered according to user configuration */
#endif
USBD_MAX_POWER, /* bMaxPower = 100 mA */
/* 09 byte*/
/* USB Microphone Standard interface descriptor */
/* USB Audio Control 标准控制接口描述符(音频控制类接口描述符)*/
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_DESC_TYPE_INTERFACE, /* bDescriptorType 0x04接口描述符 */
0x00, /* bInterfaceNumber 本接口索引 index 0 */
0x00, /* bAlternateSetting 本备用设置索引*/
0x00, /* bNumEndpoints Audio Control Interface没有使用专用的端点,而是使用了默认的端点0来操作。并且该接口,没有中断端点 */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass 0x01音频类 */
AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass 0x01音频控制类 */
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
0x00, /* iInterface */
/* 09 byte*/
/* USB Audio Class-specific AC Interface Descriptor */
/* 音频相关的描述符 控制接口规范,音频流控制接口数量,需要有一个header作为一些统一的描述 */
#if AUDIO_PORT_IF_NUM == 2
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
#elif AUDIO_PORT_IF_NUM == 3
AUDIO_INTERFACE_DESC_SIZE + 1, /* bLength */
#endif
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType audio interface descriptor 0x24音频类接口描述符 */
AUDIO_CONTROL_HEADER, /* bDescriptorSubtype 音频控制头子类 0x01 audio control header */
0x00, /* 1.00 */ /* bcdADC 音频类 规范1.0 0x0100*/
0x01,
#if AUDIO_PORT_IF_NUM == 2
0x27, /* wTotalLength = 39 (9自身+12终端+9特征+9终端) Audio Class相关描述总大小Bytes 0x0027 */
#elif AUDIO_PORT_IF_NUM == 3
10 + (12 + 9 + 9) * 2, /* wTotalLength = 40 (10自身+12终端+9特征+9终端) Audio Class相关描述总大小Bytes 0x0028 */
#endif
0x00,
#if AUDIO_PORT_IF_NUM == 2
0x01, /* bInCollection 该音频控制接口所拥有的音频流接口总数,也就是2。 */
0x01, /* baInterfaceNr 所拥有的第一个音频流接口号 */
/* 9 byte*/
#elif AUDIO_PORT_IF_NUM == 3
0x02, /* bInCollection 该音频控制接口所拥有的音频流接口总数,也就是2。 */
0x01, /* baInterfaceNr 所拥有的第一个音频流接口号 */
0x02, /* baInterfaceNr 所拥有的第二个音频流接口号 */
/* 10 byte*/
#endif
//=============Microphone 终端1 IN -> 特征2 -> 终端3 OUT 流=============//
/* USB Microphone Input Terminal Descriptor */
/* Terminal 1 输入 来自终端类型0x0201(麦克风)数据 通道2个(L+R) */
AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype 子输入终端描述符子类 0x02 输入终端子类型 */
0x01, /* bTerminalID 本Termianl ID */
AUDIO_PORT_MICRO_PHONE_TERMINAL_L, /* wTerminalType 类型麦克风 */
AUDIO_PORT_MICRO_PHONE_TERMINAL_H,
0x00, /* bAssocTerminal 相关的input terminal ID,0代表此值未使用 */
AUDIO_PORT_CHANNEL_NUMS, /* bNrChannels 通道数 */
AUDIO_PORT_CHANNEL_CONFIG_L, /* wChannelConfig 0x0003 L+R声道 */
AUDIO_PORT_CHANNEL_CONFIG_H,
0x00, /* iChannelNames 通道名字符串描述(没有)*/
0x00, /* iTerminal 端点字符串描述(没有) */
/* 12 byte*/
/* USB Microphone Audio Feature Unit Descriptor 特征描述 */
/* Terminal 2 ,Source Terminal 1 麦克风,ControlSize 1 ,Mute */
0x09, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype 0x06 子类型:特征描述 */
AUDIO_PORT_INPUT_FEATURE_ID_2, /* bUnitID 特征ID 2 */
AUDIO_PORT_INPUT_TERMINAL_ID_1, /* bSourceID Terminal 1 麦克风 */
0x01, /* bControlSize */
AUDIO_CONTROL_MUTE, /* bmaControls(0) */
0, /* bmaControls(1) */
0x00, /* iTerminal */
/* 09 byte*/
/* USB Microphone Output Terminal Descriptor */
/* Terminal 3,音频流,Source Terminal 2(特征ID 2) */
0x09, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype 0x03 子类型:输出终端 */
AUDIO_PORT_OUTPUT_TERMINAL_ID_3, /* bTerminalID */
AUDIO_PORT_STREAM_TERMINAL_TYPE_L, /* wTerminalType 音频流0x0101*/
AUDIO_PORT_STREAM_TERMINAL_TYPE_H,
0x00, /* bAssocTerminal */
AUDIO_PORT_INPUT_FEATURE_ID_2, /* bSourceID */
0x00, /* iTerminal */
/* 09 byte*/
//=============音频流 终端4 IN -> 特征5 -> 终端6 OUT Speaker=============//
/* USB Speaker Input Terminal Descriptor */
/* Terminal 4 输入 来自终端类型0x0101(音频流)数据 通道2个(L+R) */
AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype 子类接口描述:0x02输入终端子类型*/
AUDIO_PORT_INPUT_TERMINAL_ID_4, /* bTerminalID 本Termianl ID*/
AUDIO_PORT_STREAM_TERMINAL_TYPE_L, /* wTerminalType 类型音频流*/
AUDIO_PORT_STREAM_TERMINAL_TYPE_H,
0x00, /* bAssocTerminal 相关的input terminal ID,0代表此值未使用 */
AUDIO_PORT_CHANNEL_NUMS, /* bNrChannels 通道数 */
AUDIO_PORT_CHANNEL_CONFIG_L, /* wChannelConfig 0x0003 L+R声道 */
AUDIO_PORT_CHANNEL_CONFIG_H,
0x00, /* iChannelNames 通道名字符串描述(没有)*/
0x00, /* iTerminal 端点字符串描述(没有) */
/* 12 byte*/
/* USB Speaker Audio Feature Unit Descriptor 特征描述 */
/* Terminal 5 ,Source Terminal 4 音频流,ControlSize 1 ,Mute */
0x09, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype 0x06 子类型:特征描述 */
AUDIO_PORT_INPUT_FEATURE_ID_5, /* bUnitID 特征ID 5 */
AUDIO_PORT_INPUT_TERMINAL_ID_4, /* bSourceID Terminal 4 音频流 */
0x01, /* bControlSize */
AUDIO_CONTROL_MUTE, /* bmaControls(0) */
0, /* bmaControls(1) */
0x00, /* iTerminal */
/* 09 byte*/
/*USB Speaker Output Terminal Descriptor */
/* Terminal 6,输出Speaker,Source Terminal 5(特征ID 5) */
0x09, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype 0x03 子类型:输出终端 */
AUDIO_PORT_OUTPUT_TERMINAL_ID_6, /* bTerminalID */
AUDIO_PORT_SPEAKE_TERMINAL_TYPE_L, /* wTerminalType Speaker0x0301 */
AUDIO_PORT_SPEAKE_TERMINAL_TYPE_H,
0x00, /* bAssocTerminal */
AUDIO_PORT_INPUT_FEATURE_ID_5, /* bSourceID */
0x00, /* iTerminal */
/* 09 byte*/
//==================Microphone 接口1 - 端点=================//
/* USB Microphone Standard AS Interface Descriptor - Audio Streaming Zero Bandwidth */
/* Interface 1, Alternate Setting 0 */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_DESC_TYPE_INTERFACE, /* bDescriptorType 0x04 接口描述符 */
0x01, /* bInterfaceNumber 本接口索引 index 1 */
0x00, /* bAlternateSetting 0时为默认的无音频输出接口即无端点描述符,从bAlternateSetting=1开始有数据传输 */
0x00, /* bNumEndpoints 端点数0 */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass 0x01 音频接口类 */
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass 0x02 子类音频流 */
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
0x00, /* iInterface */
/* 09 byte*/
/* USB Microphone Standard AS Interface Descriptor - Audio Streaming Operational */
/* Interface 1, Alternate Setting 1 */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_DESC_TYPE_INTERFACE, /* bDescriptorType 0x04 接口描述符 */
0x01, /* bInterfaceNumber 本接口索引 index 1 */
0x01, /* bAlternateSetting 0时为默认的无音频输出接口即无端点描述符,从bAlternateSetting=1开始有数据传输 */
0x01, /* bNumEndpoints 端点数1 */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass 0x01 音频接口类 */
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass 0x02 子类音频流 */
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
0x00, /* iInterface */
/* 09 byte*/
/* USB Microphone Audio Streaming Interface Descriptor */
AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype 0x01 一般音频流 */
AUDIO_PORT_OUTPUT_TERMINAL_ID_3, /* bTerminalLink 连接 输出终端 3 */
0x01, /* bDelay 1ms */
0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001 */
0x00,
/* 07 byte*/
/* USB Microphone Audio Type III Format Interface Descriptor */
0x0B, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType 0x24 音频接口描述符 */
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype 0x02 音频格式描述符 */
AUDIO_FORMAT_TYPE_I, /* bFormatType */
AUDIO_PORT_CHANNEL_NUMS, /* bNrChannels 2个通道 */
0x02, /* bSubFrameSize : 2 Bytes per frame (16bits) */
16, /* bBitResolution (16-bits per sample) */
0x01, /* bSamFreqType only one frequency supported 支持几中采样率,在下面每3Bytes描述支持的采样率 */
AUDIO_SAMPLE_FREQ(AUDIO_PORT_USBD_AUDIO_FREQ), /* Audio sampling frequency coded on 3 bytes */
/* 11 byte*/
/* Endpoint 1 - Standard Descriptor */
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType 0x05 端点描述符 */
AUDIO_PORT_IN_EP_DIR_ID, /* bEndpointAddress 0x81 输入端点 D7:方向位,1表示这是一个数据输入端点,0表示这是一个数据输出端点 D3~D0:端点号 */
USBD_EP_TYPE_ISOC, /* bmAttributes */
AUDIO_PORT_PACKET_SZE(AUDIO_PORT_USBD_AUDIO_FREQ),/* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */
AUDIO_PORT_FS_BINTERVAL, /* bInterval */
0x00, /* bRefresh */
0x00, /* bSynchAddress */
/* 09 byte*/
/* Endpoint - Audio Streaming Descriptor*/
AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType 0x25 音频端点描述符 */
AUDIO_ENDPOINT_GENERAL, /* bDescriptor 0x01 一般端点描述 */
0x80, /* bmAttributes */
0x01, /* bLockDelayUnits */
0x00, /* wLockDelay */
0x00,
/* 07 byte*/
//==================Speaker 接口2 - 端点=================//
/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwidth */
/* Interface 2, Alternate Setting 0 */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_DESC_TYPE_INTERFACE, /* bDescriptorType 0x04 接口描述符 */
#if AUDIO_PORT_IF_NUM == 2
0x01, /* bInterfaceNumber 本接口索引 index 1 */
#elif AUDIO_PORT_IF_NUM == 3
0x02, /* bInterfaceNumber 本接口索引 index 2 */
#endif
0x00, /* bAlternateSetting 0时为默认的无音频输出接口即无端点描述符,从bAlternateSetting=1开始有数据传输 */
0x00, /* bNumEndpoints 端点数0 */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass 0x01 音频接口类 */
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass 0x02 子类音频流 */
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
0x00, /* iInterface */
/* 09 byte*/
/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */
/* Interface 2, Alternate Setting 1 */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_DESC_TYPE_INTERFACE, /* bDescriptorType 0x04 接口描述符 */
#if AUDIO_PORT_IF_NUM == 2
0x01, /* bInterfaceNumber 本接口索引 index 1 */
#elif AUDIO_PORT_IF_NUM == 3
0x02, /* bInterfaceNumber 本接口索引 index 2 */
#endif
0x01, /* bAlternateSetting 0时为默认的无音频输出接口即无端点描述符,从bAlternateSetting=1开始有数据传输 */
0x01, /* bNumEndpoints 端点数1 */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass 0x01 音频接口类 */
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass 0x02 子类音频流 */
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 0x24 音频接口描述符 */
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype 0x01 一般音频流 */
AUDIO_PORT_INPU