1/*	$NetBSD: uaudioreg.h,v 1.12 2004/11/05 19:08:29 kent Exp $	*/
2/* $FreeBSD: releng/10.3/sys/dev/sound/usb/uaudioreg.h 272423 2014-10-02 16:57:44Z hselasky $ */
3
4/*-
5 * Copyright (c) 1999 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Lennart Augustsson (lennart@augustsson.net) at
10 * Carlstedt Research & Technology.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 *    notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 *    notice, this list of conditions and the following disclaimer in the
19 *    documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#ifndef _UAUDIOREG_H_
35#define	_UAUDIOREG_H_
36
37#define	UAUDIO_VERSION		0x0100
38#define	UAUDIO_VERSION_20	0x0200
39#define	UAUDIO_VERSION_30	0x0300
40
41#define	UAUDIO_PROTOCOL_20	0x20
42
43#define	UDESC_CS_UNDEFINED	0x20
44#define	UDESC_CS_DEVICE		0x21
45#define	UDESC_CS_CONFIG		0x22
46#define	UDESC_CS_STRING		0x23
47#define	UDESC_CS_INTERFACE	0x24
48#define	UDESC_CS_ENDPOINT	0x25
49
50#define	UDESCSUB_AC_HEADER	1
51#define	UDESCSUB_AC_INPUT	2
52#define	UDESCSUB_AC_OUTPUT	3
53#define	UDESCSUB_AC_MIXER	4
54#define	UDESCSUB_AC_SELECTOR	5
55#define	UDESCSUB_AC_FEATURE	6
56#define	UDESCSUB_AC_PROCESSING	7
57#define	UDESCSUB_AC_EXTENSION	8
58/* ==== USB audio v2.0 ==== */
59#define	UDESCSUB_AC_EFFECT	7
60#define	UDESCSUB_AC_PROCESSING_V2 8
61#define	UDESCSUB_AC_EXTENSION_V2 9
62#define	UDESCSUB_AC_CLOCK_SRC	10
63#define	UDESCSUB_AC_CLOCK_SEL	11
64#define	UDESCSUB_AC_CLOCK_MUL	12
65#define	UDESCSUB_AC_SAMPLE_RT	13
66
67/* These macros check if the endpoint descriptor has additional fields */
68#define	UEP_MINSIZE	7
69#define	UEP_HAS_REFRESH(ep)	((ep)->bLength >= 8)
70#define	UEP_HAS_SYNCADDR(ep)	((ep)->bLength >= 9)
71
72/* The first fields are identical to struct usb_endpoint_descriptor */
73typedef struct {
74	uByte	bLength;
75	uByte	bDescriptorType;
76	uByte	bEndpointAddress;
77	uByte	bmAttributes;
78	uWord	wMaxPacketSize;
79	uByte	bInterval;
80	/*
81	 * The following two entries are only used by the Audio Class.
82	 * And according to the specs the Audio Class is the only one
83	 * allowed to extend the endpoint descriptor.
84	 * Who knows what goes on in the minds of the people in the USB
85	 * standardization?  :-(
86	 */
87	uByte	bRefresh;
88	uByte	bSynchAddress;
89} __packed usb_endpoint_descriptor_audio_t;
90
91struct usb_audio_control_descriptor {
92	uByte	bLength;
93	uByte	bDescriptorType;
94	uByte	bDescriptorSubtype;
95	uWord	bcdADC;
96	uWord	wTotalLength;
97	uByte	bInCollection;
98	uByte	baInterfaceNr[1];
99} __packed;
100
101struct usb_audio_streaming_interface_descriptor {
102	uByte	bLength;
103	uByte	bDescriptorType;
104	uByte	bDescriptorSubtype;
105	uByte	bTerminalLink;
106	uByte	bDelay;
107	uWord	wFormatTag;
108} __packed;
109
110struct usb_audio_streaming_endpoint_descriptor {
111	uByte	bLength;
112	uByte	bDescriptorType;
113	uByte	bDescriptorSubtype;
114	uByte	bmAttributes;
115#define	UA_SED_FREQ_CONTROL	0x01
116#define	UA_SED_PITCH_CONTROL	0x02
117#define	UA_SED_MAXPACKETSONLY	0x80
118	uByte	bLockDelayUnits;
119	uWord	wLockDelay;
120} __packed;
121
122struct usb_midi_streaming_endpoint_descriptor {
123	uByte	bLength;
124	uByte	bDescriptorType;
125	uByte	bDescriptorSubtype;
126	uByte	bNumEmbMIDIJack;
127} __packed;
128
129struct usb_audio_streaming_type1_descriptor {
130	uByte	bLength;
131	uByte	bDescriptorType;
132	uByte	bDescriptorSubtype;
133	uByte	bFormatType;
134	uByte	bNrChannels;
135	uByte	bSubFrameSize;
136	uByte	bBitResolution;
137	uByte	bSamFreqType;
138#define	UA_SAMP_CONTNUOUS 0
139	uByte	tSamFreq[0];
140#define	UA_GETSAMP(p, n) ((uint32_t)((((p)->tSamFreq[((n)*3)+0]) | \
141			  ((p)->tSamFreq[((n)*3)+1] << 8) | \
142			  ((p)->tSamFreq[((n)*3)+2] << 16))))
143#define	UA_SAMP_LO(p) UA_GETSAMP(p, 0)
144#define	UA_SAMP_HI(p) UA_GETSAMP(p, 1)
145} __packed;
146
147struct usb_audio_cluster {
148	uByte	bNrChannels;
149	uWord	wChannelConfig;
150#define	UA_CHANNEL_LEFT		0x0001
151#define	UA_CHANNEL_RIGHT	0x0002
152#define	UA_CHANNEL_CENTER	0x0004
153#define	UA_CHANNEL_LFE		0x0008
154#define	UA_CHANNEL_L_SURROUND	0x0010
155#define	UA_CHANNEL_R_SURROUND	0x0020
156#define	UA_CHANNEL_L_CENTER	0x0040
157#define	UA_CHANNEL_R_CENTER	0x0080
158#define	UA_CHANNEL_SURROUND	0x0100
159#define	UA_CHANNEL_L_SIDE	0x0200
160#define	UA_CHANNEL_R_SIDE	0x0400
161#define	UA_CHANNEL_TOP		0x0800
162	uByte	iChannelNames;
163} __packed;
164
165/* Shared by all units and terminals */
166struct usb_audio_unit {
167	uByte	bLength;
168	uByte	bDescriptorType;
169	uByte	bDescriptorSubtype;
170	uByte	bUnitId;
171};
172
173/* UDESCSUB_AC_INPUT */
174struct usb_audio_input_terminal {
175	uByte	bLength;
176	uByte	bDescriptorType;
177	uByte	bDescriptorSubtype;
178	uByte	bTerminalId;
179	uWord	wTerminalType;
180	uByte	bAssocTerminal;
181	uByte	bNrChannels;
182	uWord	wChannelConfig;
183	uByte	iChannelNames;
184/*	uByte		iTerminal; */
185} __packed;
186
187/* UDESCSUB_AC_OUTPUT */
188struct usb_audio_output_terminal {
189	uByte	bLength;
190	uByte	bDescriptorType;
191	uByte	bDescriptorSubtype;
192	uByte	bTerminalId;
193	uWord	wTerminalType;
194	uByte	bAssocTerminal;
195	uByte	bSourceId;
196	uByte	iTerminal;
197} __packed;
198
199/* UDESCSUB_AC_MIXER */
200struct usb_audio_mixer_unit_0 {
201	uByte	bLength;
202	uByte	bDescriptorType;
203	uByte	bDescriptorSubtype;
204	uByte	bUnitId;
205	uByte	bNrInPins;
206	uByte	baSourceId[0];		/* [bNrInPins] */
207	/* struct usb_audio_mixer_unit_1 */
208} __packed;
209struct usb_audio_mixer_unit_1 {
210	uByte	bNrChannels;
211	uWord	wChannelConfig;
212	uByte	iChannelNames;
213	uByte	bmControls[0];		/* [see source code] */
214	/* uByte		iMixer; */
215} __packed;
216
217/* UDESCSUB_AC_SELECTOR */
218struct usb_audio_selector_unit {
219	uByte	bLength;
220	uByte	bDescriptorType;
221	uByte	bDescriptorSubtype;
222	uByte	bUnitId;
223	uByte	bNrInPins;
224	uByte	baSourceId[0];		/* [bNrInPins] */
225	/* uByte	iSelector; */
226} __packed;
227
228/* UDESCSUB_AC_FEATURE */
229struct usb_audio_feature_unit {
230	uByte	bLength;
231	uByte	bDescriptorType;
232	uByte	bDescriptorSubtype;
233	uByte	bUnitId;
234	uByte	bSourceId;
235	uByte	bControlSize;
236	uByte	bmaControls[0];		/* [bControlSize * x] */
237	/* uByte	iFeature; */
238} __packed;
239
240/* UDESCSUB_AC_PROCESSING */
241struct usb_audio_processing_unit_0 {
242	uByte	bLength;
243	uByte	bDescriptorType;
244	uByte	bDescriptorSubtype;
245	uByte	bUnitId;
246	uWord	wProcessType;
247	uByte	bNrInPins;
248	uByte	baSourceId[0];		/* [bNrInPins] */
249	/* struct usb_audio_processing_unit_1 */
250} __packed;
251struct usb_audio_processing_unit_1 {
252	uByte	bNrChannels;
253	uWord	wChannelConfig;
254	uByte	iChannelNames;
255	uByte	bControlSize;
256	uByte	bmControls[0];		/* [bControlSize] */
257#define	UA_PROC_ENABLE_MASK 1
258} __packed;
259
260struct usb_audio_processing_unit_updown {
261	uByte	iProcessing;
262	uByte	bNrModes;
263	uWord	waModes[0];		/* [bNrModes] */
264} __packed;
265
266/* UDESCSUB_AC_EXTENSION */
267struct usb_audio_extension_unit_0 {
268	uByte	bLength;
269	uByte	bDescriptorType;
270	uByte	bDescriptorSubtype;
271	uByte	bUnitId;
272	uWord	wExtensionCode;
273	uByte	bNrInPins;
274	uByte	baSourceId[0];		/* [bNrInPins] */
275	/* struct usb_audio_extension_unit_1 */
276} __packed;
277
278struct usb_audio_extension_unit_1 {
279	uByte	bNrChannels;
280	uWord	wChannelConfig;
281	uByte	iChannelNames;
282	uByte	bControlSize;
283	uByte	bmControls[0];		/* [bControlSize] */
284#define	UA_EXT_ENABLE_MASK 1
285#define	UA_EXT_ENABLE 1
286	/* uByte		iExtension; */
287} __packed;
288
289/* USB terminal types */
290#define	UAT_UNDEFINED		0x0100
291#define	UAT_STREAM		0x0101
292#define	UAT_VENDOR		0x01ff
293/* input terminal types */
294#define	UATI_UNDEFINED		0x0200
295#define	UATI_MICROPHONE		0x0201
296#define	UATI_DESKMICROPHONE	0x0202
297#define	UATI_PERSONALMICROPHONE	0x0203
298#define	UATI_OMNIMICROPHONE	0x0204
299#define	UATI_MICROPHONEARRAY	0x0205
300#define	UATI_PROCMICROPHONEARR	0x0206
301/* output terminal types */
302#define	UATO_UNDEFINED		0x0300
303#define	UATO_SPEAKER		0x0301
304#define	UATO_HEADPHONES		0x0302
305#define	UATO_DISPLAYAUDIO	0x0303
306#define	UATO_DESKTOPSPEAKER	0x0304
307#define	UATO_ROOMSPEAKER	0x0305
308#define	UATO_COMMSPEAKER	0x0306
309#define	UATO_SUBWOOFER		0x0307
310/* bidir terminal types */
311#define	UATB_UNDEFINED		0x0400
312#define	UATB_HANDSET		0x0401
313#define	UATB_HEADSET		0x0402
314#define	UATB_SPEAKERPHONE	0x0403
315#define	UATB_SPEAKERPHONEESUP	0x0404
316#define	UATB_SPEAKERPHONEECANC	0x0405
317/* telephony terminal types */
318#define	UATT_UNDEFINED		0x0500
319#define	UATT_PHONELINE		0x0501
320#define	UATT_TELEPHONE		0x0502
321#define	UATT_DOWNLINEPHONE	0x0503
322/* external terminal types */
323#define	UATE_UNDEFINED		0x0600
324#define	UATE_ANALOGCONN		0x0601
325#define	UATE_DIGITALAUIFC	0x0602
326#define	UATE_LINECONN		0x0603
327#define	UATE_LEGACYCONN		0x0604
328#define	UATE_SPDIF		0x0605
329#define	UATE_1394DA		0x0606
330#define	UATE_1394DV		0x0607
331/* embedded function terminal types */
332#define	UATF_UNDEFINED		0x0700
333#define	UATF_CALIBNOISE		0x0701
334#define	UATF_EQUNOISE		0x0702
335#define	UATF_CDPLAYER		0x0703
336#define	UATF_DAT		0x0704
337#define	UATF_DCC		0x0705
338#define	UATF_MINIDISK		0x0706
339#define	UATF_ANALOGTAPE		0x0707
340#define	UATF_PHONOGRAPH		0x0708
341#define	UATF_VCRAUDIO		0x0709
342#define	UATF_VIDEODISCAUDIO	0x070a
343#define	UATF_DVDAUDIO		0x070b
344#define	UATF_TVTUNERAUDIO	0x070c
345#define	UATF_SATELLITE		0x070d
346#define	UATF_CABLETUNER		0x070e
347#define	UATF_DSS		0x070f
348#define	UATF_RADIORECV		0x0710
349#define	UATF_RADIOXMIT		0x0711
350#define	UATF_MULTITRACK		0x0712
351#define	UATF_SYNTHESIZER	0x0713
352
353
354#define	SET_CUR 0x01
355#define	GET_CUR 0x81
356#define	SET_MIN 0x02
357#define	GET_MIN 0x82
358#define	SET_MAX 0x03
359#define	GET_MAX 0x83
360#define	SET_RES 0x04
361#define	GET_RES 0x84
362#define	SET_MEM 0x05
363#define	GET_MEM 0x85
364#define	GET_STAT 0xff
365
366#define	MUTE_CONTROL	0x01
367#define	VOLUME_CONTROL	0x02
368#define	BASS_CONTROL	0x03
369#define	MID_CONTROL	0x04
370#define	TREBLE_CONTROL	0x05
371#define	GRAPHIC_EQUALIZER_CONTROL	0x06
372#define	AGC_CONTROL	0x07
373#define	DELAY_CONTROL	0x08
374#define	BASS_BOOST_CONTROL 0x09
375#define	LOUDNESS_CONTROL 0x0a
376/* ==== USB audio v2.0 ==== */
377#define	INPUT_GAIN_CONTROL 0x0b
378#define	INPUT_GAIN_PAD_CONTROL 0x0c
379#define	PHASE_INVERTER_CONTROL 0x0d
380#define	UNDERFLOW_CONTROL 0x0e
381#define	OVERFLOW_CONTROL 0x0f
382#define	LATENCY_CONTROL 0x10
383
384#define	FU_MASK(u) (1 << ((u)-1))
385
386#define	MASTER_CHAN	0
387
388#define	MS_GENERAL	1
389#define	AS_GENERAL	1
390#define	FORMAT_TYPE	2
391#define	FORMAT_SPECIFIC 3
392/* ==== USB audio v2.0 ==== */
393#define	FORMAT_ENCODER	3
394#define	FORMAT_DECODER	4
395
396#define	UA_FMT_PCM	1
397#define	UA_FMT_PCM8	2
398#define	UA_FMT_IEEE_FLOAT 3
399#define	UA_FMT_ALAW	4
400#define	UA_FMT_MULAW	5
401#define	UA_FMT_MPEG	0x1001
402#define	UA_FMT_AC3	0x1002
403
404#define	SAMPLING_FREQ_CONTROL	0x01
405#define	PITCH_CONTROL		0x02
406
407#define	FORMAT_TYPE_UNDEFINED 0
408#define	FORMAT_TYPE_I 1
409#define	FORMAT_TYPE_II 2
410#define	FORMAT_TYPE_III 3
411
412#define	UA_PROC_MASK(n) (1<< ((n)-1))
413#define	PROCESS_UNDEFINED		0
414#define	XX_ENABLE_CONTROL			1
415#define	UPDOWNMIX_PROCESS		1
416#define	UD_ENABLE_CONTROL			1
417#define	UD_MODE_SELECT_CONTROL			2
418#define	DOLBY_PROLOGIC_PROCESS		2
419#define	DP_ENABLE_CONTROL			1
420#define	DP_MODE_SELECT_CONTROL			2
421#define	P3D_STEREO_EXTENDER_PROCESS	3
422#define	P3D_ENABLE_CONTROL			1
423#define	P3D_SPACIOUSNESS_CONTROL		2
424#define	REVERBATION_PROCESS		4
425#define	RV_ENABLE_CONTROL			1
426#define	RV_LEVEL_CONTROL			2
427#define	RV_TIME_CONTROL			3
428#define	RV_FEEDBACK_CONTROL			4
429#define	CHORUS_PROCESS			5
430#define	CH_ENABLE_CONTROL			1
431#define	CH_LEVEL_CONTROL			2
432#define	CH_RATE_CONTROL			3
433#define	CH_DEPTH_CONTROL			4
434#define	DYN_RANGE_COMP_PROCESS		6
435#define	DR_ENABLE_CONTROL			1
436#define	DR_COMPRESSION_RATE_CONTROL		2
437#define	DR_MAXAMPL_CONTROL			3
438#define	DR_THRESHOLD_CONTROL			4
439#define	DR_ATTACK_TIME_CONTROL			5
440#define	DR_RELEASE_TIME_CONTROL		6
441
442/*------------------------------------------------------------------------*
443 * USB audio v2.0 definitions
444 *------------------------------------------------------------------------*/
445
446struct usb_audio20_streaming_interface_descriptor {
447	uByte	bLength;
448	uByte	bDescriptorType;
449	uByte	bDescriptorSubtype;
450	uByte	bTerminalLink;
451	uByte	bmControls;
452	uByte	bFormatType;
453	uDWord	bmFormats;
454	uByte	bNrChannels;
455	uDWord	bmChannelConfig;
456	uByte	iChannelNames;
457} __packed;
458
459struct usb_audio20_encoder_descriptor {
460	uByte	bLength;
461	uByte	bDescriptorType;
462	uByte	bDescriptorSubtype;
463	uByte	bEncoderID;
464	uByte	bEncoder;
465	uDWord	bmControls;
466	uByte	iParam1;
467	uByte	iParam2;
468	uByte	iParam3;
469	uByte	iParam4;
470	uByte	iParam5;
471	uByte	iParam6;
472	uByte	iParam7;
473	uByte	iParam8;
474	uByte	iEncoder;
475} __packed;
476
477struct usb_audio20_streaming_endpoint_descriptor {
478	uByte	bLength;
479	uByte	bDescriptorType;
480	uByte	bDescriptorSubtype;
481	uByte	bmAttributes;
482#define	UA20_MPS_ONLY		0x80
483	uByte	bmControls;
484#define	UA20_PITCH_CONTROL_MASK	0x03
485#define	UA20_DATA_OVERRUN_MASK	0x0C
486#define	UA20_DATA_UNDERRUN_MASK	0x30
487	uByte	bLockDelayUnits;
488	uWord	wLockDelay;
489} __packed;
490
491struct usb_audio20_feedback_endpoint_descriptor {
492	uByte	bLength;
493	uByte	bDescriptorType;
494	uByte	bEndpointAddress;
495	uByte	bmAttributes;
496	uWord	wMaxPacketSize;
497	uByte	bInterval;
498} __packed;
499
500#define	UA20_CS_CUR	0x01
501#define	UA20_CS_RANGE	0x02
502#define	UA20_CS_MEM	0x03
503
504struct usb_audio20_cur1_parameter {
505	uByte	bCur;
506} __packed;
507
508struct usb_audio20_ctl1_range_sub {
509	uByte	bMIN;
510	uByte	bMAX;
511	uByte	bRES;
512} __packed;
513
514struct usb_audio20_ctl1_range {
515	uWord	wNumSubRanges;
516	struct usb_audio20_ctl1_range_sub sub[1];
517} __packed;
518
519struct usb_audio20_cur2_parameter {
520	uWord	wCur;
521} __packed;
522
523struct usb_audio20_ctl2_range_sub {
524	uWord	wMIN;
525	uWord	wMAX;
526	uWord	wRES;
527} __packed;
528
529struct usb_audio20_ctl2_range {
530	uWord	wNumSubRanges;
531	struct usb_audio20_ctl2_range_sub sub[1];
532} __packed;
533
534struct usb_audio20_cur4_parameter {
535	uDWord	dCur;
536} __packed;
537
538struct usb_audio20_ctl4_range_sub {
539	uDWord	dMIN;
540	uDWord	dMAX;
541	uDWord	dRES;
542} __packed;
543
544struct usb_audio20_ctl4_range {
545	uWord	wNumSubRanges;
546	struct usb_audio20_ctl4_range_sub sub[1];
547} __packed;
548
549struct usb_audio20_cc_cluster_descriptor {
550	uByte	bNrChannels;
551	uDWord	bmChannelConfig;
552	uByte	iChannelNames;
553} __packed;
554
555struct usb_audio20_streaming_type1_descriptor {
556	uByte	bLength;
557	uByte	bDescriptorType;
558	uByte	bDescriptorSubtype;
559	uByte	bFormatType;
560	uByte	bSubslotSize;
561	uByte	bBitResolution;
562} __packed;
563
564#define	UA20_EERROR_NONE	0
565#define	UA20_EERROR_MEMORY	1
566#define	UA20_EERROR_BANDWIDTH	2
567#define	UA20_EERROR_CPU		3
568#define	UA20_EERROR_FORMATFR_ER	4
569#define	UA20_EERROR_FORMATFR_SM	5
570#define	UA20_EERROR_FORMATFR_LG	6
571#define	UA20_EERROR_DATAFORMAT	7
572#define	UA20_EERROR_NUMCHANNELS	8
573#define	UA20_EERROR_SAMPLERATE	9
574#define	UA20_EERROR_BITRATE	10
575#define	UA20_EERROR_PARAM	11
576#define	UA20_EERROR_NREADY	12
577#define	UA20_EERROR_BUSY	13
578
579struct usb_audio20_cc_alt_setting {
580	uByte	bControlSize;
581	uDWord	bmValidAltSettings;
582} __packed;
583
584struct usb_audio20_interrupt_message {
585	uByte	bInfo;
586	uByte	bAttribute;
587	uDWord	wValue;
588	uDWord	wIndex;
589} __packed;
590
591/* UDESCSUB_AC_CLOCK_SRC */
592struct usb_audio20_clock_source_unit {
593	uByte	bLength;
594	uByte	bDescriptorType;
595	uByte	bDescriptorSubtype;
596	uByte	bClockId;
597	uByte	bmAttributes;
598	uByte	bmControls;
599	uByte	bAssocTerminal;
600	uByte	iClockSource;
601} __packed;
602
603/* UDESCSUB_AC_CLOCK_SEL */
604struct usb_audio20_clock_selector_unit_0 {
605	uByte	bLength;
606	uByte	bDescriptorType;
607	uByte	bDescriptorSubtype;
608	uByte	bClockId;
609	uByte	bNrInPins;
610	uByte	baCSourceId[0];
611} __packed;
612
613struct usb_audio20_clock_selector_unit_1 {
614	uByte	bmControls;
615	uByte	iClockSelector;
616} __packed;
617
618/* UDESCSUB_AC_CLOCK_MUL */
619struct usb_audio20_clock_multiplier_unit {
620	uByte	bLength;
621	uByte	bDescriptorType;
622	uByte	bDescriptorSubtype;
623	uByte	bClockId;
624	uByte	bCSourceId;
625	uByte	bmControls;
626	uByte	iClockMultiplier;
627} __packed;
628
629/* UDESCSUB_AC_INPUT */
630struct usb_audio20_input_terminal {
631	uByte	bLength;
632	uByte	bDescriptorType;
633	uByte	bDescriptorSubtype;
634	uByte	bTerminalId;
635	uWord	wTerminalType;
636	uByte	bAssocTerminal;
637	uByte	bCSourceId;
638	uByte	bNrChannels;
639	uDWord	bmChannelConfig;
640	uByte	iCHannelNames;
641	uWord	bmControls;
642	uByte	iTerminal;
643} __packed;
644
645/* UDESCSUB_AC_OUTPUT */
646struct usb_audio20_output_terminal {
647	uByte	bLength;
648	uByte	bDescriptorType;
649	uByte	bDescriptorSubtype;
650	uByte	bTerminalId;
651	uWord	wTerminalType;
652	uByte	bAssocTerminal;
653	uByte	bSourceId;
654	uByte	bCSourceId;
655	uWord	bmControls;
656	uByte	iTerminal;
657} __packed;
658
659/* UDESCSUB_AC_MIXER */
660struct usb_audio20_mixer_unit_0 {
661	uByte	bLength;
662	uByte	bDescriptorType;
663	uByte	bDescriptorSubtype;
664	uByte	bUnitId;
665	uByte	bNrInPins;
666	uByte	baSourceId[0];
667	/* struct usb_audio20_mixer_unit_1 */
668} __packed;
669
670struct usb_audio20_mixer_unit_1 {
671	uByte	bNrChannels;
672	uDWord	bmChannelConfig;
673	uByte	iChannelNames;
674	uByte	bmControls[0];
675	/* uByte	iMixer; */
676} __packed;
677
678/* UDESCSUB_AC_SELECTOR */
679struct usb_audio20_selector_unit {
680	uByte	bLength;
681	uByte	bDescriptorType;
682	uByte	bDescriptorSubtype;
683	uByte	bUnitId;
684	uByte	bNrInPins;
685	uByte	baSourceId[0];
686	/* uByte	iSelector; */
687} __packed;
688
689/* UDESCSUB_AC_FEATURE */
690struct usb_audio20_feature_unit {
691	uByte	bLength;
692	uByte	bDescriptorType;
693	uByte	bDescriptorSubtype;
694	uByte	bUnitId;
695	uByte	bSourceId;
696	uDWord	bmaControls[0];
697	/* uByte	iFeature; */
698} __packed;
699
700/* UDESCSUB_AC_SAMPLE_RT */
701struct usb_audio20_sample_rate_unit {
702	uByte	bLength;
703	uByte	bDescriptorType;
704	uByte	bDescriptorSubtype;
705	uByte	bUnitId;
706	uByte	bSourceId;
707	uByte	bSourceInId;
708	uByte	bSourceOutId;
709	uByte	iSrc;
710} __packed;
711
712/* UDESCSUB_AC_EFFECT */
713struct usb_audio20_effect_unit {
714	uByte	bLength;
715	uByte	bDescriptorType;
716	uByte	bDescriptorSubtype;
717	uByte	bUnitId;
718	uWord	wEffectType;
719	uByte	bSourceId;
720	uDWord	bmaControls[0];
721	uByte	iEffects;
722} __packed;
723
724/* UDESCSUB_AC_PROCESSING_V2 */
725struct usb_audio20_processing_unit_0 {
726	uByte	bLength;
727	uByte	bDescriptorType;
728	uByte	bDescriptorSubtype;
729	uByte	bUnitId;
730	uWord	wProcessType;
731	uByte	bNrInPins;
732	uByte	baSourceId[0];		/* [bNrInPins] */
733} __packed;
734
735struct usb_audio20_processing_unit_1 {
736	uByte	bNrChannels;
737	uDWord	bmChannelConfig;
738	uByte	iChannelNames;
739	uWord	bmControls;
740	uByte	iProcessing;
741} __packed;
742
743/* UDESCSUB_AC_EXTENSION_V2 */
744struct usb_audio20_extension_unit_0 {
745	uByte	bLength;
746	uByte	bDescriptorType;
747	uByte	bDescriptorSubtype;
748	uByte	bUnitId;
749	uWord	wExtensionCode;
750	uByte	bNrInPins;
751	uByte	baSourceId[0];
752} __packed;
753
754struct usb_audio20_extension_unit_1 {
755	uByte	bNrChannels;
756	uDWord	bmChannelConfig;
757	uByte	iChannelNames;
758	uByte	bmControls;
759	uByte	iExtension;
760} __packed;
761
762struct usb_audio20_cluster {
763	uByte	bNrChannels;
764	uDWord	bmChannelConfig;
765	uByte	iChannelNames;
766} __packed;
767
768#define	UA20_TF_UNDEFINED		0x00
769#define	UA20_TF_DESKTOP_SPEAKER		0x01
770#define	UA20_TF_HOME_THEATER		0x02
771#define	UA20_TF_MICROPHONE		0x03
772#define	UA20_TF_HEADSET			0x04
773#define	UA20_TF_TELEPHONE		0x05
774#define	UA20_TF_CONVERTER		0x06
775#define	UA20_TF_SOUND_RECORDER		0x07
776#define	UA20_TF_IO_BOX			0x08
777#define	UA20_TF_MUSICAL_INSTRUMENT	0x09
778#define	UA20_TF_PRO_AUDIO		0x0A
779#define	UA20_TF_AV			0x0B
780#define	UA20_TF_CONTROL_PANEL		0x0C
781#define	UA20_TF_OTHER			0xFF
782
783#define	UA20_CS_SAM_FREQ_CONTROL	0x01
784#define	UA20_CS_CLOCK_VALID_CONTROL 	0x02
785
786#define	UA20_TE_COPY_PROTECT_CONTROL	0x01
787#define	UA20_TE_CONNECTOR_CONTROL	0x02
788#define	UA20_TE_OVERLOAD_CONTROL	0x03
789#define	UA20_TE_CLUSTER_CONTROL		0x04
790#define	UA20_TE_UNDERFLOW_CONTROL	0x05
791#define	UA20_TE_OVERFLOW_CONTROL	0x06
792#define	UA20_TE_LATENCY_CONTROL		0x07
793
794#define	UA20_MU_MIXER_CONTROL		0x01
795#define	UA20_MU_CLUSTER_CONTROL		0x02
796#define	UA20_MU_UNDERFLOW_CONTROL	0x03
797#define	UA20_MU_OVERFLOW_CONTROL	0x04
798#define	UA20_MU_LATENCY_CONTROL		0x05
799
800#define	UA20_FMT_PCM	(1U << 0)
801#define	UA20_FMT_PCM8	(1U << 1)
802#define	UA20_FMT_FLOAT	(1U << 2)
803#define	UA20_FMT_ALAW	(1U << 3)
804#define	UA20_FMT_MULAW	(1U << 4)
805#define	UA20_FMT_RAW	(1U << 31)
806
807#endif					/* _UAUDIOREG_H_ */
808