Skip to content

Commit dfcab87

Browse files
authored
Merge pull request #3270 from HiFiPhile/uac1
audio: Add UAC1.0 support
2 parents fc3857e + aa739c9 commit dfcab87

File tree

41 files changed

+3414
-2173
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+3414
-2173
lines changed

examples/device/audio_4_channel_mic/src/main.c

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ uint32_t sampFreq;
6666
uint8_t clkValid;
6767

6868
// Range states
69-
audio_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state
70-
audio_control_range_4_n_t(1) sampleFreqRng; // Sample frequency range state
69+
audio20_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state
70+
audio20_control_range_4_n_t(1) sampleFreqRng; // Sample frequency range state
7171

7272
// Audio test data, 4 channels muxed together, buffer[0] for CH0, buffer[1] for CH1, buffer[2] for CH2, buffer[3] for CH3
7373
uint16_t i2s_dummy_buffer[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX * CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000];
@@ -171,7 +171,7 @@ bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_req
171171
(void) pBuff;
172172

173173
// We do not support any set range requests here, only current value requests
174-
TU_VERIFY(p_request->bRequest == AUDIO_CS_REQ_CUR);
174+
TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);
175175

176176
// Page 91 in UAC2 specification
177177
uint8_t channelNum = TU_U16_LOW(p_request->wValue);
@@ -191,7 +191,7 @@ bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_re
191191
(void) pBuff;
192192

193193
// We do not support any set range requests here, only current value requests
194-
TU_VERIFY(p_request->bRequest == AUDIO_CS_REQ_CUR);
194+
TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);
195195

196196
// Page 91 in UAC2 specification
197197
uint8_t channelNum = TU_U16_LOW(p_request->wValue);
@@ -218,25 +218,25 @@ bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
218218
(void) itf;
219219

220220
// We do not support any set range requests here, only current value requests
221-
TU_VERIFY(p_request->bRequest == AUDIO_CS_REQ_CUR);
221+
TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);
222222

223223
// If request is for our feature unit
224224
if (entityID == 2) {
225225
switch (ctrlSel) {
226-
case AUDIO_FU_CTRL_MUTE:
226+
case AUDIO20_FU_CTRL_MUTE:
227227
// Request uses format layout 1
228-
TU_VERIFY(p_request->wLength == sizeof(audio_control_cur_1_t));
228+
TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_1_t));
229229

230-
mute[channelNum] = ((audio_control_cur_1_t *) pBuff)->bCur;
230+
mute[channelNum] = ((audio20_control_cur_1_t *) pBuff)->bCur;
231231

232232
TU_LOG2(" Set Mute: %d of channel: %u\r\n", mute[channelNum], channelNum);
233233
return true;
234234

235-
case AUDIO_FU_CTRL_VOLUME:
235+
case AUDIO20_FU_CTRL_VOLUME:
236236
// Request uses format layout 2
237-
TU_VERIFY(p_request->wLength == sizeof(audio_control_cur_2_t));
237+
TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_2_t));
238238

239-
volume[channelNum] = (uint16_t) ((audio_control_cur_2_t *) pBuff)->bCur;
239+
volume[channelNum] = (uint16_t) ((audio20_control_cur_2_t *) pBuff)->bCur;
240240

241241
TU_LOG2(" Set Volume: %d dB of channel: %u\r\n", volume[channelNum], channelNum);
242242
return true;
@@ -297,13 +297,13 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
297297
// Input terminal (Microphone input)
298298
if (entityID == 1) {
299299
switch (ctrlSel) {
300-
case AUDIO_TE_CTRL_CONNECTOR: {
300+
case AUDIO20_TE_CTRL_CONNECTOR: {
301301
// The terminal connector control only has a get request with only the CUR attribute.
302-
audio_desc_channel_cluster_t ret;
302+
audio20_desc_channel_cluster_t ret;
303303

304304
// Those are dummy values for now
305305
ret.bNrChannels = 1;
306-
ret.bmChannelConfig = (audio_channel_config_t) 0;
306+
ret.bmChannelConfig = (audio20_channel_config_t) 0;
307307
ret.iChannelNames = 0;
308308

309309
TU_LOG2(" Get terminal connector\r\n");
@@ -321,24 +321,23 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
321321
// Feature unit
322322
if (entityID == 2) {
323323
switch (ctrlSel) {
324-
case AUDIO_FU_CTRL_MUTE:
324+
case AUDIO20_FU_CTRL_MUTE:
325325
// Audio control mute cur parameter block consists of only one byte - we thus can send it right away
326326
// There does not exist a range parameter block for mute
327327
TU_LOG2(" Get Mute of channel: %u\r\n", channelNum);
328328
return tud_control_xfer(rhport, p_request, &mute[channelNum], 1);
329329

330-
case AUDIO_FU_CTRL_VOLUME:
330+
case AUDIO20_FU_CTRL_VOLUME:
331331
switch (p_request->bRequest) {
332-
case AUDIO_CS_REQ_CUR:
332+
case AUDIO20_CS_REQ_CUR:
333333
TU_LOG2(" Get Volume of channel: %u\r\n", channelNum);
334334
return tud_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));
335335

336-
case AUDIO_CS_REQ_RANGE:
336+
case AUDIO20_CS_REQ_RANGE:
337337
TU_LOG2(" Get Volume range of channel: %u\r\n", channelNum);
338338

339339
// Copy values - only for testing - better is version below
340-
audio_control_range_2_n_t(1)
341-
ret;
340+
audio20_control_range_2_n_t(1) ret;
342341

343342
ret.wNumSubRanges = 1;
344343
ret.subrange[0].bMin = -90;// -90 dB
@@ -364,15 +363,15 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
364363
// Clock Source unit
365364
if (entityID == 4) {
366365
switch (ctrlSel) {
367-
case AUDIO_CS_CTRL_SAM_FREQ:
366+
case AUDIO20_CS_CTRL_SAM_FREQ:
368367
// channelNum is always zero in this case
369368
switch (p_request->bRequest) {
370-
case AUDIO_CS_REQ_CUR:
369+
case AUDIO20_CS_REQ_CUR:
371370
TU_LOG2(" Get Sample Freq.\r\n");
372371
// Buffered control transfer is needed for IN flow control to work
373372
return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));
374373

375-
case AUDIO_CS_REQ_RANGE:
374+
case AUDIO20_CS_REQ_RANGE:
376375
TU_LOG2(" Get Sample Freq. range\r\n");
377376
return tud_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));
378377

@@ -383,7 +382,7 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
383382
}
384383
break;
385384

386-
case AUDIO_CS_CTRL_CLK_VALID:
385+
case AUDIO20_CS_CTRL_CLK_VALID:
387386
// Only cur attribute exists for this request
388387
TU_LOG2(" Get Sample Freq. valid\r\n");
389388
return tud_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));

examples/device/audio_4_channel_mic/src/tusb_config.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,10 @@ extern "C" {
105105
// Have a look into audio_device.h for all configurations
106106
#define CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE 48000
107107

108-
#define CFG_TUD_AUDIO_FUNC_1_DESC_LEN TUD_AUDIO_MIC_FOUR_CH_DESC_LEN
109-
110-
#define CFG_TUD_AUDIO_FUNC_1_CTRL_BUF_SZ 64
111-
112108
#define CFG_TUD_AUDIO_ENABLE_EP_IN 1
113109
#define CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX 2 // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup
114110
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX 4 // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup
115-
#define CFG_TUD_AUDIO_EP_SZ_IN TUD_AUDIO_EP_SIZE(CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)
111+
#define CFG_TUD_AUDIO_EP_SZ_IN TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)
116112

117113
#define CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL 1
118114

examples/device/audio_4_channel_mic/src/usb_descriptors.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ enum
8080
ITF_NUM_TOTAL
8181
};
8282

83-
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO_MIC_FOUR_CH_DESC_LEN)
83+
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO20_MIC_FOUR_CH_DESC_LEN)
8484

8585
#if TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)
8686
// LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number
@@ -101,7 +101,7 @@ uint8_t const desc_configuration[] =
101101
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
102102

103103
// Interface number, string index, EP Out & EP In address, EP size
104-
TUD_AUDIO_MIC_FOUR_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)
104+
TUD_AUDIO20_MIC_FOUR_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)
105105
};
106106

107107
// Invoked when received GET CONFIGURATION DESCRIPTOR

examples/device/audio_4_channel_mic_freertos/src/main.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ uint32_t sampFreq;
102102
uint8_t clkValid;
103103

104104
// Range states
105-
audio_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state
106-
audio_control_range_4_n_t(1) sampleFreqRng; // Sample frequency range state
105+
audio20_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state
106+
audio20_control_range_4_n_t(1) sampleFreqRng; // Sample frequency range state
107107

108108
// Audio test data, 4 channels muxed together, buffer[0] for CH0, buffer[1] for CH1, buffer[2] for CH2, buffer[3] for CH3
109109
uint16_t i2s_dummy_buffer[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX * CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000];
@@ -245,7 +245,7 @@ bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_req
245245
(void) pBuff;
246246

247247
// We do not support any set range requests here, only current value requests
248-
TU_VERIFY(p_request->bRequest == AUDIO_CS_REQ_CUR);
248+
TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);
249249

250250
// Page 91 in UAC2 specification
251251
uint8_t channelNum = TU_U16_LOW(p_request->wValue);
@@ -265,7 +265,7 @@ bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_re
265265
(void) pBuff;
266266

267267
// We do not support any set range requests here, only current value requests
268-
TU_VERIFY(p_request->bRequest == AUDIO_CS_REQ_CUR);
268+
TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);
269269

270270
// Page 91 in UAC2 specification
271271
uint8_t channelNum = TU_U16_LOW(p_request->wValue);
@@ -292,25 +292,25 @@ bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
292292
(void) itf;
293293

294294
// We do not support any set range requests here, only current value requests
295-
TU_VERIFY(p_request->bRequest == AUDIO_CS_REQ_CUR);
295+
TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);
296296

297297
// If request is for our feature unit
298298
if (entityID == 2) {
299299
switch (ctrlSel) {
300-
case AUDIO_FU_CTRL_MUTE:
300+
case AUDIO20_FU_CTRL_MUTE:
301301
// Request uses format layout 1
302-
TU_VERIFY(p_request->wLength == sizeof(audio_control_cur_1_t));
302+
TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_1_t));
303303

304-
mute[channelNum] = ((audio_control_cur_1_t *) pBuff)->bCur;
304+
mute[channelNum] = ((audio20_control_cur_1_t *) pBuff)->bCur;
305305

306306
TU_LOG1(" Set Mute: %d of channel: %u\r\n", mute[channelNum], channelNum);
307307
return true;
308308

309-
case AUDIO_FU_CTRL_VOLUME:
309+
case AUDIO20_FU_CTRL_VOLUME:
310310
// Request uses format layout 2
311-
TU_VERIFY(p_request->wLength == sizeof(audio_control_cur_2_t));
311+
TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_2_t));
312312

313-
volume[channelNum] = ((audio_control_cur_2_t *) pBuff)->bCur;
313+
volume[channelNum] = ((audio20_control_cur_2_t *) pBuff)->bCur;
314314
TU_LOG1(" Set Volume: %d dB of channel: %u\r\n", volume[channelNum], channelNum);
315315
return true;
316316

@@ -368,9 +368,9 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
368368
// Input terminal (Microphone input)
369369
if (entityID == 1) {
370370
switch (ctrlSel) {
371-
case AUDIO_TE_CTRL_CONNECTOR: {
371+
case AUDIO20_TE_CTRL_CONNECTOR: {
372372
// The terminal connector control only has a get request with only the CUR attribute.
373-
audio_desc_channel_cluster_t ret;
373+
audio20_desc_channel_cluster_t ret;
374374

375375
// Those are dummy values for now
376376
ret.bNrChannels = 1;
@@ -392,23 +392,23 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
392392
// Feature unit
393393
if (entityID == 2) {
394394
switch (ctrlSel) {
395-
case AUDIO_FU_CTRL_MUTE:
395+
case AUDIO20_FU_CTRL_MUTE:
396396
// Audio control mute cur parameter block consists of only one byte - we thus can send it right away
397397
// There does not exist a range parameter block for mute
398398
TU_LOG1(" Get Mute of channel: %u\r\n", channelNum);
399399
return tud_control_xfer(rhport, p_request, &mute[channelNum], 1);
400400

401-
case AUDIO_FU_CTRL_VOLUME:
401+
case AUDIO20_FU_CTRL_VOLUME:
402402
switch (p_request->bRequest) {
403-
case AUDIO_CS_REQ_CUR:
403+
case AUDIO20_CS_REQ_CUR:
404404
TU_LOG1(" Get Volume of channel: %u\r\n", channelNum);
405405
return tud_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));
406406

407-
case AUDIO_CS_REQ_RANGE:
407+
case AUDIO20_CS_REQ_RANGE:
408408
TU_LOG1(" Get Volume range of channel: %u\r\n", channelNum);
409409

410410
// Copy values - only for testing - better is version below
411-
audio_control_range_2_n_t(1) ret;
411+
audio20_control_range_2_n_t(1) ret;
412412

413413
ret.wNumSubRanges = 1;
414414
ret.subrange[0].bMin = -90;// -90 dB
@@ -434,15 +434,15 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
434434
// Clock Source unit
435435
if (entityID == 4) {
436436
switch (ctrlSel) {
437-
case AUDIO_CS_CTRL_SAM_FREQ:
437+
case AUDIO20_CS_CTRL_SAM_FREQ:
438438
// channelNum is always zero in this case
439439
switch (p_request->bRequest) {
440-
case AUDIO_CS_REQ_CUR:
440+
case AUDIO20_CS_REQ_CUR:
441441
TU_LOG1(" Get Sample Freq.\r\n");
442442
// Buffered control transfer is needed for IN flow control to work
443443
return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));
444444

445-
case AUDIO_CS_REQ_RANGE:
445+
case AUDIO20_CS_REQ_RANGE:
446446
TU_LOG1(" Get Sample Freq. range\r\n");
447447
return tud_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));
448448

@@ -453,7 +453,7 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
453453
}
454454
break;
455455

456-
case AUDIO_CS_CTRL_CLK_VALID:
456+
case AUDIO20_CS_CTRL_CLK_VALID:
457457
// Only cur attribute exists for this request
458458
TU_LOG1(" Get Sample Freq. valid\r\n");
459459
return tud_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));

examples/device/audio_4_channel_mic_freertos/src/tusb_config.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,10 @@ extern "C" {
111111
// Have a look into audio_device.h for all configurations
112112
#define CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE 48000
113113

114-
#define CFG_TUD_AUDIO_FUNC_1_DESC_LEN TUD_AUDIO_MIC_FOUR_CH_DESC_LEN
115-
116-
#define CFG_TUD_AUDIO_FUNC_1_CTRL_BUF_SZ 64
117-
118114
#define CFG_TUD_AUDIO_ENABLE_EP_IN 1
119115
#define CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX 2 // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup
120116
#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX 4 // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup
121-
#define CFG_TUD_AUDIO_EP_SZ_IN TUD_AUDIO_EP_SIZE(CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)
117+
#define CFG_TUD_AUDIO_EP_SZ_IN TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)
122118

123119
#define CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL 1
124120

examples/device/audio_4_channel_mic_freertos/src/usb_descriptors.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ enum
8080
ITF_NUM_TOTAL
8181
};
8282

83-
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO_MIC_FOUR_CH_DESC_LEN)
83+
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO20_MIC_FOUR_CH_DESC_LEN)
8484

8585
#if TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)
8686
// LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number
@@ -101,7 +101,7 @@ uint8_t const desc_configuration[] =
101101
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
102102

103103
// Interface number, string index, EP Out & EP In address, EP size
104-
TUD_AUDIO_MIC_FOUR_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)
104+
TUD_AUDIO20_MIC_FOUR_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)
105105
};
106106

107107
// Invoked when received GET CONFIGURATION DESCRIPTOR

0 commit comments

Comments
 (0)