f_uac1_sim.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  1. /*
  2. * f_uac1.c -- USB Audio Class 1.0 Function (using u_audio API)
  3. *
  4. * Copyright (C) 2016 Ruslan Bilovol <ruslan.bilovol@gmail.com>
  5. *
  6. * This driver doesn't expect any real Audio codec to be present
  7. * on the device - the audio streams are simply sinked to and
  8. * sourced from a virtual ALSA sound card created.
  9. *
  10. * This file is based on f_uac1.c which is
  11. * Copyright (C) 2008 Bryan Wu <cooloney@kernel.org>
  12. * Copyright (C) 2008 Analog Devices, Inc
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License as published by
  16. * the Free Software Foundation; either version 2 of the License, or
  17. * (at your option) any later version.
  18. */
  19. #include <linux/usb/audio.h>
  20. #include <linux/module.h>
  21. #include <asm/unaligned.h>
  22. #include "u_audio.h"
  23. #include "u_uac1.h"
  24. #include "f_apple_common.h"
  25. #define USE_AUDIO_MIC 0
  26. struct f_uac1 {
  27. struct g_audio g_audio;
  28. u8 ac_intf, as_in_intf, as_out_intf;
  29. u8 ac_alt, as_in_alt, as_out_alt; /* needed for get_alt() */
  30. #if EP_ASSIGN_AT_CONN
  31. u8 ep_addr_in;
  32. #endif
  33. };
  34. static inline struct f_uac1 *func_to_uac1(struct usb_function *f)
  35. {
  36. return container_of(f, struct f_uac1, g_audio.func);
  37. }
  38. /*
  39. * DESCRIPTORS ... most are static, but strings and full
  40. * configuration descriptors are built on demand.
  41. */
  42. /*
  43. * We have three interfaces - one AudioControl and two AudioStreaming
  44. *
  45. * The driver implements a simple UAC_1 topology.
  46. * USB-OUT -> IT_1 -> OT_2 -> ALSA_Capture
  47. * ALSA_Playback -> IT_3 -> OT_4 -> USB-IN
  48. */
  49. #define F_AUDIO_AC_INTERFACE 0
  50. #define F_AUDIO_AS_OUT_INTERFACE 1
  51. #define F_AUDIO_AS_IN_INTERFACE 2
  52. /* Number of streaming interfaces */
  53. #define F_AUDIO_NUM_INTERFACES 2
  54. #if USE_AUDIO_MIC
  55. static struct usb_interface_assoc_descriptor uac1_iad = {
  56. .bLength = sizeof(uac1_iad),
  57. .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
  58. .bFirstInterface = 0,
  59. .bInterfaceCount = 3,
  60. .bFunctionClass = USB_CLASS_AUDIO,
  61. .bFunctionSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  62. .bFunctionProtocol = 0x00,
  63. .iFunction = 0,
  64. };
  65. #endif
  66. /* B.3.1 Standard AC Interface Descriptor */
  67. static struct usb_interface_descriptor ac_interface_desc = {
  68. .bLength = USB_DT_INTERFACE_SIZE,
  69. .bDescriptorType = USB_DT_INTERFACE,
  70. .bNumEndpoints = 0,
  71. .bInterfaceClass = USB_CLASS_AUDIO,
  72. .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
  73. };
  74. /*
  75. * The number of AudioStreaming and MIDIStreaming interfaces
  76. * in the Audio Interface Collection
  77. */
  78. DECLARE_UAC_AC_HEADER_DESCRIPTOR(2);
  79. #define UAC_DT_AC_HEADER_LENGTH UAC_DT_AC_HEADER_SIZE(F_AUDIO_NUM_INTERFACES)
  80. /* 2 input terminals and 2 output terminals */
  81. #define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH \
  82. + 2*UAC_DT_INPUT_TERMINAL_SIZE + 2*UAC_DT_OUTPUT_TERMINAL_SIZE)
  83. /* B.3.2 Class-Specific AC Interface Descriptor */
  84. #if USE_AUDIO_MIC
  85. static struct uac1_ac_header_descriptor_2 ac_header_desc = {
  86. .bLength = UAC_DT_AC_HEADER_LENGTH,
  87. .bDescriptorType = USB_DT_CS_INTERFACE,
  88. .bDescriptorSubtype = UAC_HEADER,
  89. .bcdADC = cpu_to_le16(0x0100),
  90. .wTotalLength = cpu_to_le16(UAC_DT_TOTAL_LENGTH),
  91. .bInCollection = F_AUDIO_NUM_INTERFACES,
  92. .baInterfaceNr = {
  93. /* Interface number of the AudioStream interfaces */
  94. [0] = 1,
  95. [1] = 2,
  96. }
  97. };
  98. #else
  99. static struct uac1_ac_header_descriptor_2 ac_header_desc = {
  100. .bLength = 9,
  101. .bDescriptorType = USB_DT_CS_INTERFACE,
  102. .bDescriptorSubtype = UAC_HEADER,
  103. .bcdADC = cpu_to_le16(0x0100),
  104. .wTotalLength = cpu_to_le16(30),//UAC_DT_TOTAL_LENGTH
  105. .bInCollection = F_AUDIO_AS_OUT_INTERFACE,
  106. .baInterfaceNr = {
  107. /* Interface number of the AudioStream interfaces */
  108. [0] = F_AUDIO_AS_OUT_INTERFACE,
  109. }
  110. };
  111. #endif
  112. #if USE_AUDIO_MIC
  113. #define USB_OUT_IT_ID 1
  114. static struct uac_input_terminal_descriptor usb_out_it_desc = {
  115. .bLength = UAC_DT_INPUT_TERMINAL_SIZE,
  116. .bDescriptorType = USB_DT_CS_INTERFACE,
  117. .bDescriptorSubtype = UAC_INPUT_TERMINAL,
  118. .bTerminalID = USB_OUT_IT_ID,
  119. .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
  120. .bAssocTerminal = 0,
  121. .wChannelConfig = cpu_to_le16(0x3),
  122. };
  123. #define IO_OUT_OT_ID 2
  124. static struct uac1_output_terminal_descriptor io_out_ot_desc = {
  125. .bLength = UAC_DT_OUTPUT_TERMINAL_SIZE,
  126. .bDescriptorType = USB_DT_CS_INTERFACE,
  127. .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
  128. .bTerminalID = IO_OUT_OT_ID,
  129. .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_SPEAKER),
  130. .bAssocTerminal = 0,
  131. .bSourceID = USB_OUT_IT_ID,
  132. };
  133. #endif
  134. #if USE_AUDIO_MIC
  135. #define IO_IN_IT_ID 3
  136. static struct uac_input_terminal_descriptor io_in_it_desc = {
  137. .bLength = UAC_DT_INPUT_TERMINAL_SIZE,
  138. .bDescriptorType = USB_DT_CS_INTERFACE,
  139. .bDescriptorSubtype = UAC_INPUT_TERMINAL,
  140. .bTerminalID = IO_IN_IT_ID,
  141. .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE),
  142. .bAssocTerminal = 0,
  143. .wChannelConfig = cpu_to_le16(0x3),
  144. };
  145. #else
  146. #define IO_IN_IT_ID 1
  147. static struct uac_input_terminal_descriptor io_in_it_desc = {
  148. .bLength = UAC_DT_INPUT_TERMINAL_SIZE,
  149. .bDescriptorType = USB_DT_CS_INTERFACE,
  150. .bDescriptorSubtype = UAC_INPUT_TERMINAL,
  151. .bTerminalID = IO_IN_IT_ID,
  152. .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE),
  153. .bAssocTerminal = 2,
  154. .wChannelConfig = cpu_to_le16(0x3),
  155. };
  156. #endif
  157. #if USE_AUDIO_MIC
  158. #define USB_IN_OT_ID 4
  159. #define FEATURE_UNIT_ID 0
  160. #else
  161. #define USB_IN_OT_ID 2
  162. #define FEATURE_UNIT_ID 1
  163. #endif
  164. static struct uac1_output_terminal_descriptor usb_in_ot_desc = {
  165. .bLength = UAC_DT_OUTPUT_TERMINAL_SIZE,
  166. .bDescriptorType = USB_DT_CS_INTERFACE,
  167. .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
  168. .bTerminalID = USB_IN_OT_ID,
  169. .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
  170. .bAssocTerminal = FEATURE_UNIT_ID,
  171. .bSourceID = IO_IN_IT_ID,
  172. };
  173. #if USE_AUDIO_MIC
  174. /* B.4.1 Standard AS Interface Descriptor */
  175. static struct usb_interface_descriptor as_out_interface_alt_0_desc = {
  176. .bLength = USB_DT_INTERFACE_SIZE,
  177. .bDescriptorType = USB_DT_INTERFACE,
  178. .bAlternateSetting = 0,
  179. .bNumEndpoints = 0,
  180. .bInterfaceClass = USB_CLASS_AUDIO,
  181. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  182. };
  183. static struct usb_interface_descriptor as_out_interface_alt_1_desc = {
  184. .bLength = USB_DT_INTERFACE_SIZE,
  185. .bDescriptorType = USB_DT_INTERFACE,
  186. .bAlternateSetting = 1,
  187. .bNumEndpoints = 1,
  188. .bInterfaceClass = USB_CLASS_AUDIO,
  189. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  190. };
  191. #endif
  192. static struct usb_interface_descriptor as_in_interface_alt_0_desc = {
  193. .bLength = USB_DT_INTERFACE_SIZE,
  194. .bDescriptorType = USB_DT_INTERFACE,
  195. .bAlternateSetting = 0,
  196. .bNumEndpoints = 0,
  197. .bInterfaceClass = USB_CLASS_AUDIO,
  198. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  199. };
  200. static struct usb_interface_descriptor as_in_interface_alt_1_desc = {
  201. .bLength = USB_DT_INTERFACE_SIZE,
  202. .bDescriptorType = USB_DT_INTERFACE,
  203. .bAlternateSetting = 1,
  204. .bNumEndpoints = 1,
  205. .bInterfaceClass = USB_CLASS_AUDIO,
  206. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  207. };
  208. #if USE_AUDIO_MIC
  209. /* B.4.2 Class-Specific AS Interface Descriptor */
  210. static struct uac1_as_header_descriptor as_out_header_desc = {
  211. .bLength = UAC_DT_AS_HEADER_SIZE,
  212. .bDescriptorType = USB_DT_CS_INTERFACE,
  213. .bDescriptorSubtype = UAC_AS_GENERAL,
  214. .bTerminalLink = USB_OUT_IT_ID,
  215. .bDelay = 1,
  216. .wFormatTag = cpu_to_le16(UAC_FORMAT_TYPE_I_PCM),
  217. };
  218. #endif
  219. static struct uac1_as_header_descriptor as_in_header_desc = {
  220. .bLength = UAC_DT_AS_HEADER_SIZE,
  221. .bDescriptorType = USB_DT_CS_INTERFACE,
  222. .bDescriptorSubtype = UAC_AS_GENERAL,
  223. .bTerminalLink = USB_IN_OT_ID,
  224. .bDelay = 1,
  225. .wFormatTag = cpu_to_le16(UAC_FORMAT_TYPE_I_PCM),
  226. };
  227. #if USE_AUDIO_MIC
  228. DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1);
  229. static struct uac_format_type_i_discrete_descriptor_1 as_out_type_i_desc = {
  230. .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
  231. .bDescriptorType = USB_DT_CS_INTERFACE,
  232. .bDescriptorSubtype = UAC_FORMAT_TYPE,
  233. .bFormatType = UAC_FORMAT_TYPE_I,
  234. .bSubframeSize = 2,
  235. .bBitResolution = 16,
  236. .bSamFreqType = 1,
  237. };
  238. /* Standard ISO OUT Endpoint Descriptor */
  239. static struct usb_endpoint_descriptor as_out_ep_desc = {
  240. .bLength = USB_DT_ENDPOINT_AUDIO_SIZE,
  241. .bDescriptorType = USB_DT_ENDPOINT,
  242. .bEndpointAddress = USB_DIR_OUT,
  243. .bmAttributes = USB_ENDPOINT_SYNC_ADAPTIVE
  244. | USB_ENDPOINT_XFER_ISOC,
  245. .wMaxPacketSize = cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
  246. .bInterval = 4,
  247. };
  248. /* Class-specific AS ISO OUT Endpoint Descriptor */
  249. static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
  250. .bLength = UAC_ISO_ENDPOINT_DESC_SIZE,
  251. .bDescriptorType = USB_DT_CS_ENDPOINT,
  252. .bDescriptorSubtype = UAC_EP_GENERAL,
  253. .bmAttributes = 1,
  254. .bLockDelayUnits = 1,
  255. .wLockDelay = cpu_to_le16(1),
  256. };
  257. static struct uac_format_type_i_discrete_descriptor_1 as_in_type_i_desc = {
  258. .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
  259. .bDescriptorType = USB_DT_CS_INTERFACE,
  260. .bDescriptorSubtype = UAC_FORMAT_TYPE,
  261. .bFormatType = UAC_FORMAT_TYPE_I,
  262. .bSubframeSize = 2,
  263. .bBitResolution = 16,
  264. .bSamFreqType = 1,
  265. };
  266. #else
  267. DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(9);
  268. static struct uac_format_type_i_discrete_descriptor_9 as_in_type_i_desc = {
  269. .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(9),
  270. .bDescriptorType = USB_DT_CS_INTERFACE,
  271. .bDescriptorSubtype = UAC_FORMAT_TYPE,
  272. .bFormatType = UAC_FORMAT_TYPE_I,
  273. .bSubframeSize = 2,
  274. .bBitResolution = 16,
  275. .bSamFreqType = 9,
  276. };
  277. #endif
  278. /* Standard ISO OUT Endpoint Descriptor */
  279. static struct usb_endpoint_descriptor as_in_ep_desc = {
  280. .bLength = USB_DT_ENDPOINT_AUDIO_SIZE,
  281. .bDescriptorType = USB_DT_ENDPOINT,
  282. .bEndpointAddress = USB_DIR_IN,
  283. .bmAttributes = USB_ENDPOINT_SYNC_NONE
  284. | USB_ENDPOINT_XFER_ISOC,
  285. .wMaxPacketSize = cpu_to_le16(0xc0),
  286. .bInterval = 4,
  287. };
  288. /* Class-specific AS ISO OUT Endpoint Descriptor */
  289. static struct uac_iso_endpoint_descriptor as_iso_in_desc = {
  290. .bLength = UAC_ISO_ENDPOINT_DESC_SIZE,
  291. .bDescriptorType = USB_DT_CS_ENDPOINT,
  292. .bDescriptorSubtype = UAC_EP_GENERAL,
  293. .bmAttributes = 1,
  294. .bLockDelayUnits = 0,
  295. .wLockDelay = 0,
  296. };
  297. static struct usb_descriptor_header *f_audio_desc[] = {
  298. #if USE_AUDIO_MIC
  299. (struct usb_descriptor_header *)&uac1_iad,
  300. #endif
  301. (struct usb_descriptor_header *)&ac_interface_desc,
  302. (struct usb_descriptor_header *)&ac_header_desc,
  303. #if USE_AUDIO_MIC
  304. (struct usb_descriptor_header *)&usb_out_it_desc,
  305. (struct usb_descriptor_header *)&io_out_ot_desc,
  306. #endif
  307. (struct usb_descriptor_header *)&io_in_it_desc,
  308. (struct usb_descriptor_header *)&usb_in_ot_desc,
  309. #if USE_AUDIO_MIC
  310. (struct usb_descriptor_header *)&as_out_interface_alt_0_desc,
  311. (struct usb_descriptor_header *)&as_out_interface_alt_1_desc,
  312. (struct usb_descriptor_header *)&as_out_header_desc,
  313. (struct usb_descriptor_header *)&as_out_type_i_desc,
  314. (struct usb_descriptor_header *)&as_out_ep_desc,
  315. (struct usb_descriptor_header *)&as_iso_out_desc,
  316. #endif
  317. (struct usb_descriptor_header *)&as_in_interface_alt_0_desc,
  318. (struct usb_descriptor_header *)&as_in_interface_alt_1_desc,
  319. (struct usb_descriptor_header *)&as_in_header_desc,
  320. (struct usb_descriptor_header *)&as_in_type_i_desc,
  321. (struct usb_descriptor_header *)&as_in_ep_desc,
  322. (struct usb_descriptor_header *)&as_iso_in_desc,
  323. NULL,
  324. };
  325. #if USE_AUDIO_MIC
  326. enum {
  327. STR_AC_IF,
  328. STR_USB_OUT_IT,
  329. STR_USB_OUT_IT_CH_NAMES,
  330. STR_IO_OUT_OT,
  331. STR_IO_IN_IT,
  332. STR_IO_IN_IT_CH_NAMES,
  333. STR_USB_IN_OT,
  334. STR_AS_OUT_IF_ALT0,
  335. STR_AS_OUT_IF_ALT1,
  336. STR_AS_IN_IF_ALT0,
  337. STR_AS_IN_IF_ALT1,
  338. };
  339. static struct usb_string strings_uac1[] = {
  340. [STR_AC_IF].s = "AC Interface",
  341. [STR_USB_OUT_IT].s = "Playback Input terminal",
  342. [STR_USB_OUT_IT_CH_NAMES].s = "Playback Channels",
  343. [STR_IO_OUT_OT].s = "Playback Output terminal",
  344. [STR_IO_IN_IT].s = "Capture Input terminal",
  345. [STR_IO_IN_IT_CH_NAMES].s = "Capture Channels",
  346. [STR_USB_IN_OT].s = "Capture Output terminal",
  347. [STR_AS_OUT_IF_ALT0].s = "Playback Inactive",
  348. [STR_AS_OUT_IF_ALT1].s = "Playback Active",
  349. [STR_AS_IN_IF_ALT0].s = "Capture Inactive",
  350. [STR_AS_IN_IF_ALT1].s = "Capture Active",
  351. { },
  352. };
  353. static struct usb_gadget_strings str_uac1 = {
  354. .language = 0x0409, /* en-us */
  355. .strings = strings_uac1,
  356. };
  357. static struct usb_gadget_strings *uac1_strings[] = {
  358. &str_uac1,
  359. NULL,
  360. };
  361. #endif
  362. /*
  363. * This function is an ALSA sound card following USB Audio Class Spec 1.0.
  364. */
  365. static int audio_set_endpoint_req(struct usb_function *f,
  366. const struct usb_ctrlrequest *ctrl)
  367. {
  368. struct usb_composite_dev *cdev = f->config->cdev;
  369. int value = -EOPNOTSUPP;
  370. u16 ep = le16_to_cpu(ctrl->wIndex);
  371. u16 len = le16_to_cpu(ctrl->wLength);
  372. u16 w_value = le16_to_cpu(ctrl->wValue);
  373. DBG(cdev, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
  374. ctrl->bRequest, w_value, len, ep);
  375. switch (ctrl->bRequest) {
  376. case UAC_SET_CUR:
  377. value = len;
  378. break;
  379. case UAC_SET_MIN:
  380. break;
  381. case UAC_SET_MAX:
  382. break;
  383. case UAC_SET_RES:
  384. break;
  385. case UAC_SET_MEM:
  386. break;
  387. default:
  388. break;
  389. }
  390. return value;
  391. }
  392. static int audio_get_endpoint_req(struct usb_function *f,
  393. const struct usb_ctrlrequest *ctrl)
  394. {
  395. struct usb_composite_dev *cdev = f->config->cdev;
  396. int value = -EOPNOTSUPP;
  397. u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF);
  398. u16 len = le16_to_cpu(ctrl->wLength);
  399. u16 w_value = le16_to_cpu(ctrl->wValue);
  400. DBG(cdev, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
  401. ctrl->bRequest, w_value, len, ep);
  402. switch (ctrl->bRequest) {
  403. case UAC_GET_CUR:
  404. case UAC_GET_MIN:
  405. case UAC_GET_MAX:
  406. case UAC_GET_RES:
  407. value = len;
  408. break;
  409. case UAC_GET_MEM:
  410. break;
  411. default:
  412. break;
  413. }
  414. return value;
  415. }
  416. int usb_dev_ready_notify(int is_ready);
  417. static int
  418. f_audio_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
  419. {
  420. struct usb_composite_dev *cdev = f->config->cdev;
  421. struct usb_request *req = cdev->req;
  422. int value = -EOPNOTSUPP;
  423. u16 w_index = le16_to_cpu(ctrl->wIndex);
  424. u16 w_value = le16_to_cpu(ctrl->wValue);
  425. u16 w_length = le16_to_cpu(ctrl->wLength);
  426. u32 result = 1;
  427. /* composite driver infrastructure handles everything; interface
  428. * activation uses set_alt().
  429. */
  430. switch (ctrl->bRequestType) {
  431. case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
  432. value = audio_set_endpoint_req(f, ctrl);
  433. break;
  434. case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
  435. value = audio_get_endpoint_req(f, ctrl);
  436. break;
  437. case 0x40 :
  438. printk("%s %x-->receive switch ctrl\n", __func__, ctrl->bRequest);
  439. if (ctrl->bRequest != 0x51)
  440. break;
  441. value = 0;
  442. usb_dev_ready_notify(1);
  443. break;
  444. case 0xc0 :
  445. printk("%s %x-->receive query ctrl\n", __func__, ctrl->bRequest);
  446. if (ctrl->bRequest != 0x53)
  447. break;
  448. value = 4;
  449. put_unaligned_le32(result, req->buf);
  450. break;
  451. default:
  452. ERROR(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
  453. ctrl->bRequestType, ctrl->bRequest,
  454. w_value, w_index, w_length);
  455. }
  456. /* respond with data transfer or status phase? */
  457. if (value >= 0) {
  458. DBG(cdev, "audio req%02x.%02x v%04x i%04x l%d\n",
  459. ctrl->bRequestType, ctrl->bRequest,
  460. w_value, w_index, w_length);
  461. req->zero = 0;
  462. req->length = value;
  463. value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
  464. if (value < 0)
  465. ERROR(cdev, "audio response on err %d\n", value);
  466. }
  467. /* device either stalls (value < 0) or reports success */
  468. return value;
  469. }
  470. static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
  471. {
  472. struct usb_composite_dev *cdev = f->config->cdev;
  473. struct usb_gadget *gadget = cdev->gadget;
  474. struct device *dev = &gadget->dev;
  475. struct f_uac1 *uac1 = func_to_uac1(f);
  476. int ret = 0;
  477. /* No i/f has more than 2 alt settings */
  478. if (alt > 1) {
  479. dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
  480. return -EINVAL;
  481. }
  482. if (intf == uac1->ac_intf) {
  483. /* Control I/f has only 1 AltSetting - 0 */
  484. if (alt) {
  485. dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
  486. return -EINVAL;
  487. }
  488. return 0;
  489. }
  490. #if USE_AUDIO_MIC
  491. if (intf == uac1->as_out_intf) {
  492. uac1->as_out_alt = alt;
  493. if (alt)
  494. ret = u_audio_start_capture(&uac1->g_audio);
  495. else
  496. u_audio_stop_capture(&uac1->g_audio);
  497. } else
  498. #endif
  499. if (intf == uac1->as_in_intf) {
  500. #if EP_ASSIGN_AT_CONN
  501. struct usb_ep *ep = NULL;
  502. struct g_audio *audio = func_to_g_audio(f);
  503. if (audio->in_ep == NULL) {
  504. ep = usb_ep_autoconfig(f->config->cdev->gadget, &as_in_ep_desc);
  505. if (!ep)
  506. return -EINVAL;
  507. audio->in_ep = ep;
  508. audio->in_ep->desc = &as_in_ep_desc;
  509. }
  510. #endif
  511. uac1->as_in_alt = alt;
  512. if (alt)
  513. ret = u_audio_start_playback(&uac1->g_audio);
  514. else
  515. u_audio_stop_playback(&uac1->g_audio);
  516. } else {
  517. dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
  518. return -EINVAL;
  519. }
  520. return ret;
  521. }
  522. static int f_audio_get_alt(struct usb_function *f, unsigned intf)
  523. {
  524. struct usb_composite_dev *cdev = f->config->cdev;
  525. struct usb_gadget *gadget = cdev->gadget;
  526. struct device *dev = &gadget->dev;
  527. struct f_uac1 *uac1 = func_to_uac1(f);
  528. if (intf == uac1->ac_intf)
  529. return uac1->ac_alt;
  530. #if USE_AUDIO_MIC
  531. else if (intf == uac1->as_out_intf)
  532. return uac1->as_out_alt;
  533. #endif
  534. else if (intf == uac1->as_in_intf)
  535. return uac1->as_in_alt;
  536. else
  537. dev_err(dev, "%s:%d Invalid Interface %d!\n",
  538. __func__, __LINE__, intf);
  539. return -EINVAL;
  540. }
  541. static void f_audio_disable(struct usb_function *f)
  542. {
  543. struct f_uac1 *uac1 = func_to_uac1(f);
  544. uac1->as_out_alt = 0;
  545. uac1->as_in_alt = 0;
  546. u_audio_stop_capture(&uac1->g_audio);
  547. #if EP_ASSIGN_AT_CONN
  548. usb_ep_autoconfig_release(uac1->g_audio.in_ep);
  549. uac1->g_audio.in_ep = NULL;
  550. #endif
  551. }
  552. /*-------------------------------------------------------------------------*/
  553. /* audio function driver setup/binding */
  554. static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
  555. {
  556. struct usb_composite_dev *cdev = c->cdev;
  557. struct usb_gadget *gadget = cdev->gadget;
  558. struct f_uac1 *uac1 = func_to_uac1(f);
  559. struct g_audio *audio = func_to_g_audio(f);
  560. struct f_uac1_opts *audio_opts;
  561. #if EP_ASSIGN_AT_CONN == 0
  562. struct usb_ep *ep = NULL;
  563. #endif
  564. #if USE_AUDIO_MIC
  565. struct usb_string *us;
  566. #endif
  567. u8 *sam_freq;
  568. int rate;
  569. int status;
  570. printk("%s:%d\n", __func__, __LINE__);
  571. audio_opts = container_of(f->fi, struct f_uac1_opts, func_inst);
  572. #if USE_AUDIO_MIC
  573. us = usb_gstrings_attach(cdev, uac1_strings, ARRAY_SIZE(strings_uac1));
  574. if (IS_ERR(us))
  575. return PTR_ERR(us);
  576. ac_interface_desc.iInterface = us[STR_AC_IF].id;
  577. usb_out_it_desc.iTerminal = us[STR_USB_OUT_IT].id;
  578. usb_out_it_desc.iChannelNames = us[STR_USB_OUT_IT_CH_NAMES].id;
  579. io_out_ot_desc.iTerminal = us[STR_IO_OUT_OT].id;
  580. as_out_interface_alt_0_desc.iInterface = us[STR_AS_OUT_IF_ALT0].id;
  581. as_out_interface_alt_1_desc.iInterface = us[STR_AS_OUT_IF_ALT1].id;
  582. io_in_it_desc.iTerminal = us[STR_IO_IN_IT].id;
  583. io_in_it_desc.iChannelNames = us[STR_IO_IN_IT_CH_NAMES].id;
  584. usb_in_ot_desc.iTerminal = us[STR_USB_IN_OT].id;
  585. as_in_interface_alt_0_desc.iInterface = us[STR_AS_IN_IF_ALT0].id;
  586. as_in_interface_alt_1_desc.iInterface = us[STR_AS_IN_IF_ALT1].id;
  587. /* Set channel numbers */
  588. usb_out_it_desc.bNrChannels = num_channels(audio_opts->c_chmask);
  589. usb_out_it_desc.wChannelConfig = cpu_to_le16(audio_opts->c_chmask);
  590. as_out_type_i_desc.bNrChannels = num_channels(audio_opts->c_chmask);
  591. as_out_type_i_desc.bSubframeSize = audio_opts->c_ssize;
  592. as_out_type_i_desc.bBitResolution = audio_opts->c_ssize * 8;
  593. #endif
  594. io_in_it_desc.bNrChannels = num_channels(audio_opts->p_chmask);
  595. io_in_it_desc.wChannelConfig = cpu_to_le16(audio_opts->p_chmask);
  596. as_in_type_i_desc.bNrChannels = num_channels(audio_opts->p_chmask);
  597. as_in_type_i_desc.bSubframeSize = audio_opts->p_ssize;
  598. as_in_type_i_desc.bBitResolution = audio_opts->p_ssize * 8;
  599. #if USE_AUDIO_MIC
  600. /* Set sample rates */
  601. rate = audio_opts->c_srate;
  602. sam_freq = as_out_type_i_desc.tSamFreq[0];
  603. memcpy(sam_freq, &rate, 3);
  604. rate = audio_opts->p_srate;
  605. sam_freq = as_in_type_i_desc.tSamFreq[0];
  606. memcpy(sam_freq, &rate, 3);
  607. #else
  608. /* Set channel numbers */
  609. io_in_it_desc.bNrChannels = 2;
  610. as_in_type_i_desc.bNrChannels = 2;
  611. /* Set sample rates */
  612. rate = 8000;
  613. sam_freq = as_in_type_i_desc.tSamFreq[0];
  614. memcpy(sam_freq, &rate, 3);
  615. rate = 11025;
  616. sam_freq = as_in_type_i_desc.tSamFreq[1];
  617. memcpy(sam_freq, &rate, 3);
  618. rate = 12000;
  619. sam_freq = as_in_type_i_desc.tSamFreq[2];
  620. memcpy(sam_freq, &rate, 3);
  621. rate = 16000;
  622. sam_freq = as_in_type_i_desc.tSamFreq[3];
  623. memcpy(sam_freq, &rate, 3);
  624. rate = 22050;
  625. sam_freq = as_in_type_i_desc.tSamFreq[4];
  626. memcpy(sam_freq, &rate, 3);
  627. rate = 24000;
  628. sam_freq = as_in_type_i_desc.tSamFreq[5];
  629. memcpy(sam_freq, &rate, 3);
  630. rate = 32000;
  631. sam_freq = as_in_type_i_desc.tSamFreq[6];
  632. memcpy(sam_freq, &rate, 3);
  633. rate = 44100;
  634. sam_freq = as_in_type_i_desc.tSamFreq[7];
  635. memcpy(sam_freq, &rate, 3);
  636. rate = 48000;
  637. sam_freq = as_in_type_i_desc.tSamFreq[8];
  638. memcpy(sam_freq, &rate, 3);
  639. #endif
  640. /* allocate instance-specific interface IDs, and patch descriptors */
  641. status = usb_interface_id(c, f);
  642. if (status < 0)
  643. goto fail;
  644. #if USE_AUDIO_MIC
  645. uac1_iad.bFirstInterface = status;
  646. #endif
  647. ac_interface_desc.bInterfaceNumber = status;
  648. uac1->ac_intf = status;
  649. uac1->ac_alt = 0;
  650. #if USE_AUDIO_MIC
  651. status = usb_interface_id(c, f);
  652. if (status < 0)
  653. goto fail;
  654. as_out_interface_alt_0_desc.bInterfaceNumber = status;
  655. as_out_interface_alt_1_desc.bInterfaceNumber = status;
  656. ac_header_desc.baInterfaceNr[0] = status;
  657. uac1->as_out_intf = status;
  658. uac1->as_out_alt = 0;
  659. #endif
  660. status = usb_interface_id(c, f);
  661. if (status < 0)
  662. goto fail;
  663. as_in_interface_alt_0_desc.bInterfaceNumber = status;
  664. as_in_interface_alt_1_desc.bInterfaceNumber = status;
  665. ac_header_desc.baInterfaceNr[1] = status;
  666. uac1->as_in_intf = status;
  667. uac1->as_in_alt = 0;
  668. audio->gadget = gadget;
  669. status = -ENODEV;
  670. #if USE_AUDIO_MIC
  671. /* allocate instance-specific endpoints */
  672. ep = usb_ep_autoconfig(cdev->gadget, &as_out_ep_desc);
  673. if (!ep)
  674. goto fail;
  675. audio->out_ep = ep;
  676. audio->out_ep->desc = &as_out_ep_desc;
  677. #endif
  678. printk("%s:%d\n", __func__, __LINE__);
  679. #if EP_ASSIGN_AT_CONN
  680. uac1->ep_addr_in = 0x81;
  681. as_in_ep_desc.bEndpointAddress = uac1->ep_addr_in;
  682. audio->in_ep = NULL;
  683. #else
  684. ep = usb_ep_autoconfig(cdev->gadget, &as_in_ep_desc);
  685. if (!ep)
  686. goto fail;
  687. audio->in_ep = ep;
  688. audio->in_ep->desc = &as_in_ep_desc;
  689. #endif
  690. /* copy descriptors, and track endpoint copies */
  691. status = usb_assign_descriptors(f, f_audio_desc, f_audio_desc, NULL,
  692. NULL);
  693. if (status)
  694. goto fail;
  695. #if USE_AUDIO_MIC
  696. audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize);
  697. #endif
  698. audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize);
  699. audio->params.c_chmask = audio_opts->c_chmask;
  700. audio->params.c_srate = audio_opts->c_srate;
  701. audio->params.c_ssize = audio_opts->c_ssize;
  702. audio->params.p_chmask = audio_opts->p_chmask;
  703. audio->params.p_srate = audio_opts->p_srate;
  704. audio->params.p_ssize = audio_opts->p_ssize;
  705. audio->params.req_number = audio_opts->req_number;
  706. status = g_audio_setup(audio, "UAC1_PCM", "UAC1_Gadget");
  707. if (status)
  708. goto err_card_register;
  709. return 0;
  710. err_card_register:
  711. usb_free_all_descriptors(f);
  712. fail:
  713. return status;
  714. }
  715. /*-------------------------------------------------------------------------*/
  716. static inline struct f_uac1_opts *to_f_uac1_opts(struct config_item *item)
  717. {
  718. return container_of(to_config_group(item), struct f_uac1_opts,
  719. func_inst.group);
  720. }
  721. static void f_uac1_attr_release(struct config_item *item)
  722. {
  723. struct f_uac1_opts *opts = to_f_uac1_opts(item);
  724. usb_put_function_instance(&opts->func_inst);
  725. }
  726. static struct configfs_item_operations f_uac1_item_ops = {
  727. .release = f_uac1_attr_release,
  728. };
  729. #define UAC1_ATTRIBUTE(name) \
  730. static ssize_t f_uac1_opts_##name##_show( \
  731. struct config_item *item, \
  732. char *page) \
  733. { \
  734. struct f_uac1_opts *opts = to_f_uac1_opts(item); \
  735. int result; \
  736. \
  737. mutex_lock(&opts->lock); \
  738. result = sprintf(page, "%u\n", opts->name); \
  739. mutex_unlock(&opts->lock); \
  740. \
  741. return result; \
  742. } \
  743. \
  744. static ssize_t f_uac1_opts_##name##_store( \
  745. struct config_item *item, \
  746. const char *page, size_t len) \
  747. { \
  748. struct f_uac1_opts *opts = to_f_uac1_opts(item); \
  749. int ret; \
  750. u32 num; \
  751. \
  752. mutex_lock(&opts->lock); \
  753. if (opts->refcnt) { \
  754. ret = -EBUSY; \
  755. goto end; \
  756. } \
  757. \
  758. ret = kstrtou32(page, 0, &num); \
  759. if (ret) \
  760. goto end; \
  761. \
  762. opts->name = num; \
  763. ret = len; \
  764. \
  765. end: \
  766. mutex_unlock(&opts->lock); \
  767. return ret; \
  768. } \
  769. \
  770. CONFIGFS_ATTR(f_uac1_opts_, name)
  771. UAC1_ATTRIBUTE(c_chmask);
  772. UAC1_ATTRIBUTE(c_srate);
  773. UAC1_ATTRIBUTE(c_ssize);
  774. UAC1_ATTRIBUTE(p_chmask);
  775. UAC1_ATTRIBUTE(p_srate);
  776. UAC1_ATTRIBUTE(p_ssize);
  777. UAC1_ATTRIBUTE(req_number);
  778. static struct configfs_attribute *f_uac1_attrs[] = {
  779. &f_uac1_opts_attr_c_chmask,
  780. &f_uac1_opts_attr_c_srate,
  781. &f_uac1_opts_attr_c_ssize,
  782. &f_uac1_opts_attr_p_chmask,
  783. &f_uac1_opts_attr_p_srate,
  784. &f_uac1_opts_attr_p_ssize,
  785. &f_uac1_opts_attr_req_number,
  786. NULL,
  787. };
  788. static struct config_item_type f_uac1_func_type = {
  789. .ct_item_ops = &f_uac1_item_ops,
  790. .ct_attrs = f_uac1_attrs,
  791. .ct_owner = THIS_MODULE,
  792. };
  793. static void f_audio_free_inst(struct usb_function_instance *f)
  794. {
  795. struct f_uac1_opts *opts;
  796. printk("%s:%d\n", __func__, __LINE__);
  797. opts = container_of(f, struct f_uac1_opts, func_inst);
  798. kfree(opts);
  799. }
  800. static struct usb_function_instance *f_audio_alloc_inst(void)
  801. {
  802. struct f_uac1_opts *opts;
  803. printk("%s:%d\n", __func__, __LINE__);
  804. opts = kzalloc(sizeof(*opts), GFP_KERNEL);
  805. if (!opts)
  806. return ERR_PTR(-ENOMEM);
  807. mutex_init(&opts->lock);
  808. opts->func_inst.free_func_inst = f_audio_free_inst;
  809. config_group_init_type_name(&opts->func_inst.group, "",
  810. &f_uac1_func_type);
  811. opts->c_chmask = UAC1_DEF_CCHMASK;
  812. opts->c_srate = UAC1_DEF_CSRATE;
  813. opts->c_ssize = UAC1_DEF_CSSIZE;
  814. opts->p_chmask = UAC1_DEF_PCHMASK;
  815. opts->p_srate = UAC1_DEF_PSRATE;
  816. opts->p_ssize = UAC1_DEF_PSSIZE;
  817. opts->req_number = UAC1_DEF_REQ_NUM;
  818. return &opts->func_inst;
  819. }
  820. static void f_audio_free(struct usb_function *f)
  821. {
  822. struct g_audio *audio;
  823. struct f_uac1_opts *opts;
  824. printk("%s:%d\n", __func__, __LINE__);
  825. audio = func_to_g_audio(f);
  826. opts = container_of(f->fi, struct f_uac1_opts, func_inst);
  827. kfree(audio);
  828. mutex_lock(&opts->lock);
  829. --opts->refcnt;
  830. mutex_unlock(&opts->lock);
  831. }
  832. static void f_audio_unbind(struct usb_configuration *c, struct usb_function *f)
  833. {
  834. struct g_audio *audio = func_to_g_audio(f);
  835. printk("%s:%d\n", __func__, __LINE__);
  836. g_audio_cleanup(audio);
  837. usb_free_all_descriptors(f);
  838. audio->gadget = NULL;
  839. }
  840. static bool apple_audio_req_match(struct usb_function *f,
  841. const struct usb_ctrlrequest *ctrl,
  842. bool config0)
  843. {
  844. switch (ctrl->bRequest) {
  845. case 0x53:
  846. if (0xc0 == ctrl->bRequestType)
  847. return true;
  848. case 0x51:
  849. if (0x40 == ctrl->bRequestType)
  850. return true;
  851. default:
  852. return false;
  853. }
  854. return false;
  855. }
  856. static struct usb_function *f_audio_alloc(struct usb_function_instance *fi)
  857. {
  858. struct f_uac1 *uac1;
  859. struct f_uac1_opts *opts;
  860. printk("%s:%d\n", __func__, __LINE__);
  861. /* allocate and initialize one new instance */
  862. uac1 = kzalloc(sizeof(*uac1), GFP_KERNEL);
  863. if (!uac1)
  864. return ERR_PTR(-ENOMEM);
  865. opts = container_of(fi, struct f_uac1_opts, func_inst);
  866. mutex_lock(&opts->lock);
  867. ++opts->refcnt;
  868. mutex_unlock(&opts->lock);
  869. uac1->g_audio.func.name = "uac1_func";
  870. uac1->g_audio.func.bind = f_audio_bind;
  871. uac1->g_audio.func.unbind = f_audio_unbind;
  872. uac1->g_audio.func.set_alt = f_audio_set_alt;
  873. uac1->g_audio.func.get_alt = f_audio_get_alt;
  874. uac1->g_audio.func.setup = f_audio_setup;
  875. uac1->g_audio.func.disable = f_audio_disable;
  876. uac1->g_audio.func.free_func = f_audio_free;
  877. uac1->g_audio.func.req_match = apple_audio_req_match;
  878. return &uac1->g_audio.func;
  879. }
  880. #if USE_AUDIO_MIC
  881. DECLARE_USB_FUNCTION_INIT(uac1, f_audio_alloc_inst, f_audio_alloc);
  882. #else
  883. DECLARE_USB_FUNCTION_INIT(audio_sim, f_audio_alloc_inst, f_audio_alloc);
  884. #endif
  885. MODULE_LICENSE("GPL");
  886. MODULE_AUTHOR("Ruslan Bilovol");