1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2017 Ruslan Bilovol <ruslan.bilovol@gmail.com> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This file holds USB constants and structures defined 6*4882a593Smuzhiyun * by the USB DEVICE CLASS DEFINITION FOR AUDIO DEVICES Release 3.0. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __LINUX_USB_AUDIO_V3_H 10*4882a593Smuzhiyun #define __LINUX_USB_AUDIO_V3_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/types.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * v1.0, v2.0 and v3.0 of this standard have many things in common. For the rest 16*4882a593Smuzhiyun * of the definitions, please refer to audio.h and audio-v2.h 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* All High Capability descriptors have these 2 fields at the beginning */ 20*4882a593Smuzhiyun struct uac3_hc_descriptor_header { 21*4882a593Smuzhiyun __le16 wLength; 22*4882a593Smuzhiyun __u8 bDescriptorType; 23*4882a593Smuzhiyun __u8 bDescriptorSubtype; 24*4882a593Smuzhiyun __le16 wDescriptorID; 25*4882a593Smuzhiyun } __attribute__ ((packed)); 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* 4.3.1 CLUSTER DESCRIPTOR HEADER */ 28*4882a593Smuzhiyun struct uac3_cluster_header_descriptor { 29*4882a593Smuzhiyun __le16 wLength; 30*4882a593Smuzhiyun __u8 bDescriptorType; 31*4882a593Smuzhiyun __u8 bDescriptorSubtype; 32*4882a593Smuzhiyun __le16 wDescriptorID; 33*4882a593Smuzhiyun __u8 bNrChannels; 34*4882a593Smuzhiyun } __attribute__ ((packed)); 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* 4.3.2.1 SEGMENTS */ 37*4882a593Smuzhiyun struct uac3_cluster_segment_descriptor { 38*4882a593Smuzhiyun __le16 wLength; 39*4882a593Smuzhiyun __u8 bSegmentType; 40*4882a593Smuzhiyun /* __u8[0]; segment-specific data */ 41*4882a593Smuzhiyun } __attribute__ ((packed)); 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 4.3.2.1.1 END SEGMENT */ 44*4882a593Smuzhiyun struct uac3_cluster_end_segment_descriptor { 45*4882a593Smuzhiyun __le16 wLength; 46*4882a593Smuzhiyun __u8 bSegmentType; /* Constant END_SEGMENT */ 47*4882a593Smuzhiyun } __attribute__ ((packed)); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* 4.3.2.1.3.1 INFORMATION SEGMENT */ 50*4882a593Smuzhiyun struct uac3_cluster_information_segment_descriptor { 51*4882a593Smuzhiyun __le16 wLength; 52*4882a593Smuzhiyun __u8 bSegmentType; 53*4882a593Smuzhiyun __u8 bChPurpose; 54*4882a593Smuzhiyun __u8 bChRelationship; 55*4882a593Smuzhiyun __u8 bChGroupID; 56*4882a593Smuzhiyun } __attribute__ ((packed)); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* 4.5.2 CLASS-SPECIFIC AC INTERFACE DESCRIPTOR */ 59*4882a593Smuzhiyun struct uac3_ac_header_descriptor { 60*4882a593Smuzhiyun __u8 bLength; /* 10 */ 61*4882a593Smuzhiyun __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ 62*4882a593Smuzhiyun __u8 bDescriptorSubtype; /* HEADER descriptor subtype */ 63*4882a593Smuzhiyun __u8 bCategory; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* includes Clock Source, Unit, Terminal, and Power Domain desc. */ 66*4882a593Smuzhiyun __le16 wTotalLength; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun __le32 bmControls; 69*4882a593Smuzhiyun } __attribute__ ((packed)); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* 4.5.2.1 INPUT TERMINAL DESCRIPTOR */ 72*4882a593Smuzhiyun struct uac3_input_terminal_descriptor { 73*4882a593Smuzhiyun __u8 bLength; 74*4882a593Smuzhiyun __u8 bDescriptorType; 75*4882a593Smuzhiyun __u8 bDescriptorSubtype; 76*4882a593Smuzhiyun __u8 bTerminalID; 77*4882a593Smuzhiyun __le16 wTerminalType; 78*4882a593Smuzhiyun __u8 bAssocTerminal; 79*4882a593Smuzhiyun __u8 bCSourceID; 80*4882a593Smuzhiyun __le32 bmControls; 81*4882a593Smuzhiyun __le16 wClusterDescrID; 82*4882a593Smuzhiyun __le16 wExTerminalDescrID; 83*4882a593Smuzhiyun __le16 wConnectorsDescrID; 84*4882a593Smuzhiyun __le16 wTerminalDescrStr; 85*4882a593Smuzhiyun } __attribute__((packed)); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* 4.5.2.2 OUTPUT TERMINAL DESCRIPTOR */ 88*4882a593Smuzhiyun struct uac3_output_terminal_descriptor { 89*4882a593Smuzhiyun __u8 bLength; 90*4882a593Smuzhiyun __u8 bDescriptorType; 91*4882a593Smuzhiyun __u8 bDescriptorSubtype; 92*4882a593Smuzhiyun __u8 bTerminalID; 93*4882a593Smuzhiyun __le16 wTerminalType; 94*4882a593Smuzhiyun __u8 bAssocTerminal; 95*4882a593Smuzhiyun __u8 bSourceID; 96*4882a593Smuzhiyun __u8 bCSourceID; 97*4882a593Smuzhiyun __le32 bmControls; 98*4882a593Smuzhiyun __le16 wExTerminalDescrID; 99*4882a593Smuzhiyun __le16 wConnectorsDescrID; 100*4882a593Smuzhiyun __le16 wTerminalDescrStr; 101*4882a593Smuzhiyun } __attribute__((packed)); 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* 4.5.2.7 FEATURE UNIT DESCRIPTOR */ 104*4882a593Smuzhiyun struct uac3_feature_unit_descriptor { 105*4882a593Smuzhiyun __u8 bLength; 106*4882a593Smuzhiyun __u8 bDescriptorType; 107*4882a593Smuzhiyun __u8 bDescriptorSubtype; 108*4882a593Smuzhiyun __u8 bUnitID; 109*4882a593Smuzhiyun __u8 bSourceID; 110*4882a593Smuzhiyun /* bmaControls is actually u32, 111*4882a593Smuzhiyun * but u8 is needed for the hybrid parser */ 112*4882a593Smuzhiyun __u8 bmaControls[]; /* variable length */ 113*4882a593Smuzhiyun /* wFeatureDescrStr omitted */ 114*4882a593Smuzhiyun } __attribute__((packed)); 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define UAC3_DT_FEATURE_UNIT_SIZE(ch) (7 + ((ch) + 1) * 4) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* As above, but more useful for defining your own descriptors */ 119*4882a593Smuzhiyun #define DECLARE_UAC3_FEATURE_UNIT_DESCRIPTOR(ch) \ 120*4882a593Smuzhiyun struct uac3_feature_unit_descriptor_##ch { \ 121*4882a593Smuzhiyun __u8 bLength; \ 122*4882a593Smuzhiyun __u8 bDescriptorType; \ 123*4882a593Smuzhiyun __u8 bDescriptorSubtype; \ 124*4882a593Smuzhiyun __u8 bUnitID; \ 125*4882a593Smuzhiyun __u8 bSourceID; \ 126*4882a593Smuzhiyun __le32 bmaControls[ch + 1]; \ 127*4882a593Smuzhiyun __le16 wFeatureDescrStr; \ 128*4882a593Smuzhiyun } __attribute__ ((packed)) 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* 4.5.2.12 CLOCK SOURCE DESCRIPTOR */ 131*4882a593Smuzhiyun struct uac3_clock_source_descriptor { 132*4882a593Smuzhiyun __u8 bLength; 133*4882a593Smuzhiyun __u8 bDescriptorType; 134*4882a593Smuzhiyun __u8 bDescriptorSubtype; 135*4882a593Smuzhiyun __u8 bClockID; 136*4882a593Smuzhiyun __u8 bmAttributes; 137*4882a593Smuzhiyun __le32 bmControls; 138*4882a593Smuzhiyun __u8 bReferenceTerminal; 139*4882a593Smuzhiyun __le16 wClockSourceStr; 140*4882a593Smuzhiyun } __attribute__((packed)); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* bmAttribute fields */ 143*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_TYPE_EXT 0x0 144*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_TYPE_INT 0x1 145*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_ASYNC (0 << 2) 146*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_SYNCED_TO_SOF (1 << 1) 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /* 4.5.2.13 CLOCK SELECTOR DESCRIPTOR */ 149*4882a593Smuzhiyun struct uac3_clock_selector_descriptor { 150*4882a593Smuzhiyun __u8 bLength; 151*4882a593Smuzhiyun __u8 bDescriptorType; 152*4882a593Smuzhiyun __u8 bDescriptorSubtype; 153*4882a593Smuzhiyun __u8 bClockID; 154*4882a593Smuzhiyun __u8 bNrInPins; 155*4882a593Smuzhiyun __u8 baCSourceID[]; 156*4882a593Smuzhiyun /* bmControls and wCSelectorDescrStr omitted */ 157*4882a593Smuzhiyun } __attribute__((packed)); 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* 4.5.2.14 CLOCK MULTIPLIER DESCRIPTOR */ 160*4882a593Smuzhiyun struct uac3_clock_multiplier_descriptor { 161*4882a593Smuzhiyun __u8 bLength; 162*4882a593Smuzhiyun __u8 bDescriptorType; 163*4882a593Smuzhiyun __u8 bDescriptorSubtype; 164*4882a593Smuzhiyun __u8 bClockID; 165*4882a593Smuzhiyun __u8 bCSourceID; 166*4882a593Smuzhiyun __le32 bmControls; 167*4882a593Smuzhiyun __le16 wCMultiplierDescrStr; 168*4882a593Smuzhiyun } __attribute__((packed)); 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* 4.5.2.15 POWER DOMAIN DESCRIPTOR */ 171*4882a593Smuzhiyun struct uac3_power_domain_descriptor { 172*4882a593Smuzhiyun __u8 bLength; 173*4882a593Smuzhiyun __u8 bDescriptorType; 174*4882a593Smuzhiyun __u8 bDescriptorSubtype; 175*4882a593Smuzhiyun __u8 bPowerDomainID; 176*4882a593Smuzhiyun __le16 waRecoveryTime1; 177*4882a593Smuzhiyun __le16 waRecoveryTime2; 178*4882a593Smuzhiyun __u8 bNrEntities; 179*4882a593Smuzhiyun __u8 baEntityID[]; 180*4882a593Smuzhiyun /* wPDomainDescrStr omitted */ 181*4882a593Smuzhiyun } __attribute__((packed)); 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* As above, but more useful for defining your own descriptors */ 184*4882a593Smuzhiyun #define DECLARE_UAC3_POWER_DOMAIN_DESCRIPTOR(n) \ 185*4882a593Smuzhiyun struct uac3_power_domain_descriptor_##n { \ 186*4882a593Smuzhiyun __u8 bLength; \ 187*4882a593Smuzhiyun __u8 bDescriptorType; \ 188*4882a593Smuzhiyun __u8 bDescriptorSubtype; \ 189*4882a593Smuzhiyun __u8 bPowerDomainID; \ 190*4882a593Smuzhiyun __le16 waRecoveryTime1; \ 191*4882a593Smuzhiyun __le16 waRecoveryTime2; \ 192*4882a593Smuzhiyun __u8 bNrEntities; \ 193*4882a593Smuzhiyun __u8 baEntityID[n]; \ 194*4882a593Smuzhiyun __le16 wPDomainDescrStr; \ 195*4882a593Smuzhiyun } __attribute__ ((packed)) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* 4.7.2 CLASS-SPECIFIC AS INTERFACE DESCRIPTOR */ 198*4882a593Smuzhiyun struct uac3_as_header_descriptor { 199*4882a593Smuzhiyun __u8 bLength; 200*4882a593Smuzhiyun __u8 bDescriptorType; 201*4882a593Smuzhiyun __u8 bDescriptorSubtype; 202*4882a593Smuzhiyun __u8 bTerminalLink; 203*4882a593Smuzhiyun __le32 bmControls; 204*4882a593Smuzhiyun __le16 wClusterDescrID; 205*4882a593Smuzhiyun __le64 bmFormats; 206*4882a593Smuzhiyun __u8 bSubslotSize; 207*4882a593Smuzhiyun __u8 bBitResolution; 208*4882a593Smuzhiyun __le16 bmAuxProtocols; 209*4882a593Smuzhiyun __u8 bControlSize; 210*4882a593Smuzhiyun } __attribute__((packed)); 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define UAC3_FORMAT_TYPE_I_RAW_DATA (1 << 6) 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* 4.8.1.2 CLASS-SPECIFIC AS ISOCHRONOUS AUDIO DATA ENDPOINT DESCRIPTOR */ 215*4882a593Smuzhiyun struct uac3_iso_endpoint_descriptor { 216*4882a593Smuzhiyun __u8 bLength; 217*4882a593Smuzhiyun __u8 bDescriptorType; 218*4882a593Smuzhiyun __u8 bDescriptorSubtype; 219*4882a593Smuzhiyun __le32 bmControls; 220*4882a593Smuzhiyun __u8 bLockDelayUnits; 221*4882a593Smuzhiyun __le16 wLockDelay; 222*4882a593Smuzhiyun } __attribute__((packed)); 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /* 5.2.1.6.1 INSERTION CONTROL PARAMETER BLOCK */ 225*4882a593Smuzhiyun struct uac3_insertion_ctl_blk { 226*4882a593Smuzhiyun __u8 bSize; 227*4882a593Smuzhiyun __u8 bmConInserted; 228*4882a593Smuzhiyun } __attribute__ ((packed)); 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun /* 6.1 INTERRUPT DATA MESSAGE */ 231*4882a593Smuzhiyun struct uac3_interrupt_data_msg { 232*4882a593Smuzhiyun __u8 bInfo; 233*4882a593Smuzhiyun __u8 bSourceType; 234*4882a593Smuzhiyun __le16 wValue; 235*4882a593Smuzhiyun __le16 wIndex; 236*4882a593Smuzhiyun } __attribute__((packed)); 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* A.2 AUDIO AUDIO FUNCTION SUBCLASS CODES */ 239*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_UNDEFINED 0x00 240*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_FULL_ADC_3_0 0x01 241*4882a593Smuzhiyun /* BADD profiles */ 242*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_GENERIC_IO 0x20 243*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_HEADPHONE 0x21 244*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_SPEAKER 0x22 245*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_MICROPHONE 0x23 246*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_HEADSET 0x24 247*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER 0x25 248*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE 0x26 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* A.7 AUDIO FUNCTION CATEGORY CODES */ 251*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_UNDEFINED 0x00 252*4882a593Smuzhiyun #define UAC3_FUNCTION_DESKTOP_SPEAKER 0x01 253*4882a593Smuzhiyun #define UAC3_FUNCTION_HOME_THEATER 0x02 254*4882a593Smuzhiyun #define UAC3_FUNCTION_MICROPHONE 0x03 255*4882a593Smuzhiyun #define UAC3_FUNCTION_HEADSET 0x04 256*4882a593Smuzhiyun #define UAC3_FUNCTION_TELEPHONE 0x05 257*4882a593Smuzhiyun #define UAC3_FUNCTION_CONVERTER 0x06 258*4882a593Smuzhiyun #define UAC3_FUNCTION_SOUND_RECORDER 0x07 259*4882a593Smuzhiyun #define UAC3_FUNCTION_IO_BOX 0x08 260*4882a593Smuzhiyun #define UAC3_FUNCTION_MUSICAL_INSTRUMENT 0x09 261*4882a593Smuzhiyun #define UAC3_FUNCTION_PRO_AUDIO 0x0a 262*4882a593Smuzhiyun #define UAC3_FUNCTION_AUDIO_VIDEO 0x0b 263*4882a593Smuzhiyun #define UAC3_FUNCTION_CONTROL_PANEL 0x0c 264*4882a593Smuzhiyun #define UAC3_FUNCTION_HEADPHONE 0x0d 265*4882a593Smuzhiyun #define UAC3_FUNCTION_GENERIC_SPEAKER 0x0e 266*4882a593Smuzhiyun #define UAC3_FUNCTION_HEADSET_ADAPTER 0x0f 267*4882a593Smuzhiyun #define UAC3_FUNCTION_SPEAKERPHONE 0x10 268*4882a593Smuzhiyun #define UAC3_FUNCTION_OTHER 0xff 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun /* A.8 AUDIO CLASS-SPECIFIC DESCRIPTOR TYPES */ 271*4882a593Smuzhiyun #define UAC3_CS_UNDEFINED 0x20 272*4882a593Smuzhiyun #define UAC3_CS_DEVICE 0x21 273*4882a593Smuzhiyun #define UAC3_CS_CONFIGURATION 0x22 274*4882a593Smuzhiyun #define UAC3_CS_STRING 0x23 275*4882a593Smuzhiyun #define UAC3_CS_INTERFACE 0x24 276*4882a593Smuzhiyun #define UAC3_CS_ENDPOINT 0x25 277*4882a593Smuzhiyun #define UAC3_CS_CLUSTER 0x26 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* A.10 CLUSTER DESCRIPTOR SEGMENT TYPES */ 280*4882a593Smuzhiyun #define UAC3_SEGMENT_UNDEFINED 0x00 281*4882a593Smuzhiyun #define UAC3_CLUSTER_DESCRIPTION 0x01 282*4882a593Smuzhiyun #define UAC3_CLUSTER_VENDOR_DEFINED 0x1F 283*4882a593Smuzhiyun #define UAC3_CHANNEL_INFORMATION 0x20 284*4882a593Smuzhiyun #define UAC3_CHANNEL_AMBISONIC 0x21 285*4882a593Smuzhiyun #define UAC3_CHANNEL_DESCRIPTION 0x22 286*4882a593Smuzhiyun #define UAC3_CHANNEL_VENDOR_DEFINED 0xFE 287*4882a593Smuzhiyun #define UAC3_END_SEGMENT 0xFF 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* A.11 CHANNEL PURPOSE DEFINITIONS */ 290*4882a593Smuzhiyun #define UAC3_PURPOSE_UNDEFINED 0x00 291*4882a593Smuzhiyun #define UAC3_PURPOSE_GENERIC_AUDIO 0x01 292*4882a593Smuzhiyun #define UAC3_PURPOSE_VOICE 0x02 293*4882a593Smuzhiyun #define UAC3_PURPOSE_SPEECH 0x03 294*4882a593Smuzhiyun #define UAC3_PURPOSE_AMBIENT 0x04 295*4882a593Smuzhiyun #define UAC3_PURPOSE_REFERENCE 0x05 296*4882a593Smuzhiyun #define UAC3_PURPOSE_ULTRASONIC 0x06 297*4882a593Smuzhiyun #define UAC3_PURPOSE_VIBROKINETIC 0x07 298*4882a593Smuzhiyun #define UAC3_PURPOSE_NON_AUDIO 0xFF 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun /* A.12 CHANNEL RELATIONSHIP DEFINITIONS */ 301*4882a593Smuzhiyun #define UAC3_CH_RELATIONSHIP_UNDEFINED 0x00 302*4882a593Smuzhiyun #define UAC3_CH_MONO 0x01 303*4882a593Smuzhiyun #define UAC3_CH_LEFT 0x02 304*4882a593Smuzhiyun #define UAC3_CH_RIGHT 0x03 305*4882a593Smuzhiyun #define UAC3_CH_ARRAY 0x04 306*4882a593Smuzhiyun #define UAC3_CH_PATTERN_X 0x20 307*4882a593Smuzhiyun #define UAC3_CH_PATTERN_Y 0x21 308*4882a593Smuzhiyun #define UAC3_CH_PATTERN_A 0x22 309*4882a593Smuzhiyun #define UAC3_CH_PATTERN_B 0x23 310*4882a593Smuzhiyun #define UAC3_CH_PATTERN_M 0x24 311*4882a593Smuzhiyun #define UAC3_CH_PATTERN_S 0x25 312*4882a593Smuzhiyun #define UAC3_CH_FRONT_LEFT 0x80 313*4882a593Smuzhiyun #define UAC3_CH_FRONT_RIGHT 0x81 314*4882a593Smuzhiyun #define UAC3_CH_FRONT_CENTER 0x82 315*4882a593Smuzhiyun #define UAC3_CH_FRONT_LEFT_OF_CENTER 0x83 316*4882a593Smuzhiyun #define UAC3_CH_FRONT_RIGHT_OF_CENTER 0x84 317*4882a593Smuzhiyun #define UAC3_CH_FRONT_WIDE_LEFT 0x85 318*4882a593Smuzhiyun #define UAC3_CH_FRONT_WIDE_RIGHT 0x86 319*4882a593Smuzhiyun #define UAC3_CH_SIDE_LEFT 0x87 320*4882a593Smuzhiyun #define UAC3_CH_SIDE_RIGHT 0x88 321*4882a593Smuzhiyun #define UAC3_CH_SURROUND_ARRAY_LEFT 0x89 322*4882a593Smuzhiyun #define UAC3_CH_SURROUND_ARRAY_RIGHT 0x8A 323*4882a593Smuzhiyun #define UAC3_CH_BACK_LEFT 0x8B 324*4882a593Smuzhiyun #define UAC3_CH_BACK_RIGHT 0x8C 325*4882a593Smuzhiyun #define UAC3_CH_BACK_CENTER 0x8D 326*4882a593Smuzhiyun #define UAC3_CH_BACK_LEFT_OF_CENTER 0x8E 327*4882a593Smuzhiyun #define UAC3_CH_BACK_RIGHT_OF_CENTER 0x8F 328*4882a593Smuzhiyun #define UAC3_CH_BACK_WIDE_LEFT 0x90 329*4882a593Smuzhiyun #define UAC3_CH_BACK_WIDE_RIGHT 0x91 330*4882a593Smuzhiyun #define UAC3_CH_TOP_CENTER 0x92 331*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_LEFT 0x93 332*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_RIGHT 0x94 333*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_CENTER 0x95 334*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_LOC 0x96 335*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_ROC 0x97 336*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_WIDE_LEFT 0x98 337*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_WIDE_RIGHT 0x99 338*4882a593Smuzhiyun #define UAC3_CH_TOP_SIDE_LEFT 0x9A 339*4882a593Smuzhiyun #define UAC3_CH_TOP_SIDE_RIGHT 0x9B 340*4882a593Smuzhiyun #define UAC3_CH_TOP_SURR_ARRAY_LEFT 0x9C 341*4882a593Smuzhiyun #define UAC3_CH_TOP_SURR_ARRAY_RIGHT 0x9D 342*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_LEFT 0x9E 343*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_RIGHT 0x9F 344*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_CENTER 0xA0 345*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_LOC 0xA1 346*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_ROC 0xA2 347*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_WIDE_LEFT 0xA3 348*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_WIDE_RIGHT 0xA4 349*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_CENTER 0xA5 350*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_LEFT 0xA6 351*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_RIGHT 0xA7 352*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_CENTER 0xA8 353*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_LOC 0xA9 354*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_ROC 0xAA 355*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_WIDE_LEFT 0xAB 356*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_WIDE_RIGHT 0xAC 357*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SIDE_LEFT 0xAD 358*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SIDE_RIGHT 0xAE 359*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SURR_ARRAY_LEFT 0xAF 360*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SURR_ARRAY_RIGHT 0xB0 361*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_LEFT 0xB1 362*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_RIGHT 0xB2 363*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_CENTER 0xB3 364*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_LOC 0xB4 365*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_ROC 0xB5 366*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_WIDE_LEFT 0xB6 367*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_WIDE_RIGHT 0xB7 368*4882a593Smuzhiyun #define UAC3_CH_LOW_FREQUENCY_EFFECTS 0xB8 369*4882a593Smuzhiyun #define UAC3_CH_LFE_LEFT 0xB9 370*4882a593Smuzhiyun #define UAC3_CH_LFE_RIGHT 0xBA 371*4882a593Smuzhiyun #define UAC3_CH_HEADPHONE_LEFT 0xBB 372*4882a593Smuzhiyun #define UAC3_CH_HEADPHONE_RIGHT 0xBC 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun /* A.15 AUDIO CLASS-SPECIFIC AC INTERFACE DESCRIPTOR SUBTYPES */ 375*4882a593Smuzhiyun /* see audio.h for the rest, which is identical to v1 */ 376*4882a593Smuzhiyun #define UAC3_EXTENDED_TERMINAL 0x04 377*4882a593Smuzhiyun #define UAC3_MIXER_UNIT 0x05 378*4882a593Smuzhiyun #define UAC3_SELECTOR_UNIT 0x06 379*4882a593Smuzhiyun #define UAC3_FEATURE_UNIT 0x07 380*4882a593Smuzhiyun #define UAC3_EFFECT_UNIT 0x08 381*4882a593Smuzhiyun #define UAC3_PROCESSING_UNIT 0x09 382*4882a593Smuzhiyun #define UAC3_EXTENSION_UNIT 0x0a 383*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE 0x0b 384*4882a593Smuzhiyun #define UAC3_CLOCK_SELECTOR 0x0c 385*4882a593Smuzhiyun #define UAC3_CLOCK_MULTIPLIER 0x0d 386*4882a593Smuzhiyun #define UAC3_SAMPLE_RATE_CONVERTER 0x0e 387*4882a593Smuzhiyun #define UAC3_CONNECTORS 0x0f 388*4882a593Smuzhiyun #define UAC3_POWER_DOMAIN 0x10 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun /* A.20 PROCESSING UNIT PROCESS TYPES */ 391*4882a593Smuzhiyun #define UAC3_PROCESS_UNDEFINED 0x00 392*4882a593Smuzhiyun #define UAC3_PROCESS_UP_DOWNMIX 0x01 393*4882a593Smuzhiyun #define UAC3_PROCESS_STEREO_EXTENDER 0x02 394*4882a593Smuzhiyun #define UAC3_PROCESS_MULTI_FUNCTION 0x03 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun /* A.22 AUDIO CLASS-SPECIFIC REQUEST CODES */ 397*4882a593Smuzhiyun /* see audio-v2.h for the rest, which is identical to v2 */ 398*4882a593Smuzhiyun #define UAC3_CS_REQ_INTEN 0x04 399*4882a593Smuzhiyun #define UAC3_CS_REQ_STRING 0x05 400*4882a593Smuzhiyun #define UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR 0x06 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun /* A.23.1 AUDIOCONTROL INTERFACE CONTROL SELECTORS */ 403*4882a593Smuzhiyun #define UAC3_AC_CONTROL_UNDEFINED 0x00 404*4882a593Smuzhiyun #define UAC3_AC_ACTIVE_INTERFACE_CONTROL 0x01 405*4882a593Smuzhiyun #define UAC3_AC_POWER_DOMAIN_CONTROL 0x02 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun /* A.23.5 TERMINAL CONTROL SELECTORS */ 408*4882a593Smuzhiyun #define UAC3_TE_UNDEFINED 0x00 409*4882a593Smuzhiyun #define UAC3_TE_INSERTION 0x01 410*4882a593Smuzhiyun #define UAC3_TE_OVERLOAD 0x02 411*4882a593Smuzhiyun #define UAC3_TE_UNDERFLOW 0x03 412*4882a593Smuzhiyun #define UAC3_TE_OVERFLOW 0x04 413*4882a593Smuzhiyun #define UAC3_TE_LATENCY 0x05 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /* A.23.10 PROCESSING UNITS CONTROL SELECTROS */ 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun /* Up/Down Mixer */ 418*4882a593Smuzhiyun #define UAC3_UD_MODE_SELECT 0x01 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun /* Stereo Extender */ 421*4882a593Smuzhiyun #define UAC3_EXT_WIDTH_CONTROL 0x01 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun /* BADD predefined Unit/Terminal values */ 425*4882a593Smuzhiyun #define UAC3_BADD_IT_ID1 1 /* Input Terminal ID1: bTerminalID = 1 */ 426*4882a593Smuzhiyun #define UAC3_BADD_FU_ID2 2 /* Feature Unit ID2: bUnitID = 2 */ 427*4882a593Smuzhiyun #define UAC3_BADD_OT_ID3 3 /* Output Terminal ID3: bTerminalID = 3 */ 428*4882a593Smuzhiyun #define UAC3_BADD_IT_ID4 4 /* Input Terminal ID4: bTerminalID = 4 */ 429*4882a593Smuzhiyun #define UAC3_BADD_FU_ID5 5 /* Feature Unit ID5: bUnitID = 5 */ 430*4882a593Smuzhiyun #define UAC3_BADD_OT_ID6 6 /* Output Terminal ID6: bTerminalID = 6 */ 431*4882a593Smuzhiyun #define UAC3_BADD_FU_ID7 7 /* Feature Unit ID7: bUnitID = 7 */ 432*4882a593Smuzhiyun #define UAC3_BADD_MU_ID8 8 /* Mixer Unit ID8: bUnitID = 8 */ 433*4882a593Smuzhiyun #define UAC3_BADD_CS_ID9 9 /* Clock Source Entity ID9: bClockID = 9 */ 434*4882a593Smuzhiyun #define UAC3_BADD_PD_ID10 10 /* Power Domain ID10: bPowerDomainID = 10 */ 435*4882a593Smuzhiyun #define UAC3_BADD_PD_ID11 11 /* Power Domain ID11: bPowerDomainID = 11 */ 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun /* BADD wMaxPacketSize of AS endpoints */ 438*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_16 0x0060 439*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_16 0x0062 440*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_24 0x0090 441*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_24 0x0093 442*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_16 0x00C0 443*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_16 0x00C4 444*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_24 0x0120 445*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_24 0x0126 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun /* BADD sample rate is always fixed to 48kHz */ 448*4882a593Smuzhiyun #define UAC3_BADD_SAMPLING_RATE 48000 449*4882a593Smuzhiyun 450*4882a593Smuzhiyun /* BADD power domains recovery times in 50us increments */ 451*4882a593Smuzhiyun #define UAC3_BADD_PD_RECOVER_D1D0 0x0258 /* 30ms */ 452*4882a593Smuzhiyun #define UAC3_BADD_PD_RECOVER_D2D0 0x1770 /* 300ms */ 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun #endif /* __LINUX_USB_AUDIO_V3_H */ 455