summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-04-09 16:29:41 +0800
committersakumisu <[email protected]>2022-04-09 17:15:06 +0800
commit065a0a4a0b0c8c860e081db27832625ea2d58da8 (patch)
tree4f1e5e511ba5891887441a0cbd33cf263196fba1
parent7fbffaf927c02e1f82448824e4b15d89d2ad2932 (diff)
update audio class driver
-rw-r--r--class/audio/usb_audio.h102
-rw-r--r--class/audio/usbd_audio.c119
-rw-r--r--class/audio/usbd_audio.h1
-rw-r--r--demo/audio_v2_mic_dualchan_template.c170
-rw-r--r--demo/audio_v2_speaker_dualchan_template.c12
5 files changed, 295 insertions, 109 deletions
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, &current_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) {
}
}
}