usb_audio.h 91 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358
  1. /*
  2. * Copyright (c) 2022, sakumisu
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #ifndef USB_AUDIO_H
  7. #define USB_AUDIO_H
  8. /** Audio Interface Subclass Codes
  9. * Refer to Table A-2 from audio10.pdf
  10. */
  11. #define AUDIO_SUBCLASS_UNDEFINED 0x00
  12. #define AUDIO_SUBCLASS_AUDIOCONTROL 0x01
  13. #define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
  14. #define AUDIO_SUBCLASS_MIDISTREAMING 0x03
  15. #define AUDIO_PROTOCOL_UNDEFINED 0x00
  16. #define AUDIO_PROTOCOLv20 0x20 /* IP version 2.0 */
  17. /** Audio Class-Specific Request Codes
  18. * Refer to Table A-9 from audio10.pdf
  19. */
  20. #define AUDIO_REQUEST_UNDEFINED 0x00
  21. #define AUDIO_REQUEST_SET_CUR 0x01
  22. #define AUDIO_REQUEST_GET_CUR 0x81
  23. #define AUDIO_REQUEST_SET_MIN 0x02
  24. #define AUDIO_REQUEST_GET_MIN 0x82
  25. #define AUDIO_REQUEST_SET_MAX 0x03
  26. #define AUDIO_REQUEST_GET_MAX 0x83
  27. #define AUDIO_REQUEST_SET_RES 0x04
  28. #define AUDIO_REQUEST_GET_RES 0x84
  29. #define AUDIO_REQUEST_SET_MEM 0x05
  30. #define AUDIO_REQUEST_GET_MEM 0x85
  31. #define AUDIO_REQUEST_GET_STAT 0xFF
  32. /** Audio Class-Specific Request Codes
  33. * Refer from audio20_final.pdf
  34. */
  35. #define AUDIO_REQUEST_CUR 0x01
  36. #define AUDIO_REQUEST_RANGE 0x02
  37. /** Audio Class-Specific Control Interface Descriptor Subtypes
  38. * Refer to Table A-5 from audio10.pdf
  39. */
  40. #define AUDIO_CONTROL_UNDEF 0x01U
  41. #define AUDIO_CONTROL_HEADER 0x01U
  42. #define AUDIO_CONTROL_INPUT_TERMINAL 0x02U
  43. #define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03U
  44. #define AUDIO_CONTROL_MIXER_UNIT 0x04U
  45. #define AUDIO_CONTROL_SELECTOR_UNIT 0x05U
  46. #define AUDIO_CONTROL_FEATURE_UNIT 0x06U
  47. #define AUDIO_CONTROL_EFFECT_UNIT 0x07U
  48. #define AUDIO_CONTROL_PROCESSING_UNIT 0x08U
  49. #define AUDIO_CONTROL_EXTENSION_UNIT 0x09U
  50. #define AUDIO_CONTROL_CLOCK_SOURCE 0x0aU
  51. #define AUDIO_CONTROL_CLOCK_SELECTOR 0x0bU
  52. #define AUDIO_CONTROL_CLOCK_MULTIPLIER 0x0cU
  53. #define AUDIO_CONTROL_SAMPLERATE_CONVERTER 0x0dU
  54. /** Audio Class-Specific AS Interface Descriptor Subtypes
  55. * Refer to Table A-6 from audio10.pdf
  56. */
  57. #define AUDIO_STREAMING_UNDEFINED 0x00U
  58. #define AUDIO_STREAMING_GENERAL 0x01U
  59. #define AUDIO_STREAMING_FORMAT_TYPE 0x02U
  60. #define AUDIO_STREAMING_ENCODER 0x03U
  61. #define AUDIO_STREAMING_DECODER 0x04U
  62. /* Clock Source Descriptor Clock Types */
  63. #define AUDIO_CLKSRC_EXTERNAL 0x00 /* External clock */
  64. #define AUDIO_CLKSRC_INTERNAL_FIXED 0x01 /* Internal fixed clock */
  65. #define AUDIO_CLKSRC_INTERNAL_VAR 0x02 /* Internal variable clock */
  66. #define AUDIO_CLKSRC_INTERNAL_PROG 0x03 /* Internal programmable clock */
  67. /* Effect Unit Effect Types */
  68. #define AUDIO_EFFECT_UNDEF 0x00
  69. #define AUDIO_EFFECT_PARAM_EQ_SECTION 0x01
  70. #define AUDIO_EFFECT_REVERBERATION 0x02
  71. #define AUDIO_EFFECT_MOD_DELAY 0x03
  72. #define AUDIO_EFFECT_DYN_RANGE_COMP 0x04
  73. /* Processing Unit Process Types */
  74. #define AUDIO_PROCESS_UNDEFINED 0x00
  75. #define AUDIO_PROCESS_UPDOWNMIX 0x01
  76. #define AUDIO_PROCESS_DOLBY_PROLOGIC 0x02
  77. #define AUDIO_PROCESS_STEREO_EXTENDER 0x03
  78. /* Audio Class-Specific Endpoint Descriptor Subtypes */
  79. #define AUDIO_ENDPOINT_UNDEFINED 0x00U
  80. #define AUDIO_ENDPOINT_GENERAL 0x01U
  81. /* Feature Unit Control Bits */
  82. #define AUDIO_CONTROL_MUTE 0x0001
  83. #define AUDIO_CONTROL_VOLUME 0x0002
  84. #define AUDIO_CONTROL_BASS 0x0004
  85. #define AUDIO_CONTROL_MID 0x0008
  86. #define AUDIO_CONTROL_TREBLE 0x0010
  87. #define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020
  88. #define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040
  89. #define AUDIO_CONTROL_DEALY 0x0080
  90. #define AUDIO_CONTROL_BASS_BOOST 0x0100
  91. #define AUDIO_CONTROL_LOUDNESS 0x0200
  92. /* Encoder Type Codes */
  93. #define AUDIO_ENCODER_UNDEF 0x00
  94. #define AUDIO_ENCODER_OTHER 0x01
  95. #define AUDIO_ENCODER_MPEG 0x02
  96. #define AUDIO_ENCODER_AC3 0x03
  97. #define AUDIO_ENCODER_WMA 0x04
  98. #define AUDIO_ENCODER_DTS 0x05
  99. /* Decoder Type Codes */
  100. #define AUDIO_DECODER_UNDEF 0x00
  101. #define AUDIO_DECODER_OTHER 0x01
  102. #define AUDIO_DECODER_MPEG 0x02
  103. #define AUDIO_DECODER_AC3 0x03
  104. #define AUDIO_DECODER_WMA 0x04
  105. #define AUDIO_DECODER_DTS 0x05
  106. /* Audio Descriptor Types */
  107. #define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20
  108. #define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21
  109. #define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22
  110. #define AUDIO_STRING_DESCRIPTOR_TYPE 0x23
  111. #define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24
  112. #define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25
  113. /* Audio Data Format Type I Codes */
  114. #define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000
  115. #define AUDIO_FORMAT_PCM 0x0001
  116. #define AUDIO_FORMAT_PCM8 0x0002
  117. #define AUDIO_FORMAT_IEEE_FLOAT 0x0003
  118. #define AUDIO_FORMAT_ALAW 0x0004
  119. #define AUDIO_FORMAT_MULAW 0x0005
  120. #define AUDIO_V2_FORMAT_PCM 0x00000001
  121. #define AUDIO_V2_FORMAT_PCM8 0x00000002
  122. #define AUDIO_V2_FORMAT_IEEE_FLOAT 0x00000004
  123. #define AUDIO_V2_FORMAT_ALAW 0x00000008
  124. #define AUDIO_V2_FORMAT_MULAW 0x00000010
  125. /* bmChannelConfig: a bitmap field that indicates which spatial locations
  126. * are occupied by the channels present in the cluster. The bit allocations
  127. * are as follows:
  128. */
  129. #define AUDIO_CHANNEL_M 0 /* Mono */
  130. #define AUDIO_CHANNEL_FL (1 << 0) /* Front Left */
  131. #define AUDIO_CHANNEL_FR (1 << 1) /* Front Right */
  132. #define AUDIO_CHANNEL_FC (1 << 2) /* Front Center */
  133. #define AUDIO_CHANNEL_LFE (1 << 3) /* Low Frequency Effects */
  134. #define AUDIO_CHANNEL_BL (1 << 4) /* Back Left */
  135. #define AUDIO_CHANNEL_BR (1 << 5) /* Back Right */
  136. #define AUDIO_CHANNEL_FLC (1 << 6) /* Front Left of Center */
  137. #define AUDIO_CHANNEL_FRC (1 << 7) /* Front Right of Center */
  138. #define AUDIO_CHANNEL_BC (1 << 8) /* Back Center */
  139. #define AUDIO_CHANNEL_SL (1 << 9) /* Side Left */
  140. #define AUDIO_CHANNEL_SR (1 << 10) /* Side Right */
  141. #define AUDIO_CHANNEL_TC (1 << 11) /* Top Center */
  142. #define AUDIO_CHANNEL_TFL (1 << 12) /* Top Front Left */
  143. #define AUDIO_CHANNEL_TFC (1 << 13) /* Top Front Center */
  144. #define AUDIO_CHANNEL_TFR (1 << 14) /* Top Front Right */
  145. #define AUDIO_CHANNEL_TBL (1 << 15) /* Top Back Left */
  146. #define AUDIO_CHANNEL_TBC (1 << 16) /* Top Back Center */
  147. #define AUDIO_CHANNEL_TBR (1 << 17) /* Top Back Right */
  148. #define AUDIO_CHANNEL_TFLC (1 << 18) /* Top Front Left of Center */
  149. #define AUDIO_CHANNEL_TFRC (1 << 19) /* Top Front Right of Center */
  150. #define AUDIO_CHANNEL_LLFE (1 << 20) /* Left Low Frequency Effects */
  151. #define AUDIO_CHANNEL_RLFE (1 << 21) /* Right Low Frequency Effects */
  152. #define AUDIO_CHANNEL_TSL (1 << 22) /* Top Side Left */
  153. #define AUDIO_CHANNEL_TSR (1 << 23) /* Top Side Right */
  154. #define AUDIO_CHANNEL_BOC (1 << 24) /* Bottom Center */
  155. #define AUDIO_CHANNEL_BLC (1 << 25) /* Back Left of Center */
  156. #define AUDIO_CHANNEL_BRC (1 << 26) /* Back Right of Center */
  157. /* Bits 27-30: Reserved */
  158. #define AUDIO_CHANNEL_RD (1 << 31) /* Raw Data */
  159. /* Audio Function Category Codes */
  160. #define AUDIO_CATEGORY_UNDEF 0x00 /* Undefined */
  161. #define AUDIO_CATEGORY_SPEAKER 0x01 /* Desktop speaker */
  162. #define AUDIO_CATEGORY_THEATER 0x02 /* Home theater */
  163. #define AUDIO_CATEGORY_MICROPHONE 0x03 /* Microphone */
  164. #define AUDIO_CATEGORY_HEADSET 0x04 /* Headset */
  165. #define AUDIO_CATEGORY_TELEPHONE 0x05 /* Telephone */
  166. #define AUDIO_CATEGORY_CONVERTER 0x06 /* Converter */
  167. #define AUDIO_CATEGORY_RECORDER 0x07 /* Voice/Sound recorder */
  168. #define AUDIO_CATEGORY_IO_BOX 0x08 /* I/O box */
  169. #define AUDIO_CATEGORY_INSTRUMENT 0x09 /* Musical instrument */
  170. #define AUDIO_CATEGORY_PROAUDIO 0x0a /* Pro-audio */
  171. #define AUDIO_CATEGORY_AV 0x0b /* Audio/video */
  172. #define AUDIO_CATEGORY_CONTROL 0x0c /* Control panel */
  173. #define AUDIO_CATEGORY_OTHER 0xff
  174. /* Clock Source Control Selectors */
  175. #define AUDIO_CS_CONTROL_UNDEF 0x00
  176. #define AUDIO_CS_CONTROL_SAM_FREQ 0x01
  177. #define AUDIO_CS_CONTROL_CLOCK_VALID 0x02
  178. /* Clock Selector Control Selectors */
  179. #define AUDIO_CX_CONTROL_UNDEF 0x00
  180. #define AUDIO_CX_CONTROL_CLOCKSEL 0x01
  181. /* Clock Multiplier Control Selectors */
  182. #define AUDIO_CM_CONTROL_UNDEF 0x00
  183. #define AUDIO_CM_CONTROL_NUMERATOR 0x01
  184. #define AUDIO_CM_CONTROL_DENOMINATOR 0x02
  185. /* Terminal Control Selectors */
  186. #define AUDIO_TE_CONTROL_UNDEF 0x00
  187. #define AUDIO_TE_CONTROL_COPY_PROTECT 0x01
  188. #define AUDIO_TE_CONTROL_CONNECTOR 0x02
  189. #define AUDIO_TE_CONTROL_OVERLOAD 0x03
  190. #define AUDIO_TE_CONTROL_CLUSTER 0x04
  191. #define AUDIO_TE_CONTROL_UNDERFLOW 0x05
  192. #define AUDIO_TE_CONTROL_OVERFLOW 0x06
  193. #define AUDIO_TE_CONTROL_LATENCY 0x07
  194. /* Mixer Control Selectors */
  195. #define AUDIO_MU_CONTROL_UNDEF 0x00
  196. #define AUDIO_MU_CONTROL_MIXER 0x01
  197. #define AUDIO_MU_CONTROL_CLUSTER 0x02
  198. #define AUDIO_MU_CONTROL_UNDERFLOW 0x03
  199. #define AUDIO_MU_CONTROL_OVERFLOW 0x04
  200. #define AUDIO_MU_CONTROL_LATENCY 0x05
  201. /* Selector Control Selectors */
  202. #define AUDIO_SU_CONTROL_UNDEFINE 0x00
  203. #define AUDIO_SU_CONTROL_SELECTOR 0x01
  204. #define AUDIO_SU_CONTROL_LATENCY 0x02
  205. /* Feature Unit Control Selectors */
  206. #define AUDIO_FU_CONTROL_UNDEF 0x00
  207. #define AUDIO_FU_CONTROL_MUTE 0x01
  208. #define AUDIO_FU_CONTROL_VOLUME 0x02
  209. #define AUDIO_FU_CONTROL_BASS 0x03
  210. #define AUDIO_FU_CONTROL_MID 0x04
  211. #define AUDIO_FU_CONTROL_TREBLE 0x05
  212. #define AUDIO_FU_CONTROL_EQUALIZER 0x06
  213. #define AUDIO_FU_CONTROL_AGC 0x07
  214. #define AUDIO_FU_CONTROL_DELAY 0x08
  215. #define AUDIO_FU_CONTROL_BASS_BOOST 0x09
  216. #define AUDIO_FU_CONTROL_LOUDNESS 0x0a
  217. #define AUDIO_FU_CONTROL_INP_GAIN 0x0b
  218. #define AUDIO_FU_CONTROL_INP_GAIN_PAD 0x0c
  219. #define AUDIO_FU_CONTROL_PHASE_INVERT 0x0d
  220. #define AUDIO_FU_CONTROL_UNDERFLOW 0x0e
  221. #define AUDIO_FU_CONTROL_OVERFLOW 0x0f
  222. #define AUDIO_FU_CONTROL_LATENCY 0x10
  223. #define AUDIO_V2_FU_CONTROL_UNDEF 0x00
  224. #define AUDIO_V2_FU_CONTROL_MUTE (0x03 << 0)
  225. #define AUDIO_V2_FU_CONTROL_VOLUME (0x03 << 2)
  226. #define AUDIO_V2_FU_CONTROL_BASS (0x03 << 4)
  227. #define AUDIO_V2_FU_CONTROL_MID (0x03 << 6)
  228. #define AUDIO_V2_FU_CONTROL_TREBLE (0x03 << 8)
  229. #define AUDIO_V2_FU_CONTROL_EQUALIZER (0x03 << 10)
  230. #define AUDIO_V2_FU_CONTROL_AGC (0x03 << 12)
  231. #define AUDIO_V2_FU_CONTROL_DELAY (0x03 << 14)
  232. #define AUDIO_V2_FU_CONTROL_BASS_BOOST (0x03 << 16)
  233. #define AUDIO_V2_FU_CONTROL_LOUDNESS (0x03 << 18)
  234. #define AUDIO_V2_FU_CONTROL_INP_GAIN (0x03 << 20)
  235. #define AUDIO_V2_FU_CONTROL_INP_GAIN_PAD (0x03 << 22)
  236. #define AUDIO_V2_FU_CONTROL_PHASE_INVERT (0x03 << 24)
  237. #define AUDIO_V2_FU_CONTROL_UNDERFLOW (0x03 << 26)
  238. #define AUDIO_V2_FU_CONTROL_OVERFLOW (0x03 << 28)
  239. /* Parametric Equalizer Section Effect Unit Control Selectors */
  240. #define AUDIO_PE_CONTROL_UNDEF 0x00
  241. #define AUDIO_PE_CONTROL_ENABLE 0x01
  242. #define AUDIO_PE_CONTROL_CENTERFREQ 0x02
  243. #define AUDIO_PE_CONTROL_QFACTOR 0x03
  244. #define AUDIO_PE_CONTROL_GAIN 0x04
  245. #define AUDIO_PE_CONTROL_UNDERFLOW 0x05
  246. #define AUDIO_PE_CONTROL_OVERFLOW 0x06
  247. #define AUDIO_PE_CONTROL_LATENCY 0x07
  248. /* Reverberation Effect Unit Control Selectors */
  249. #define AUDIO_RV_CONTROL_UNDEF 0x00
  250. #define AUDIO_RV_CONTROL_ENABLE 0x01
  251. #define AUDIO_RV_CONTROL_TYPE 0x02
  252. #define AUDIO_RV_CONTROL_LEVEL 0x03
  253. #define AUDIO_RV_CONTROL_TIME 0x04
  254. #define AUDIO_RV_CONTROL_FEEDBACK 0x05
  255. #define AUDIO_RV_CONTROL_PREDELAY 0x06
  256. #define AUDIO_RV_CONTROL_DENSITY 0x07
  257. #define AUDIO_RV_CONTROL_HF_ROLLOFF 0x08
  258. #define AUDIO_RV_CONTROL_UNDERFLOW 0x09
  259. #define AUDIO_RV_CONTROL_OVERFLOW 0x0a
  260. #define AUDIO_RV_CONTROL_LATENCY 0x0b
  261. /* Modulation Delay Effect Unit Control Selectors */
  262. #define AUDIO_MD_CONTROL_UNDEF 0x00
  263. #define AUDIO_MD_CONTROL_ENABLE 0x01
  264. #define AUDIO_MD_CONTROL_BALANCE 0x02
  265. #define AUDIO_MD_CONTROL_RATE 0x03
  266. #define AUDIO_MD_CONTROL_DEPTH 0x04
  267. #define AUDIO_MD_CONTROL_TIME 0x05
  268. #define AUDIO_MD_CONTROL_FEEDBACK 0x06
  269. #define AUDIO_MD_CONTROL_UNDERFLOW 0x07
  270. #define AUDIO_MD_CONTROL_OVERFLOW 0x08
  271. #define AUDIO_MD_CONTROL_LATENCY 0x09
  272. /* Dynamic Range Compressor Effect Unit Control Selectors */
  273. #define AUDIO_DR_CONTROL_UNDEF 0x00
  274. #define AUDIO_DR_CONTROL_ENABLE 0x01
  275. #define AUDIO_DR_CONTROL_COMP_RATE 0x02
  276. #define AUDIO_DR_CONTROL_MAXAMPL 0x03
  277. #define AUDIO_DR_CONTROL_THRESHOLD 0x04
  278. #define AUDIO_DR_CONTROL_ATTACK_TIME 0x05
  279. #define AUDIO_DR_CONTROL_RELEASE_TIME 0x06
  280. #define AUDIO_DR_CONTROL_UNDERFLOW 0x07
  281. #define AUDIO_DR_CONTROL_OVERFLOW 0x08
  282. #define AUDIO_DR_CONTROL_LATENCY 0x09
  283. /* Up/Down-mix Processing Unit Control Selectors */
  284. #define AUDIO_UD_CONTROL_UNDEF 0x00
  285. #define AUDIO_UD_CONTROL_ENABLE 0x01
  286. #define AUDIO_UD_CONTROL_MODE_SELECT 0x02
  287. #define AUDIO_UD_CONTROL_CLUSTER 0x03
  288. #define AUDIO_UD_CONTROL_UNDERFLOW 0x04
  289. #define AUDIO_UD_CONTROL_OVERFLOW 0x05
  290. #define AUDIO_UD_CONTROL_LATENCY 0x06
  291. /* Dolby Prologic?Processing Unit Control Selectors */
  292. #define AUDIO_DP_CONTROL_UNDEF 0x00
  293. #define AUDIO_DP_CONTROL_ENABLE 0x01
  294. #define AUDIO_DP_CONTROL_MODE_SELECT 0x02
  295. #define AUDIO_DP_CONTROL_CLUSTER 0x03
  296. #define AUDIO_DP_CONTROL_UNDERFLOW 0x04
  297. #define AUDIO_DP_CONTROL_OVERFLOW 0x05
  298. #define AUDIO_DP_CONTROL_LATENCY 0x06
  299. /* Stereo Extender Processing Unit Control Selectors */
  300. #define AUDIO_STEXT_CONTROL_UNDEF 0x00
  301. #define AUDIO_STEXT_CONTROL_ENABLE 0x01
  302. #define AUDIO_STEXT_CONTROL_WIDTH 0x02
  303. #define AUDIO_STEXT_CONTROL_UNDERFLOW 0x03
  304. #define AUDIO_STEXT_CONTROL_OVERFLOW 0x04
  305. #define AUDIO_STEXT_CONTROL_LATENCY 0x05
  306. /* Extension Unit Control Selectors */
  307. #define AUDIO_XU_CONTROL_UNDEF 0x00
  308. #define AUDIO_XU_CONTROL_ENABLE 0x01
  309. #define AUDIO_XU_CONTROL_CLUSTER 0x02
  310. #define AUDIO_XU_CONTROL_UNDERFLOW 0x03
  311. #define AUDIO_XU_CONTROL_OVERFLOW 0x04
  312. #define AUDIO_XU_CONTROL_LATENCY 0x05
  313. /* AudioStreaming Interface Control Selectors */
  314. #define AUDIO_AS_CONTROL_UNDEF 0x00
  315. #define AUDIO_AS_CONTROL_ACT_ALT 0x01
  316. #define AUDIO_AS_CONTROL_VAL_ALT 0x02
  317. #define AUDIO_AS_CONTROL_AUDIO_FORMAT 0x03
  318. /* Encoder Control Selectors */
  319. #define AUDIO_EN_CONTROL_UNDEF 0x00
  320. #define AUDIO_EN_CONTROL_BIT_RATE 0x01
  321. #define AUDIO_EN_CONTROL_QUALITY 0x02
  322. #define AUDIO_EN_CONTROL_VBR 0x03
  323. #define AUDIO_EN_CONTROL_TYPE 0x04
  324. #define AUDIO_EN_CONTROL_UNDERFLOW 0x05
  325. #define AUDIO_EN_CONTROL_OVERFLOW 0x06
  326. #define AUDIO_EN_CONTROL_ENCODER_ERR 0x07
  327. #define AUDIO_EN_CONTROL_PARAM1 0x08
  328. #define AUDIO_EN_CONTROL_PARAM2 0x09
  329. #define AUDIO_EN_CONTROL_PARAM3 0x0a
  330. #define AUDIO_EN_CONTROL_PARAM4 0x0b
  331. #define AUDIO_EN_CONTROL_PARAM5 0x0c
  332. #define AUDIO_EN_CONTROL_PARAM6 0x0d
  333. #define AUDIO_EN_CONTROL_PARAM7 0x0e
  334. #define AUDIO_EN_CONTROL_PARAM8 0x0f
  335. /* MPEG Decoder Control Selectors */
  336. #define AUDIO_MPGD_CONTROL_UNDEF 0x00
  337. #define AUDIO_MPGD_CONTROL_DUAL_CHAN 0x01
  338. #define AUDIO_MPGD_CONTROL_2ND_STEREO 0x02
  339. #define AUDIO_MPGD_CONTROL_MULTILING 0x03
  340. #define AUDIO_MPGD_CONTROL_DYN_RANGE 0x04
  341. #define AUDIO_MPGD_CONTROL_SCALING 0x05
  342. #define AUDIO_MPGD_CONTROL_HILO_SCALE 0x06
  343. #define AUDIO_MPGD_CONTROL_UNDERFLOW 0x07
  344. #define AUDIO_MPGD_CONTROL_OVERFLOW 0x08
  345. #define AUDIO_MPGD_CONTROL_DECODE_ERR 0x09
  346. /* AC-3 Decoder Control Selectors */
  347. #define AUDIO_AC3D_CONTROL_UNDEF 0x00
  348. #define AUDIO_AC3D_CONTROL_MODE 0x01
  349. #define AUDIO_AC3D_CONTROL_DYN_RANGE 0x02
  350. #define AUDIO_AC3D_CONTROL_SCALING 0x03
  351. #define AUDIO_AC3D_CONTROL_HILO_SCALE 0x04
  352. #define AUDIO_AC3D_CONTROL_UNDERFLOW 0x05
  353. #define AUDIO_AC3D_CONTROL_OVERFLOW 0x06
  354. #define AUDIO_AC3D_CONTROL_DECODE_ERR 0x07
  355. /* WMA Decoder Control Selectors */
  356. #define AUDIO_WMAD_CONTROL_UNDEF 0x00
  357. #define AUDIO_WMAD_CONTROL_UNDERFLOW 0x01
  358. #define AUDIO_WMAD_CONTROL_OVERFLOW 0x02
  359. #define AUDIO_WMAD_CONTROL_DECODE_ERR 0x03
  360. /* DTS Decoder Control Selectors */
  361. #define AUDIO_DTSD_CONTROL_UNDEF 0x00
  362. #define AUDIO_DTSD_CONTROL_UNDERFLOW 0x01
  363. #define AUDIO_DTSD_CONTROL_OVERFLOW 0x02
  364. #define AUDIO_DTSD_CONTROL_DECODE_ERR 0x03
  365. /* Endpoint Control Selectors */
  366. #define AUDIO_EP_CONTROL_UNDEF 0x00
  367. #define AUDIO_EP_CONTROL_SAMPLING_FEQ 0x01
  368. #define AUDIO_EP_CONTROL_PITCH 0x02
  369. /* Encoder Error Codes */
  370. /* <0: Reserved for vendor extensions */
  371. #define AUDIO_ENCODER_SUCCESS 0 /* No Error */
  372. #define AUDIO_ENCODER_ERROR_NOMEM 1 /* Out of Memory */
  373. #define AUDIO_ENCODER_ERROR_BW 2 /* Out of Bandwidth */
  374. #define AUDIO_ENCODER_ERROR_CYCLE 3 /* Out of Processing Cycles */
  375. #define AUDIO_ENCODER_ERROR_FRAME 4 /* General Format Frame Error */
  376. #define AUDIO_ENCODER_ERROR_TOOSMALL 5 /* Format Frame Too Small */
  377. #define AUDIO_ENCODER_ERROR_TOOBIG 6 /* Format Frame Too Large */
  378. #define AUDIO_ENCODER_ERROR_BADFORMAT 7 /* Bad Data Format */
  379. #define AUDIO_ENCODER_ERROR_NCHAN 8 /* Incorrect Number of Channels */
  380. #define AUDIO_ENCODER_ERROR_RATE 9 /* Incorrect Sampling Rate */
  381. #define AUDIO_ENCODER_ERROR_BITRATE 10 /* Unable to Meet Target Bitrate */
  382. #define AUDIO_ENCODER_ERROR_PARMS 11 /* Inconsistent Set of Parameters */
  383. #define AUDIO_ENCODER_ERROR_NOTREADY 12 /* Not Ready */
  384. #define AUDIO_ENCODER_ERROR_BUSY 13 /* Busy */
  385. /* >13: Reserved */
  386. /* Format Type Codes */
  387. #define AUDIO_FORMAT_TYPE_UNDEF 0x00
  388. #define AUDIO_FORMAT_TYPEI 0x01
  389. #define AUDIO_FORMAT_TYPEII 0x02
  390. #define AUDIO_FORMAT_TYPEIII 0x03
  391. #define AUDIO_FORMAT_TYPEIV 0x04
  392. #define AUDIO_FORMAT_EXT_TYPEI 0x81
  393. #define AUDIO_FORMAT_EXT_TYPEII 0x82
  394. #define AUDIO_FORMAT_EXT_TYPEIII 0x83
  395. /* Audio Data Format Type I Bit Allocations */
  396. #define AUDIO_FORMAT_TYPEI_PCM (1 << 0)
  397. #define AUDIO_FORMAT_TYPEI_PCM8 (1 << 1)
  398. #define AUDIO_FORMAT_TYPEI_IEEEFLOAT (1 << 2)
  399. #define AUDIO_FORMAT_TYPEI_ALAW (1 << 3)
  400. #define AUDIO_FORMAT_TYPEI_MULAW (1 << 4)
  401. #define AUDIO_FORMAT_TYPEI_RAWDATA (1 << 31)
  402. /* Audio Data Format Type II Bit Allocations */
  403. #define AUDIO_FORMAT_TYPEII_MPEG (1 << 0)
  404. #define AUDIO_FORMAT_TYPEII_AC3 (1 << 1)
  405. #define AUDIO_FORMAT_TYPEII_WMA (1 << 2)
  406. #define AUDIO_FORMAT_TYPEII_DTS (1 << 3)
  407. #define AUDIO_FORMAT_TYPEII_RAWDATA (1 << 31)
  408. /* Audio Data Format Type III Bit Allocations */
  409. #define AUDIO_FORMAT_TYPEIII_IEC61937_AC3 (1 << 0)
  410. #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L1 (1 << 1)
  411. #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L2_3 (1 << 1)
  412. #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_NOEXT (1 << 2)
  413. #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_EXT (1 << 3)
  414. #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_AAC_ADTS (1 << 4)
  415. #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L1_LS (1 << 5)
  416. #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L2_3_LS (1 << 6)
  417. #define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_I (1 << 7)
  418. #define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_II (1 << 8)
  419. #define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_III (1 << 9)
  420. #define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC (1 << 10)
  421. #define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC2_3 (1 << 11)
  422. #define AUDIO_FORMAT_TYPEIII_WMA (1 << 12)
  423. /* Audio Data Format Type IV Bit Allocations */
  424. #define AUDIO_FORMAT_TYPEIV_PCM (1 << 0)
  425. #define AUDIO_FORMAT_TYPEIV_PCM8 (1 << 1)
  426. #define AUDIO_FORMAT_TYPEIV_IEEE_FLOAT (1 << 2)
  427. #define AUDIO_FORMAT_TYPEIV_ALAW (1 << 3)
  428. #define AUDIO_FORMAT_TYPEIV_MULAW (1 << 4)
  429. #define AUDIO_FORMAT_TYPEIV_MPEG (1 << 5)
  430. #define AUDIO_FORMAT_TYPEIV_AC3 (1 << 6)
  431. #define AUDIO_FORMAT_TYPEIV_WMA (1 << 7)
  432. #define AUDIO_FORMAT_TYPEIV_IEC61937_AC3 (1 << 8)
  433. #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L1 (1 << 9)
  434. #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L2_3 (1 << 10)
  435. #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_NOEXT (1 << 10)
  436. #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_EXT (1 << 11)
  437. #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_AAC_ADTS (1 << 12)
  438. #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L1_LS (1 << 13)
  439. #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L2_3_LS (1 << 14)
  440. #define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_I (1 << 15)
  441. #define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_II (1 << 16)
  442. #define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_III (1 << 17)
  443. #define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC (1 << 18)
  444. #define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC2_3 (1 << 19)
  445. #define AUDIO_FORMAT_TYPEIV_TYPE_III_WMA (1 << 20)
  446. #define AUDIO_FORMAT_TYPEIV_IEC60958_PCM (1 << 21)
  447. /* Side Band Protocol Codes */
  448. #define AUDIO_SIDEBAND_PROTOCOL_UNDEF 0x00
  449. #define AUDIO_PRES_TIMESTAMP_PROTOCOL 0x01
  450. /** USB Terminal Types
  451. * Refer to Table 2-1 - Table 2-4 from termt10.pdf
  452. */
  453. /* USB Terminal Types */
  454. #define AUDIO_TERMINAL_UNDEF 0x0100
  455. #define AUDIO_TERMINAL_STREAMING 0x0101
  456. #define AUDIO_TERMINAL_VENDOR 0x01ff
  457. /* Input Terminal Types */
  458. #define AUDIO_INTERM_UNDEF 0x0200 /* Undefined Type */
  459. #define AUDIO_INTERM_MIC 0x0201 /* A generic microhpone */
  460. #define AUDIO_INTERM_DESKTOP_MIC 0x0202 /* A desktop microphone */
  461. #define AUDIO_INTERM_PERSONAL_MIC 0x0203 /* Head-mounted or clip-on microphone */
  462. #define AUDIO_INTERM_OMNI_MIC 0x0204 /* Omni-directional microphone */
  463. #define AUDIO_INTERM_MIC_ARRAY 0x0205 /* Microphone array */
  464. #define AUDIO_INTERM_PROC_MIC_ARRAY 0x0206 /* Microphone array with signal processor */
  465. /* Output Terminal Types */
  466. #define AUDIO_OUTTERM_UNDEF 0x0300 /* Undefined Type */
  467. #define AUDIO_OUTTERM_SPEAKER 0x0301 /* Generic speakers */
  468. #define AUDIO_OUTTERM_HEADPHONES 0x0302 /* A head-mounted audio output device */
  469. #define AUDIO_OUTTERM_HEADDISPLAY 0x0303 /* Head Mounted Display Audio */
  470. #define AUDIO_OUTTERM_DESKTOP 0x0304 /* Desktop speaker */
  471. #define AUDIO_OUTTERM_ROOM 0x0305 /* Room speaker */
  472. #define AUDIO_OUTTERM_COMMS 0x0306 /* Communication speaker */
  473. #define AUDIO_OUTTERM_LOFREQ 0x0307 /* Low frequency effects speaker */
  474. /* Bi-directional Terminal Types */
  475. #define AUDIO_BIDITERM_UNDEF 0x0400 /* Undefined Type */
  476. #define AUDIO_BIDITERM_HANDSET 0x0401 /* Hand-held bi-directional audio device */
  477. #define AUDIO_BIDITERM_HEADSET 0x0402 /* Head-mounted bi-directional audio device */
  478. #define AUDIO_BIDITERM_SPEAKERPHONE 0x0403 /* Speakerphone, no echo reduction */
  479. #define AUDIO_BIDITERM_ECHOSUPPRESS 0x0404 /* Echo-suppressing speakerphone */
  480. #define AUDIO_BIDITERM_ECHOCANCEL 0x0405 /* Echo-canceling speakerphone */
  481. /* Telephony Terminal Types */
  482. #define AUDIO_TELETERM_UNDEF 0x0500 /* Undefined Type */
  483. #define AUDIO_TELETERM_PHONELINE 0x0501 /* Analog telephone line jack, an ISDN line,
  484. * a proprietary PBX interface, or a wireless link */
  485. #define AUDIO_TELETERM_TELEPHONE 0x0502 /* Device can be used as a telephone */
  486. #define AUDIO_TELETERM_DOWNLINE 0x0503 /* Down Line Phone */
  487. /* External Terminal Types */
  488. #define AUDIO_EXTTERM_UNDEF 0x0600 /* Undefined Type */
  489. #define AUDIO_EXTTERM_ANALOG 0x0601 /* Generic analog connector */
  490. #define AUDIO_EXTTERM_DIGITAL 0x0602 /* Generic digital audio interface */
  491. #define AUDIO_EXTTERM_LINE 0x0603 /* Analog connector at standard line levels */
  492. #define AUDIO_EXTTERM_LEGACY 0x0604 /* Legacy audio line out connector */
  493. #define AUDIO_EXTTERM_SPDIF 0x0605 /* SPDIF interface */
  494. #define AUDIO_EXTTERM_1394DA 0x0606 /* 1394 DA stream */
  495. #define AUDIO_EXTTERM_1394DV 0x0607 /* 1394 DV stream soundtrack */
  496. #define AUDIO_EXTTERM_ADAT 0x0608 /* ADAT Lightpipe */
  497. #define AUDIO_EXTTERM_TDIF 0x0609 /* TDIF - Tascam Digital Interface */
  498. #define AUDIO_EXTTERM_MADI 0x060a /* MADI - Multi-channel Audio Digital Interface (AES) */
  499. /* Embedded Function Terminal Types */
  500. #define AUDIO_EMBEDTERM_UNDEF 0x0700 /* Undefined Type */
  501. #define AUDIO_EMBEDTERM_CALIBRATION 0x0701 /* Level Calibration Noise Source */
  502. #define AUDIO_EMBEDTERM_EQUALIZATION 0x0702 /* Equalization Noise */
  503. #define AUDIO_EMBEDTERM_CD 0x0703 /* CD player */
  504. #define AUDIO_EMBEDTERM_DAT 0x0704 /* Digital Audio Tape */
  505. #define AUDIO_EMBEDTERM_DCC 0x0705 /* Digital Compact Cassette */
  506. #define AUDIO_EMBEDTERM_COMPRESSED 0x0706 /* Compressed Audio Player */
  507. #define AUDIO_EMBEDTERM_TAPE 0x0707 /* Analog Audio Tape */
  508. #define AUDIO_EMBEDTERM_PHONOGRAPH 0x0708 /* Analog vinyl record player */
  509. #define AUDIO_EMBEDTERM_VCR 0x0709 /* Audio track of VCR */
  510. #define AUDIO_EMBEDTERM_VIDDISC 0x070a /* Audio track of VideoDisc player */
  511. #define AUDIO_EMBEDTERM_DVD 0x070b /* Audio track of DVD player */
  512. #define AUDIO_EMBEDTERM_TVTUNER 0x070c /* Audio track of TV tuner */
  513. #define AUDIO_EMBEDTERM_SATELLITE 0x070d /* Audio track of satellite receiver */
  514. #define AUDIO_EMBEDTERM_CABLETUNER 0x070e /* Audio track of cable tuner */
  515. #define AUDIO_EMBEDTERM_DSS 0x070f /* Audio track of DSS receiver */
  516. #define AUDIO_EMBEDTERM_RADIO 0x0710 /* AM/FM radio receiver */
  517. #define AUDIO_EMBEDTERM_TRANSMITTER 0x0711 /* AM/FM radio transmitter */
  518. #define AUDIO_EMBEDTERM_MULTITRACK 0x0712 /* A multi-track recording system */
  519. #define AUDIO_EMBEDTERM_SYNTHESIZER 0x0713 /* Synthesizer */
  520. #define AUDIO_EMBEDTERM_PIANO 0x0714 /* Piano */
  521. #define AUDIO_EMBEDTERM_GUITAR 0x0715 /* Guitar */
  522. #define AUDIO_EMBEDTERM_PERCUSSON 0x0716 /* Percussion Instrument */
  523. #define AUDIO_EMBEDTERM_INSTRUMENT 0x0717 /* Other Musical Instrument */
  524. #define AUDIO_FORMAT_TYPE_I 0x01
  525. #define AUDIO_FORMAT_TYPE_II 0x02
  526. #define AUDIO_FORMAT_TYPE_III 0x03
  527. struct audio_cs_if_ac_header_descriptor {
  528. uint8_t bLength;
  529. uint8_t bDescriptorType;
  530. uint8_t bDescriptorSubtype;
  531. uint16_t bcdADC;
  532. uint16_t wTotalLength;
  533. uint8_t bInCollection;
  534. uint8_t baInterfaceNr[];
  535. } __PACKED;
  536. #define AUDIO_SIZEOF_AC_HEADER_DESC(n) (8 + n)
  537. struct audio_cs_if_ac_input_terminal_descriptor {
  538. uint8_t bLength;
  539. uint8_t bDescriptorType;
  540. uint8_t bDescriptorSubtype;
  541. uint8_t bTerminalID;
  542. uint16_t wTerminalType;
  543. uint8_t bAssocTerminal;
  544. uint8_t bNrChannels;
  545. uint16_t wChannelConfig;
  546. uint8_t iChannelNames;
  547. uint8_t iTerminal;
  548. } __PACKED;
  549. #define AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC (12)
  550. struct audio_cs_if_ac_output_terminal_descriptor {
  551. uint8_t bLength;
  552. uint8_t bDescriptorType;
  553. uint8_t bDescriptorSubtype;
  554. uint8_t bTerminalID;
  555. uint16_t wTerminalType;
  556. uint8_t bAssocTerminal;
  557. uint8_t bSourceID;
  558. uint8_t iTerminal;
  559. } __PACKED;
  560. #define AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC (9)
  561. struct audio_cs_if_ac_feature_unit_descriptor {
  562. uint8_t bLength;
  563. uint8_t bDescriptorType;
  564. uint8_t bDescriptorSubtype;
  565. uint8_t bUnitID;
  566. uint8_t bSourceID;
  567. uint8_t bControlSize;
  568. uint8_t bmaControls[1];
  569. uint8_t iFeature;
  570. } __PACKED;
  571. #define AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(ch, n) (7 + (ch + 1) * n)
  572. struct audio_cs_if_ac_selector_unit_descriptor {
  573. uint8_t bLength;
  574. uint8_t bDescriptorType;
  575. uint8_t bDescriptorSubtype;
  576. uint8_t bUnitID;
  577. uint8_t bNrInPins;
  578. uint8_t baSourceID[1];
  579. uint8_t iSelector;
  580. } __PACKED;
  581. #define AUDIO_SIZEOF_AC_SELECTOR_UNIT_DESC(n) (6 + n)
  582. struct audio_cs_if_as_general_descriptor {
  583. uint8_t bLength;
  584. uint8_t bDescriptorType;
  585. uint8_t bDescriptorSubtype;
  586. uint8_t bTerminalLink;
  587. uint8_t bDelay;
  588. uint16_t wFormatTag;
  589. } __PACKED;
  590. #define AUDIO_SIZEOF_AS_GENERAL_DESC (7)
  591. struct audio_cs_if_as_format_type_descriptor {
  592. uint8_t bLength;
  593. uint8_t bDescriptorType;
  594. uint8_t bDescriptorSubtype;
  595. uint8_t bFormatType;
  596. uint8_t bNrChannels;
  597. uint8_t bSubframeSize;
  598. uint8_t bBitResolution;
  599. uint8_t bSamFreqType;
  600. uint8_t tSamFreq[3];
  601. } __PACKED;
  602. #define AUDIO_SIZEOF_FORMAT_TYPE_DESC(n) (8 + 3 * n)
  603. struct audio_ep_descriptor {
  604. uint8_t bLength;
  605. uint8_t bDescriptorType;
  606. uint8_t bEndpointAddress;
  607. uint8_t bmAttributes;
  608. uint16_t wMaxPacketSize;
  609. uint8_t bInterval;
  610. uint8_t bRefresh;
  611. uint8_t bSynchAddress;
  612. } __PACKED;
  613. #define AUDIO_SIZEOF_EP_DESC (9)
  614. struct audio_cs_ep_ep_general_descriptor {
  615. uint8_t bLength;
  616. uint8_t bDescriptorType;
  617. uint8_t bDescriptorSubtype;
  618. uint8_t bmAttributes;
  619. uint8_t bLockDelayUnits;
  620. uint16_t wLockDelay;
  621. } __PACKED;
  622. #define AUDIO_SIZEOF_CS_EP_GENERAL_DESC (7)
  623. // clang-format off
  624. #define AUDIO_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, stridx, ...) \
  625. /* Interface Association Descriptor */ \
  626. 0x08, \
  627. USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, \
  628. bFirstInterface, \
  629. bInterfaceCount, \
  630. USB_DEVICE_CLASS_AUDIO, \
  631. AUDIO_SUBCLASS_AUDIOCONTROL, \
  632. AUDIO_PROTOCOL_UNDEFINED, \
  633. 0x00, \
  634. /* ------------------ AudioControl Interface ------------------ */\
  635. 0x09, /* bLength */ \
  636. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  637. bFirstInterface, /* bInterfaceNumber */ \
  638. 0x00, /* bAlternateSetting */ \
  639. 0x00, /* bNumEndpoints */ \
  640. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  641. AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ \
  642. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  643. stridx, /* iInterface */ \
  644. 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \
  645. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  646. AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ \
  647. WBVAL(0x0100), /* bcdADC */ \
  648. WBVAL(wTotalLength), /* wTotalLength */ \
  649. PP_NARG(__VA_ARGS__), /* bInCollection */ \
  650. __VA_ARGS__ /* baInterfaceNr */
  651. #define AUDIO_AC_DESCRIPTOR_INIT_LEN(n) (0x08 + 0x09 + 0x08 + n)
  652. #define AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bNrChannels, wChannelConfig) \
  653. 0x0C, /* bLength */ \
  654. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  655. AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ \
  656. bTerminalID, /* bTerminalID */ \
  657. WBVAL(wTerminalType), /* wTerminalType : Microphone 0x0201 */ \
  658. 0x00, /* bAssocTerminal */ \
  659. bNrChannels, /* bNrChannels */ \
  660. WBVAL(wChannelConfig), /* wChannelConfig : Mono sets no position bits */ \
  661. 0x00, /* iChannelNames */ \
  662. 0x00 /* iTerminal */
  663. #define AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID) \
  664. 0x09, /* bLength */ \
  665. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  666. AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ \
  667. bTerminalID, /* bTerminalID */ \
  668. WBVAL(wTerminalType), /* wTerminalType : USB Streaming */ \
  669. 0x00, /* bAssocTerminal */ \
  670. bSourceID, /* bSourceID */ \
  671. 0x00 /* iTerminal */
  672. #define AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, bControlSize, ...) \
  673. 0x07 + PP_NARG(__VA_ARGS__), /* bLength */ \
  674. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  675. AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ \
  676. bUnitID, /* bUnitID */ \
  677. bSourceID, /* bSourceID */ \
  678. bControlSize, /* bControlSize */ \
  679. __VA_ARGS__, /* bmaControls(0) Mute */ \
  680. 0x00 /* iTerminal */
  681. #define AUDIO_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \
  682. 0x09, /* bLength */ \
  683. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  684. bInterfaceNumber, /* bInterfaceNumber */ \
  685. 0x00, /* bAlternateSetting */ \
  686. 0x00, /* bNumEndpoints */ \
  687. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  688. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  689. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  690. 0x00, /* iInterface */ \
  691. 0x09, /* bLength */ \
  692. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  693. bInterfaceNumber, /* bInterfaceNumber */ \
  694. 0x01, /* bAlternateSetting */ \
  695. 0x01, /* bNumEndpoints */ \
  696. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  697. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  698. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  699. 0x00, /* iInterface */ \
  700. 0x07, /* bLength */ \
  701. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  702. AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \
  703. bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \
  704. 0x01, /* bDelay */ \
  705. WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag : AUDIO_FORMAT_PCM */ \
  706. 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \
  707. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  708. AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \
  709. AUDIO_FORMAT_TYPE_I, /* bFormatType */ \
  710. bNrChannels, /* bNrChannels */ \
  711. bSubFrameSize, /* bSubFrameSize : Bytes per audio subframe */ \
  712. bBitResolution, /* bBitResolution : bits per sample */ \
  713. (PP_NARG(__VA_ARGS__)/3), /* bSamFreqType : only one frequency supported */ \
  714. __VA_ARGS__, /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \
  715. 0x09, /* bLength */ \
  716. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  717. bEndpointAddress, /* bEndpointAddress : IN endpoint 1 */ \
  718. bmAttributes, /* bmAttributes */ \
  719. WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
  720. bInterval, /* bInterval : one packet per frame */ \
  721. 0x00, /* bRefresh */ \
  722. 0x00, /* bSynchAddress */ \
  723. 0x07, /* bLength */ \
  724. AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  725. AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \
  726. AUDIO_EP_CONTROL_SAMPLING_FEQ, /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */ \
  727. 0x00, /* bLockDelayUnits */ \
  728. 0x00, /* wLockDelay */ \
  729. 0x00
  730. #define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, bFeedbackEndpointAddress, ...) \
  731. 0x09, /* bLength */ \
  732. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  733. bInterfaceNumber, /* bInterfaceNumber */ \
  734. 0x00, /* bAlternateSetting */ \
  735. 0x00, /* bNumEndpoints */ \
  736. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  737. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  738. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  739. 0x00, /* iInterface */ \
  740. 0x09, /* bLength */ \
  741. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  742. bInterfaceNumber, /* bInterfaceNumber */ \
  743. 0x01, /* bAlternateSetting */ \
  744. 0x02, /* bNumEndpoints */ \
  745. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  746. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  747. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  748. 0x00, /* iInterface */ \
  749. 0x07, /* bLength */ \
  750. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  751. AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \
  752. bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \
  753. 0x01, /* bDelay */ \
  754. WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag : AUDIO_FORMAT_PCM */ \
  755. 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \
  756. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  757. AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \
  758. AUDIO_FORMAT_TYPE_I, /* bFormatType */ \
  759. bNrChannels, /* bNrChannels */ \
  760. bSubFrameSize, /* bSubFrameSize : Bytes per audio subframe */ \
  761. bBitResolution, /* bBitResolution : bits per sample */ \
  762. (PP_NARG(__VA_ARGS__)/3), /* bSamFreqType : only one frequency supported */ \
  763. __VA_ARGS__, /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \
  764. 0x09, /* bLength */ \
  765. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  766. bEndpointAddress, /* bEndpointAddress : IN endpoint 1 */ \
  767. 0x05, /* bmAttributes */ \
  768. WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
  769. bInterval, /* bInterval : one packet per frame */ \
  770. 0x00, /* bRefresh */ \
  771. bFeedbackEndpointAddress, /* bSynchAddress */ \
  772. 0x07, /* bLength */ \
  773. AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  774. AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \
  775. AUDIO_EP_CONTROL_SAMPLING_FEQ, /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */ \
  776. 0x00, /* bLockDelayUnits */ \
  777. 0x00, /* wLockDelay */ \
  778. 0x00, \
  779. 0x09, /* bLength */ \
  780. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  781. bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \
  782. 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \
  783. WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \
  784. bInterval, /* bInterval */ \
  785. 0x03, /* bRefresh, 8ms */ \
  786. 0x00 /* bSynchAddress */
  787. #define AUDIO_AS_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07)
  788. #define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07 + 0x09)
  789. #define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \
  790. 0x09, /* bLength */ \
  791. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  792. bInterfaceNumber, /* bInterfaceNumber */ \
  793. bAlternateSetting, /* bAlternateSetting */ \
  794. 0x01, /* bNumEndpoints */ \
  795. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  796. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  797. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  798. 0x00, /* iInterface */ \
  799. 0x07, /* bLength */ \
  800. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  801. AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \
  802. bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \
  803. 0x01, /* bDelay */ \
  804. WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag : AUDIO_FORMAT_PCM */ \
  805. 0x08 + PP_NARG(__VA_ARGS__), /* bLength */ \
  806. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  807. AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \
  808. AUDIO_FORMAT_TYPE_I, /* bFormatType */ \
  809. bNrChannels, /* bNrChannels */ \
  810. bSubFrameSize, /* bSubFrameSize : Bytes per audio subframe */ \
  811. bBitResolution, /* bBitResolution : bits per sample */ \
  812. (PP_NARG(__VA_ARGS__)/3), /* bSamFreqType : only one frequency supported */ \
  813. __VA_ARGS__, /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \
  814. 0x09, /* bLength */ \
  815. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  816. bEndpointAddress, /* bEndpointAddress : IN endpoint 1 */ \
  817. bmAttributes, /* bmAttributes */ \
  818. WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \
  819. bInterval, /* bInterval : one packet per frame */ \
  820. 0x00, /* bRefresh */ \
  821. 0x00, /* bSynchAddress */ \
  822. 0x07, /* bLength */ \
  823. AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  824. AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \
  825. AUDIO_EP_CONTROL_SAMPLING_FEQ, /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */ \
  826. 0x00, /* bLockDelayUnits */ \
  827. 0x00, /* wLockDelay */ \
  828. 0x00
  829. #define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07)
  830. #define AUDIO_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \
  831. 0x09, /* bLength */ \
  832. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  833. bInterfaceNumber, /* bInterfaceNumber */ \
  834. 0x00, /* bAlternateSetting */ \
  835. 0x01, /* bNumEndpoints */ \
  836. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  837. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  838. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  839. 0x00 /* iInterface */
  840. #define AUDIO_MS_STANDARD_DESCRIPTOR_INIT(bInterfaceNumber, bNumEndpoints) \
  841. 0x09, /* bLength */ \
  842. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  843. bInterfaceNumber, /* bInterfaceNumber */ \
  844. 0x00, /* bAlternateSetting */ \
  845. bNumEndpoints, /* bNumEndpoints */ \
  846. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  847. AUDIO_SUBCLASS_MIDISTREAMING, /* bInterfaceSubClass */ \
  848. AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \
  849. 0x00 /* iInterface */
  850. #define AUDIO_MS_STANDARD_DESCRIPTOR_INIT_LEN 0x09
  851. struct audio_v2_channel_cluster_descriptor {
  852. uint8_t bNrChannels;
  853. uint32_t bmChannelConfig;
  854. uint8_t iChannelNames;
  855. } __PACKED;
  856. #define AUDIO_V2_SIZEOF_CHANNEL_CLUSTER_DESC (6)
  857. struct audio_v2_cs_if_ac_header_descriptor {
  858. uint8_t bLength;
  859. uint8_t bDescriptorType;
  860. uint8_t bDescriptorSubtype;
  861. uint16_t bcdADC;
  862. uint8_t bCategory;
  863. uint16_t wTotalLength;
  864. uint8_t bmControls;
  865. } __PACKED;
  866. #define AUDIO_V2_SIZEOF_AC_HEADER_DESC (9)
  867. struct audio_v2_cs_if_ac_clock_source_descriptor {
  868. uint8_t bLength;
  869. uint8_t bDescriptorType;
  870. uint8_t bDescriptorSubtype;
  871. uint8_t bClockID;
  872. uint8_t bmAttributes;
  873. uint8_t bmControls;
  874. uint8_t bAssocTerminal;
  875. uint8_t iClockSource;
  876. } __PACKED;
  877. #define AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC (8)
  878. struct audio_v2_cs_if_ac_clock_selector_descriptor {
  879. uint8_t bLength;
  880. uint8_t bDescriptorType;
  881. uint8_t bDescriptorSubtype;
  882. uint8_t bClockID;
  883. uint8_t bNrInPins;
  884. uint8_t baCSourceID[1];
  885. uint8_t iClockSelector;
  886. } __PACKED;
  887. #define AUDIO_SIZEOF_AC_CLOCK_SELECTOR_DESC(n) (7 + n)
  888. struct audio_v2_cs_if_ac_clock_multiplier_descriptor {
  889. uint8_t bLength;
  890. uint8_t bDescriptorType;
  891. uint8_t bDescriptorSubtype;
  892. uint8_t bClockID;
  893. uint8_t bCSourceID;
  894. uint8_t bmControls;
  895. uint8_t iClockMultiplier;
  896. } __PACKED;
  897. #define AUDIO_SIZEOF_AC_CLOCK_MULTIPLIER_DESC() (7)
  898. struct audio_v2_cs_if_ac_input_terminal_descriptor {
  899. uint8_t bLength;
  900. uint8_t bDescriptorType;
  901. uint8_t bDescriptorSubtype;
  902. uint8_t bTerminalID;
  903. uint16_t wTerminalType;
  904. uint8_t bAssocTerminal;
  905. uint8_t bCSourceID;
  906. uint8_t bNrChannels;
  907. uint32_t wChannelConfig;
  908. uint8_t iChannelNames;
  909. uint16_t bmControls;
  910. uint8_t iTerminal;
  911. } __PACKED;
  912. #define AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC (17)
  913. struct audio_v2_cs_if_ac_output_terminal_descriptor {
  914. uint8_t bLength;
  915. uint8_t bDescriptorType;
  916. uint8_t bDescriptorSubtype;
  917. uint8_t bTerminalID;
  918. uint16_t wTerminalType;
  919. uint8_t bAssocTerminal;
  920. uint8_t bSourceID;
  921. uint8_t bCSourceID;
  922. uint16_t bmControls;
  923. uint8_t iTerminal;
  924. } __PACKED;
  925. #define AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC (12)
  926. struct audio_v2_cs_if_ac_feature_unit_descriptor {
  927. uint8_t bLength;
  928. uint8_t bDescriptorType;
  929. uint8_t bDescriptorSubtype;
  930. uint8_t bUnitID;
  931. uint8_t bSourceID;
  932. uint32_t bmaControls[1];
  933. uint8_t iFeature;
  934. } __PACKED;
  935. #define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(ch) (6 + (ch + 1) * 4)
  936. struct audio_v2_cs_if_as_general_descriptor {
  937. uint8_t bLength;
  938. uint8_t bDescriptorType;
  939. uint8_t bDescriptorSubtype;
  940. uint8_t bTerminalLink;
  941. uint8_t bmControls;
  942. uint8_t bFormatType;
  943. uint32_t bmFormats;
  944. uint8_t bNrChannels;
  945. uint32_t bmChannelConfig;
  946. uint8_t iChannelNames;
  947. } __PACKED;
  948. #define AUDIO_V2_SIZEOF_AS_GENERAL_DESC (16)
  949. struct audio_v2_control_range1_param_block {
  950. uint16_t wNumSubRanges;
  951. struct
  952. {
  953. uint8_t bMin;
  954. uint8_t bMax;
  955. uint8_t bRes;
  956. }subrange[];
  957. } __PACKED;
  958. struct audio_v2_control_range2_param_block {
  959. uint16_t wNumSubRanges;
  960. struct
  961. {
  962. uint16_t wMin;
  963. uint16_t wMax;
  964. uint16_t wRes;
  965. }subrange[];
  966. } __PACKED;
  967. struct audio_v2_control_range3_param_block {
  968. uint16_t wNumSubRanges;
  969. struct
  970. {
  971. uint32_t dMin;
  972. uint32_t dMax;
  973. uint32_t dRes;
  974. }subrange[];
  975. } __PACKED;
  976. #define AUDIO_V2_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, bCategory, bmControls, stridx) \
  977. /* Interface Association Descriptor */ \
  978. 0x08, \
  979. USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, \
  980. bFirstInterface, \
  981. bInterfaceCount, \
  982. USB_DEVICE_CLASS_AUDIO, \
  983. AUDIO_SUBCLASS_UNDEFINED, \
  984. AUDIO_PROTOCOLv20, \
  985. 0x00, \
  986. /* ------------------ AudioControl Interface ------------------ */\
  987. 0x09, /* bLength */ \
  988. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  989. bFirstInterface, /* bInterfaceNumber */ \
  990. 0x00, /* bAlternateSetting */ \
  991. 0x00, /* bNumEndpoints */ \
  992. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  993. AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ \
  994. AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \
  995. stridx, /* iInterface */ \
  996. 0x09, /* bLength */ \
  997. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  998. AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ \
  999. WBVAL(0x0200), /* bcdADC */ \
  1000. bCategory, /* bCategory */ \
  1001. WBVAL(wTotalLength), /* wTotalLength */ \
  1002. bmControls /* bmControls */ \
  1003. #define AUDIO_V2_AC_DESCRIPTOR_INIT_LEN (0x08 + 0x09 + 0x09)
  1004. #define AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(bClockID, bmAttributes, bmControls) \
  1005. 0x08, /* bLength */ \
  1006. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1007. AUDIO_CONTROL_CLOCK_SOURCE, /* bDescriptorSubtype */ \
  1008. bClockID, /* bClockID */ \
  1009. bmAttributes, /* bmAttributes */ \
  1010. bmControls, /* bmControls */ \
  1011. 0x00, /* bAssocTerminal */ \
  1012. 0x00 /* iClockSource */
  1013. #define AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bCSourceID, bNrChannels, wChannelConfig, bmControls) \
  1014. 0x11, /* bLength */ \
  1015. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1016. AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ \
  1017. bTerminalID, /* bTerminalID */ \
  1018. WBVAL(wTerminalType), /* wTerminalType : Microphone 0x0201 */ \
  1019. 0x00, /* bAssocTerminal */ \
  1020. bCSourceID, /* bCSourceID */ \
  1021. bNrChannels, /* bNrChannels */ \
  1022. DBVAL(wChannelConfig), /* wChannelConfig : Mono sets no position bits */ \
  1023. 0x00, /* iChannelNames */ \
  1024. WBVAL(bmControls), /* bmControls */ \
  1025. 0x00 /* iTerminal */
  1026. #define AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID, bCSourceID, bmControls) \
  1027. 0x0c, /* bLength */ \
  1028. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1029. AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ \
  1030. bTerminalID, /* bTerminalID */ \
  1031. WBVAL(wTerminalType), /* wTerminalType : USB Streaming */ \
  1032. 0x00, /* bAssocTerminal */ \
  1033. bSourceID, /* bSourceID */ \
  1034. bCSourceID, /* bCSourceID */ \
  1035. WBVAL(bmControls), /* bmControls */ \
  1036. 0x00 /* iTerminal */
  1037. #define AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, ...) \
  1038. 0x06 + (PP_NARG(__VA_ARGS__)), /* bLength */ \
  1039. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1040. AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ \
  1041. bUnitID, /* bUnitID */ \
  1042. bSourceID, /* bSourceID */ \
  1043. __VA_ARGS__, /* bmaControls(0) Mute */ \
  1044. 0x00 /* iTerminal */
  1045. #define AUDIO_V2_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
  1046. 0x09, /* bLength */ \
  1047. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  1048. bInterfaceNumber, /* bInterfaceNumber */ \
  1049. 0x00, /* bAlternateSetting */ \
  1050. 0x00, /* bNumEndpoints */ \
  1051. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  1052. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  1053. AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \
  1054. 0x00, /* iInterface */ \
  1055. 0x09, /* bLength */ \
  1056. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  1057. bInterfaceNumber, /* bInterfaceNumber */ \
  1058. 0x01, /* bAlternateSetting */ \
  1059. 0x01, /* bNumEndpoints */ \
  1060. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  1061. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  1062. AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \
  1063. 0x00, /* iInterface */ \
  1064. 0x10, /* bLength */ \
  1065. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1066. AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \
  1067. bTerminalLink, /* bTerminalLink : Unit ID of the Output or Input Terminal*/ \
  1068. 0x00, /* bmControls */ \
  1069. AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \
  1070. DBVAL(AUDIO_V2_FORMAT_PCM), /* bmFormats PCM */ \
  1071. bNrChannels, /* bNrChannels */ \
  1072. DBVAL(bmChannelConfig), /* bmChannelConfig */ \
  1073. 0x00, /* iChannelNames */ \
  1074. 0x06, /* bLength */ \
  1075. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1076. AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \
  1077. AUDIO_FORMAT_TYPE_I, /* bFormatType */ \
  1078. bSubslotSize, /* bSubslotSize */ \
  1079. bBitResolution, /* bBitResolution */ \
  1080. 0x07, /* bLength */ \
  1081. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  1082. bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \
  1083. bmAttributes, /* bmAttributes */ \
  1084. WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */ \
  1085. bInterval, /* bInterval */ \
  1086. 0x08, /* bLength */ \
  1087. AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1088. AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \
  1089. 0x00, /* bmAttributes */ \
  1090. 0x00, /* bmControls */ \
  1091. 0x00, /* bLockDelayUnits */ \
  1092. 0x00, /* wLockDelay */ \
  1093. 0x00
  1094. #define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
  1095. 0x09, /* bLength */ \
  1096. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  1097. bInterfaceNumber, /* bInterfaceNumber */ \
  1098. bAlternateSetting, /* bAlternateSetting */ \
  1099. 0x01, /* bNumEndpoints */ \
  1100. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  1101. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  1102. AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \
  1103. 0x00, /* iInterface */ \
  1104. 0x10, /* bLength */ \
  1105. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1106. AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \
  1107. bTerminalLink, /* bTerminalLink : Unit ID of the Output or Input Terminal*/ \
  1108. 0x00, /* bmControls */ \
  1109. AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \
  1110. DBVAL(AUDIO_V2_FORMAT_PCM), /* bmFormats PCM */ \
  1111. bNrChannels, /* bNrChannels */ \
  1112. DBVAL(bmChannelConfig), /* bmChannelConfig */ \
  1113. 0x00, /* iChannelNames */ \
  1114. 0x06, /* bLength */ \
  1115. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1116. AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \
  1117. AUDIO_FORMAT_TYPE_I, /* bFormatType */ \
  1118. bSubslotSize, /* bSubslotSize */ \
  1119. bBitResolution, /* bBitResolution */ \
  1120. 0x07, /* bLength */ \
  1121. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  1122. bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \
  1123. bmAttributes, /* bmAttributes */ \
  1124. WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */ \
  1125. bInterval, /* bInterval */ \
  1126. 0x08, /* bLength */ \
  1127. AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1128. AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \
  1129. 0x00, /* bmAttributes */ \
  1130. 0x00, /* bmControls */ \
  1131. 0x00, /* bLockDelayUnits */ \
  1132. 0x00, /* wLockDelay */ \
  1133. 0x00
  1134. #define AUDIO_V2_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \
  1135. 0x09, /* bLength */ \
  1136. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  1137. bInterfaceNumber, /* bInterfaceNumber */ \
  1138. 0x00, /* bAlternateSetting */ \
  1139. 0x01, /* bNumEndpoints */ \
  1140. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  1141. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  1142. AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \
  1143. 0x00 /* iInterface */
  1144. #define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, bFeedbackEndpointAddress) \
  1145. 0x09, /* bLength */ \
  1146. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  1147. bInterfaceNumber, /* bInterfaceNumber */ \
  1148. 0x00, /* bAlternateSetting */ \
  1149. 0x00, /* bNumEndpoints */ \
  1150. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  1151. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  1152. AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \
  1153. 0x00, /* iInterface */ \
  1154. 0x09, /* bLength */ \
  1155. USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
  1156. bInterfaceNumber, /* bInterfaceNumber */ \
  1157. 0x01, /* bAlternateSetting */ \
  1158. 0x02, /* bNumEndpoints */ \
  1159. USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \
  1160. AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ \
  1161. AUDIO_PROTOCOLv20, /* bInterfaceProtocol */ \
  1162. 0x00, /* iInterface */ \
  1163. 0x10, /* bLength */ \
  1164. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1165. AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \
  1166. bTerminalLink, /* bTerminalLink : Unit ID of the Output or Input Terminal*/ \
  1167. 0x00, /* bmControls */ \
  1168. AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \
  1169. DBVAL(AUDIO_V2_FORMAT_PCM), /* bmFormats PCM */ \
  1170. bNrChannels, /* bNrChannels */ \
  1171. DBVAL(bmChannelConfig), /* bmChannelConfig */ \
  1172. 0x00, /* iChannelNames */ \
  1173. 0x06, /* bLength */ \
  1174. AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1175. AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \
  1176. AUDIO_FORMAT_TYPE_I, /* bFormatType */ \
  1177. bSubslotSize, /* bSubslotSize */ \
  1178. bBitResolution, /* bBitResolution */ \
  1179. 0x07, /* bLength */ \
  1180. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  1181. bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \
  1182. 0x05, /* bmAttributes: TransferType=Isochronous SyncType=Asynchronous EndpointType=Data*/ \
  1183. WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */ \
  1184. bInterval, /* bInterval */ \
  1185. 0x08, /* bLength */ \
  1186. AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \
  1187. AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ \
  1188. 0x00, /* bmAttributes */ \
  1189. 0x00, /* bmControls */ \
  1190. 0x00, /* bLockDelayUnits */ \
  1191. 0x00, /* wLockDelay */ \
  1192. 0x00, \
  1193. 0x07, /* bLength */ \
  1194. USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \
  1195. bFeedbackEndpointAddress, /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */ \
  1196. 0x11, /* bmAttributes: TransferType=Isochronous SyncType=None EndpointType=Feedback */ \
  1197. WBVAL(4), /* XXXX wMaxPacketSize in Bytes */ \
  1198. bInterval /* bInterval */
  1199. // clang-format on
  1200. #define AUDIO_V2_AS_DESCRIPTOR_INIT_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08)
  1201. #define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_INIT_LEN (0x09 + 0x10 + 0x06 + 0x07 + 0x08)
  1202. #define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08 + 0x07)
  1203. #define AUDIO_SAMPLE_FREQ_NUM(num) (uint8_t)(num), (uint8_t)((num >> 8))
  1204. #define AUDIO_SAMPLE_FREQ_3B(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16))
  1205. #define AUDIO_SAMPLE_FREQ_4B(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), \
  1206. (uint8_t)((frq >> 16)), (uint8_t)((frq >> 24))
  1207. /* format 10.14 */
  1208. #define AUDIO_FREQ_TO_FEEDBACK_FS(freq) ((freq << 10) / 1000)
  1209. #define AUDIO_FEEDBACK_TO_BUF_FS(buf, feedback) \
  1210. buf[0] = ((feedback << 4) & 0xFFU); \
  1211. buf[1] = (((feedback << 4) >> 8U) & 0xFFU); \
  1212. buf[2] = (((feedback << 4) >> 16U) & 0xFFU)
  1213. /* format 16.16 */
  1214. #define AUDIO_FREQ_TO_FEEDBACK_HS(freq) ((freq << 13) / 1000)
  1215. #define AUDIO_FEEDBACK_TO_BUF_HS(buf, feedback) \
  1216. buf[0] = (((feedback & 0x00001FFFu) << 3) & 0xFFu); \
  1217. buf[1] = ((((feedback & 0x00001FFFu) << 3) >> 8) & 0xFFu); \
  1218. buf[2] = (((feedback & 0x01FFE000u) >> 13) & 0xFFu); \
  1219. buf[3] = (((feedback & 0x01FFE000u) >> 21) & 0xFFu)
  1220. #endif /* USB_AUDIO_H */