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