diff --git a/class/audio/usb_audio.h b/class/audio/usb_audio.h index 617bc3ca..3acf581d 100644 --- a/class/audio/usb_audio.h +++ b/class/audio/usb_audio.h @@ -844,7 +844,7 @@ struct audio_v2_cs_if_ac_clock_source_descriptor { uint8_t iClockSource; } __PACKED; -#define AUDIO_SIZEOF_AC_CLOCK_SOURCE_DESC (8) +#define AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC (8) struct audio_v2_cs_if_ac_clock_selector_descriptor { uint8_t bLength; @@ -1034,57 +1034,57 @@ struct audio_v2_control_range3_param_block { __VA_ARGS__, /* bmaControls(0) Mute */ \ 0x00 /* iTerminal */ -// clang-format on - #define AUDIO_V2_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval) \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - bInterfaceNumber, /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - 0x00, /* bNumEndpoints */ \ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ - AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ - AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ - 0x00, /* iInterface */ \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - bInterfaceNumber, /* bInterfaceNumber */ \ - 0x01, /* bAlternateSetting */ \ - 0x01, /* bNumEndpoints */ \ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ - AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ - AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ - 0x00, /* iInterface */ \ - 0x10, /* bLength */ \ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ - AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ - bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \ - 0x00, /* bmControls */ \ - AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \ - DBVAL(AUDIO_FORMAT_PCM), /* bmFormats PCM */ \ - bNrChannels, /* bNrChannels */ \ - DBVAL(bmChannelConfig), /* bmChannelConfig */ \ - 0x00, /* iChannelNames */ \ - 0x06, /* bLength */ \ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ - AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ - AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ - bSubslotSize, /* bSubslotSize */ \ - bBitResolution, /* bBitResolution */ \ - 0x07, /* bLength */ \ - 0x05, /* bDescriptorType */ \ - bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \ - 0x09, /* bmAttributes */ \ - WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */ \ - bInterval, /* bInterval */ \ - 0x08, /* bLength */ \ - AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ - AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ - 0x00, /* bmAttributes */ \ - 0x00, /* bmControls */ \ - 0x00, /* bLockDelayUnits */ \ - 0x00, /* wLockDelay */ \ - 0x00 + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + 0x00, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x01, /* bAlternateSetting */ \ + 0x01, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \ + 0x00, /* iInterface */ \ + 0x10, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \ + 0x00, /* bmControls */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \ + DBVAL(AUDIO_FORMAT_PCM), /* bmFormats PCM */ \ + bNrChannels, /* bNrChannels */ \ + DBVAL(bmChannelConfig), /* bmChannelConfig */ \ + 0x00, /* iChannelNames */ \ + 0x06, /* bLength */ \ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ + AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ + bSubslotSize, /* bSubslotSize */ \ + bBitResolution, /* bBitResolution */ \ + 0x07, /* bLength */ \ + 0x05, /* bDescriptorType */ \ + bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \ + 0x01, /* bmAttributes */ \ + WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */ \ + bInterval, /* bInterval */ \ + 0x08, /* bLength */ \ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \ + 0x00, /* bmAttributes */ \ + 0x00, /* bmControls */ \ + 0x00, /* bLockDelayUnits */ \ + 0x00, /* wLockDelay */ \ + 0x00 + +// clang-format on #define AUDIO_V2_AS_DESCRIPTOR_INIT_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08) diff --git a/class/audio/usbd_audio.c b/class/audio/usbd_audio.c index 029ac4c7..96a352ce 100644 --- a/class/audio/usbd_audio.c +++ b/class/audio/usbd_audio.c @@ -23,6 +23,7 @@ #include "usbd_core.h" #include "usbd_audio.h" +#if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 struct usbd_audio_volume_info { uint16_t vol_min; uint16_t vol_max; @@ -30,12 +31,12 @@ struct usbd_audio_volume_info { uint16_t vol_current; }; -struct usbd_audio_v1_feature_unit_control { +struct usbd_audio_attribute_control { struct usbd_audio_volume_info volume[CONFIG_USBDEV_AUDIO_MAX_CHANNEL]; uint8_t mute[CONFIG_USBDEV_AUDIO_MAX_CHANNEL]; uint8_t automatic_gain[CONFIG_USBDEV_AUDIO_MAX_CHANNEL]; }; - +#else struct audio_v2_control_range2_param_block_default { uint16_t wNumSubRanges; struct @@ -46,13 +47,14 @@ struct audio_v2_control_range2_param_block_default { } subrange[CONFIG_USBDEV_AUDIO_MAX_CHANNEL]; } __PACKED; -struct usbd_audio_v2_feature_unit_control { +struct usbd_audio_attribute_control { uint32_t volume_bCUR; uint32_t mute_bCUR; struct audio_v2_control_range2_param_block_default volume; uint8_t mute[CONFIG_USBDEV_AUDIO_MAX_CHANNEL]; + uint32_t sampling_freq[CONFIG_USBDEV_AUDIO_MAX_CHANNEL]; }; - +#endif struct audio_entity_info { usb_slist_t list; uint8_t bDescriptorSubtype; @@ -62,11 +64,39 @@ struct audio_entity_info { static usb_slist_t usbd_audio_entity_info_head = USB_SLIST_OBJECT_INIT(usbd_audio_entity_info_head); +const uint8_t default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(8), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(44100), + AUDIO_SAMPLE_FREQ_4B(44100), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(88200), + AUDIO_SAMPLE_FREQ_4B(88200), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(192000), + AUDIO_SAMPLE_FREQ_4B(192000), + AUDIO_SAMPLE_FREQ_4B(0x00), +}; + #if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 static int audio_custom_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { uint8_t control_selector; - uint32_t sampling_freq; + uint32_t sampling_freq = 0; uint8_t pitch_enable; uint8_t ep; @@ -78,7 +108,7 @@ static int audio_custom_request_handler(struct usb_setup_packet *setup, uint8_t case AUDIO_REQUEST_SET_CUR: switch (control_selector) { case AUDIO_EP_CONTROL_SAMPLING_FEQ: - memcpy(&sampling_freq, *data, *len); + memcpy((uint8_t *)&sampling_freq, *data, *len); USB_LOG_INFO("Set ep %02x %d Hz\r\n", ep, (int)sampling_freq); usbd_audio_set_sampling_freq(ep, sampling_freq); return 0; @@ -107,6 +137,7 @@ static int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t * setup->bRequest); struct audio_entity_info *current_entity_info = NULL; + struct usbd_audio_attribute_control *current_control = NULL; usb_slist_t *i; uint8_t entity_id; uint8_t control_selector; @@ -136,10 +167,10 @@ static int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t * return -2; } + current_control = (struct usbd_audio_attribute_control *)current_entity_info->priv; + if (current_entity_info->bDescriptorSubtype == AUDIO_CONTROL_FEATURE_UNIT) { #if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 - struct usbd_audio_v1_feature_unit_control *current_control = (struct usbd_audio_v1_feature_unit_control *)current_entity_info->priv; - float volume2db = 0.0; switch (control_selector) { @@ -204,14 +235,12 @@ static int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t * break; } #else - struct usbd_audio_v2_feature_unit_control *control = (struct usbd_audio_v2_feature_unit_control *)current_entity_info->priv; - switch (setup->bRequest) { case AUDIO_REQUEST_CUR: switch (control_selector) { case AUDIO_FU_CONTROL_MUTE: if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { - (*data)[0] = control->mute_bCUR; + (*data)[0] = current_control->mute_bCUR; *len = 1; } else { mute = (*data)[0]; @@ -221,12 +250,12 @@ static int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t * break; case AUDIO_FU_CONTROL_VOLUME: if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { - (*data)[0] = control->volume_bCUR & 0XFF; - (*data)[1] = (control->volume_bCUR >> 8) & 0xff; + (*data)[0] = current_control->volume_bCUR & 0XFF; + (*data)[1] = (current_control->volume_bCUR >> 8) & 0xff; *len = 2; } else { volume = (((uint16_t)(*data)[1] << 8) | ((uint16_t)(*data)[0])); - control->volume_bCUR = volume; + current_control->volume_bCUR = volume; USB_LOG_INFO("Set ch[%d] %d dB\r\n", ch, volume); usbd_audio_set_volume(ch, volume); } @@ -240,10 +269,10 @@ static int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t * switch (control_selector) { case AUDIO_FU_CONTROL_VOLUME: if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { - *((uint16_t *)(*data + 0)) = control->volume.wNumSubRanges; - *((uint16_t *)(*data + 2)) = control->volume.subrange[ch].wMin; - *((uint16_t *)(*data + 4)) = control->volume.subrange[ch].wMax; - *((uint16_t *)(*data + 6)) = control->volume.subrange[ch].wRes; + *((uint16_t *)(*data + 0)) = current_control->volume.wNumSubRanges; + *((uint16_t *)(*data + 2)) = current_control->volume.subrange[ch].wMin; + *((uint16_t *)(*data + 4)) = current_control->volume.subrange[ch].wMax; + *((uint16_t *)(*data + 6)) = current_control->volume.subrange[ch].wRes; *len = 8; } else { } @@ -267,17 +296,13 @@ static int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t * switch (control_selector) { case AUDIO_CS_CONTROL_SAM_FREQ: if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { - uint8_t param_block[] = { - 0x80, - 0xbb, - 0x00, - 0x00 - }; - memcpy(*data, param_block, sizeof(param_block)); + uint32_t current_sampling_freq = current_control->sampling_freq[ch]; + memcpy(*data, ¤t_sampling_freq, sizeof(uint32_t)); *len = 4; } else { uint32_t sampling_freq; memcpy(&sampling_freq, *data, setup->wLength); + current_control->sampling_freq[ch] = sampling_freq; USB_LOG_INFO("Set ch[%d] %d Hz\r\n", ch, (int)sampling_freq); usbd_audio_set_sampling_freq(ch, sampling_freq); } @@ -298,29 +323,13 @@ static int audio_class_request_handler(struct usb_setup_packet *setup, uint8_t * switch (control_selector) { case AUDIO_CS_CONTROL_SAM_FREQ: if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { - uint8_t param_block[] = { - AUDIO_SAMPLE_FREQ_NUM(6), - AUDIO_SAMPLE_FREQ_4B(16000), - AUDIO_SAMPLE_FREQ_4B(16000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(48000), - AUDIO_SAMPLE_FREQ_4B(48000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(96000), - AUDIO_SAMPLE_FREQ_4B(96000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(44100), - AUDIO_SAMPLE_FREQ_4B(44100), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(8000), - AUDIO_SAMPLE_FREQ_4B(8000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(32000), - AUDIO_SAMPLE_FREQ_4B(32000), - AUDIO_SAMPLE_FREQ_4B(0x00), - }; - memcpy(*data, param_block, sizeof(param_block)); - *len = sizeof(param_block); + uint8_t *sampling_freq_table = NULL; + uint16_t num; + + usbd_audio_get_sampling_freq_table(&sampling_freq_table); + num = (uint16_t)((uint16_t)(sampling_freq_table[1] << 8) | ((uint16_t)sampling_freq_table[0])); + *data = sampling_freq_table; + *len = (12 * num + 2); } else { } break; @@ -395,8 +404,8 @@ void usbd_audio_add_entity(uint8_t entity_id, uint16_t bDescriptorSubtype) if (bDescriptorSubtype == AUDIO_CONTROL_FEATURE_UNIT) { #if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 - struct usbd_audio_v1_feature_unit_control *control = malloc(sizeof(struct usbd_audio_v1_feature_unit_control)); - memset(control, 0, sizeof(struct usbd_audio_v1_feature_unit_control)); + struct usbd_audio_attribute_control *control = malloc(sizeof(struct usbd_audio_attribute_control)); + memset(control, 0, sizeof(struct usbd_audio_attribute_control)); for (uint8_t ch = 0; ch < CONFIG_USBDEV_AUDIO_MAX_CHANNEL; ch++) { control->volume[ch].vol_min = 0xdb00; control->volume[ch].vol_max = 0x0000; @@ -406,14 +415,15 @@ void usbd_audio_add_entity(uint8_t entity_id, uint16_t bDescriptorSubtype) control->automatic_gain[ch] = 0; } #else - struct usbd_audio_v2_feature_unit_control *control = malloc(sizeof(struct usbd_audio_v2_feature_unit_control)); - memset(control, 0, sizeof(struct usbd_audio_v2_feature_unit_control)); + struct usbd_audio_attribute_control *control = malloc(sizeof(struct usbd_audio_attribute_control)); + memset(control, 0, sizeof(struct usbd_audio_attribute_control)); for (uint8_t ch = 0; ch < CONFIG_USBDEV_AUDIO_MAX_CHANNEL; ch++) { control->volume.wNumSubRanges = 1; control->volume.subrange[ch].wMin = 0; control->volume.subrange[ch].wMax = 100; control->volume.subrange[ch].wRes = 1; control->mute[ch] = 0; + control->sampling_freq[ch] = 16000; control->volume_bCUR = 50; control->mute_bCUR = 0; } @@ -437,6 +447,11 @@ __WEAK void usbd_audio_set_sampling_freq(uint8_t ep_ch, uint32_t sampling_freq) { } +__WEAK void usbd_audio_get_sampling_freq_table(uint8_t **sampling_freq_table) +{ + *sampling_freq_table = (uint8_t *)default_sampling_freq_table; +} + __WEAK void usbd_audio_set_pitch(uint8_t ep, bool enable) { } diff --git a/class/audio/usbd_audio.h b/class/audio/usbd_audio.h index 387fe4c3..42a4614d 100644 --- a/class/audio/usbd_audio.h +++ b/class/audio/usbd_audio.h @@ -37,6 +37,7 @@ void usbd_audio_add_entity(uint8_t entity_id, uint16_t bDescriptorSubtype); void usbd_audio_set_volume(uint8_t ch, float dB); void usbd_audio_set_mute(uint8_t ch, uint8_t enable); void usbd_audio_set_sampling_freq(uint8_t ep_ch, uint32_t sampling_freq); +void usbd_audio_get_sampling_freq_table(uint8_t **sampling_freq_table); void usbd_audio_set_pitch(uint8_t ep, bool enable); void usbd_audio_sof_callback(void); diff --git a/demo/audio_v2_mic_dualchan_template.c b/demo/audio_v2_mic_dualchan_template.c new file mode 100644 index 00000000..9f6bf8c7 --- /dev/null +++ b/demo/audio_v2_mic_dualchan_template.c @@ -0,0 +1,170 @@ +#include "usbd_core.h" +#include "usbd_audio.h" + +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#ifdef CONFIG_USB_HS +#define EP_INTERVAL 0x04 +#else +#define EP_INTERVAL 0x01 +#endif + +#define AUDIO_IN_EP 0x01 + +#define AUDIO_FREQ 96000 +/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ +/* 16bit(2 Bytes) 双声道(Mono:2) */ + +#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_FREQ * 2 * 2) / 1000)) + +#define HALF_WORD_BYTES 2 //2 half word (one channel) +#define SAMPLE_BITS 16 //16 bit per channel + +#define CHANNEL_NUM 2 + +#define BMCONTROL (AUDIO_V2_FU_CONTROL_MUTE | AUDIO_V2_FU_CONTROL_VOLUME) + +#define USB_AUDIO_CONFIG_DESC_SIZ (9 + \ + AUDIO_V2_AC_DESCRIPTOR_INIT_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_DESCRIPTOR_INIT_LEN) + +#define AUDIO_AC_SIZ (AUDIO_V2_SIZEOF_AC_HEADER_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC) + +const uint8_t audio_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_MICROPHONE, 0x00, 0x00), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(0x01, 0x03, 0x07), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_INTERM_MIC, 0x01, CHANNEL_NUM, 0x00000003, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x03, 0x02, DBVAL(BMCONTROL), DBVAL(BMCONTROL)), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x03, 0x01, 0x0000), + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, CHANNEL_NUM, 0x00000003, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, AUDIO_IN_PACKET, EP_INTERVAL), + /////////////////////////////////////// + /// string0 descriptor + /////////////////////////////////////// + USB_LANGID_INIT(USBD_LANGID_STRING), + /////////////////////////////////////// + /// string1 descriptor + /////////////////////////////////////// + 0x14, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + /////////////////////////////////////// + /// string2 descriptor + /////////////////////////////////////// + 0x26, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + 'C', 0x00, /* wcChar0 */ + 'h', 0x00, /* wcChar1 */ + 'e', 0x00, /* wcChar2 */ + 'r', 0x00, /* wcChar3 */ + 'r', 0x00, /* wcChar4 */ + 'y', 0x00, /* wcChar5 */ + 'U', 0x00, /* wcChar6 */ + 'S', 0x00, /* wcChar7 */ + 'B', 0x00, /* wcChar8 */ + ' ', 0x00, /* wcChar9 */ + 'U', 0x00, /* wcChar10 */ + 'A', 0x00, /* wcChar11 */ + 'C', 0x00, /* wcChar12 */ + ' ', 0x00, /* wcChar13 */ + 'D', 0x00, /* wcChar14 */ + 'E', 0x00, /* wcChar15 */ + 'M', 0x00, /* wcChar16 */ + 'O', 0x00, /* wcChar17 */ + /////////////////////////////////////// + /// string3 descriptor + /////////////////////////////////////// + 0x16, /* bLength */ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ + '2', 0x00, /* wcChar0 */ + '0', 0x00, /* wcChar1 */ + '2', 0x00, /* wcChar2 */ + '1', 0x00, /* wcChar3 */ + '0', 0x00, /* wcChar4 */ + '3', 0x00, /* wcChar5 */ + '1', 0x00, /* wcChar6 */ + '0', 0x00, /* wcChar7 */ + '0', 0x00, /* wcChar8 */ + '4', 0x00, /* wcChar9 */ +#ifdef CONFIG_USB_HS + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +#endif + 0x00 +}; +volatile bool tx_flag = 0; + +void usbd_audio_open(uint8_t intf) +{ + tx_flag = 1; + printf("OPEN\r\n"); +} +void usbd_audio_close(uint8_t intf) +{ + printf("CLOSE\r\n"); + tx_flag = 0; +} + +static usbd_class_t audio_class; +static usbd_interface_t audio_control_intf; +static usbd_interface_t audio_stream_intf; + +void usbd_audio_iso_callback(uint8_t ep) +{ +} + +static usbd_endpoint_t audio_in_ep = { + .ep_cb = usbd_audio_iso_callback, + .ep_addr = AUDIO_IN_EP +}; + +void audio_init() +{ + usbd_desc_register(audio_descriptor); + usbd_audio_add_interface(&audio_class, &audio_control_intf); + usbd_audio_add_interface(&audio_class, &audio_stream_intf); + usbd_interface_add_endpoint(&audio_stream_intf, &audio_in_ep); + usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); + usbd_audio_add_entity(0x03, AUDIO_CONTROL_FEATURE_UNIT); + + usbd_initialize(); +} + +void audio_test() +{ + while (1) { + if (tx_flag) { + } + } +} diff --git a/demo/audio_v2_speaker_dualchan_template.c b/demo/audio_v2_speaker_dualchan_template.c index 061f95b3..0013603b 100644 --- a/demo/audio_v2_speaker_dualchan_template.c +++ b/demo/audio_v2_speaker_dualchan_template.c @@ -14,7 +14,7 @@ #define AUDIO_OUT_EP 0x01 -#define AUDIO_FREQ 48000 +#define AUDIO_FREQ 96000 /* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ /* 16bit(2 Bytes) 双声道(Mono:2) */ @@ -123,17 +123,17 @@ const uint8_t audio_descriptor[] = { #endif 0x00 }; -volatile bool tx_flag = 0; +volatile bool rx_flag = 0; void usbd_audio_open(uint8_t intf) { - tx_flag = 1; + rx_flag = 1; printf("OPEN\r\n"); } void usbd_audio_close(uint8_t intf) { printf("CLOSE\r\n"); - tx_flag = 0; + rx_flag = 0; } static usbd_class_t audio_class; @@ -146,7 +146,7 @@ void usbd_audio_iso_callback(uint8_t ep) static usbd_endpoint_t audio_in_ep = { .ep_cb = usbd_audio_iso_callback, - .ep_addr = AUDIO_IN_EP + .ep_addr = AUDIO_OUT_EP }; void audio_init() @@ -164,7 +164,7 @@ void audio_init() void audio_test() { while (1) { - if (tx_flag) { + if (rx_flag) { } } }