uaudioreg.h revision 192984
1184610Salfred/*	$NetBSD: uaudioreg.h,v 1.12 2004/11/05 19:08:29 kent Exp $	*/
2184610Salfred/* $FreeBSD: head/sys/dev/sound/usb/uaudioreg.h 192984 2009-05-28 17:36:36Z thompsa $ */
3184610Salfred
4184610Salfred/*-
5184610Salfred * Copyright (c) 1999 The NetBSD Foundation, Inc.
6184610Salfred * All rights reserved.
7184610Salfred *
8184610Salfred * This code is derived from software contributed to The NetBSD Foundation
9184610Salfred * by Lennart Augustsson (lennart@augustsson.net) at
10184610Salfred * Carlstedt Research & Technology.
11184610Salfred *
12184610Salfred * Redistribution and use in source and binary forms, with or without
13184610Salfred * modification, are permitted provided that the following conditions
14184610Salfred * are met:
15184610Salfred * 1. Redistributions of source code must retain the above copyright
16184610Salfred *    notice, this list of conditions and the following disclaimer.
17184610Salfred * 2. Redistributions in binary form must reproduce the above copyright
18184610Salfred *    notice, this list of conditions and the following disclaimer in the
19184610Salfred *    documentation and/or other materials provided with the distribution.
20184610Salfred *
21184610Salfred * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22184610Salfred * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23184610Salfred * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24184610Salfred * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25184610Salfred * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26184610Salfred * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27184610Salfred * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28184610Salfred * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29184610Salfred * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30184610Salfred * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31184610Salfred * POSSIBILITY OF SUCH DAMAGE.
32184610Salfred */
33184610Salfred
34184610Salfred#define	UAUDIO_VERSION		0x100
35184610Salfred
36184610Salfred#define	UDESC_CS_CONFIG		0x22
37184610Salfred#define	UDESC_CS_STRING		0x23
38184610Salfred#define	UDESC_CS_INTERFACE	0x24
39184610Salfred#define	UDESC_CS_ENDPOINT	0x25
40184610Salfred
41184610Salfred#define	UDESCSUB_AC_HEADER	1
42184610Salfred#define	UDESCSUB_AC_INPUT	2
43184610Salfred#define	UDESCSUB_AC_OUTPUT	3
44184610Salfred#define	UDESCSUB_AC_MIXER	4
45184610Salfred#define	UDESCSUB_AC_SELECTOR	5
46184610Salfred#define	UDESCSUB_AC_FEATURE	6
47184610Salfred#define	UDESCSUB_AC_PROCESSING	7
48184610Salfred#define	UDESCSUB_AC_EXTENSION	8
49184610Salfred
50192984Sthompsa/* The first fields are identical to struct usb_endpoint_descriptor */
51184610Salfredtypedef struct {
52184610Salfred	uByte	bLength;
53184610Salfred	uByte	bDescriptorType;
54184610Salfred	uByte	bEndpointAddress;
55184610Salfred	uByte	bmAttributes;
56184610Salfred	uWord	wMaxPacketSize;
57184610Salfred	uByte	bInterval;
58184610Salfred	/*
59184610Salfred	 * The following two entries are only used by the Audio Class.
60184610Salfred	 * And according to the specs the Audio Class is the only one
61184610Salfred	 * allowed to extend the endpoint descriptor.
62184610Salfred	 * Who knows what goes on in the minds of the people in the USB
63184610Salfred	 * standardization?  :-(
64184610Salfred	 */
65184610Salfred	uByte	bRefresh;
66184610Salfred	uByte	bSynchAddress;
67184610Salfred} __packed usb2_endpoint_descriptor_audio_t;
68184610Salfred
69184610Salfredstruct usb2_audio_control_descriptor {
70184610Salfred	uByte	bLength;
71184610Salfred	uByte	bDescriptorType;
72184610Salfred	uByte	bDescriptorSubtype;
73184610Salfred	uWord	bcdADC;
74184610Salfred	uWord	wTotalLength;
75184610Salfred	uByte	bInCollection;
76184610Salfred	uByte	baInterfaceNr[1];
77184610Salfred} __packed;
78184610Salfred
79184610Salfredstruct usb2_audio_streaming_interface_descriptor {
80184610Salfred	uByte	bLength;
81184610Salfred	uByte	bDescriptorType;
82184610Salfred	uByte	bDescriptorSubtype;
83184610Salfred	uByte	bTerminalLink;
84184610Salfred	uByte	bDelay;
85184610Salfred	uWord	wFormatTag;
86184610Salfred} __packed;
87184610Salfred
88184610Salfredstruct usb2_audio_streaming_endpoint_descriptor {
89184610Salfred	uByte	bLength;
90184610Salfred	uByte	bDescriptorType;
91184610Salfred	uByte	bDescriptorSubtype;
92184610Salfred	uByte	bmAttributes;
93184610Salfred#define	UA_SED_FREQ_CONTROL	0x01
94184610Salfred#define	UA_SED_PITCH_CONTROL	0x02
95184610Salfred#define	UA_SED_MAXPACKETSONLY	0x80
96184610Salfred	uByte	bLockDelayUnits;
97184610Salfred	uWord	wLockDelay;
98184610Salfred} __packed;
99184610Salfred
100184610Salfredstruct usb2_audio_streaming_type1_descriptor {
101184610Salfred	uByte	bLength;
102184610Salfred	uByte	bDescriptorType;
103184610Salfred	uByte	bDescriptorSubtype;
104184610Salfred	uByte	bFormatType;
105184610Salfred	uByte	bNrChannels;
106184610Salfred	uByte	bSubFrameSize;
107184610Salfred	uByte	bBitResolution;
108184610Salfred	uByte	bSamFreqType;
109184610Salfred#define	UA_SAMP_CONTNUOUS 0
110184610Salfred	uByte	tSamFreq[0];
111184610Salfred#define	UA_GETSAMP(p, n) (((p)->tSamFreq[((n)*3)+0]) |	    \
112184610Salfred			  ((p)->tSamFreq[((n)*3)+1] << 8) | \
113184610Salfred			  ((p)->tSamFreq[((n)*3)+2] << 16))
114184610Salfred#define	UA_SAMP_LO(p) UA_GETSAMP(p, 0)
115184610Salfred#define	UA_SAMP_HI(p) UA_GETSAMP(p, 1)
116184610Salfred} __packed;
117184610Salfred
118184610Salfredstruct usb2_audio_cluster {
119184610Salfred	uByte	bNrChannels;
120184610Salfred	uWord	wChannelConfig;
121184610Salfred#define	UA_CHANNEL_LEFT		0x0001
122184610Salfred#define	UA_CHANNEL_RIGHT	0x0002
123184610Salfred#define	UA_CHANNEL_CENTER	0x0004
124184610Salfred#define	UA_CHANNEL_LFE		0x0008
125184610Salfred#define	UA_CHANNEL_L_SURROUND	0x0010
126184610Salfred#define	UA_CHANNEL_R_SURROUND	0x0020
127184610Salfred#define	UA_CHANNEL_L_CENTER	0x0040
128184610Salfred#define	UA_CHANNEL_R_CENTER	0x0080
129184610Salfred#define	UA_CHANNEL_SURROUND	0x0100
130184610Salfred#define	UA_CHANNEL_L_SIDE	0x0200
131184610Salfred#define	UA_CHANNEL_R_SIDE	0x0400
132184610Salfred#define	UA_CHANNEL_TOP		0x0800
133184610Salfred	uByte	iChannelNames;
134184610Salfred} __packed;
135184610Salfred
136184610Salfred/* Shared by all units and terminals */
137184610Salfredstruct usb2_audio_unit {
138184610Salfred	uByte	bLength;
139184610Salfred	uByte	bDescriptorType;
140184610Salfred	uByte	bDescriptorSubtype;
141184610Salfred	uByte	bUnitId;
142184610Salfred};
143184610Salfred
144184610Salfred/* UDESCSUB_AC_INPUT */
145184610Salfredstruct usb2_audio_input_terminal {
146184610Salfred	uByte	bLength;
147184610Salfred	uByte	bDescriptorType;
148184610Salfred	uByte	bDescriptorSubtype;
149184610Salfred	uByte	bTerminalId;
150184610Salfred	uWord	wTerminalType;
151184610Salfred	uByte	bAssocTerminal;
152184610Salfred	uByte	bNrChannels;
153184610Salfred	uWord	wChannelConfig;
154184610Salfred	uByte	iChannelNames;
155184610Salfred/*	uByte		iTerminal; */
156184610Salfred} __packed;
157184610Salfred
158184610Salfred/* UDESCSUB_AC_OUTPUT */
159184610Salfredstruct usb2_audio_output_terminal {
160184610Salfred	uByte	bLength;
161184610Salfred	uByte	bDescriptorType;
162184610Salfred	uByte	bDescriptorSubtype;
163184610Salfred	uByte	bTerminalId;
164184610Salfred	uWord	wTerminalType;
165184610Salfred	uByte	bAssocTerminal;
166184610Salfred	uByte	bSourceId;
167184610Salfred	uByte	iTerminal;
168184610Salfred} __packed;
169184610Salfred
170184610Salfred/* UDESCSUB_AC_MIXER */
171184610Salfredstruct usb2_audio_mixer_unit_0 {
172184610Salfred	uByte	bLength;
173184610Salfred	uByte	bDescriptorType;
174184610Salfred	uByte	bDescriptorSubtype;
175184610Salfred	uByte	bUnitId;
176184610Salfred	uByte	bNrInPins;
177184610Salfred	uByte	baSourceId[0];		/* [bNrInPins] */
178184610Salfred	/* struct usb2_audio_mixer_unit_1 */
179184610Salfred} __packed;
180184610Salfredstruct usb2_audio_mixer_unit_1 {
181184610Salfred	uByte	bNrChannels;
182184610Salfred	uWord	wChannelConfig;
183184610Salfred	uByte	iChannelNames;
184184610Salfred	uByte	bmControls[0];		/* [see source code] */
185184610Salfred	/* uByte		iMixer; */
186184610Salfred} __packed;
187184610Salfred
188184610Salfred/* UDESCSUB_AC_SELECTOR */
189184610Salfredstruct usb2_audio_selector_unit {
190184610Salfred	uByte	bLength;
191184610Salfred	uByte	bDescriptorType;
192184610Salfred	uByte	bDescriptorSubtype;
193184610Salfred	uByte	bUnitId;
194184610Salfred	uByte	bNrInPins;
195184610Salfred	uByte	baSourceId[0];		/* [bNrInPins] */
196184610Salfred	/* uByte	iSelector; */
197184610Salfred} __packed;
198184610Salfred
199184610Salfred/* UDESCSUB_AC_FEATURE */
200184610Salfredstruct usb2_audio_feature_unit {
201184610Salfred	uByte	bLength;
202184610Salfred	uByte	bDescriptorType;
203184610Salfred	uByte	bDescriptorSubtype;
204184610Salfred	uByte	bUnitId;
205184610Salfred	uByte	bSourceId;
206184610Salfred	uByte	bControlSize;
207184610Salfred	uByte	bmaControls[0];		/* [bControlSize * x] */
208184610Salfred	/* uByte	iFeature; */
209184610Salfred} __packed;
210184610Salfred
211184610Salfred/* UDESCSUB_AC_PROCESSING */
212184610Salfredstruct usb2_audio_processing_unit_0 {
213184610Salfred	uByte	bLength;
214184610Salfred	uByte	bDescriptorType;
215184610Salfred	uByte	bDescriptorSubtype;
216184610Salfred	uByte	bUnitId;
217184610Salfred	uWord	wProcessType;
218184610Salfred	uByte	bNrInPins;
219184610Salfred	uByte	baSourceId[0];		/* [bNrInPins] */
220184610Salfred	/* struct usb2_audio_processing_unit_1 */
221184610Salfred} __packed;
222184610Salfredstruct usb2_audio_processing_unit_1 {
223184610Salfred	uByte	bNrChannels;
224184610Salfred	uWord	wChannelConfig;
225184610Salfred	uByte	iChannelNames;
226184610Salfred	uByte	bControlSize;
227184610Salfred	uByte	bmControls[0];		/* [bControlSize] */
228184610Salfred#define	UA_PROC_ENABLE_MASK 1
229184610Salfred} __packed;
230184610Salfred
231184610Salfredstruct usb2_audio_processing_unit_updown {
232184610Salfred	uByte	iProcessing;
233184610Salfred	uByte	bNrModes;
234184610Salfred	uWord	waModes[0];		/* [bNrModes] */
235184610Salfred} __packed;
236184610Salfred
237184610Salfred/* UDESCSUB_AC_EXTENSION */
238184610Salfredstruct usb2_audio_extension_unit_0 {
239184610Salfred	uByte	bLength;
240184610Salfred	uByte	bDescriptorType;
241184610Salfred	uByte	bDescriptorSubtype;
242184610Salfred	uByte	bUnitId;
243184610Salfred	uWord	wExtensionCode;
244184610Salfred	uByte	bNrInPins;
245184610Salfred	uByte	baSourceId[0];		/* [bNrInPins] */
246184610Salfred	/* struct usb2_audio_extension_unit_1 */
247184610Salfred} __packed;
248184610Salfredstruct usb2_audio_extension_unit_1 {
249184610Salfred	uByte	bNrChannels;
250184610Salfred	uWord	wChannelConfig;
251184610Salfred	uByte	iChannelNames;
252184610Salfred	uByte	bControlSize;
253184610Salfred	uByte	bmControls[0];		/* [bControlSize] */
254184610Salfred#define	UA_EXT_ENABLE_MASK 1
255184610Salfred#define	UA_EXT_ENABLE 1
256184610Salfred	/* uByte		iExtension; */
257184610Salfred} __packed;
258184610Salfred
259184610Salfred/* USB terminal types */
260184610Salfred#define	UAT_UNDEFINED		0x0100
261184610Salfred#define	UAT_STREAM		0x0101
262184610Salfred#define	UAT_VENDOR		0x01ff
263184610Salfred/* input terminal types */
264184610Salfred#define	UATI_UNDEFINED		0x0200
265184610Salfred#define	UATI_MICROPHONE		0x0201
266184610Salfred#define	UATI_DESKMICROPHONE	0x0202
267184610Salfred#define	UATI_PERSONALMICROPHONE	0x0203
268184610Salfred#define	UATI_OMNIMICROPHONE	0x0204
269184610Salfred#define	UATI_MICROPHONEARRAY	0x0205
270184610Salfred#define	UATI_PROCMICROPHONEARR	0x0206
271184610Salfred/* output terminal types */
272184610Salfred#define	UATO_UNDEFINED		0x0300
273184610Salfred#define	UATO_SPEAKER		0x0301
274184610Salfred#define	UATO_HEADPHONES		0x0302
275184610Salfred#define	UATO_DISPLAYAUDIO	0x0303
276184610Salfred#define	UATO_DESKTOPSPEAKER	0x0304
277184610Salfred#define	UATO_ROOMSPEAKER	0x0305
278184610Salfred#define	UATO_COMMSPEAKER	0x0306
279184610Salfred#define	UATO_SUBWOOFER		0x0307
280184610Salfred/* bidir terminal types */
281184610Salfred#define	UATB_UNDEFINED		0x0400
282184610Salfred#define	UATB_HANDSET		0x0401
283184610Salfred#define	UATB_HEADSET		0x0402
284184610Salfred#define	UATB_SPEAKERPHONE	0x0403
285184610Salfred#define	UATB_SPEAKERPHONEESUP	0x0404
286184610Salfred#define	UATB_SPEAKERPHONEECANC	0x0405
287184610Salfred/* telephony terminal types */
288184610Salfred#define	UATT_UNDEFINED		0x0500
289184610Salfred#define	UATT_PHONELINE		0x0501
290184610Salfred#define	UATT_TELEPHONE		0x0502
291184610Salfred#define	UATT_DOWNLINEPHONE	0x0503
292184610Salfred/* external terminal types */
293184610Salfred#define	UATE_UNDEFINED		0x0600
294184610Salfred#define	UATE_ANALOGCONN		0x0601
295184610Salfred#define	UATE_DIGITALAUIFC	0x0602
296184610Salfred#define	UATE_LINECONN		0x0603
297184610Salfred#define	UATE_LEGACYCONN		0x0604
298184610Salfred#define	UATE_SPDIF		0x0605
299184610Salfred#define	UATE_1394DA		0x0606
300184610Salfred#define	UATE_1394DV		0x0607
301184610Salfred/* embedded function terminal types */
302184610Salfred#define	UATF_UNDEFINED		0x0700
303184610Salfred#define	UATF_CALIBNOISE		0x0701
304184610Salfred#define	UATF_EQUNOISE		0x0702
305184610Salfred#define	UATF_CDPLAYER		0x0703
306184610Salfred#define	UATF_DAT		0x0704
307184610Salfred#define	UATF_DCC		0x0705
308184610Salfred#define	UATF_MINIDISK		0x0706
309184610Salfred#define	UATF_ANALOGTAPE		0x0707
310184610Salfred#define	UATF_PHONOGRAPH		0x0708
311184610Salfred#define	UATF_VCRAUDIO		0x0709
312184610Salfred#define	UATF_VIDEODISCAUDIO	0x070a
313184610Salfred#define	UATF_DVDAUDIO		0x070b
314184610Salfred#define	UATF_TVTUNERAUDIO	0x070c
315184610Salfred#define	UATF_SATELLITE		0x070d
316184610Salfred#define	UATF_CABLETUNER		0x070e
317184610Salfred#define	UATF_DSS		0x070f
318184610Salfred#define	UATF_RADIORECV		0x0710
319184610Salfred#define	UATF_RADIOXMIT		0x0711
320184610Salfred#define	UATF_MULTITRACK		0x0712
321184610Salfred#define	UATF_SYNTHESIZER	0x0713
322184610Salfred
323184610Salfred
324184610Salfred#define	SET_CUR 0x01
325184610Salfred#define	GET_CUR 0x81
326184610Salfred#define	SET_MIN 0x02
327184610Salfred#define	GET_MIN 0x82
328184610Salfred#define	SET_MAX 0x03
329184610Salfred#define	GET_MAX 0x83
330184610Salfred#define	SET_RES 0x04
331184610Salfred#define	GET_RES 0x84
332184610Salfred#define	SET_MEM 0x05
333184610Salfred#define	GET_MEM 0x85
334184610Salfred#define	GET_STAT 0xff
335184610Salfred
336184610Salfred#define	MUTE_CONTROL	0x01
337184610Salfred#define	VOLUME_CONTROL	0x02
338184610Salfred#define	BASS_CONTROL	0x03
339184610Salfred#define	MID_CONTROL	0x04
340184610Salfred#define	TREBLE_CONTROL	0x05
341184610Salfred#define	GRAPHIC_EQUALIZER_CONTROL	0x06
342184610Salfred#define	AGC_CONTROL	0x07
343184610Salfred#define	DELAY_CONTROL	0x08
344184610Salfred#define	BASS_BOOST_CONTROL 0x09
345184610Salfred#define	LOUDNESS_CONTROL 0x0a
346184610Salfred
347184610Salfred#define	FU_MASK(u) (1 << ((u)-1))
348184610Salfred
349184610Salfred#define	MASTER_CHAN	0
350184610Salfred
351184610Salfred#define	AS_GENERAL	1
352184610Salfred#define	FORMAT_TYPE	2
353184610Salfred#define	FORMAT_SPECIFIC 3
354184610Salfred
355184610Salfred#define	UA_FMT_PCM	1
356184610Salfred#define	UA_FMT_PCM8	2
357184610Salfred#define	UA_FMT_IEEE_FLOAT 3
358184610Salfred#define	UA_FMT_ALAW	4
359184610Salfred#define	UA_FMT_MULAW	5
360184610Salfred#define	UA_FMT_MPEG	0x1001
361184610Salfred#define	UA_FMT_AC3	0x1002
362184610Salfred
363184610Salfred#define	SAMPLING_FREQ_CONTROL	0x01
364184610Salfred#define	PITCH_CONTROL		0x02
365184610Salfred
366184610Salfred#define	FORMAT_TYPE_UNDEFINED 0
367184610Salfred#define	FORMAT_TYPE_I 1
368184610Salfred#define	FORMAT_TYPE_II 2
369184610Salfred#define	FORMAT_TYPE_III 3
370184610Salfred
371184610Salfred#define	UA_PROC_MASK(n) (1<< ((n)-1))
372184610Salfred#define	PROCESS_UNDEFINED		0
373184610Salfred#define	XX_ENABLE_CONTROL			1
374184610Salfred#define	UPDOWNMIX_PROCESS		1
375184610Salfred#define	UD_ENABLE_CONTROL			1
376184610Salfred#define	UD_MODE_SELECT_CONTROL			2
377184610Salfred#define	DOLBY_PROLOGIC_PROCESS		2
378184610Salfred#define	DP_ENABLE_CONTROL			1
379184610Salfred#define	DP_MODE_SELECT_CONTROL			2
380184610Salfred#define	P3D_STEREO_EXTENDER_PROCESS	3
381184610Salfred#define	P3D_ENABLE_CONTROL			1
382184610Salfred#define	P3D_SPACIOUSNESS_CONTROL		2
383184610Salfred#define	REVERBATION_PROCESS		4
384184610Salfred#define	RV_ENABLE_CONTROL			1
385184610Salfred#define	RV_LEVEL_CONTROL			2
386184610Salfred#define	RV_TIME_CONTROL			3
387184610Salfred#define	RV_FEEDBACK_CONTROL			4
388184610Salfred#define	CHORUS_PROCESS			5
389184610Salfred#define	CH_ENABLE_CONTROL			1
390184610Salfred#define	CH_LEVEL_CONTROL			2
391184610Salfred#define	CH_RATE_CONTROL			3
392184610Salfred#define	CH_DEPTH_CONTROL			4
393184610Salfred#define	DYN_RANGE_COMP_PROCESS		6
394184610Salfred#define	DR_ENABLE_CONTROL			1
395184610Salfred#define	DR_COMPRESSION_RATE_CONTROL		2
396184610Salfred#define	DR_MAXAMPL_CONTROL			3
397184610Salfred#define	DR_THRESHOLD_CONTROL			4
398184610Salfred#define	DR_ATTACK_TIME_CONTROL			5
399184610Salfred#define	DR_RELEASE_TIME_CONTROL		6
400