uaudioreg.h revision 209452
1/*	$NetBSD: uaudioreg.h,v 1.12 2004/11/05 19:08:29 kent Exp $	*/
2/* $FreeBSD: head/sys/dev/sound/usb/uaudioreg.h 209452 2010-06-22 21:16:18Z thompsa $ */
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#define	UAUDIO_VERSION		0x100
35
36#define	UDESC_CS_CONFIG		0x22
37#define	UDESC_CS_STRING		0x23
38#define	UDESC_CS_INTERFACE	0x24
39#define	UDESC_CS_ENDPOINT	0x25
40
41#define	UDESCSUB_AC_HEADER	1
42#define	UDESCSUB_AC_INPUT	2
43#define	UDESCSUB_AC_OUTPUT	3
44#define	UDESCSUB_AC_MIXER	4
45#define	UDESCSUB_AC_SELECTOR	5
46#define	UDESCSUB_AC_FEATURE	6
47#define	UDESCSUB_AC_PROCESSING	7
48#define	UDESCSUB_AC_EXTENSION	8
49
50/* These macros check if the endpoint descriptor has additional fields */
51#define	UEP_MINSIZE	7
52#define	UEP_HAS_REFRESH(ep)	((ep)->bLength >= 8)
53#define	UEP_HAS_SYNCADDR(ep)	((ep)->bLength >= 9)
54
55/* The first fields are identical to struct usb_endpoint_descriptor */
56typedef struct {
57	uByte	bLength;
58	uByte	bDescriptorType;
59	uByte	bEndpointAddress;
60	uByte	bmAttributes;
61	uWord	wMaxPacketSize;
62	uByte	bInterval;
63	/*
64	 * The following two entries are only used by the Audio Class.
65	 * And according to the specs the Audio Class is the only one
66	 * allowed to extend the endpoint descriptor.
67	 * Who knows what goes on in the minds of the people in the USB
68	 * standardization?  :-(
69	 */
70	uByte	bRefresh;
71	uByte	bSynchAddress;
72} __packed usb_endpoint_descriptor_audio_t;
73
74struct usb_audio_control_descriptor {
75	uByte	bLength;
76	uByte	bDescriptorType;
77	uByte	bDescriptorSubtype;
78	uWord	bcdADC;
79	uWord	wTotalLength;
80	uByte	bInCollection;
81	uByte	baInterfaceNr[1];
82} __packed;
83
84struct usb_audio_streaming_interface_descriptor {
85	uByte	bLength;
86	uByte	bDescriptorType;
87	uByte	bDescriptorSubtype;
88	uByte	bTerminalLink;
89	uByte	bDelay;
90	uWord	wFormatTag;
91} __packed;
92
93struct usb_audio_streaming_endpoint_descriptor {
94	uByte	bLength;
95	uByte	bDescriptorType;
96	uByte	bDescriptorSubtype;
97	uByte	bmAttributes;
98#define	UA_SED_FREQ_CONTROL	0x01
99#define	UA_SED_PITCH_CONTROL	0x02
100#define	UA_SED_MAXPACKETSONLY	0x80
101	uByte	bLockDelayUnits;
102	uWord	wLockDelay;
103} __packed;
104
105struct usb_audio_streaming_type1_descriptor {
106	uByte	bLength;
107	uByte	bDescriptorType;
108	uByte	bDescriptorSubtype;
109	uByte	bFormatType;
110	uByte	bNrChannels;
111	uByte	bSubFrameSize;
112	uByte	bBitResolution;
113	uByte	bSamFreqType;
114#define	UA_SAMP_CONTNUOUS 0
115	uByte	tSamFreq[0];
116#define	UA_GETSAMP(p, n) (((p)->tSamFreq[((n)*3)+0]) |	    \
117			  ((p)->tSamFreq[((n)*3)+1] << 8) | \
118			  ((p)->tSamFreq[((n)*3)+2] << 16))
119#define	UA_SAMP_LO(p) UA_GETSAMP(p, 0)
120#define	UA_SAMP_HI(p) UA_GETSAMP(p, 1)
121} __packed;
122
123struct usb_audio_cluster {
124	uByte	bNrChannels;
125	uWord	wChannelConfig;
126#define	UA_CHANNEL_LEFT		0x0001
127#define	UA_CHANNEL_RIGHT	0x0002
128#define	UA_CHANNEL_CENTER	0x0004
129#define	UA_CHANNEL_LFE		0x0008
130#define	UA_CHANNEL_L_SURROUND	0x0010
131#define	UA_CHANNEL_R_SURROUND	0x0020
132#define	UA_CHANNEL_L_CENTER	0x0040
133#define	UA_CHANNEL_R_CENTER	0x0080
134#define	UA_CHANNEL_SURROUND	0x0100
135#define	UA_CHANNEL_L_SIDE	0x0200
136#define	UA_CHANNEL_R_SIDE	0x0400
137#define	UA_CHANNEL_TOP		0x0800
138	uByte	iChannelNames;
139} __packed;
140
141/* Shared by all units and terminals */
142struct usb_audio_unit {
143	uByte	bLength;
144	uByte	bDescriptorType;
145	uByte	bDescriptorSubtype;
146	uByte	bUnitId;
147};
148
149/* UDESCSUB_AC_INPUT */
150struct usb_audio_input_terminal {
151	uByte	bLength;
152	uByte	bDescriptorType;
153	uByte	bDescriptorSubtype;
154	uByte	bTerminalId;
155	uWord	wTerminalType;
156	uByte	bAssocTerminal;
157	uByte	bNrChannels;
158	uWord	wChannelConfig;
159	uByte	iChannelNames;
160/*	uByte		iTerminal; */
161} __packed;
162
163/* UDESCSUB_AC_OUTPUT */
164struct usb_audio_output_terminal {
165	uByte	bLength;
166	uByte	bDescriptorType;
167	uByte	bDescriptorSubtype;
168	uByte	bTerminalId;
169	uWord	wTerminalType;
170	uByte	bAssocTerminal;
171	uByte	bSourceId;
172	uByte	iTerminal;
173} __packed;
174
175/* UDESCSUB_AC_MIXER */
176struct usb_audio_mixer_unit_0 {
177	uByte	bLength;
178	uByte	bDescriptorType;
179	uByte	bDescriptorSubtype;
180	uByte	bUnitId;
181	uByte	bNrInPins;
182	uByte	baSourceId[0];		/* [bNrInPins] */
183	/* struct usb_audio_mixer_unit_1 */
184} __packed;
185struct usb_audio_mixer_unit_1 {
186	uByte	bNrChannels;
187	uWord	wChannelConfig;
188	uByte	iChannelNames;
189	uByte	bmControls[0];		/* [see source code] */
190	/* uByte		iMixer; */
191} __packed;
192
193/* UDESCSUB_AC_SELECTOR */
194struct usb_audio_selector_unit {
195	uByte	bLength;
196	uByte	bDescriptorType;
197	uByte	bDescriptorSubtype;
198	uByte	bUnitId;
199	uByte	bNrInPins;
200	uByte	baSourceId[0];		/* [bNrInPins] */
201	/* uByte	iSelector; */
202} __packed;
203
204/* UDESCSUB_AC_FEATURE */
205struct usb_audio_feature_unit {
206	uByte	bLength;
207	uByte	bDescriptorType;
208	uByte	bDescriptorSubtype;
209	uByte	bUnitId;
210	uByte	bSourceId;
211	uByte	bControlSize;
212	uByte	bmaControls[0];		/* [bControlSize * x] */
213	/* uByte	iFeature; */
214} __packed;
215
216/* UDESCSUB_AC_PROCESSING */
217struct usb_audio_processing_unit_0 {
218	uByte	bLength;
219	uByte	bDescriptorType;
220	uByte	bDescriptorSubtype;
221	uByte	bUnitId;
222	uWord	wProcessType;
223	uByte	bNrInPins;
224	uByte	baSourceId[0];		/* [bNrInPins] */
225	/* struct usb_audio_processing_unit_1 */
226} __packed;
227struct usb_audio_processing_unit_1 {
228	uByte	bNrChannels;
229	uWord	wChannelConfig;
230	uByte	iChannelNames;
231	uByte	bControlSize;
232	uByte	bmControls[0];		/* [bControlSize] */
233#define	UA_PROC_ENABLE_MASK 1
234} __packed;
235
236struct usb_audio_processing_unit_updown {
237	uByte	iProcessing;
238	uByte	bNrModes;
239	uWord	waModes[0];		/* [bNrModes] */
240} __packed;
241
242/* UDESCSUB_AC_EXTENSION */
243struct usb_audio_extension_unit_0 {
244	uByte	bLength;
245	uByte	bDescriptorType;
246	uByte	bDescriptorSubtype;
247	uByte	bUnitId;
248	uWord	wExtensionCode;
249	uByte	bNrInPins;
250	uByte	baSourceId[0];		/* [bNrInPins] */
251	/* struct usb_audio_extension_unit_1 */
252} __packed;
253struct usb_audio_extension_unit_1 {
254	uByte	bNrChannels;
255	uWord	wChannelConfig;
256	uByte	iChannelNames;
257	uByte	bControlSize;
258	uByte	bmControls[0];		/* [bControlSize] */
259#define	UA_EXT_ENABLE_MASK 1
260#define	UA_EXT_ENABLE 1
261	/* uByte		iExtension; */
262} __packed;
263
264/* USB terminal types */
265#define	UAT_UNDEFINED		0x0100
266#define	UAT_STREAM		0x0101
267#define	UAT_VENDOR		0x01ff
268/* input terminal types */
269#define	UATI_UNDEFINED		0x0200
270#define	UATI_MICROPHONE		0x0201
271#define	UATI_DESKMICROPHONE	0x0202
272#define	UATI_PERSONALMICROPHONE	0x0203
273#define	UATI_OMNIMICROPHONE	0x0204
274#define	UATI_MICROPHONEARRAY	0x0205
275#define	UATI_PROCMICROPHONEARR	0x0206
276/* output terminal types */
277#define	UATO_UNDEFINED		0x0300
278#define	UATO_SPEAKER		0x0301
279#define	UATO_HEADPHONES		0x0302
280#define	UATO_DISPLAYAUDIO	0x0303
281#define	UATO_DESKTOPSPEAKER	0x0304
282#define	UATO_ROOMSPEAKER	0x0305
283#define	UATO_COMMSPEAKER	0x0306
284#define	UATO_SUBWOOFER		0x0307
285/* bidir terminal types */
286#define	UATB_UNDEFINED		0x0400
287#define	UATB_HANDSET		0x0401
288#define	UATB_HEADSET		0x0402
289#define	UATB_SPEAKERPHONE	0x0403
290#define	UATB_SPEAKERPHONEESUP	0x0404
291#define	UATB_SPEAKERPHONEECANC	0x0405
292/* telephony terminal types */
293#define	UATT_UNDEFINED		0x0500
294#define	UATT_PHONELINE		0x0501
295#define	UATT_TELEPHONE		0x0502
296#define	UATT_DOWNLINEPHONE	0x0503
297/* external terminal types */
298#define	UATE_UNDEFINED		0x0600
299#define	UATE_ANALOGCONN		0x0601
300#define	UATE_DIGITALAUIFC	0x0602
301#define	UATE_LINECONN		0x0603
302#define	UATE_LEGACYCONN		0x0604
303#define	UATE_SPDIF		0x0605
304#define	UATE_1394DA		0x0606
305#define	UATE_1394DV		0x0607
306/* embedded function terminal types */
307#define	UATF_UNDEFINED		0x0700
308#define	UATF_CALIBNOISE		0x0701
309#define	UATF_EQUNOISE		0x0702
310#define	UATF_CDPLAYER		0x0703
311#define	UATF_DAT		0x0704
312#define	UATF_DCC		0x0705
313#define	UATF_MINIDISK		0x0706
314#define	UATF_ANALOGTAPE		0x0707
315#define	UATF_PHONOGRAPH		0x0708
316#define	UATF_VCRAUDIO		0x0709
317#define	UATF_VIDEODISCAUDIO	0x070a
318#define	UATF_DVDAUDIO		0x070b
319#define	UATF_TVTUNERAUDIO	0x070c
320#define	UATF_SATELLITE		0x070d
321#define	UATF_CABLETUNER		0x070e
322#define	UATF_DSS		0x070f
323#define	UATF_RADIORECV		0x0710
324#define	UATF_RADIOXMIT		0x0711
325#define	UATF_MULTITRACK		0x0712
326#define	UATF_SYNTHESIZER	0x0713
327
328
329#define	SET_CUR 0x01
330#define	GET_CUR 0x81
331#define	SET_MIN 0x02
332#define	GET_MIN 0x82
333#define	SET_MAX 0x03
334#define	GET_MAX 0x83
335#define	SET_RES 0x04
336#define	GET_RES 0x84
337#define	SET_MEM 0x05
338#define	GET_MEM 0x85
339#define	GET_STAT 0xff
340
341#define	MUTE_CONTROL	0x01
342#define	VOLUME_CONTROL	0x02
343#define	BASS_CONTROL	0x03
344#define	MID_CONTROL	0x04
345#define	TREBLE_CONTROL	0x05
346#define	GRAPHIC_EQUALIZER_CONTROL	0x06
347#define	AGC_CONTROL	0x07
348#define	DELAY_CONTROL	0x08
349#define	BASS_BOOST_CONTROL 0x09
350#define	LOUDNESS_CONTROL 0x0a
351
352#define	FU_MASK(u) (1 << ((u)-1))
353
354#define	MASTER_CHAN	0
355
356#define	AS_GENERAL	1
357#define	FORMAT_TYPE	2
358#define	FORMAT_SPECIFIC 3
359
360#define	UA_FMT_PCM	1
361#define	UA_FMT_PCM8	2
362#define	UA_FMT_IEEE_FLOAT 3
363#define	UA_FMT_ALAW	4
364#define	UA_FMT_MULAW	5
365#define	UA_FMT_MPEG	0x1001
366#define	UA_FMT_AC3	0x1002
367
368#define	SAMPLING_FREQ_CONTROL	0x01
369#define	PITCH_CONTROL		0x02
370
371#define	FORMAT_TYPE_UNDEFINED 0
372#define	FORMAT_TYPE_I 1
373#define	FORMAT_TYPE_II 2
374#define	FORMAT_TYPE_III 3
375
376#define	UA_PROC_MASK(n) (1<< ((n)-1))
377#define	PROCESS_UNDEFINED		0
378#define	XX_ENABLE_CONTROL			1
379#define	UPDOWNMIX_PROCESS		1
380#define	UD_ENABLE_CONTROL			1
381#define	UD_MODE_SELECT_CONTROL			2
382#define	DOLBY_PROLOGIC_PROCESS		2
383#define	DP_ENABLE_CONTROL			1
384#define	DP_MODE_SELECT_CONTROL			2
385#define	P3D_STEREO_EXTENDER_PROCESS	3
386#define	P3D_ENABLE_CONTROL			1
387#define	P3D_SPACIOUSNESS_CONTROL		2
388#define	REVERBATION_PROCESS		4
389#define	RV_ENABLE_CONTROL			1
390#define	RV_LEVEL_CONTROL			2
391#define	RV_TIME_CONTROL			3
392#define	RV_FEEDBACK_CONTROL			4
393#define	CHORUS_PROCESS			5
394#define	CH_ENABLE_CONTROL			1
395#define	CH_LEVEL_CONTROL			2
396#define	CH_RATE_CONTROL			3
397#define	CH_DEPTH_CONTROL			4
398#define	DYN_RANGE_COMP_PROCESS		6
399#define	DR_ENABLE_CONTROL			1
400#define	DR_COMPRESSION_RATE_CONTROL		2
401#define	DR_MAXAMPL_CONTROL			3
402#define	DR_THRESHOLD_CONTROL			4
403#define	DR_ATTACK_TIME_CONTROL			5
404#define	DR_RELEASE_TIME_CONTROL		6
405