Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (c) 2010 Daniel Mack <daniel@caiaq.de>
0004  *
0005  * This file holds USB constants and structures defined
0006  * by the USB Device Class Definition for Audio Devices in version 2.0.
0007  * Comments below reference relevant sections of the documents contained
0008  * in http://www.usb.org/developers/devclass_docs/Audio2.0_final.zip
0009  */
0010 
0011 #ifndef __LINUX_USB_AUDIO_V2_H
0012 #define __LINUX_USB_AUDIO_V2_H
0013 
0014 #include <linux/types.h>
0015 
0016 /* v1.0 and v2.0 of this standard have many things in common. For the rest
0017  * of the definitions, please refer to audio.h */
0018 
0019 /*
0020  * bmControl field decoders
0021  *
0022  * From the USB Audio spec v2.0:
0023  *
0024  *   bmaControls() is a (ch+1)-element array of 4-byte bitmaps,
0025  *   each containing a set of bit pairs. If a Control is present,
0026  *   it must be Host readable. If a certain Control is not
0027  *   present then the bit pair must be set to 0b00.
0028  *   If a Control is present but read-only, the bit pair must be
0029  *   set to 0b01. If a Control is also Host programmable, the bit
0030  *   pair must be set to 0b11. The value 0b10 is not allowed.
0031  *
0032  */
0033 
0034 static inline bool uac_v2v3_control_is_readable(u32 bmControls, u8 control)
0035 {
0036     return (bmControls >> ((control - 1) * 2)) & 0x1;
0037 }
0038 
0039 static inline bool uac_v2v3_control_is_writeable(u32 bmControls, u8 control)
0040 {
0041     return (bmControls >> ((control - 1) * 2)) & 0x2;
0042 }
0043 
0044 /* 4.7.2 Class-Specific AC Interface Descriptor */
0045 struct uac2_ac_header_descriptor {
0046     __u8  bLength;          /* 9 */
0047     __u8  bDescriptorType;      /* USB_DT_CS_INTERFACE */
0048     __u8  bDescriptorSubtype;   /* UAC_MS_HEADER */
0049     __le16 bcdADC;          /* 0x0200 */
0050     __u8  bCategory;
0051     __le16 wTotalLength;        /* includes Unit and Terminal desc. */
0052     __u8  bmControls;
0053 } __packed;
0054 
0055 /* 2.3.1.6 Type I Format Type Descriptor (Frmts20 final.pdf)*/
0056 struct uac2_format_type_i_descriptor {
0057     __u8  bLength;          /* in bytes: 6 */
0058     __u8  bDescriptorType;      /* USB_DT_CS_INTERFACE */
0059     __u8  bDescriptorSubtype;   /* FORMAT_TYPE */
0060     __u8  bFormatType;      /* FORMAT_TYPE_1 */
0061     __u8  bSubslotSize;     /* {1,2,3,4} */
0062     __u8  bBitResolution;
0063 } __packed;
0064 
0065 /* 4.7.2.1 Clock Source Descriptor */
0066 
0067 struct uac_clock_source_descriptor {
0068     __u8 bLength;
0069     __u8 bDescriptorType;
0070     __u8 bDescriptorSubtype;
0071     __u8 bClockID;
0072     __u8 bmAttributes;
0073     __u8 bmControls;
0074     __u8 bAssocTerminal;
0075     __u8 iClockSource;
0076 } __attribute__((packed));
0077 
0078 /* bmAttribute fields */
0079 #define UAC_CLOCK_SOURCE_TYPE_EXT   0x0
0080 #define UAC_CLOCK_SOURCE_TYPE_INT_FIXED 0x1
0081 #define UAC_CLOCK_SOURCE_TYPE_INT_VAR   0x2
0082 #define UAC_CLOCK_SOURCE_TYPE_INT_PROG  0x3
0083 #define UAC_CLOCK_SOURCE_SYNCED_TO_SOF  (1 << 2)
0084 
0085 /* 4.7.2.2 Clock Source Descriptor */
0086 
0087 struct uac_clock_selector_descriptor {
0088     __u8 bLength;
0089     __u8 bDescriptorType;
0090     __u8 bDescriptorSubtype;
0091     __u8 bClockID;
0092     __u8 bNrInPins;
0093     __u8 baCSourceID[];
0094     /* bmControls and iClockSource omitted */
0095 } __attribute__((packed));
0096 
0097 /* 4.7.2.3 Clock Multiplier Descriptor */
0098 
0099 struct uac_clock_multiplier_descriptor {
0100     __u8 bLength;
0101     __u8 bDescriptorType;
0102     __u8 bDescriptorSubtype;
0103     __u8 bClockID;
0104     __u8 bCSourceID;
0105     __u8 bmControls;
0106     __u8 iClockMultiplier;
0107 } __attribute__((packed));
0108 
0109 /* 4.7.2.4 Input terminal descriptor */
0110 
0111 struct uac2_input_terminal_descriptor {
0112     __u8 bLength;
0113     __u8 bDescriptorType;
0114     __u8 bDescriptorSubtype;
0115     __u8 bTerminalID;
0116     __le16 wTerminalType;
0117     __u8 bAssocTerminal;
0118     __u8 bCSourceID;
0119     __u8 bNrChannels;
0120     __le32 bmChannelConfig;
0121     __u8 iChannelNames;
0122     __le16 bmControls;
0123     __u8 iTerminal;
0124 } __attribute__((packed));
0125 
0126 /* 4.7.2.5 Output terminal descriptor */
0127 
0128 struct uac2_output_terminal_descriptor {
0129     __u8 bLength;
0130     __u8 bDescriptorType;
0131     __u8 bDescriptorSubtype;
0132     __u8 bTerminalID;
0133     __le16 wTerminalType;
0134     __u8 bAssocTerminal;
0135     __u8 bSourceID;
0136     __u8 bCSourceID;
0137     __le16 bmControls;
0138     __u8 iTerminal;
0139 } __attribute__((packed));
0140 
0141 
0142 
0143 /* 4.7.2.8 Feature Unit Descriptor */
0144 
0145 struct uac2_feature_unit_descriptor {
0146     __u8 bLength;
0147     __u8 bDescriptorType;
0148     __u8 bDescriptorSubtype;
0149     __u8 bUnitID;
0150     __u8 bSourceID;
0151     /* bmaControls is actually u32,
0152      * but u8 is needed for the hybrid parser */
0153     __u8 bmaControls[]; /* variable length */
0154 } __attribute__((packed));
0155 
0156 #define UAC2_DT_FEATURE_UNIT_SIZE(ch)       (6 + ((ch) + 1) * 4)
0157 
0158 /* As above, but more useful for defining your own descriptors: */
0159 #define DECLARE_UAC2_FEATURE_UNIT_DESCRIPTOR(ch)        \
0160 struct uac2_feature_unit_descriptor_##ch {          \
0161     __u8  bLength;                      \
0162     __u8  bDescriptorType;                  \
0163     __u8  bDescriptorSubtype;               \
0164     __u8  bUnitID;                      \
0165     __u8  bSourceID;                    \
0166     __le32 bmaControls[ch + 1];             \
0167     __u8  iFeature;                     \
0168 } __packed
0169 
0170 /* 4.7.2.10 Effect Unit Descriptor */
0171 
0172 struct uac2_effect_unit_descriptor {
0173     __u8 bLength;
0174     __u8 bDescriptorType;
0175     __u8 bDescriptorSubtype;
0176     __u8 bUnitID;
0177     __le16 wEffectType;
0178     __u8 bSourceID;
0179     __u8 bmaControls[]; /* variable length */
0180 } __attribute__((packed));
0181 
0182 /* 4.9.2 Class-Specific AS Interface Descriptor */
0183 
0184 struct uac2_as_header_descriptor {
0185     __u8 bLength;
0186     __u8 bDescriptorType;
0187     __u8 bDescriptorSubtype;
0188     __u8 bTerminalLink;
0189     __u8 bmControls;
0190     __u8 bFormatType;
0191     __le32 bmFormats;
0192     __u8 bNrChannels;
0193     __le32 bmChannelConfig;
0194     __u8 iChannelNames;
0195 } __attribute__((packed));
0196 
0197 #define UAC2_FORMAT_TYPE_I_RAW_DATA (1 << 31)
0198 
0199 /* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */
0200 
0201 struct uac2_iso_endpoint_descriptor {
0202     __u8  bLength;          /* in bytes: 8 */
0203     __u8  bDescriptorType;      /* USB_DT_CS_ENDPOINT */
0204     __u8  bDescriptorSubtype;   /* EP_GENERAL */
0205     __u8  bmAttributes;
0206     __u8  bmControls;
0207     __u8  bLockDelayUnits;
0208     __le16 wLockDelay;
0209 } __attribute__((packed));
0210 
0211 #define UAC2_CONTROL_PITCH      (3 << 0)
0212 #define UAC2_CONTROL_DATA_OVERRUN   (3 << 2)
0213 #define UAC2_CONTROL_DATA_UNDERRUN  (3 << 4)
0214 
0215 /* 5.2.5.4.2 Connector Control Parameter Block */
0216 struct uac2_connectors_ctl_blk {
0217     __u8 bNrChannels;
0218     __le32 bmChannelConfig;
0219     __u8 iChannelNames;
0220 } __attribute__((packed));
0221 
0222 /* 6.1 Interrupt Data Message */
0223 
0224 #define UAC2_INTERRUPT_DATA_MSG_VENDOR  (1 << 0)
0225 #define UAC2_INTERRUPT_DATA_MSG_EP  (1 << 1)
0226 
0227 struct uac2_interrupt_data_msg {
0228     __u8 bInfo;
0229     __u8 bAttribute;
0230     __le16 wValue;
0231     __le16 wIndex;
0232 } __attribute__((packed));
0233 
0234 /* A.7 Audio Function Category Codes */
0235 #define UAC2_FUNCTION_SUBCLASS_UNDEFINED    0x00
0236 #define UAC2_FUNCTION_DESKTOP_SPEAKER       0x01
0237 #define UAC2_FUNCTION_HOME_THEATER      0x02
0238 #define UAC2_FUNCTION_MICROPHONE        0x03
0239 #define UAC2_FUNCTION_HEADSET           0x04
0240 #define UAC2_FUNCTION_TELEPHONE         0x05
0241 #define UAC2_FUNCTION_CONVERTER         0x06
0242 #define UAC2_FUNCTION_SOUND_RECORDER        0x07
0243 #define UAC2_FUNCTION_IO_BOX            0x08
0244 #define UAC2_FUNCTION_MUSICAL_INSTRUMENT    0x09
0245 #define UAC2_FUNCTION_PRO_AUDIO         0x0a
0246 #define UAC2_FUNCTION_AUDIO_VIDEO       0x0b
0247 #define UAC2_FUNCTION_CONTROL_PANEL     0x0c
0248 #define UAC2_FUNCTION_OTHER         0xff
0249 
0250 /* A.9 Audio Class-Specific AC Interface Descriptor Subtypes */
0251 /* see audio.h for the rest, which is identical to v1 */
0252 #define UAC2_EFFECT_UNIT            0x07
0253 #define UAC2_PROCESSING_UNIT_V2     0x08
0254 #define UAC2_EXTENSION_UNIT_V2      0x09
0255 #define UAC2_CLOCK_SOURCE       0x0a
0256 #define UAC2_CLOCK_SELECTOR     0x0b
0257 #define UAC2_CLOCK_MULTIPLIER       0x0c
0258 #define UAC2_SAMPLE_RATE_CONVERTER  0x0d
0259 
0260 /* A.10 Audio Class-Specific AS Interface Descriptor Subtypes */
0261 /* see audio.h for the rest, which is identical to v1 */
0262 #define UAC2_ENCODER            0x03
0263 #define UAC2_DECODER            0x04
0264 
0265 /* A.11 Effect Unit Effect Types */
0266 #define UAC2_EFFECT_UNDEFINED       0x00
0267 #define UAC2_EFFECT_PARAM_EQ        0x01
0268 #define UAC2_EFFECT_REVERB      0x02
0269 #define UAC2_EFFECT_MOD_DELAY       0x03
0270 #define UAC2_EFFECT_DYN_RANGE_COMP  0x04
0271 
0272 /* A.12 Processing Unit Process Types */
0273 #define UAC2_PROCESS_UNDEFINED      0x00
0274 #define UAC2_PROCESS_UP_DOWNMIX     0x01
0275 #define UAC2_PROCESS_DOLBY_PROLOCIC 0x02
0276 #define UAC2_PROCESS_STEREO_EXTENDER    0x03
0277 
0278 /* A.14 Audio Class-Specific Request Codes */
0279 #define UAC2_CS_CUR         0x01
0280 #define UAC2_CS_RANGE           0x02
0281 #define UAC2_CS_MEM         0x03
0282 
0283 /* A.15 Encoder Type Codes */
0284 #define UAC2_ENCODER_UNDEFINED      0x00
0285 #define UAC2_ENCODER_OTHER      0x01
0286 #define UAC2_ENCODER_MPEG       0x02
0287 #define UAC2_ENCODER_AC3        0x03
0288 #define UAC2_ENCODER_WMA        0x04
0289 #define UAC2_ENCODER_DTS        0x05
0290 
0291 /* A.16 Decoder Type Codes */
0292 #define UAC2_DECODER_UNDEFINED      0x00
0293 #define UAC2_DECODER_OTHER      0x01
0294 #define UAC2_DECODER_MPEG       0x02
0295 #define UAC2_DECODER_AC3        0x03
0296 #define UAC2_DECODER_WMA        0x04
0297 #define UAC2_DECODER_DTS        0x05
0298 
0299 /* A.17.1 Clock Source Control Selectors */
0300 #define UAC2_CS_UNDEFINED       0x00
0301 #define UAC2_CS_CONTROL_SAM_FREQ    0x01
0302 #define UAC2_CS_CONTROL_CLOCK_VALID 0x02
0303 
0304 /* A.17.2 Clock Selector Control Selectors */
0305 #define UAC2_CX_UNDEFINED       0x00
0306 #define UAC2_CX_CLOCK_SELECTOR      0x01
0307 
0308 /* A.17.3 Clock Multiplier Control Selectors */
0309 #define UAC2_CM_UNDEFINED       0x00
0310 #define UAC2_CM_NUMERATOR       0x01
0311 #define UAC2_CM_DENOMINTATOR        0x02
0312 
0313 /* A.17.4 Terminal Control Selectors */
0314 #define UAC2_TE_UNDEFINED       0x00
0315 #define UAC2_TE_COPY_PROTECT        0x01
0316 #define UAC2_TE_CONNECTOR       0x02
0317 #define UAC2_TE_OVERLOAD        0x03
0318 #define UAC2_TE_CLUSTER         0x04
0319 #define UAC2_TE_UNDERFLOW       0x05
0320 #define UAC2_TE_OVERFLOW        0x06
0321 #define UAC2_TE_LATENCY         0x07
0322 
0323 /* A.17.5 Mixer Control Selectors */
0324 #define UAC2_MU_UNDEFINED       0x00
0325 #define UAC2_MU_MIXER           0x01
0326 #define UAC2_MU_CLUSTER         0x02
0327 #define UAC2_MU_UNDERFLOW       0x03
0328 #define UAC2_MU_OVERFLOW        0x04
0329 #define UAC2_MU_LATENCY         0x05
0330 
0331 /* A.17.6 Selector Control Selectors */
0332 #define UAC2_SU_UNDEFINED       0x00
0333 #define UAC2_SU_SELECTOR        0x01
0334 #define UAC2_SU_LATENCY         0x02
0335 
0336 /* A.17.7 Feature Unit Control Selectors */
0337 /* see audio.h for the rest, which is identical to v1 */
0338 #define UAC2_FU_INPUT_GAIN      0x0b
0339 #define UAC2_FU_INPUT_GAIN_PAD      0x0c
0340 #define UAC2_FU_PHASE_INVERTER      0x0d
0341 #define UAC2_FU_UNDERFLOW       0x0e
0342 #define UAC2_FU_OVERFLOW        0x0f
0343 #define UAC2_FU_LATENCY         0x10
0344 
0345 /* A.17.8.1 Parametric Equalizer Section Effect Unit Control Selectors */
0346 #define UAC2_PE_UNDEFINED       0x00
0347 #define UAC2_PE_ENABLE          0x01
0348 #define UAC2_PE_CENTERFREQ      0x02
0349 #define UAC2_PE_QFACTOR         0x03
0350 #define UAC2_PE_GAIN            0x04
0351 #define UAC2_PE_UNDERFLOW       0x05
0352 #define UAC2_PE_OVERFLOW        0x06
0353 #define UAC2_PE_LATENCY         0x07
0354 
0355 /* A.17.8.2 Reverberation Effect Unit Control Selectors */
0356 #define UAC2_RV_UNDEFINED       0x00
0357 #define UAC2_RV_ENABLE          0x01
0358 #define UAC2_RV_TYPE            0x02
0359 #define UAC2_RV_LEVEL           0x03
0360 #define UAC2_RV_TIME            0x04
0361 #define UAC2_RV_FEEDBACK        0x05
0362 #define UAC2_RV_PREDELAY        0x06
0363 #define UAC2_RV_DENSITY         0x07
0364 #define UAC2_RV_HIFREQ_ROLLOFF      0x08
0365 #define UAC2_RV_UNDERFLOW       0x09
0366 #define UAC2_RV_OVERFLOW        0x0a
0367 #define UAC2_RV_LATENCY         0x0b
0368 
0369 /* A.17.8.3 Modulation Delay Effect Control Selectors */
0370 #define UAC2_MD_UNDEFINED       0x00
0371 #define UAC2_MD_ENABLE          0x01
0372 #define UAC2_MD_BALANCE         0x02
0373 #define UAC2_MD_RATE            0x03
0374 #define UAC2_MD_DEPTH           0x04
0375 #define UAC2_MD_TIME            0x05
0376 #define UAC2_MD_FEEDBACK        0x06
0377 #define UAC2_MD_UNDERFLOW       0x07
0378 #define UAC2_MD_OVERFLOW        0x08
0379 #define UAC2_MD_LATENCY         0x09
0380 
0381 /* A.17.8.4 Dynamic Range Compressor Effect Unit Control Selectors */
0382 #define UAC2_DR_UNDEFINED       0x00
0383 #define UAC2_DR_ENABLE          0x01
0384 #define UAC2_DR_COMPRESSION_RATE    0x02
0385 #define UAC2_DR_MAXAMPL         0x03
0386 #define UAC2_DR_THRESHOLD       0x04
0387 #define UAC2_DR_ATTACK_TIME     0x05
0388 #define UAC2_DR_RELEASE_TIME        0x06
0389 #define UAC2_DR_UNDEFLOW        0x07
0390 #define UAC2_DR_OVERFLOW        0x08
0391 #define UAC2_DR_LATENCY         0x09
0392 
0393 /* A.17.9.1 Up/Down-mix Processing Unit Control Selectors */
0394 #define UAC2_UD_UNDEFINED       0x00
0395 #define UAC2_UD_ENABLE          0x01
0396 #define UAC2_UD_MODE_SELECT     0x02
0397 #define UAC2_UD_CLUSTER         0x03
0398 #define UAC2_UD_UNDERFLOW       0x04
0399 #define UAC2_UD_OVERFLOW        0x05
0400 #define UAC2_UD_LATENCY         0x06
0401 
0402 /* A.17.9.2 Dolby Prologic[tm] Processing Unit Control Selectors */
0403 #define UAC2_DP_UNDEFINED       0x00
0404 #define UAC2_DP_ENABLE          0x01
0405 #define UAC2_DP_MODE_SELECT     0x02
0406 #define UAC2_DP_CLUSTER         0x03
0407 #define UAC2_DP_UNDERFFLOW      0x04
0408 #define UAC2_DP_OVERFLOW        0x05
0409 #define UAC2_DP_LATENCY         0x06
0410 
0411 /* A.17.9.3 Stereo Expander Processing Unit Control Selectors */
0412 #define UAC2_ST_EXT_UNDEFINED       0x00
0413 #define UAC2_ST_EXT_ENABLE      0x01
0414 #define UAC2_ST_EXT_WIDTH       0x02
0415 #define UAC2_ST_EXT_UNDEFLOW        0x03
0416 #define UAC2_ST_EXT_OVERFLOW        0x04
0417 #define UAC2_ST_EXT_LATENCY     0x05
0418 
0419 /* A.17.10 Extension Unit Control Selectors */
0420 #define UAC2_XU_UNDEFINED       0x00
0421 #define UAC2_XU_ENABLE          0x01
0422 #define UAC2_XU_CLUSTER         0x02
0423 #define UAC2_XU_UNDERFLOW       0x03
0424 #define UAC2_XU_OVERFLOW        0x04
0425 #define UAC2_XU_LATENCY         0x05
0426 
0427 /* A.17.11 AudioStreaming Interface Control Selectors */
0428 #define UAC2_AS_UNDEFINED       0x00
0429 #define UAC2_AS_ACT_ALT_SETTING     0x01
0430 #define UAC2_AS_VAL_ALT_SETTINGS    0x02
0431 #define UAC2_AS_AUDIO_DATA_FORMAT   0x03
0432 
0433 /* A.17.12 Encoder Control Selectors */
0434 #define UAC2_EN_UNDEFINED       0x00
0435 #define UAC2_EN_BIT_RATE        0x01
0436 #define UAC2_EN_QUALITY         0x02
0437 #define UAC2_EN_VBR         0x03
0438 #define UAC2_EN_TYPE            0x04
0439 #define UAC2_EN_UNDERFLOW       0x05
0440 #define UAC2_EN_OVERFLOW        0x06
0441 #define UAC2_EN_ENCODER_ERROR       0x07
0442 #define UAC2_EN_PARAM1          0x08
0443 #define UAC2_EN_PARAM2          0x09
0444 #define UAC2_EN_PARAM3          0x0a
0445 #define UAC2_EN_PARAM4          0x0b
0446 #define UAC2_EN_PARAM5          0x0c
0447 #define UAC2_EN_PARAM6          0x0d
0448 #define UAC2_EN_PARAM7          0x0e
0449 #define UAC2_EN_PARAM8          0x0f
0450 
0451 /* A.17.13.1 MPEG Decoder Control Selectors */
0452 #define UAC2_MPEG_UNDEFINED     0x00
0453 #define UAC2_MPEG_DUAL_CHANNEL      0x01
0454 #define UAC2_MPEG_SECOND_STEREO     0x02
0455 #define UAC2_MPEG_MULTILINGUAL      0x03
0456 #define UAC2_MPEG_DYN_RANGE     0x04
0457 #define UAC2_MPEG_SCALING       0x05
0458 #define UAC2_MPEG_HILO_SCALING      0x06
0459 #define UAC2_MPEG_UNDERFLOW     0x07
0460 #define UAC2_MPEG_OVERFLOW      0x08
0461 #define UAC2_MPEG_DECODER_ERROR     0x09
0462 
0463 /* A17.13.2 AC3 Decoder Control Selectors */
0464 #define UAC2_AC3_UNDEFINED      0x00
0465 #define UAC2_AC3_MODE           0x01
0466 #define UAC2_AC3_DYN_RANGE      0x02
0467 #define UAC2_AC3_SCALING        0x03
0468 #define UAC2_AC3_HILO_SCALING       0x04
0469 #define UAC2_AC3_UNDERFLOW      0x05
0470 #define UAC2_AC3_OVERFLOW       0x06
0471 #define UAC2_AC3_DECODER_ERROR      0x07
0472 
0473 /* A17.13.3 WMA Decoder Control Selectors */
0474 #define UAC2_WMA_UNDEFINED      0x00
0475 #define UAC2_WMA_UNDERFLOW      0x01
0476 #define UAC2_WMA_OVERFLOW       0x02
0477 #define UAC2_WMA_DECODER_ERROR      0x03
0478 
0479 /* A17.13.4 DTS Decoder Control Selectors */
0480 #define UAC2_DTS_UNDEFINED      0x00
0481 #define UAC2_DTS_UNDERFLOW      0x01
0482 #define UAC2_DTS_OVERFLOW       0x02
0483 #define UAC2_DTS_DECODER_ERROR      0x03
0484 
0485 /* A17.14 Endpoint Control Selectors */
0486 #define UAC2_EP_CS_UNDEFINED        0x00
0487 #define UAC2_EP_CS_PITCH        0x01
0488 #define UAC2_EP_CS_DATA_OVERRUN     0x02
0489 #define UAC2_EP_CS_DATA_UNDERRUN    0x03
0490 
0491 #endif /* __LINUX_USB_AUDIO_V2_H */
0492