usb_audio.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. #include "include.h"
  2. #include "driver_sddac.h"
  3. #include "usb_audio.h"
  4. #include "usb_com.h"
  5. #include "usb_audio_desc.h"
  6. #include "bsp_sddac.h"
  7. #include "utils_ring_buffer.h"
  8. #if USB_AUDIO_EN
  9. #define RING_BUF_LEN 0x480
  10. uda_t uda_0 AT(.usb_buf.usb);
  11. typedef struct {
  12. ring_buffer_t ring_buf;
  13. s16 speed;
  14. } au_cbuf_cb_t;
  15. u8 usbmic_compli_xp_sys = 0;
  16. #if USB_MIC_EN
  17. AT(.usbdev.com.table)
  18. static const u8 mic_vol_tbl[3] = {
  19. 0x00,//min
  20. 0x00,//max
  21. 0x01,//res
  22. };
  23. AT(.usbdev.com.table)
  24. static const u8 mic_vol_tbl1[3] = {
  25. 0xf9,//min
  26. 0x1e,//max
  27. 0x50,//res
  28. };
  29. epcb_t epcb2_tx AT(.usb_buf.usb);
  30. u8 ep2_isoc_in[AUDIO_ISOIN_SIZE + 2];
  31. u8 ude_micbuf[RING_BUF_LEN] AT(.usb_buf.aubuf.mic);
  32. au_cbuf_cb_t aumic_cb AT(.usb_buf.aubuf.mic);
  33. bool mic_is_start AT(.buf.uac.mic);
  34. uint8_t enc_buf[AUDIO_MIC_PACKET_SIZE] AT(.usb_buf.aubuf.mic);
  35. #if (AUDIO_DEC_ADPCM_EN)
  36. uint8_t pcm_data[ADPCM_BYTE_2_PCM16_BYTE(AUDIO_MIC_PACKET_SIZE)] AT(.usb_buf.aubuf.mic);
  37. #elif (AUDIO_DEC_MSBC_EN)
  38. uint8_t pcm_data[240] AT(.usb_buf.aubuf.mic);
  39. #elif (AUDIO_DEC_SBC_EN)
  40. uint8_t pcm_data[256] AT(.usb_buf.aubuf.mic);
  41. #else
  42. uint8_t pcm_data[256] AT(.usb_buf.aubuf.mic);
  43. #endif
  44. #endif //USB_MIC_EN
  45. #if USB_SPEAKER_EN
  46. AT(.usbdev.com.table)
  47. static const u8 spk_vol_tbl[3] = {
  48. 0x00,//min
  49. 0xff,//max
  50. 0x01,//res
  51. };
  52. epcb_t epcb2_rx AT(.usb_buf.usb);
  53. u8 ep2_isoc_out[AUDIO_ISOOUT_SIZE + 4];
  54. u8 ude_aubuf[AUDIO_ISOOUT_SIZE] AT(.usb_buf.aubuf.spk);
  55. u8 ude_speakerbuf[RING_BUF_LEN] AT(.usb_buf.aubuf.spk);
  56. au_cbuf_cb_t auspeaker_cb AT(.usb_buf.aubuf.spk);
  57. #endif
  58. void uda_run_loop_execute(void);
  59. #if USB_MIC_EN
  60. AT(.usbdev.com)
  61. void uda_set_isocin_flag(u8 val)
  62. {
  63. uda_t *uda = &uda_0;
  64. uda->flag_isocin_int = val;
  65. }
  66. AT(.usbdev.com)
  67. uint8_t uda_get_isocin_flag(void)
  68. {
  69. uda_t *uda = &uda_0;
  70. return uda->flag_isocin_int;
  71. }
  72. AT(.text.func.usbdev)
  73. void uda_mic_start_do(void)
  74. {
  75. /* Start mic */
  76. printf("[UAC] mic start\n");
  77. mic_is_start = true;
  78. //wireless_send_ctrl_cmd(WIRELESS_CTRL_CMD_CODE_MIC_ALLOW, 0, NULL);
  79. }
  80. AT(.text.func.usbdev)
  81. void uda_mic_stop_do(void)
  82. {
  83. /* Sotp mic */
  84. printf("[UAC] mic stop\n");
  85. mic_is_start = false;
  86. utils_ring_buffer_clear(&aumic_cb.ring_buf);
  87. //wireless_send_ctrl_cmd(WIRELESS_CTRL_CMD_CODE_MIC_DISALLOW, 0, NULL);
  88. }
  89. AT(.text.func.usbdev)
  90. bool uda_mic_check(void)
  91. {
  92. return mic_is_start;
  93. }
  94. void uda_mic_buffer_prepare(uint8_t *ibuf, uint32_t size)
  95. {
  96. if (size > sizeof(enc_buf)) {
  97. printf("ERR!!!\n");
  98. sw_reset_kick(6);
  99. }
  100. memcpy(enc_buf, ibuf, size);
  101. }
  102. // API for upper layer
  103. AT(.usbdev.com)
  104. void usb_audio_mic_stream(void *ibuf, u32 sample)
  105. {
  106. if (ibuf == NULL) {
  107. #if (AUDIO_DEC_ADPCM_EN)
  108. adpcm_decode_block(pcm_data, enc_buf, sample);
  109. #elif (AUDIO_DEC_MSBC_EN || AUDIO_DEC_SBC_EN)
  110. sbc_decode_frame(enc_buf, AUDIO_MIC_PACKET_SIZE, pcm_data);
  111. #endif
  112. ibuf = pcm_data;
  113. }
  114. utils_ring_buffer_write(&aumic_cb.ring_buf, ibuf, (sample << 1));
  115. }
  116. AT(.usbdev.com)
  117. static void uda_mic_stop(uda_t *uda)
  118. {
  119. printf("%s\n", __func__);
  120. uda_mic_stop_do();
  121. uda->flag_isocin_en = 0;
  122. }
  123. AT(.usbdev.com)
  124. static void uda_mic_start(uda_t *uda)
  125. {
  126. printf("%s\n", __func__);
  127. uda->flag_isocin_en = 1;
  128. memset(uda->isoc_in->buf, 0, AUDIO_ISOIN_SIZE);
  129. if (usb_ep_transfer(uda->isoc_in)) {
  130. usb_ep_start_transfer(uda->isoc_in, AUDIO_ISOIN_SIZE);
  131. }
  132. memset(&aumic_cb, 0, sizeof(aumic_cb));
  133. utils_ring_buffer_init(&aumic_cb.ring_buf, ude_micbuf, RING_BUF_LEN);
  134. #if (AUDIO_DEC_ADPCM_EN)
  135. adpcm_sample_idx_reset();
  136. #elif (AUDIO_DEC_MSBC_EN)
  137. sbc_decode_init(1);
  138. #elif (AUDIO_DEC_SBC_EN)
  139. sbc_decode_init(0); //128 points
  140. #endif
  141. uda_mic_start_do();
  142. }
  143. ///USB AUDIO iso in process(mic)
  144. AT(.usbdev.com)
  145. void ude_isoc_tx_process(void)
  146. {
  147. int mlen;
  148. au_cbuf_cb_t *s = &aumic_cb;
  149. uda_t *uda = &uda_0;
  150. u16 frame_size = AUDIO_ISOIN_SIZE;
  151. if (usb_ep_transfer(uda->isoc_in)) {
  152. mlen = frame_size + s->speed;
  153. if (!utils_ring_buffer_read(&s->ring_buf, uda->isoc_in->buf, mlen)) {
  154. memset(uda->isoc_in->buf, 0, mlen);
  155. }
  156. if (uda->mic_mute) {
  157. memset(uda->isoc_in->buf, 0, mlen);
  158. }
  159. usb_ep_start_transfer(uda->isoc_in, mlen);
  160. }
  161. }
  162. AT(.usbdev.com)
  163. bool uda_get_mic_mute(void)
  164. {
  165. u8 buf = uda_0.mic_mute;
  166. return usb_ep0_start_transfer(&buf, 1);
  167. }
  168. AT(.usbdev.com)
  169. void uda_set_mic_mute(u8 val)
  170. {
  171. uda_0.mic_mute = val;
  172. printf("mic set mute: %0d\n", val);
  173. }
  174. AT(.usbdev.com)
  175. void uda_set_mic_volume(u16 val)
  176. {
  177. printf("mic set volume: %04x\n", val);
  178. uda_0.mic_vol = val;
  179. }
  180. AT(.usbdev.com)
  181. bool uda_get_mic_volume(u8 req)
  182. {
  183. u8 buf[2] = {0};
  184. u8 value;
  185. if(usbmic_compli_xp_sys) {
  186. uda_t *uda = &uda_0;
  187. if (req == UA_GET_CUR) {
  188. value = uda->mic_vol;
  189. } else {
  190. value = mic_vol_tbl[(req&0x7f) - 2];
  191. }
  192. buf[0] = value;
  193. buf[1] = 0x00;
  194. if (req != UA_GET_RES) {
  195. value = mic_vol_tbl1[(req&0x7f) - 2];
  196. buf[1] = value;
  197. }
  198. if (req == UA_GET_CUR) {
  199. buf[0] = 0x00;
  200. buf[1] = 0x09;
  201. }
  202. } else {
  203. uda_t *uda = &uda_0;
  204. if (req == UA_GET_CUR) {
  205. value = uda->mic_vol;
  206. printf("value4 = %02x\n",value);
  207. } else {
  208. value = mic_vol_tbl[(req&0x7f) - 2];
  209. printf("value5 = %02x\n",value);
  210. }
  211. buf[0] = value;
  212. buf[1] = 0x00;
  213. if (req != UA_GET_RES) {
  214. buf[1] = 0x80;
  215. }
  216. }
  217. return usb_ep0_start_transfer(buf, 2);
  218. }
  219. #endif
  220. #if USB_SPEAKER_EN
  221. AT(.usbdev.com)
  222. void uda_set_isocout_flag(u8 val)
  223. {
  224. uda_t *uda = &uda_0;
  225. uda->flag_isocout_int = val;
  226. }
  227. AT(.usbdev.com)
  228. uint8_t uda_get_isocout_flag(void)
  229. {
  230. uda_t *uda = &uda_0;
  231. return uda->flag_isocout_int;
  232. }
  233. AT(.text.func.usbdev)
  234. void uda_speaker_start_do(void)
  235. {
  236. /* Start mic */
  237. printf("[UAC] speaker start\n");
  238. sddac_cmd(ENABLE);
  239. }
  240. AT(.text.func.usbdev)
  241. void uda_speaker_stop_do(void)
  242. {
  243. printf("[UAC] speaker stop\n");
  244. sddac_cmd(DISABLE);
  245. }
  246. AT(.usbdev.com)
  247. static void uda_speaker_stop(uda_t *uda)
  248. {
  249. printf("%s\n", __func__);
  250. uda_speaker_stop_do();
  251. uda->flag_isocout_en = 0;
  252. }
  253. AT(.usbdev.com)
  254. static void uda_speaker_start(uda_t *uda)
  255. {
  256. printf("%s\n", __func__);
  257. uda->flag_isocout_en = 1;
  258. memset(&auspeaker_cb, 0x00, sizeof(auspeaker_cb));
  259. utils_ring_buffer_init(&auspeaker_cb.ring_buf, ude_speakerbuf, RING_BUF_LEN);
  260. uda_speaker_start_do();
  261. }
  262. ///USB AUDIO iso out process(speaker)
  263. AT(.usbdev.com)
  264. void ude_isoc_rx_process(void)
  265. {
  266. uda_t *uda = &uda_0;
  267. u8 *aubuf = ude_aubuf;
  268. if (uda->spk_mute) {
  269. memset(aubuf, 0, AUDIO_ISOOUT_SIZE);
  270. } else {
  271. memcpy(aubuf, ep2_isoc_out, AUDIO_ISOOUT_SIZE);
  272. }
  273. usb_ep_clear_rx_fifo(uda->isoc_out);
  274. utils_ring_buffer_write(&auspeaker_cb.ring_buf, aubuf, AUDIO_ISOOUT_SIZE);
  275. }
  276. AT(.usbdev.com)
  277. bool uda_get_spk_volume(u8 req)
  278. {
  279. u8 buf[2]={0};
  280. u8 value;
  281. uda_t *uda = &uda_0;
  282. if (req == UA_GET_CUR) {
  283. value = uda->spk_vol;
  284. } else {
  285. value = spk_vol_tbl[(req&0x7f) - 2];
  286. }
  287. buf[0] = value;
  288. buf[1] = 0x00;
  289. if (req != UA_GET_RES) {
  290. buf[1] = 0x80;
  291. }
  292. return usb_ep0_start_transfer(&buf, 2);
  293. }
  294. AT(.usbdev.com)
  295. void uda_set_spk_mute(u8 val)
  296. {
  297. uda_0.spk_mute = val;
  298. printf("spk set mute: %d\n", val);
  299. }
  300. AT(.usbdev.com)
  301. void uda_set_spk_volume(u16 val)
  302. {
  303. printf("spk set volume: %04x\n", val);
  304. uda_0.spk_vol = (u8)val;
  305. }
  306. AT(.usbdev.com)
  307. void uda_speaker_sync(void)
  308. {
  309. au_cbuf_cb_t *s = &auspeaker_cb;
  310. switch(s->speed) {
  311. case -2:
  312. if(s->ring_buf.data_len >= 1152) {
  313. s->speed = 0;
  314. }
  315. break;
  316. case 0:
  317. if(s->ring_buf.data_len >= 1152) {
  318. s->speed = 2;
  319. } else if(s->ring_buf.data_len < 384) {
  320. s->speed = -2;
  321. }
  322. break;
  323. case 2:
  324. if(s->ring_buf.data_len < 1152) {
  325. s->speed = 0;
  326. }
  327. break;
  328. }
  329. }
  330. AT(.usbdev.com)
  331. bool uda_get_spk_mute(void)
  332. {
  333. u8 buf = uda_0.spk_mute;
  334. return usb_ep0_start_transfer(&buf, 1);
  335. }
  336. // API for upper layer
  337. AT(.com_text.usbdev)
  338. void usb_audio_speaker_stream(void *obuf, u32 *sample)
  339. {
  340. au_cbuf_cb_t *s = &auspeaker_cb;
  341. int mlen;
  342. mlen = AUDIO_ISOOUT_SIZE + s->speed;
  343. if (!utils_ring_buffer_read(&s->ring_buf, obuf, mlen)) {
  344. memset(obuf, 0x00, mlen);
  345. }
  346. *sample = mlen >> 1;
  347. }
  348. #endif
  349. void usb_audio_process(void)
  350. {
  351. uda_run_loop_execute();
  352. }
  353. ///USB AUDIO endpoint reset
  354. AT(.usbdev.com)
  355. void usb_isoc_ep_reset(void)
  356. {
  357. uda_t *uda = &uda_0;
  358. #if USB_MIC_EN
  359. if (uda->isoc_in->index) {
  360. usb_ep_reset(uda->isoc_in);
  361. }
  362. #endif // USB_MIC_EN
  363. #if USB_SPEAKER_EN
  364. if (uda->isoc_out->index) {
  365. usb_ep_reset(uda->isoc_out);
  366. }
  367. #endif // USB_SPEAKER_EN
  368. }
  369. AT(.usbdev.com)
  370. void uda_run_loop_execute(void)
  371. {
  372. uda_t *uda = &uda_0;
  373. #if USB_MIC_EN
  374. if (uda->flag_isocin_en != uda->flag_isocin_int) {
  375. if (uda->flag_isocin_int) {
  376. delay_5ms(2); //delay 10ms启动MIC, 等待SET CUR命令先处理(例如设采样率)
  377. uda_mic_start(uda);
  378. } else {
  379. uda_mic_stop(uda);
  380. }
  381. }
  382. #endif // USB_MIC_EN
  383. #if USB_SPEAKER_EN
  384. if (uda->flag_isocout_en != uda->flag_isocout_int) {
  385. if (uda->flag_isocout_int) {
  386. uda_speaker_start(uda);
  387. } else {
  388. uda_speaker_stop(uda);
  389. }
  390. }
  391. #endif // USB_MIC_EN
  392. }
  393. void uda_exit(uda_t *uda)
  394. {
  395. #if USB_MIC_EN
  396. if (uda->flag_isocin_en) {
  397. uda_mic_stop(uda);
  398. }
  399. #endif
  400. }
  401. void uda_init(void )
  402. {
  403. epcb_t *epcb;
  404. memset(&uda_0, 0, sizeof(uda_t));
  405. uda_t *uda = &uda_0;
  406. #if USB_MIC_EN
  407. uda_0.isoc_in = &epcb2_tx;
  408. memset(uda->isoc_in, 0x00, sizeof(epcb_t));
  409. usb_ep_callback_register(ude_isoc_tx_process, USB_AUDIO_EP_IN_INDEX, EP_DIR_IN);
  410. //usb audio mic ep init
  411. memset(ep2_isoc_in, 0, sizeof(ep2_isoc_in));
  412. epcb = uda->isoc_in;
  413. epcb->dir = EP_DIR_IN;
  414. epcb->index = USB_AUDIO_EP_IN_INDEX;
  415. epcb->type = EP_TYPE_ISOC;
  416. epcb->epsize = AUDIO_ISOIN_SIZE;
  417. epcb->buf = ep2_isoc_in;
  418. epcb->first_pkt = 0;
  419. epcb->xlen = 0;
  420. usb_ep_init(epcb);
  421. uda->mic_vol = 0x6a; //min:0x00, max:0xff
  422. uda->mic_mute = 0;
  423. uda->flag_isocin_int = 0;
  424. uda->flag_isocin_en = 0;
  425. #endif
  426. #if USB_SPEAKER_EN
  427. uda_0.isoc_out = &epcb2_rx;
  428. memset(uda->isoc_out, 0x00, sizeof(epcb_t));
  429. usb_ep_callback_register(ude_isoc_rx_process, USB_AUDIO_EP_OUT_INDEX, EP_DIR_OUT);
  430. //usb audio speaker ep init
  431. memset(ep2_isoc_out, 0, sizeof(ep2_isoc_out));
  432. epcb = uda->isoc_out;
  433. epcb->dir = EP_DIR_OUT;
  434. epcb->index = USB_AUDIO_EP_OUT_INDEX;
  435. epcb->type = EP_TYPE_ISOC;
  436. epcb->epsize = AUDIO_ISOOUT_SIZE;
  437. epcb->buf = ep2_isoc_out;
  438. usb_ep_init(epcb);
  439. uda->spk_vol = 0x80; //min:0x00, max:0xff
  440. uda->spk_mute = 0;
  441. uda->flag_isocout_int = 0;
  442. uda->flag_isocout_en = 0;
  443. #endif
  444. printf("uda_init success\n");
  445. }
  446. void usb_audio_init(void)
  447. {
  448. /* Add application layer initialize if need */
  449. }
  450. void usb_audio_deinit(void)
  451. {
  452. uda_t *uda = &uda_0;
  453. uda_exit(uda);
  454. }
  455. #endif