f_uac1.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
  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 "u_audio.h"
  22. #include "u_uac1.h"
  23. struct f_uac1 {
  24. struct g_audio g_audio;
  25. u8 ac_intf, as_in_intf, as_out_intf;
  26. u8 ac_alt, as_in_alt, as_out_alt; /* needed for get_alt() */
  27. };
  28. static inline struct f_uac1 *func_to_uac1(struct usb_function *f)
  29. {
  30. return container_of(f, struct f_uac1, g_audio.func);
  31. }
  32. /*
  33. * DESCRIPTORS ... most are static, but strings and full
  34. * configuration descriptors are built on demand.
  35. */
  36. /*
  37. * We have three interfaces - one AudioControl and two AudioStreaming
  38. *
  39. * The driver implements a simple UAC_1 topology.
  40. * USB-OUT -> IT_1 -> OT_2 -> ALSA_Capture
  41. * ALSA_Playback -> IT_3 -> OT_4 -> USB-IN
  42. */
  43. #define F_AUDIO_AC_INTERFACE 0
  44. #define F_AUDIO_AS_OUT_INTERFACE 1
  45. #define F_AUDIO_AS_IN_INTERFACE 2
  46. /* Number of streaming interfaces */
  47. #define F_AUDIO_NUM_INTERFACES 2
  48. /* B.3.1 Standard AC Interface Descriptor */
  49. static struct usb_interface_descriptor ac_interface_desc = {
  50. .bLength = USB_DT_INTERFACE_SIZE,
  51. .bDescriptorType = USB_DT_INTERFACE,
  52. .bNumEndpoints = 0,
  53. .bInterfaceClass = USB_CLASS_AUDIO,
  54. .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
  55. };
  56. /*
  57. * The number of AudioStreaming and MIDIStreaming interfaces
  58. * in the Audio Interface Collection
  59. */
  60. DECLARE_UAC_AC_HEADER_DESCRIPTOR(2);
  61. #define UAC_DT_AC_HEADER_LENGTH UAC_DT_AC_HEADER_SIZE(F_AUDIO_NUM_INTERFACES)
  62. /* 2 input terminals and 2 output terminals */
  63. #define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH \
  64. + 2*UAC_DT_INPUT_TERMINAL_SIZE + 2*UAC_DT_OUTPUT_TERMINAL_SIZE)
  65. /* B.3.2 Class-Specific AC Interface Descriptor */
  66. static struct uac1_ac_header_descriptor_2 ac_header_desc = {
  67. .bLength = UAC_DT_AC_HEADER_LENGTH,
  68. .bDescriptorType = USB_DT_CS_INTERFACE,
  69. .bDescriptorSubtype = UAC_HEADER,
  70. .bcdADC = cpu_to_le16(0x0100),
  71. .wTotalLength = cpu_to_le16(UAC_DT_TOTAL_LENGTH),
  72. .bInCollection = F_AUDIO_NUM_INTERFACES,
  73. .baInterfaceNr = {
  74. /* Interface number of the AudioStream interfaces */
  75. [0] = 1,
  76. [1] = 2,
  77. }
  78. };
  79. #define USB_OUT_IT_ID 1
  80. static struct uac_input_terminal_descriptor usb_out_it_desc = {
  81. .bLength = UAC_DT_INPUT_TERMINAL_SIZE,
  82. .bDescriptorType = USB_DT_CS_INTERFACE,
  83. .bDescriptorSubtype = UAC_INPUT_TERMINAL,
  84. .bTerminalID = USB_OUT_IT_ID,
  85. .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
  86. .bAssocTerminal = 0,
  87. .wChannelConfig = cpu_to_le16(0x3),
  88. };
  89. #define IO_OUT_OT_ID 2
  90. static struct uac1_output_terminal_descriptor io_out_ot_desc = {
  91. .bLength = UAC_DT_OUTPUT_TERMINAL_SIZE,
  92. .bDescriptorType = USB_DT_CS_INTERFACE,
  93. .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
  94. .bTerminalID = IO_OUT_OT_ID,
  95. .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_SPEAKER),
  96. .bAssocTerminal = 0,
  97. .bSourceID = USB_OUT_IT_ID,
  98. };
  99. #define IO_IN_IT_ID 3
  100. static struct uac_input_terminal_descriptor io_in_it_desc = {
  101. .bLength = UAC_DT_INPUT_TERMINAL_SIZE,
  102. .bDescriptorType = USB_DT_CS_INTERFACE,
  103. .bDescriptorSubtype = UAC_INPUT_TERMINAL,
  104. .bTerminalID = IO_IN_IT_ID,
  105. .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE),
  106. .bAssocTerminal = 0,
  107. .wChannelConfig = cpu_to_le16(0x3),
  108. };
  109. #define USB_IN_OT_ID 4
  110. static struct uac1_output_terminal_descriptor usb_in_ot_desc = {
  111. .bLength = UAC_DT_OUTPUT_TERMINAL_SIZE,
  112. .bDescriptorType = USB_DT_CS_INTERFACE,
  113. .bDescriptorSubtype = UAC_OUTPUT_TERMINAL,
  114. .bTerminalID = USB_IN_OT_ID,
  115. .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING),
  116. .bAssocTerminal = 0,
  117. .bSourceID = IO_IN_IT_ID,
  118. };
  119. /* B.4.1 Standard AS Interface Descriptor */
  120. static struct usb_interface_descriptor as_out_interface_alt_0_desc = {
  121. .bLength = USB_DT_INTERFACE_SIZE,
  122. .bDescriptorType = USB_DT_INTERFACE,
  123. .bAlternateSetting = 0,
  124. .bNumEndpoints = 0,
  125. .bInterfaceClass = USB_CLASS_AUDIO,
  126. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  127. };
  128. static struct usb_interface_descriptor as_out_interface_alt_1_desc = {
  129. .bLength = USB_DT_INTERFACE_SIZE,
  130. .bDescriptorType = USB_DT_INTERFACE,
  131. .bAlternateSetting = 1,
  132. .bNumEndpoints = 1,
  133. .bInterfaceClass = USB_CLASS_AUDIO,
  134. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  135. };
  136. static struct usb_interface_descriptor as_in_interface_alt_0_desc = {
  137. .bLength = USB_DT_INTERFACE_SIZE,
  138. .bDescriptorType = USB_DT_INTERFACE,
  139. .bAlternateSetting = 0,
  140. .bNumEndpoints = 0,
  141. .bInterfaceClass = USB_CLASS_AUDIO,
  142. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  143. };
  144. static struct usb_interface_descriptor as_in_interface_alt_1_desc = {
  145. .bLength = USB_DT_INTERFACE_SIZE,
  146. .bDescriptorType = USB_DT_INTERFACE,
  147. .bAlternateSetting = 1,
  148. .bNumEndpoints = 1,
  149. .bInterfaceClass = USB_CLASS_AUDIO,
  150. .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING,
  151. };
  152. /* B.4.2 Class-Specific AS Interface Descriptor */
  153. static struct uac1_as_header_descriptor as_out_header_desc = {
  154. .bLength = UAC_DT_AS_HEADER_SIZE,
  155. .bDescriptorType = USB_DT_CS_INTERFACE,
  156. .bDescriptorSubtype = UAC_AS_GENERAL,
  157. .bTerminalLink = USB_OUT_IT_ID,
  158. .bDelay = 1,
  159. .wFormatTag = cpu_to_le16(UAC_FORMAT_TYPE_I_PCM),
  160. };
  161. static struct uac1_as_header_descriptor as_in_header_desc = {
  162. .bLength = UAC_DT_AS_HEADER_SIZE,
  163. .bDescriptorType = USB_DT_CS_INTERFACE,
  164. .bDescriptorSubtype = UAC_AS_GENERAL,
  165. .bTerminalLink = USB_IN_OT_ID,
  166. .bDelay = 1,
  167. .wFormatTag = cpu_to_le16(UAC_FORMAT_TYPE_I_PCM),
  168. };
  169. DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1);
  170. static struct uac_format_type_i_discrete_descriptor_1 as_out_type_i_desc = {
  171. .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
  172. .bDescriptorType = USB_DT_CS_INTERFACE,
  173. .bDescriptorSubtype = UAC_FORMAT_TYPE,
  174. .bFormatType = UAC_FORMAT_TYPE_I,
  175. .bSubframeSize = 2,
  176. .bBitResolution = 16,
  177. .bSamFreqType = 1,
  178. };
  179. /* Standard ISO OUT Endpoint Descriptor */
  180. static struct usb_endpoint_descriptor as_out_ep_desc = {
  181. .bLength = USB_DT_ENDPOINT_AUDIO_SIZE,
  182. .bDescriptorType = USB_DT_ENDPOINT,
  183. .bEndpointAddress = USB_DIR_OUT,
  184. .bmAttributes = USB_ENDPOINT_SYNC_ADAPTIVE
  185. | USB_ENDPOINT_XFER_ISOC,
  186. .wMaxPacketSize = cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
  187. .bInterval = 4,
  188. };
  189. /* Class-specific AS ISO OUT Endpoint Descriptor */
  190. static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
  191. .bLength = UAC_ISO_ENDPOINT_DESC_SIZE,
  192. .bDescriptorType = USB_DT_CS_ENDPOINT,
  193. .bDescriptorSubtype = UAC_EP_GENERAL,
  194. .bmAttributes = 1,
  195. .bLockDelayUnits = 1,
  196. .wLockDelay = cpu_to_le16(1),
  197. };
  198. static struct uac_format_type_i_discrete_descriptor_1 as_in_type_i_desc = {
  199. .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
  200. .bDescriptorType = USB_DT_CS_INTERFACE,
  201. .bDescriptorSubtype = UAC_FORMAT_TYPE,
  202. .bFormatType = UAC_FORMAT_TYPE_I,
  203. .bSubframeSize = 2,
  204. .bBitResolution = 16,
  205. .bSamFreqType = 1,
  206. };
  207. /* Standard ISO OUT Endpoint Descriptor */
  208. static struct usb_endpoint_descriptor as_in_ep_desc = {
  209. .bLength = USB_DT_ENDPOINT_AUDIO_SIZE,
  210. .bDescriptorType = USB_DT_ENDPOINT,
  211. .bEndpointAddress = USB_DIR_IN,
  212. .bmAttributes = USB_ENDPOINT_SYNC_ASYNC
  213. | USB_ENDPOINT_XFER_ISOC,
  214. .wMaxPacketSize = cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
  215. .bInterval = 4,
  216. };
  217. /* Class-specific AS ISO OUT Endpoint Descriptor */
  218. static struct uac_iso_endpoint_descriptor as_iso_in_desc = {
  219. .bLength = UAC_ISO_ENDPOINT_DESC_SIZE,
  220. .bDescriptorType = USB_DT_CS_ENDPOINT,
  221. .bDescriptorSubtype = UAC_EP_GENERAL,
  222. .bmAttributes = 1,
  223. .bLockDelayUnits = 0,
  224. .wLockDelay = 0,
  225. };
  226. static struct usb_descriptor_header *f_audio_desc[] = {
  227. (struct usb_descriptor_header *)&ac_interface_desc,
  228. (struct usb_descriptor_header *)&ac_header_desc,
  229. (struct usb_descriptor_header *)&usb_out_it_desc,
  230. (struct usb_descriptor_header *)&io_out_ot_desc,
  231. (struct usb_descriptor_header *)&io_in_it_desc,
  232. (struct usb_descriptor_header *)&usb_in_ot_desc,
  233. (struct usb_descriptor_header *)&as_out_interface_alt_0_desc,
  234. (struct usb_descriptor_header *)&as_out_interface_alt_1_desc,
  235. (struct usb_descriptor_header *)&as_out_header_desc,
  236. (struct usb_descriptor_header *)&as_out_type_i_desc,
  237. (struct usb_descriptor_header *)&as_out_ep_desc,
  238. (struct usb_descriptor_header *)&as_iso_out_desc,
  239. (struct usb_descriptor_header *)&as_in_interface_alt_0_desc,
  240. (struct usb_descriptor_header *)&as_in_interface_alt_1_desc,
  241. (struct usb_descriptor_header *)&as_in_header_desc,
  242. (struct usb_descriptor_header *)&as_in_type_i_desc,
  243. (struct usb_descriptor_header *)&as_in_ep_desc,
  244. (struct usb_descriptor_header *)&as_iso_in_desc,
  245. NULL,
  246. };
  247. enum {
  248. STR_AC_IF,
  249. STR_USB_OUT_IT,
  250. STR_USB_OUT_IT_CH_NAMES,
  251. STR_IO_OUT_OT,
  252. STR_IO_IN_IT,
  253. STR_IO_IN_IT_CH_NAMES,
  254. STR_USB_IN_OT,
  255. STR_AS_OUT_IF_ALT0,
  256. STR_AS_OUT_IF_ALT1,
  257. STR_AS_IN_IF_ALT0,
  258. STR_AS_IN_IF_ALT1,
  259. };
  260. static struct usb_string strings_uac1[] = {
  261. [STR_AC_IF].s = "AC Interface",
  262. [STR_USB_OUT_IT].s = "Playback Input terminal",
  263. [STR_USB_OUT_IT_CH_NAMES].s = "Playback Channels",
  264. [STR_IO_OUT_OT].s = "Playback Output terminal",
  265. [STR_IO_IN_IT].s = "Capture Input terminal",
  266. [STR_IO_IN_IT_CH_NAMES].s = "Capture Channels",
  267. [STR_USB_IN_OT].s = "Capture Output terminal",
  268. [STR_AS_OUT_IF_ALT0].s = "Playback Inactive",
  269. [STR_AS_OUT_IF_ALT1].s = "Playback Active",
  270. [STR_AS_IN_IF_ALT0].s = "Capture Inactive",
  271. [STR_AS_IN_IF_ALT1].s = "Capture Active",
  272. { },
  273. };
  274. static struct usb_gadget_strings str_uac1 = {
  275. .language = 0x0409, /* en-us */
  276. .strings = strings_uac1,
  277. };
  278. static struct usb_gadget_strings *uac1_strings[] = {
  279. &str_uac1,
  280. NULL,
  281. };
  282. /*
  283. * This function is an ALSA sound card following USB Audio Class Spec 1.0.
  284. */
  285. static int audio_set_endpoint_req(struct usb_function *f,
  286. const struct usb_ctrlrequest *ctrl)
  287. {
  288. struct usb_composite_dev *cdev = f->config->cdev;
  289. int value = -EOPNOTSUPP;
  290. u16 ep = le16_to_cpu(ctrl->wIndex);
  291. u16 len = le16_to_cpu(ctrl->wLength);
  292. u16 w_value = le16_to_cpu(ctrl->wValue);
  293. DBG(cdev, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
  294. ctrl->bRequest, w_value, len, ep);
  295. switch (ctrl->bRequest) {
  296. case UAC_SET_CUR:
  297. value = len;
  298. break;
  299. case UAC_SET_MIN:
  300. break;
  301. case UAC_SET_MAX:
  302. break;
  303. case UAC_SET_RES:
  304. break;
  305. case UAC_SET_MEM:
  306. break;
  307. default:
  308. break;
  309. }
  310. return value;
  311. }
  312. static int audio_get_endpoint_req(struct usb_function *f,
  313. const struct usb_ctrlrequest *ctrl)
  314. {
  315. struct usb_composite_dev *cdev = f->config->cdev;
  316. int value = -EOPNOTSUPP;
  317. u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF);
  318. u16 len = le16_to_cpu(ctrl->wLength);
  319. u16 w_value = le16_to_cpu(ctrl->wValue);
  320. DBG(cdev, "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
  321. ctrl->bRequest, w_value, len, ep);
  322. switch (ctrl->bRequest) {
  323. case UAC_GET_CUR:
  324. case UAC_GET_MIN:
  325. case UAC_GET_MAX:
  326. case UAC_GET_RES:
  327. value = len;
  328. break;
  329. case UAC_GET_MEM:
  330. break;
  331. default:
  332. break;
  333. }
  334. return value;
  335. }
  336. static int
  337. f_audio_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
  338. {
  339. struct usb_composite_dev *cdev = f->config->cdev;
  340. struct usb_request *req = cdev->req;
  341. int value = -EOPNOTSUPP;
  342. u16 w_index = le16_to_cpu(ctrl->wIndex);
  343. u16 w_value = le16_to_cpu(ctrl->wValue);
  344. u16 w_length = le16_to_cpu(ctrl->wLength);
  345. /* composite driver infrastructure handles everything; interface
  346. * activation uses set_alt().
  347. */
  348. switch (ctrl->bRequestType) {
  349. case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
  350. value = audio_set_endpoint_req(f, ctrl);
  351. break;
  352. case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
  353. value = audio_get_endpoint_req(f, ctrl);
  354. break;
  355. default:
  356. ERROR(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
  357. ctrl->bRequestType, ctrl->bRequest,
  358. w_value, w_index, w_length);
  359. }
  360. /* respond with data transfer or status phase? */
  361. if (value >= 0) {
  362. DBG(cdev, "audio req%02x.%02x v%04x i%04x l%d\n",
  363. ctrl->bRequestType, ctrl->bRequest,
  364. w_value, w_index, w_length);
  365. req->zero = 0;
  366. req->length = value;
  367. value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
  368. if (value < 0)
  369. ERROR(cdev, "audio response on err %d\n", value);
  370. }
  371. /* device either stalls (value < 0) or reports success */
  372. return value;
  373. }
  374. static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
  375. {
  376. struct usb_composite_dev *cdev = f->config->cdev;
  377. struct usb_gadget *gadget = cdev->gadget;
  378. struct device *dev = &gadget->dev;
  379. struct f_uac1 *uac1 = func_to_uac1(f);
  380. int ret = 0;
  381. /* No i/f has more than 2 alt settings */
  382. if (alt > 1) {
  383. dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
  384. return -EINVAL;
  385. }
  386. if (intf == uac1->ac_intf) {
  387. /* Control I/f has only 1 AltSetting - 0 */
  388. if (alt) {
  389. dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
  390. return -EINVAL;
  391. }
  392. return 0;
  393. }
  394. if (intf == uac1->as_out_intf) {
  395. uac1->as_out_alt = alt;
  396. if (alt)
  397. ret = u_audio_start_capture(&uac1->g_audio);
  398. else
  399. u_audio_stop_capture(&uac1->g_audio);
  400. } else if (intf == uac1->as_in_intf) {
  401. uac1->as_in_alt = alt;
  402. if (alt)
  403. ret = u_audio_start_playback(&uac1->g_audio);
  404. else
  405. u_audio_stop_playback(&uac1->g_audio);
  406. } else {
  407. dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
  408. return -EINVAL;
  409. }
  410. return ret;
  411. }
  412. static int f_audio_get_alt(struct usb_function *f, unsigned intf)
  413. {
  414. struct usb_composite_dev *cdev = f->config->cdev;
  415. struct usb_gadget *gadget = cdev->gadget;
  416. struct device *dev = &gadget->dev;
  417. struct f_uac1 *uac1 = func_to_uac1(f);
  418. if (intf == uac1->ac_intf)
  419. return uac1->ac_alt;
  420. else if (intf == uac1->as_out_intf)
  421. return uac1->as_out_alt;
  422. else if (intf == uac1->as_in_intf)
  423. return uac1->as_in_alt;
  424. else
  425. dev_err(dev, "%s:%d Invalid Interface %d!\n",
  426. __func__, __LINE__, intf);
  427. return -EINVAL;
  428. }
  429. static void f_audio_disable(struct usb_function *f)
  430. {
  431. struct f_uac1 *uac1 = func_to_uac1(f);
  432. uac1->as_out_alt = 0;
  433. uac1->as_in_alt = 0;
  434. u_audio_stop_capture(&uac1->g_audio);
  435. }
  436. /*-------------------------------------------------------------------------*/
  437. /* audio function driver setup/binding */
  438. static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
  439. {
  440. struct usb_composite_dev *cdev = c->cdev;
  441. struct usb_gadget *gadget = cdev->gadget;
  442. struct f_uac1 *uac1 = func_to_uac1(f);
  443. struct g_audio *audio = func_to_g_audio(f);
  444. struct f_uac1_opts *audio_opts;
  445. struct usb_ep *ep = NULL;
  446. struct usb_string *us;
  447. u8 *sam_freq;
  448. int rate;
  449. int status;
  450. audio_opts = container_of(f->fi, struct f_uac1_opts, func_inst);
  451. us = usb_gstrings_attach(cdev, uac1_strings, ARRAY_SIZE(strings_uac1));
  452. if (IS_ERR(us))
  453. return PTR_ERR(us);
  454. ac_interface_desc.iInterface = us[STR_AC_IF].id;
  455. usb_out_it_desc.iTerminal = us[STR_USB_OUT_IT].id;
  456. usb_out_it_desc.iChannelNames = us[STR_USB_OUT_IT_CH_NAMES].id;
  457. io_out_ot_desc.iTerminal = us[STR_IO_OUT_OT].id;
  458. as_out_interface_alt_0_desc.iInterface = us[STR_AS_OUT_IF_ALT0].id;
  459. as_out_interface_alt_1_desc.iInterface = us[STR_AS_OUT_IF_ALT1].id;
  460. io_in_it_desc.iTerminal = us[STR_IO_IN_IT].id;
  461. io_in_it_desc.iChannelNames = us[STR_IO_IN_IT_CH_NAMES].id;
  462. usb_in_ot_desc.iTerminal = us[STR_USB_IN_OT].id;
  463. as_in_interface_alt_0_desc.iInterface = us[STR_AS_IN_IF_ALT0].id;
  464. as_in_interface_alt_1_desc.iInterface = us[STR_AS_IN_IF_ALT1].id;
  465. /* Set channel numbers */
  466. usb_out_it_desc.bNrChannels = num_channels(audio_opts->c_chmask);
  467. usb_out_it_desc.wChannelConfig = cpu_to_le16(audio_opts->c_chmask);
  468. as_out_type_i_desc.bNrChannels = num_channels(audio_opts->c_chmask);
  469. as_out_type_i_desc.bSubframeSize = audio_opts->c_ssize;
  470. as_out_type_i_desc.bBitResolution = audio_opts->c_ssize * 8;
  471. io_in_it_desc.bNrChannels = num_channels(audio_opts->p_chmask);
  472. io_in_it_desc.wChannelConfig = cpu_to_le16(audio_opts->p_chmask);
  473. as_in_type_i_desc.bNrChannels = num_channels(audio_opts->p_chmask);
  474. as_in_type_i_desc.bSubframeSize = audio_opts->p_ssize;
  475. as_in_type_i_desc.bBitResolution = audio_opts->p_ssize * 8;
  476. /* Set sample rates */
  477. rate = audio_opts->c_srate;
  478. sam_freq = as_out_type_i_desc.tSamFreq[0];
  479. memcpy(sam_freq, &rate, 3);
  480. rate = audio_opts->p_srate;
  481. sam_freq = as_in_type_i_desc.tSamFreq[0];
  482. memcpy(sam_freq, &rate, 3);
  483. /* allocate instance-specific interface IDs, and patch descriptors */
  484. status = usb_interface_id(c, f);
  485. if (status < 0)
  486. goto fail;
  487. ac_interface_desc.bInterfaceNumber = status;
  488. uac1->ac_intf = status;
  489. uac1->ac_alt = 0;
  490. status = usb_interface_id(c, f);
  491. if (status < 0)
  492. goto fail;
  493. as_out_interface_alt_0_desc.bInterfaceNumber = status;
  494. as_out_interface_alt_1_desc.bInterfaceNumber = status;
  495. uac1->as_out_intf = status;
  496. uac1->as_out_alt = 0;
  497. status = usb_interface_id(c, f);
  498. if (status < 0)
  499. goto fail;
  500. as_in_interface_alt_0_desc.bInterfaceNumber = status;
  501. as_in_interface_alt_1_desc.bInterfaceNumber = status;
  502. uac1->as_in_intf = status;
  503. uac1->as_in_alt = 0;
  504. audio->gadget = gadget;
  505. status = -ENODEV;
  506. /* allocate instance-specific endpoints */
  507. ep = usb_ep_autoconfig(cdev->gadget, &as_out_ep_desc);
  508. if (!ep)
  509. goto fail;
  510. audio->out_ep = ep;
  511. audio->out_ep->desc = &as_out_ep_desc;
  512. ep = usb_ep_autoconfig(cdev->gadget, &as_in_ep_desc);
  513. if (!ep)
  514. goto fail;
  515. audio->in_ep = ep;
  516. audio->in_ep->desc = &as_in_ep_desc;
  517. /* copy descriptors, and track endpoint copies */
  518. status = usb_assign_descriptors(f, f_audio_desc, f_audio_desc, NULL,
  519. NULL);
  520. if (status)
  521. goto fail;
  522. audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize);
  523. audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize);
  524. audio->params.c_chmask = audio_opts->c_chmask;
  525. audio->params.c_srate = audio_opts->c_srate;
  526. audio->params.c_ssize = audio_opts->c_ssize;
  527. audio->params.p_chmask = audio_opts->p_chmask;
  528. audio->params.p_srate = audio_opts->p_srate;
  529. audio->params.p_ssize = audio_opts->p_ssize;
  530. audio->params.req_number = audio_opts->req_number;
  531. status = g_audio_setup(audio, "UAC1_PCM", "UAC1_Gadget");
  532. if (status)
  533. goto err_card_register;
  534. return 0;
  535. err_card_register:
  536. usb_free_all_descriptors(f);
  537. fail:
  538. return status;
  539. }
  540. /*-------------------------------------------------------------------------*/
  541. static inline struct f_uac1_opts *to_f_uac1_opts(struct config_item *item)
  542. {
  543. return container_of(to_config_group(item), struct f_uac1_opts,
  544. func_inst.group);
  545. }
  546. static void f_uac1_attr_release(struct config_item *item)
  547. {
  548. struct f_uac1_opts *opts = to_f_uac1_opts(item);
  549. usb_put_function_instance(&opts->func_inst);
  550. }
  551. static struct configfs_item_operations f_uac1_item_ops = {
  552. .release = f_uac1_attr_release,
  553. };
  554. #define UAC1_ATTRIBUTE(name) \
  555. static ssize_t f_uac1_opts_##name##_show( \
  556. struct config_item *item, \
  557. char *page) \
  558. { \
  559. struct f_uac1_opts *opts = to_f_uac1_opts(item); \
  560. int result; \
  561. \
  562. mutex_lock(&opts->lock); \
  563. result = sprintf(page, "%u\n", opts->name); \
  564. mutex_unlock(&opts->lock); \
  565. \
  566. return result; \
  567. } \
  568. \
  569. static ssize_t f_uac1_opts_##name##_store( \
  570. struct config_item *item, \
  571. const char *page, size_t len) \
  572. { \
  573. struct f_uac1_opts *opts = to_f_uac1_opts(item); \
  574. int ret; \
  575. u32 num; \
  576. \
  577. mutex_lock(&opts->lock); \
  578. if (opts->refcnt) { \
  579. ret = -EBUSY; \
  580. goto end; \
  581. } \
  582. \
  583. ret = kstrtou32(page, 0, &num); \
  584. if (ret) \
  585. goto end; \
  586. \
  587. opts->name = num; \
  588. ret = len; \
  589. \
  590. end: \
  591. mutex_unlock(&opts->lock); \
  592. return ret; \
  593. } \
  594. \
  595. CONFIGFS_ATTR(f_uac1_opts_, name)
  596. UAC1_ATTRIBUTE(c_chmask);
  597. UAC1_ATTRIBUTE(c_srate);
  598. UAC1_ATTRIBUTE(c_ssize);
  599. UAC1_ATTRIBUTE(p_chmask);
  600. UAC1_ATTRIBUTE(p_srate);
  601. UAC1_ATTRIBUTE(p_ssize);
  602. UAC1_ATTRIBUTE(req_number);
  603. static struct configfs_attribute *f_uac1_attrs[] = {
  604. &f_uac1_opts_attr_c_chmask,
  605. &f_uac1_opts_attr_c_srate,
  606. &f_uac1_opts_attr_c_ssize,
  607. &f_uac1_opts_attr_p_chmask,
  608. &f_uac1_opts_attr_p_srate,
  609. &f_uac1_opts_attr_p_ssize,
  610. &f_uac1_opts_attr_req_number,
  611. NULL,
  612. };
  613. static struct config_item_type f_uac1_func_type = {
  614. .ct_item_ops = &f_uac1_item_ops,
  615. .ct_attrs = f_uac1_attrs,
  616. .ct_owner = THIS_MODULE,
  617. };
  618. static void f_audio_free_inst(struct usb_function_instance *f)
  619. {
  620. struct f_uac1_opts *opts;
  621. opts = container_of(f, struct f_uac1_opts, func_inst);
  622. kfree(opts);
  623. }
  624. static struct usb_function_instance *f_audio_alloc_inst(void)
  625. {
  626. struct f_uac1_opts *opts;
  627. opts = kzalloc(sizeof(*opts), GFP_KERNEL);
  628. if (!opts)
  629. return ERR_PTR(-ENOMEM);
  630. mutex_init(&opts->lock);
  631. opts->func_inst.free_func_inst = f_audio_free_inst;
  632. config_group_init_type_name(&opts->func_inst.group, "",
  633. &f_uac1_func_type);
  634. opts->c_chmask = UAC1_DEF_CCHMASK;
  635. opts->c_srate = UAC1_DEF_CSRATE;
  636. opts->c_ssize = UAC1_DEF_CSSIZE;
  637. opts->p_chmask = UAC1_DEF_PCHMASK;
  638. opts->p_srate = UAC1_DEF_PSRATE;
  639. opts->p_ssize = UAC1_DEF_PSSIZE;
  640. opts->req_number = UAC1_DEF_REQ_NUM;
  641. return &opts->func_inst;
  642. }
  643. static void f_audio_free(struct usb_function *f)
  644. {
  645. struct g_audio *audio;
  646. struct f_uac1_opts *opts;
  647. audio = func_to_g_audio(f);
  648. opts = container_of(f->fi, struct f_uac1_opts, func_inst);
  649. kfree(audio);
  650. mutex_lock(&opts->lock);
  651. --opts->refcnt;
  652. mutex_unlock(&opts->lock);
  653. }
  654. static void f_audio_unbind(struct usb_configuration *c, struct usb_function *f)
  655. {
  656. struct g_audio *audio = func_to_g_audio(f);
  657. g_audio_cleanup(audio);
  658. usb_free_all_descriptors(f);
  659. audio->gadget = NULL;
  660. }
  661. static struct usb_function *f_audio_alloc(struct usb_function_instance *fi)
  662. {
  663. struct f_uac1 *uac1;
  664. struct f_uac1_opts *opts;
  665. /* allocate and initialize one new instance */
  666. uac1 = kzalloc(sizeof(*uac1), GFP_KERNEL);
  667. if (!uac1)
  668. return ERR_PTR(-ENOMEM);
  669. opts = container_of(fi, struct f_uac1_opts, func_inst);
  670. mutex_lock(&opts->lock);
  671. ++opts->refcnt;
  672. mutex_unlock(&opts->lock);
  673. uac1->g_audio.func.name = "uac1_func";
  674. uac1->g_audio.func.bind = f_audio_bind;
  675. uac1->g_audio.func.unbind = f_audio_unbind;
  676. uac1->g_audio.func.set_alt = f_audio_set_alt;
  677. uac1->g_audio.func.get_alt = f_audio_get_alt;
  678. uac1->g_audio.func.setup = f_audio_setup;
  679. uac1->g_audio.func.disable = f_audio_disable;
  680. uac1->g_audio.func.free_func = f_audio_free;
  681. return &uac1->g_audio.func;
  682. }
  683. DECLARE_USB_FUNCTION_INIT(uac1, f_audio_alloc_inst, f_audio_alloc);
  684. MODULE_LICENSE("GPL");
  685. MODULE_AUTHOR("Ruslan Bilovol");