M480 BSP V3.05.005
The Board Support Package for M480 Series
uac.h
Go to the documentation of this file.
1/**************************************************************************/
9#ifndef __INCLUDED_UAC_H__
10#define __INCLUDED_UAC_H__
11
12
14
15//#define UAC_DEBUG
16
17/*
18 * Debug message
19 */
20#define UAC_ERRMSG printf
21#ifdef UAC_DEBUG
22#define UAC_DBGMSG printf
23#else
24#define UAC_DBGMSG(...)
25#endif
26
27typedef enum
28{
29 UAC_STATE_CONNECTING,
30 UAC_STATE_READY,
31 UAC_STATE_RUNNING,
32 UAC_STATE_DISCONNECTING,
33} UAC_STATE_E;
34
35
36/* Audio Interface Subclass Codes (A.2) */
37#define SUBCLS_UNDEFINED 0x00
38#define SUBCLS_AUDIOCONTROL 0x01
39#define SUBCLS_AUDIOSTREAMING 0x02
40#define SUBCLS_MIDISTREAMING 0x03
41
42/* Audio Interface Protocol Code (A.3) */
43#define PR_PROTOCOL_UNDEFINED 0x00
44
45/* Audio Class-specific descritpor types (A.4) */
46#define CS_UNDEFINED 0x20
47#define CS_DEVICE 0x21
48#define CS_CONFIGURATION 0x22
49#define CS_STRING 0x23
50#define CS_INTERFACE 0x24
51#define CS_ENDPOINT 0x25
52
53/* Audio Class-Specific AC Interface Descriptor Subtypes (A.5) */
54#define AC_DESCRIPTOR_UNDEFINED 0x00
55#define HEADER 0x01
56#define INPUT_TERMINAL 0x02
57#define OUTPUT_TERMINAL 0x03
58#define MIXER_UNIT 0x04
59#define SELECTOR_UNIT 0x05
60#define FEATURE_UNIT 0x06
61#define PROCESSING_UNIT 0x07
62#define EXTENSION_UNIT 0x08
63
64/* Audio Class-Specific AS Interface Descriptor Subtypes (A.6) */
65#define AS_DESCRIPTOR_UNDEFINED 0x00
66#define AS_GENERAL 0x01
67#define FORMAT_TYPE 0x02
68#define FORMAT_SPECIFIC 0x03
69
70/* Processing Unit Process Types (A.7) */
71#define PROCESS_UNDEFINED 0x00
72#define UP_DOWNMIX_PROCESS 0x01
73#define DOLBY_PROLOGIC_PROCESS 0x02
74#define _3D_STEREO_EXTENDER_PROCESS 0x03
75#define REVERBERATION_PROCESS 0x04
76#define CHORUS_PROCESS 0x05
77#define DYN_RANGE_COMP_PROCESS 0x06
78
79/* Audio Class-Specific Endpoint Descriptor Subtypes (A.8) */
80#define DESCRIPTOR_UNDEFINED 0x00
81#define EP_GENERAL 0x01
82
83/* Audio Class-Specific Request Codes (A.9) */
84#define REQUEST_CODE_UNDEFINED 0x00
85#define SET_CUR 0x01
86#define GET_CUR 0x81
87#define SET_MIN 0x02
88#define GET_MIN 0x82
89#define SET_MAX 0x03
90#define GET_MAX 0x83
91#define SET_RES 0x04
92#define GET_RES 0x84
93#define SET_MEM 0x05
94#define GET_MEM 0x85
95#define GET_STAT 0xFF
96
97/* Terminal Control Selectors (A.10.1) */
98#define TE_CONTROL_UNDEFINED 0x00
99#define COPY_PROTECT_CONTROL 0x01
100
101/* Feature Unit Control Selectors (A.10.2) */
102#define FU_CONTROL_UNDEFINED 0x00
103#define MUTE_CONTROL 0x01
104#define VOLUME_CONTROL 0x02
105#define BASS_CONTROL 0x03
106#define MID_CONTROL 0x04
107#define TREBLE_CONTROL 0x05
108#define GRAPHIC_EQUALIZER_CONTROL 0x06
109#define AUTOMATIC_GAIN_CONTROL 0x07
110#define DELAY_CONTROL 0x08
111#define BASS_BOOST_CONTROL 0x09
112#define LOUDNESS_CONTROL 0x0A
113
114/* Up/Down-mix Processing Unit Control Selectors (A.10.3.1) */
115#define UD_CONTROL_UNDEFINED 0x00
116#define UD_ENABLE_CONTROL 0x01
117#define UD_MODE_SELECT_CONTROL 0x02
118
119/* Dolby Prologic Processing Unit Control Selectors (A.10.3.2) */
120#define DP_CONTROL_UNDEFINED 0x00
121#define DP_ENABLE_CONTROL 0x01
122#define DP_MODE_SELECT_CONTROL 0x02
123
124/* 3D Stereo Extender Processing Unit Control Selectors (A.10.3.3) */
125#define _3D_CONTROL_UNDEFINED 0x00
126#define _3D_ENABLE_CONTROL 0x01
127#define SPACIOUSNESS_CONTROL 0x03
128
129/* Reverberation Processing Unit Control Selectors (A.10.3.4) */
130#define RV_CONTROL_UNDEFINED 0x00
131#define RV_ENABLE_CONTROL 0x01
132#define REVERB_LEVEL_CONTROL 0x02
133#define REVERB_TIME_CONTROL 0x03
134#define REVERB_FEEDBACK_CONTROL 0x04
135
136/* Chorus Processing Unit Control Selectors (A.10.3.5) */
137#define CH_CONTROL_UNDEFINED 0x00
138#define CH_ENABLE_CONTROL 0x01
139#define CHORUS_LEVEL_CONTROL 0x02
140#define CHORUS_RATE_CONTROL 0x03
141#define CHORUS_DEPTH_CONTROL 0x04
142
143/* Dynamic Range Compressor Processing Unit Control Selectors (A.10.3.6) */
144#define DR_CONTROL_UNDEFINED 0x00
145#define DR_ENABLE_CONTROL 0x01
146#define COMPRESSION_RATE_CONTROL 0x02
147#define MAXAMPL_CONTROL 0x03
148#define THRESHOLD_CONTROL 0x04
149#define ATTACK_TIME 0x05
150#define RELEASE_TIME 0x06
151
152/* Extension Unit Control Selectors (A.10.4) */
153#define XU_CONTROL_UNDEFINED 0x00
154#define XU_ENABLE_CONTROL 0x01
155
156/* Endpoint Control Selectors (A.10.5) */
157#define EP_CONTROL_UNDEFINED 0x00
158#define SAMPLING_FREQ_CONTROL 0x01
159#define PITCH_CONTROL 0x02
160
161/* Format Type Codes of Format Type Descriptor bFormatType field */
162#define FORMAT_TYPE_UNDEFINED 0x00
163#define FORMAT_TYPE_I 0x01
164#define FORMAT_TYPE_II 0x02
165#define FORMAT_TYPE_III 0x03
166
167
168/*-----------------------------------------------------------------------------------
169 * Audio Class Control Interface Descriptor header
170 */
171#ifdef __ICCARM__
172typedef struct cs_hdr_t
173{
174 __packed uint8_t bLength;
175 __packed uint8_t bDescriptorType;
176 __packed uint8_t bDescriptorSubtype;
177} CS_HDR_T;
178#else
179typedef struct __attribute__((__packed__)) cs_hdr_t
180{
181 uint8_t bLength;
182 uint8_t bDescriptorType;
183 uint8_t bDescriptorSubtype;
184} CS_HDR_T;
185#endif
186
187/*-----------------------------------------------------------------------------------
188 * Class-Specific AC Interface Header Descriptor (4.3.2)
189 */
190#ifdef __ICCARM__
191typedef struct ac_if_header
192{
193 __packed uint8_t bLength;
194 __packed uint8_t bDescriptorType;
195 __packed uint8_t bDescriptorSubtype;
196 __packed uint16_t bcdADC;
197 __packed uint16_t wTotalLength;
200 __packed uint8_t bInCollection;
202} AC_IF_HDR_T;
203#else
204typedef struct __attribute__((__packed__)) ac_if_header
205{
206 uint8_t bLength;
207 uint8_t bDescriptorType;
208 uint8_t bDescriptorSubtype;
209 uint16_t bcdADC;
210 uint16_t wTotalLength;
213 uint8_t bInCollection;
215} AC_IF_HDR_T;
216#endif
217
218/*-----------------------------------------------------------------------------------
219 * UAC Input Terminal Descriptor
220 */
221#ifdef __ICCARM__
222typedef struct ac_itd_t
223{
224 __packed uint8_t bLength;
225 __packed uint8_t bDescriptorType;
226 __packed uint8_t bDescriptorSubtype;
227 __packed uint8_t bTerminalID;
228 __packed uint16_t wTerminalType;
229 __packed uint8_t bAssocTerminal;
230 __packed uint8_t bNrChannels;
231 __packed uint16_t wChannelConfig;
232 __packed uint8_t iChannelNames;
233 __packed uint8_t iTerminal;
234} AC_IT_T;
235#else
236typedef struct __attribute__((__packed__)) ac_itd_t
237{
238 uint8_t bLength;
239 uint8_t bDescriptorType;
240 uint8_t bDescriptorSubtype;
241 uint8_t bTerminalID;
242 uint16_t wTerminalType;
243 uint8_t bAssocTerminal;
244 uint8_t bNrChannels;
245 uint16_t wChannelConfig;
246 uint8_t iChannelNames;
247 uint8_t iTerminal;
248} AC_IT_T;
249#endif
250
251/*-----------------------------------------------------------------------------------
252 * UAC Output Terminal Descriptor
253 */
254#ifdef __ICCARM__
255typedef struct ac_otd_t
256{
257 __packed uint8_t bLength;
258 __packed uint8_t bDescriptorType;
259 __packed uint8_t bDescriptorSubtype;
260 __packed uint8_t bTerminalID;
261 __packed uint16_t wTerminalType;
262 __packed uint8_t bAssocTerminal;
263 __packed uint8_t bSourceID;
264 __packed uint8_t iTerminal;
265} AC_OT_T;
266#else
267typedef struct __attribute__((__packed__)) ac_otd_t
268{
269 uint8_t bLength;
270 uint8_t bDescriptorType;
271 uint8_t bDescriptorSubtype;
272 uint8_t bTerminalID;
273 uint16_t wTerminalType;
274 uint8_t bAssocTerminal;
275 uint8_t bSourceID;
276 uint8_t iTerminal;
277} AC_OT_T;
278#endif
279
280/*---------------------------------*/
281/* Terminal Types */
282/*---------------------------------*/
283/* USB Terminal Types */
284#define UAC_TT_USB_UNDEFINED 0x0100 /* USB Terminal, undefined Type. */
285#define UAC_TT_USB_STREAMING 0x0101 /* A Terminal dealing with a signal carried
286 over an endpoint in an AudioStreaming
287 interface. The AudioStreaming interface. */
288#define UAC_TT_USB_VENDOR 0x01FF /* A Terminal dealing with a signal carried
289 over a vendor-specific interface. */
290/* Input Terminal Types */
291#define UAC_TT_INPUT_UNDEFINED 0x0200 /* Input Terminal, undefined Type. */
292#define UAC_TT_MICROPHONE 0x0201 /* A generic microphone that does not fit
293 under any of the other classifications. */
294#define UAC_TT_DESKTOP_MICROPHONE 0x0202 /* A microphone normally placed on the desktop
295 or integrated into the monitor. */
296#define UAC_TT_PERSONAL_MICROPHONE 0x0203 /* A head-mounted or clip-on microphone. */
297#define UAC_TT_OMNI_MICROPHONE 0x0204 /* A microphone designed to pick up voice from
298 more than one speaker at relatively long
299 ranges. */
300#define UAC_TT_MICROPHONE_ARRAY 0x0205 /* An array of microphones designed for
301 directional processing using host-based
302 signal processing algorithms. */
303/* Output Terminal Types */
304#define UAC_TT_OUTPUT_UNDEFINED 0x0300 /* Output Terminal, undefined Type. */
305#define UAC_TT_SPEAKER 0x0301 /* A generic speaker or set of speakers that
306 doe not fit under any of the other
307 classifications. */
308#define UAC_TT_HEADPHONES 0x0302 /* A head-mounted audio output device. */
309#define UAC_TT_HEAD_MOUNTED 0x0303 /* The audio part of a VR head mounted display.
310 The Associated Interfaces descriptor can
311 be used to reference the HID interface used
312 to report the position and orientation of
313 the HMD. */
314#define UAC_TT_DESKTOP_SPEAKER 0x0304 /* Relatively small speaker or set of speakers
315 normally placed on the desktop or
316 integrated into the monitor. These speakers
317 are close to the user and have limited
318 stereo separation. */
319#define UAC_TT_ROOM_SPEAKER 0x0305 /* Larger speaker or set of speakers that are
320 heard well anywhere in the room. */
321#define UAC_TT_COMM_SPEAKER 0x0306 /* Speaker or set of speakers designed for
322 voice communication. */
323#define UAC_TT_LFE_SPEAKER 0x0307 /* Speaker designed for low frequencies
324 (subwoofer). Not capable of reproducing
325 speech or music. */
326
327/*----------------------------------------------------------------------------------------*/
328/* UAC Mixer Unit Descriptor */
329/*----------------------------------------------------------------------------------------*/
330#ifdef __ICCARM__
331typedef struct ac_mxr_t
332{
333 __packed uint8_t bLength;
334 __packed uint8_t bDescriptorType;
335 __packed uint8_t bDescriptorSubtype;
336 __packed uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
337 __packed uint8_t bNrInPins; /* Number of Input Pins of this Unit: p */
338} AC_MXR_T;
339#else
340typedef struct __attribute__((__packed__)) ac_mxr_t
341{
342 uint8_t bLength;
343 uint8_t bDescriptorType;
344 uint8_t bDescriptorSubtype;
345 uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
346 uint8_t bNrInPins; /* Number of Input Pins of this Unit: p */
347} AC_MXR_T;
348#endif
349
350/*-----------------------------------------------------------------------------------
351 * UAC Selector Unit Descriptor
352 */
353#ifdef __ICCARM__
354typedef struct ac_su_t
355{
356 __packed uint8_t bLength;
357 __packed uint8_t bDescriptorType;
358 __packed uint8_t bDescriptorSubtype;
359 __packed uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
360 __packed uint8_t bNrInPins; /* Number of Input Pins of this Unit: p */
361} AC_SU_T;
362#else
363typedef struct __attribute__((__packed__)) ac_su_t
364{
365 uint8_t bLength;
366 uint8_t bDescriptorType;
367 uint8_t bDescriptorSubtype;
368 uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
369 uint8_t bNrInPins; /* Number of Input Pins of this Unit: p */
370} AC_SU_T;
371#endif
372
373/*-----------------------------------------------------------------------------------
374 * UAC Feature Unit Descriptor
375 */
376#ifdef __ICCARM__
377typedef struct ac_fu_t
378{
379 __packed uint8_t bLength;
380 __packed uint8_t bDescriptorType;
381 __packed uint8_t bDescriptorSubtype;
382 __packed uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
383 __packed uint8_t bSourceID; /* ID of the Unit or Terminal to which this Feature Unit is connected. */
384 __packed uint8_t bControlSize; /* Size in bytes of an element of the bmaControls() array: n */
385} AC_FU_T;
386#else
387typedef struct __attribute__((__packed__)) ac_fu_t
388{
389 uint8_t bLength;
390 uint8_t bDescriptorType;
391 uint8_t bDescriptorSubtype;
392 uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
393 uint8_t bSourceID; /* ID of the Unit or Terminal to which this Feature Unit is connected. */
394 uint8_t bControlSize; /* Size in bytes of an element of the bmaControls() array: n */
395} AC_FU_T;
396#endif
397
398/* Feature Unit Control Selectors */
399#define FU_CONTROL_UNDEFINED 0x00
400#define MUTE_CONTROL 0x01 /* Feature Unit Descriptor bmaControls bit 0 */
401#define VOLUME_CONTROL 0x02 /* Feature Unit Descriptor bmaControls bit 1 */
402#define BASS_CONTROL 0x03 /* Feature Unit Descriptor bmaControls bit 2 */
403#define MID_CONTROL 0x04
404#define TREBLE_CONTROL 0x05
405#define GRAPHIC_EQUALIZER_CONTROL 0x06
406#define AUTOMATIC_GAIN_CONTROL 0x07
407#define DELAY_CONTROL 0x08
408#define BASS_BOOST_CONTROL 0x09
409#define LOUDNESS_CONTROL 0x0A
410
411/*-----------------------------------------------------------------------------------
412 * UAC AS Isochronous Audio Data Endpoint Descriptor
413 */
414#ifdef __ICCARM__
415typedef struct as_gen_t
416{
417 __packed uint8_t bLength;
418 __packed uint8_t bDescriptorType;
419 __packed uint8_t bDescriptorSubtype;
420 __packed uint8_t bTerminalLink;
421 __packed uint8_t bDelay;
422 __packed uint16_t wFormatTag;
423} AS_GEN_T;
424#else
425typedef struct __attribute__((__packed__)) as_gen_t
426{
427 uint8_t bLength;
428 uint8_t bDescriptorType;
429 uint8_t bDescriptorSubtype;
430 uint8_t bTerminalLink;
431 uint8_t bDelay;
432 uint16_t wFormatTag;
433} AS_GEN_T;
434#endif
435
436/*-----------------------------------------------------------------------------------
437 * UAC Processing Unit Descriptor
438 */
439#ifdef __ICCARM__
440typedef struct ac_pu_t
441{
442 __packed uint8_t bLength;
443 __packed uint8_t bDescriptorType;
444 __packed uint8_t bDescriptorSubtype;
445 __packed uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
446 __packed uint16_t wProcessType; /* Constant identifying the type of processing this Unit is performing. */
447 __packed uint8_t bNrInPins; /* Number of Input Pins of this Unit: p */
448} AC_PU_T;
449#else
450typedef struct __attribute__((__packed__)) ac_pu_t
451{
452 uint8_t bLength;
453 uint8_t bDescriptorType;
454 uint8_t bDescriptorSubtype;
455 uint8_t bUnitID; /* Constant uniquely identifying the Unit within the audio function. */
456 uint16_t wProcessType; /* Constant identifying the type of processing this Unit is performing. */
457 uint8_t bNrInPins; /* Number of Input Pins of this Unit: p */
458} AC_PU_T;
459#endif
460
461/*-----------------------------------------------------------------------------------
462 * Class-Specific AS Isochronous Audio Data Endpoint Descriptor
463 */
464#ifdef __ICCARM__
465typedef struct cs_ep_t
466{
467 __packed uint8_t bLength;
468 __packed uint8_t bDescriptorType;
469 __packed uint8_t bDescriptorSubtype;
470 __packed uint8_t bmAttributes;
471 __packed uint8_t bLockDelayUnits;
472 __packed uint16_t wLockDelay;
473} CS_EP_T;
474#else
475typedef struct __attribute__((__packed__)) cs_ep_t
476{
477 uint8_t bLength;
478 uint8_t bDescriptorType;
479 uint8_t bDescriptorSubtype;
480 uint8_t bmAttributes;
481 uint8_t bLockDelayUnits;
482 uint16_t wLockDelay;
483} CS_EP_T;
484#endif
485
486/*-----------------------------------------------------------------------------------
487 * UAC Type I Format Type Descriptor
488 */
489#ifdef __ICCARM__
490typedef struct ac_ft1_t
491{
492 __packed uint8_t bLength;
493 __packed uint8_t bDescriptorType;
494 __packed uint8_t bDescriptorSubtype;
495 __packed uint8_t bFormatType;
496 __packed uint8_t bNrChannels;
497 __packed uint8_t bSubframeSize;
498 __packed uint8_t bBitResolution;
499 __packed uint8_t bSamFreqType;
500 __packed uint8_t tSamFreq[16][3];
501} AS_FT1_T;
502#else
503typedef struct __attribute__((__packed__)) ac_ft1_t
504{
505 uint8_t bLength;
506 uint8_t bDescriptorType;
507 uint8_t bDescriptorSubtype;
508 uint8_t bFormatType;
509 uint8_t bNrChannels;
510 uint8_t bSubframeSize;
511 uint8_t bBitResolution;
512 uint8_t bSamFreqType;
513 uint8_t tSamFreq[16][3];
514} AS_FT1_T;
515#endif
516
517/*-----------------------------------------------------------------------------------
518 * UAC Type 2 Format Type Descriptor
519 */
520#ifdef __ICCARM__
521typedef struct ac_ft2_t
522{
523 __packed uint8_t bLength;
524 __packed uint8_t bDescriptorType;
525 __packed uint8_t bDescriptorSubtype;
526 __packed uint8_t bFormatType;
527 __packed uint16_t wMaxBitRate;
528 __packed uint16_t wSamplesPerFrame;
529 __packed uint8_t bSamFreqType;
530} AS_FT2_T;
531#else
532typedef struct __attribute__((__packed__)) ac_ft2_t
533{
534 uint8_t bLength;
535 uint8_t bDescriptorType;
536 uint8_t bDescriptorSubtype;
537 uint8_t bFormatType;
538 uint16_t wMaxBitRate;
539 uint16_t wSamplesPerFrame;
540 uint8_t bSamFreqType;
541} AS_FT2_T;
542#endif
543
544/*-----------------------------------------------------------------------------------
545 * UAC Type 3 Format Type Descriptor
546 */
547#ifdef __ICCARM__
548typedef struct ac_ft3_t
549{
550 __packed uint8_t bLength;
551 __packed uint8_t bDescriptorType;
552 __packed uint8_t bDescriptorSubtype;
553 __packed uint8_t bFormatType;
554 __packed uint8_t bNrChannels;
555 __packed uint8_t bSubframeSize;
556 __packed uint8_t bBitResolution;
557 __packed uint8_t bSamFreqType;
558 __packed uint8_t tLowerSamFreq[3];
559 __packed uint8_t tUpperSamFreq[3];
560} AS_FT3_T;
561#else
562typedef struct __attribute__((__packed__)) ac_ft3_t
563{
564 uint8_t bLength;
565 uint8_t bDescriptorType;
566 uint8_t bDescriptorSubtype;
567 uint8_t bFormatType;
568 uint8_t bNrChannels;
569 uint8_t bSubframeSize;
570 uint8_t bBitResolution;
571 uint8_t bSamFreqType;
572 uint8_t tLowerSamFreq[3];
573 uint8_t tUpperSamFreq[3];
574} AS_FT3_T;
575#endif
576
577
579
580
581#endif /* __INCLUDED_UAC_H__ */
582
583/*** (C) COPYRIGHT 2017 Nuvoton Technology Corp. ***/
584
void *__dso_handle __attribute__((weak))
Definition: _syscalls.c:35