1/* $NetBSD: uaudioreg.h,v 1.16 2012/05/18 07:52:54 jdc Exp $ */
2
3/*
4 * Copyright (c) 1999 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Lennart Augustsson (lennart@augustsson.net) at
9 * Carlstedt Research & Technology.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#define UAUDIO_VERSION 0x100
34
35#define UDESC_CS_CONFIG 0x22
36#define UDESC_CS_STRING 0x23
37#define UDESC_CS_INTERFACE 0x24
38#define UDESC_CS_ENDPOINT 0x25
39
40#define UDESCSUB_AC_HEADER 1
41#define UDESCSUB_AC_INPUT 2
42#define UDESCSUB_AC_OUTPUT 3
43#define UDESCSUB_AC_MIXER 4
44#define UDESCSUB_AC_SELECTOR 5
45#define UDESCSUB_AC_FEATURE 6
46#define UDESCSUB_AC_PROCESSING 7
47#define UDESCSUB_AC_EXTENSION 8
48
49/* The first fields are identical to usb_endpoint_descriptor_t */
50typedef struct {
51 uByte bLength;
52 uByte bDescriptorType;
53 uByte bEndpointAddress;
54 uByte bmAttributes;
55 uWord wMaxPacketSize;
56 uByte bInterval;
57 /*
58 * The following two entries are only used by the Audio Class.
59 * And according to the specs the Audio Class is the only one
60 * allowed to extend the endpoint descriptor.
61 * Who knows what goes on in the minds of the people in the USB
62 * standardization? :-(
63 */
64 uByte bRefresh;
65 uByte bSynchAddress;
66} UPACKED usb_endpoint_descriptor_audio_t;
67
68/* generic, for iteration */
69typedef struct {
70 uByte bLength;
71 uByte bDescriptorType;
72 uByte bDescriptorSubtype;
73} UPACKED uaudio_cs_descriptor_t;
74
75struct usb_audio_control_descriptor {
76 uByte bLength;
77 uByte bDescriptorType;
78 uByte bDescriptorSubtype;
79 uWord bcdADC;
80 uWord wTotalLength;
81 uByte bInCollection;
82 uByte baInterfaceNr[1];
83} UPACKED;
84
85struct usb_audio_streaming_interface_descriptor {
86 uByte bLength;
87 uByte bDescriptorType;
88 uByte bDescriptorSubtype;
89 uByte bTerminalLink;
90 uByte bDelay;
91 uWord wFormatTag;
92} UPACKED;
93
94struct usb_audio_streaming_endpoint_descriptor {
95 uByte bLength;
96 uByte bDescriptorType;
97 uByte bDescriptorSubtype;
98 uByte bmAttributes;
99#define UA_SED_FREQ_CONTROL 0x01
100#define UA_SED_PITCH_CONTROL 0x02
101#define UA_SED_MAXPACKETSONLY 0x80
102 uByte bLockDelayUnits;
103 uWord wLockDelay;
104} UPACKED;
105
106struct usb_audio_streaming_type1_descriptor {
107 uByte bLength;
108 uByte bDescriptorType;
109 uByte bDescriptorSubtype;
110 uByte bFormatType;
111 uByte bNrChannels;
112 uByte bSubFrameSize;
113 uByte bBitResolution;
114 uByte bSamFreqType;
115#define UA_SAMP_CONTNUOUS 0
116 uByte tSamFreq[3*AUFMT_MAX_FREQUENCIES];
117#define UA_GETSAMP(p, n) ((p)->tSamFreq[(n)*3+0] | ((p)->tSamFreq[(n)*3+1] << 8) | ((p)->tSamFreq[(n)*3+2] << 16))
118#define UA_SAMP_LO(p) UA_GETSAMP(p, 0)
119#define UA_SAMP_HI(p) UA_GETSAMP(p, 1)
120} UPACKED;
121
122struct usb_audio_cluster {
123 uByte bNrChannels;
124 uWord wChannelConfig;
125#define UA_CHANNEL_LEFT 0x0001
126#define UA_CHANNEL_RIGHT 0x0002
127#define UA_CHANNEL_CENTER 0x0004
128#define UA_CHANNEL_LFE 0x0008
129#define UA_CHANNEL_L_SURROUND 0x0010
130#define UA_CHANNEL_R_SURROUND 0x0020
131#define UA_CHANNEL_L_CENTER 0x0040
132#define UA_CHANNEL_R_CENTER 0x0080
133#define UA_CHANNEL_SURROUND 0x0100
134#define UA_CHANNEL_L_SIDE 0x0200
135#define UA_CHANNEL_R_SIDE 0x0400
136#define UA_CHANNEL_TOP 0x0800
137 uByte iChannelNames;
138} UPACKED;
139
140/* Shared by all units and terminals */
141struct usb_audio_unit {
142 uByte bLength;
143 uByte bDescriptorType;
144 uByte bDescriptorSubtype;
145 uByte bUnitId;
146};
147
148/* UDESCSUB_AC_INPUT */
149struct usb_audio_input_terminal {
150 uByte bLength;
151 uByte bDescriptorType;
152 uByte bDescriptorSubtype;
153 uByte bTerminalId;
154 uWord wTerminalType;
155 uByte bAssocTerminal;
156 uByte bNrChannels;
157 uWord wChannelConfig;
158 uByte iChannelNames;
159 uByte iTerminal;
160} UPACKED;
161
162/* UDESCSUB_AC_OUTPUT */
163struct usb_audio_output_terminal {
164 uByte bLength;
165 uByte bDescriptorType;
166 uByte bDescriptorSubtype;
167 uByte bTerminalId;
168 uWord wTerminalType;
169 uByte bAssocTerminal;
170 uByte bSourceId;
171 uByte iTerminal;
172} UPACKED;
173
174/* UDESCSUB_AC_MIXER */
175struct usb_audio_mixer_unit {
176 uByte bLength;
177 uByte bDescriptorType;
178 uByte bDescriptorSubtype;
179 uByte bUnitId;
180 uByte bNrInPins;
181 uByte baSourceId[255]; /* [bNrInPins] */
182 /* struct usb_audio_mixer_unit_1 */
183} UPACKED;
184struct usb_audio_mixer_unit_1 {
185 uByte bNrChannels;
186 uWord wChannelConfig;
187 uByte iChannelNames;
188 uByte bmControls[255]; /* [bNrChannels] */
189 /*uByte iMixer;*/
190} UPACKED;
191
192/* UDESCSUB_AC_SELECTOR */
193struct usb_audio_selector_unit {
194 uByte bLength;
195 uByte bDescriptorType;
196 uByte bDescriptorSubtype;
197 uByte bUnitId;
198 uByte bNrInPins;
199 uByte baSourceId[255]; /* [bNrInPins] */
200 /* uByte iSelector; */
201} UPACKED;
202
203/* UDESCSUB_AC_FEATURE */
204struct usb_audio_feature_unit {
205 uByte bLength;
206 uByte bDescriptorType;
207 uByte bDescriptorSubtype;
208 uByte bUnitId;
209 uByte bSourceId;
210 uByte bControlSize;
211 uByte bmaControls[255]; /* size for more than enough */
212 /* uByte iFeature; */
213} UPACKED;
214
215/* UDESCSUB_AC_PROCESSING */
216struct usb_audio_processing_unit {
217 uByte bLength;
218 uByte bDescriptorType;
219 uByte bDescriptorSubtype;
220 uByte bUnitId;
221 uWord wProcessType;
222 uByte bNrInPins;
223 uByte baSourceId[255]; /* [bNrInPins] */
224 /* struct usb_audio_processing_unit_1 */
225} UPACKED;
226struct usb_audio_processing_unit_1{
227 uByte bNrChannels;
228 uWord wChannelConfig;
229 uByte iChannelNames;
230 uByte bControlSize;
231 uByte bmControls[255]; /* [bControlSize] */
232#define UA_PROC_ENABLE_MASK 1
233} UPACKED;
234
235struct usb_audio_processing_unit_updown {
236 uByte iProcessing;
237 uByte bNrModes;
238 uWord waModes[255]; /* [bNrModes] */
239} UPACKED;
240
241/* UDESCSUB_AC_EXTENSION */
242struct usb_audio_extension_unit {
243 uByte bLength;
244 uByte bDescriptorType;
245 uByte bDescriptorSubtype;
246 uByte bUnitId;
247 uWord wExtensionCode;
248 uByte bNrInPins;
249 uByte baSourceId[255]; /* [bNrInPins] */
250 /* struct usb_audio_extension_unit_1 */
251} UPACKED;
252struct usb_audio_extension_unit_1 {
253 uByte bNrChannels;
254 uWord wChannelConfig;
255 uByte iChannelNames;
256 uByte bControlSize;
257 uByte bmControls[255]; /* [bControlSize] */
258#define UA_EXT_ENABLE_MASK 1
259#define UA_EXT_ENABLE 1
260 /*uByte iExtension;*/
261} UPACKED;
262
263/* USB terminal types */
264#define UAT_UNDEFINED 0x0100
265#define UAT_STREAM 0x0101
266#define UAT_VENDOR 0x01ff
267/* input terminal types */
268#define UATI_UNDEFINED 0x0200
269#define UATI_MICROPHONE 0x0201
270#define UATI_DESKMICROPHONE 0x0202
271#define UATI_PERSONALMICROPHONE 0x0203
272#define UATI_OMNIMICROPHONE 0x0204
273#define UATI_MICROPHONEARRAY 0x0205
274#define UATI_PROCMICROPHONEARR 0x0206
275/* output terminal types */
276#define UATO_UNDEFINED 0x0300
277#define UATO_SPEAKER 0x0301
278#define UATO_HEADPHONES 0x0302
279#define UATO_DISPLAYAUDIO 0x0303
280#define UATO_DESKTOPSPEAKER 0x0304
281#define UATO_ROOMSPEAKER 0x0305
282#define UATO_COMMSPEAKER 0x0306
283#define UATO_SUBWOOFER 0x0307
284/* bidir terminal types */
285#define UATB_UNDEFINED 0x0400
286#define UATB_HANDSET 0x0401
287#define UATB_HEADSET 0x0402
288#define UATB_SPEAKERPHONE 0x0403
289#define UATB_SPEAKERPHONEESUP 0x0404
290#define UATB_SPEAKERPHONEECANC 0x0405
291/* telephony terminal types */
292#define UATT_UNDEFINED 0x0500
293#define UATT_PHONELINE 0x0501
294#define UATT_TELEPHONE 0x0502
295#define UATT_DOWNLINEPHONE 0x0503
296/* external terminal types */
297#define UATE_UNDEFINED 0x0600
298#define UATE_ANALOGCONN 0x0601
299#define UATE_DIGITALAUIFC 0x0602
300#define UATE_LINECONN 0x0603
301#define UATE_LEGACYCONN 0x0604
302#define UATE_SPDIF 0x0605
303#define UATE_1394DA 0x0606
304#define UATE_1394DV 0x0607
305/* embedded function terminal types */
306#define UATF_UNDEFINED 0x0700
307#define UATF_CALIBNOISE 0x0701
308#define UATF_EQUNOISE 0x0702
309#define UATF_CDPLAYER 0x0703
310#define UATF_DAT 0x0704
311#define UATF_DCC 0x0705
312#define UATF_MINIDISK 0x0706
313#define UATF_ANALOGTAPE 0x0707
314#define UATF_PHONOGRAPH 0x0708
315#define UATF_VCRAUDIO 0x0709
316#define UATF_VIDEODISCAUDIO 0x070a
317#define UATF_DVDAUDIO 0x070b
318#define UATF_TVTUNERAUDIO 0x070c
319#define UATF_SATELLITE 0x070d
320#define UATF_CABLETUNER 0x070e
321#define UATF_DSS 0x070f
322#define UATF_RADIORECV 0x0710
323#define UATF_RADIOXMIT 0x0711
324#define UATF_MULTITRACK 0x0712
325#define UATF_SYNTHESIZER 0x0713
326
327
328#define SET_CUR 0x01
329#define GET_CUR 0x81
330#define SET_MIN 0x02
331#define GET_MIN 0x82
332#define SET_MAX 0x03
333#define GET_MAX 0x83
334#define SET_RES 0x04
335#define GET_RES 0x84
336#define SET_MEM 0x05
337#define GET_MEM 0x85
338#define GET_STAT 0xff
339
340#define MUTE_CONTROL 0x01
341#define VOLUME_CONTROL 0x02
342#define BASS_CONTROL 0x03
343#define MID_CONTROL 0x04
344#define TREBLE_CONTROL 0x05
345#define GRAPHIC_EQUALIZER_CONTROL 0x06
346#define AGC_CONTROL 0x07
347#define DELAY_CONTROL 0x08
348#define BASS_BOOST_CONTROL 0x09
349#define LOUDNESS_CONTROL 0x0a
350
351#define FU_MASK(u) (1 << ((u)-1))
352
353#define MASTER_CHAN 0
354
355#define AS_GENERAL 1
356#define FORMAT_TYPE 2
357#define FORMAT_SPECIFIC 3
358
359#define UA_FMT_PCM 1
360#define UA_FMT_PCM8 2
361#define UA_FMT_IEEE_FLOAT 3
362#define UA_FMT_ALAW 4
363#define UA_FMT_MULAW 5
364#define UA_FMT_MPEG 0x1001
365#define UA_FMT_AC3 0x1002
366
367#define SAMPLING_FREQ_CONTROL 0x01
368#define PITCH_CONTROL 0x02
369
370#define FORMAT_TYPE_UNDEFINED 0
371#define FORMAT_TYPE_I 1
372#define FORMAT_TYPE_II 2
373#define FORMAT_TYPE_III 3
374
375#define UA_PROC_MASK(n) (1<< ((n)-1))
376#define PROCESS_UNDEFINED 0
377#define XX_ENABLE_CONTROL 1
378#define UPDOWNMIX_PROCESS 1
379#define UD_ENABLE_CONTROL 1
380#define UD_MODE_SELECT_CONTROL 2
381#define DOLBY_PROLOGIC_PROCESS 2
382#define DP_ENABLE_CONTROL 1
383#define DP_MODE_SELECT_CONTROL 2
384#define P3D_STEREO_EXTENDER_PROCESS 3
385#define P3D_ENABLE_CONTROL 1
386#define P3D_SPACIOUSNESS_CONTROL 2
387#define REVERBATION_PROCESS 4
388#define RV_ENABLE_CONTROL 1
389#define RV_LEVEL_CONTROL 2
390#define RV_TIME_CONTROL 3
391#define RV_FEEDBACK_CONTROL 4
392#define CHORUS_PROCESS 5
393#define CH_ENABLE_CONTROL 1
394#define CH_LEVEL_CONTROL 2
395#define CH_RATE_CONTROL 3
396#define CH_DEPTH_CONTROL 4
397#define DYN_RANGE_COMP_PROCESS 6
398#define DR_ENABLE_CONTROL 1
399#define DR_COMPRESSION_RATE_CONTROL 2
400#define DR_MAXAMPL_CONTROL 3
401#define DR_THRESHOLD_CONTROL 4
402#define DR_ATTACK_TIME_CONTROL 5
403#define DR_RELEASE_TIME_CONTROL 6
404