wm_i2s.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057
  1. #include <string.h>
  2. #include "wm_include.h"
  3. #include "wm_i2s.h"
  4. #include "wm_irq.h"
  5. #define FPGA_800_I2S 0
  6. #define I2S_CLK 160000000
  7. #define TEST_WITH_F401 0
  8. #define APPEND_NUM 4
  9. wm_i2s_buf_t wm_i2s_buf[1] = { 0 };
  10. static uint8_t tx_channel = 0, rx_channel = 0;
  11. static wm_dma_desc g_dma_desc_tx[2];
  12. static wm_dma_desc g_dma_desc_rx[2];
  13. //master or slave
  14. static void wm_i2s_set_mode(bool bl)
  15. {
  16. tls_bitband_write(HR_I2S_CTRL, 28, bl);
  17. }
  18. //master or slave
  19. static uint32_t wm_i2s_get_mode(void)
  20. {
  21. uint32_t reg;
  22. reg = tls_reg_read32(HR_I2S_CTRL);
  23. reg = reg>>28;
  24. return (reg & 0x1);
  25. }
  26. //i2s_stardard
  27. static void wm_i2s_set_format(uint32_t format)
  28. {
  29. uint32_t reg;
  30. reg = tls_reg_read32(HR_I2S_CTRL);
  31. reg &= ~(0x3<<24);
  32. reg |= format;
  33. tls_reg_write32(HR_I2S_CTRL, reg);
  34. }
  35. static void wm_i2s_left_channel_sel(bool bl)
  36. {
  37. tls_bitband_write(HR_I2S_CTRL, 23, bl);
  38. }
  39. static void wm_i2s_mono_select(bool bl)
  40. {
  41. tls_bitband_write(HR_I2S_CTRL, 22, bl);
  42. }
  43. static void wm_i2s_rx_dma_enable(bool bl)
  44. {
  45. tls_bitband_write(HR_I2S_CTRL, 21, bl);
  46. }
  47. static void wm_i2s_tx_dma_enable(bool bl)
  48. {
  49. tls_bitband_write(HR_I2S_CTRL, 20, bl);
  50. }
  51. static void wm_i2s_rx_fifo_clear()
  52. {
  53. tls_bitband_write(HR_I2S_CTRL, 19, 1);
  54. }
  55. static void wm_i2s_tx_fifo_clear()
  56. {
  57. tls_bitband_write(HR_I2S_CTRL, 18, 1);
  58. }
  59. #if 0
  60. static void wm_i2s_left_zerocross_enable(bool bl)
  61. {
  62. tls_bitband_write(HR_I2S_CTRL, 17, bl);
  63. }
  64. static void wm_i2s_right_zerocross_enable(bool bl)
  65. {
  66. tls_bitband_write(HR_I2S_CTRL, 16, bl);
  67. }
  68. #endif
  69. static void wm_i2s_set_rxth(uint8_t th)
  70. {
  71. uint32_t reg;
  72. if(th > 7)
  73. {
  74. th = 7;
  75. }
  76. reg = tls_reg_read32(HR_I2S_CTRL);
  77. reg &= ~(0x7<<12);
  78. reg |= (th << 12);
  79. tls_reg_write32(HR_I2S_CTRL, reg);
  80. }
  81. static void wm_i2s_set_txth(uint8_t th)
  82. {
  83. uint32_t reg;
  84. if(th > 7)
  85. {
  86. th = 7;
  87. }
  88. reg = tls_reg_read32(HR_I2S_CTRL);
  89. reg &= ~(0x7<<9);
  90. reg |= (th << 9);
  91. tls_reg_write32(HR_I2S_CTRL, reg);
  92. }
  93. #if 0
  94. static void wm_i2s_clk_inverse(bool bl)
  95. {
  96. tls_bitband_write(HR_I2S_CTRL, 8, bl);
  97. tls_bitband_write(HR_I2S_CTRL, 15, bl);
  98. }
  99. #endif
  100. static void wm_i2s_set_word_len(uint8_t len)
  101. {
  102. uint32_t reg;
  103. reg = tls_reg_read32(HR_I2S_CTRL);
  104. reg &= ~(0x3<<4);
  105. len = (len>>3) - 1;
  106. reg |= (len<<4);
  107. tls_reg_write32(HR_I2S_CTRL, reg);
  108. }
  109. #if 0
  110. static void wm_i2s_set_mute(bool bl)
  111. {
  112. tls_bitband_write(HR_I2S_CTRL, 3, bl);
  113. }
  114. #endif
  115. void wm_i2s_rx_enable(bool bl)
  116. {
  117. tls_bitband_write(HR_I2S_CTRL, 2, bl);
  118. }
  119. void wm_i2s_tx_enable(bool bl)
  120. {
  121. tls_bitband_write(HR_I2S_CTRL, 1, bl);
  122. }
  123. static void wm_i2s_enable(bool bl)
  124. {
  125. tls_bitband_write(HR_I2S_CTRL, 0, bl);
  126. }
  127. #if 0
  128. static void wm_i2s_lzc_int_mask(bool bl)
  129. {
  130. tls_bitband_write(HR_I2S_INT_MASK, 9, bl);
  131. }
  132. static void wm_i2s_rzc_int_mask(bool bl)
  133. {
  134. tls_bitband_write(HR_I2S_INT_MASK, 8, bl);
  135. }
  136. static void wm_i2s_txdone_int_mask(bool bl)
  137. {
  138. tls_bitband_write(HR_I2S_INT_MASK, 7, bl);
  139. }
  140. #endif
  141. static void wm_i2s_txth_int_mask(bool bl)
  142. {
  143. tls_bitband_write(HR_I2S_INT_MASK, 6, bl);
  144. }
  145. #if 0
  146. static void wm_i2s_txover_int_mask(bool bl)
  147. {
  148. tls_bitband_write(HR_I2S_INT_MASK, 5, bl);
  149. }
  150. static void wm_i2s_txuderflow_int_mask(bool bl)
  151. {
  152. tls_bitband_write(HR_I2S_INT_MASK, 4, bl);
  153. }
  154. static void wm_i2s_rxdone_int_mask(bool bl)
  155. {
  156. tls_bitband_write(HR_I2S_INT_MASK, 3, bl);
  157. }
  158. #endif
  159. static void wm_i2s_rxth_int_mask(bool bl)
  160. {
  161. tls_bitband_write(HR_I2S_INT_MASK, 2, bl);
  162. }
  163. #if 0
  164. static void wm_i2s_rx_overflow_int_mask(bool bl)
  165. {
  166. tls_bitband_write(HR_I2S_INT_MASK, 1, bl);
  167. }
  168. static void wm_i2s_rx_uderflow_int_mask(bool bl)
  169. {
  170. tls_bitband_write(HR_I2S_INT_MASK, 0, bl);
  171. }
  172. #endif
  173. static void wm_i2s_set_freq(uint32_t lr_freq, uint32_t mclk)
  174. {
  175. uint32_t div, mclk_div;
  176. uint32_t temp;
  177. uint8_t wdwidth, stereo;
  178. temp = I2S->CTRL;
  179. wdwidth = (((temp>>4)&0x03)+1)<<3;
  180. stereo = tls_bitband_read(HR_I2S_CTRL, 22) ? 1:2;
  181. stereo = 2;
  182. div = (I2S_CLK + lr_freq * wdwidth * stereo)/(lr_freq * wdwidth * stereo) - 1;
  183. #if FPGA_800_I2S
  184. div = div/2;
  185. #else
  186. div = div;
  187. #endif
  188. //Mclk should be set bigger than sample_rate * 256.
  189. //mclk_div = I2S_CLK / ( freq*256 ) + 1;
  190. mclk_div = I2S_CLK / mclk;
  191. (mclk_div > 0x3F)?(mclk_div = 0x3F):(mclk_div = mclk_div);
  192. *(volatile uint32_t *)HR_CLK_I2S_CTL &= ~0x3FFFF;
  193. //set bclk div ,mclk div, inter clk be used, mclk enabled.
  194. *(volatile uint32_t *)HR_CLK_I2S_CTL |= (uint32_t)(div<<8 | mclk_div<<2 | 2);
  195. }
  196. #if 0
  197. static void wm_i2s_set_freq_exclk(uint32_t freq, uint32_t exclk)
  198. {
  199. uint32_t div;
  200. uint32_t temp;
  201. uint8_t wdwidth, stereo;
  202. temp = I2S->CTRL;
  203. wdwidth = (((temp>>4)&0x03)+1)<<3;
  204. stereo = tls_bitband_read(HR_I2S_CTRL, 22) ? 1:2;
  205. div = (exclk * 2 + freq * wdwidth * stereo)/(2* freq * wdwidth * stereo) - 1;
  206. *(volatile uint32_t *)HR_CLK_I2S_CTL &= ~0x3FF00;
  207. *(volatile uint32_t *)HR_CLK_I2S_CTL |= (uint32_t)div<<8;
  208. *(volatile uint32_t *)HR_CLK_I2S_CTL |= 0x01;
  209. }
  210. #endif
  211. static void wm_i2s_int_clear_all(void)
  212. {
  213. tls_reg_write32(HR_I2S_INT_SRC, 0x3FF);
  214. }
  215. static void wm_i2s_int_mask_all(void)
  216. {
  217. tls_reg_write32(HR_I2S_INT_MASK, 0x3FF);
  218. }
  219. static void wm_i2s_dma_start(uint8_t ch)
  220. {
  221. DMA_CHNLCTRL_REG(ch) = DMA_CHNL_CTRL_CHNL_ON;
  222. }
  223. #if 0
  224. static void wm_i2s_dma_stop(uint8_t ch)
  225. {
  226. if(DMA_CHNLCTRL_REG(ch) & DMA_CHNL_CTRL_CHNL_ON)
  227. {
  228. DMA_CHNLCTRL_REG(ch) |= DMA_CHNL_CTRL_CHNL_OFF;
  229. while(DMA_CHNLCTRL_REG(ch) & DMA_CHNL_CTRL_CHNL_ON);
  230. }
  231. }
  232. #endif
  233. static void wm_i2s_module_reset(void)
  234. {
  235. tls_bitband_write(HR_CLK_RST_CTL, 24, 0);
  236. tls_bitband_write(HR_CLK_RST_CTL, 24, 1);
  237. }
  238. static void wm_i2s_dma_tx_init(uint8_t ch, uint32_t count, int16_t *buf)
  239. {
  240. DMA_INTMASK_REG &= ~(0x02<<(ch*2));
  241. DMA_SRCADDR_REG(ch) = (uint32_t )buf;
  242. DMA_DESTADDR_REG(ch) = HR_I2S_TX;
  243. DMA_CTRL_REG(ch) = DMA_CTRL_SRC_ADDR_INC | DMA_CTRL_DATA_SIZE_WORD | DMA_CTRL_BURST_SIZE1;
  244. DMA_MODE_REG(ch) = DMA_MODE_SEL_I2S_TX | DMA_MODE_HARD_MODE;
  245. DMA_CTRL_REG(ch) &= ~0xFFFF00;
  246. DMA_CTRL_REG(ch) |= (count<<8);
  247. }
  248. static void wm_i2s_dma_rx_init(uint8_t ch, uint32_t count, int16_t * buf)
  249. {
  250. DMA_INTMASK_REG &=~(0x02<<(ch*2));
  251. DMA_SRCADDR_REG(ch) = HR_I2S_RX;
  252. DMA_DESTADDR_REG(ch) = (uint32_t )buf;
  253. DMA_CTRL_REG(ch) = DMA_CTRL_DEST_ADDR_INC | DMA_CTRL_DATA_SIZE_WORD | DMA_CTRL_BURST_SIZE1;
  254. DMA_MODE_REG(ch) = DMA_MODE_SEL_I2S_RX | DMA_MODE_HARD_MODE;
  255. DMA_CTRL_REG(ch) &= ~0xFFFF00;
  256. DMA_CTRL_REG(ch) |= (count<<8);
  257. }
  258. ATTRIBUTE_ISR void i2s_I2S_IRQHandler(void)
  259. {
  260. volatile uint32_t temp;
  261. volatile uint8_t fifo_level, cnt;
  262. csi_kernel_intrpt_enter();
  263. /* TxTH*/
  264. if ((M32(HR_I2S_INT_SRC) >> 6) & 0x1)
  265. {
  266. if (wm_i2s_buf->txtail < wm_i2s_buf->txlen)
  267. {
  268. for(fifo_level = ((I2S->INT_STATUS >> 4)& 0x0F),temp = 0; temp < 8-fifo_level; temp++)
  269. {
  270. tls_reg_write32(HR_I2S_TX, wm_i2s_buf->txbuf[wm_i2s_buf->txtail++]);
  271. if (wm_i2s_buf->txtail >= wm_i2s_buf->txlen)
  272. {
  273. wm_i2s_buf->txtail = 0;
  274. wm_i2s_buf->txdata_done = 1;
  275. tls_bitband_write(HR_I2S_INT_MASK, 6, 1);
  276. break;
  277. }
  278. }
  279. }
  280. //printf("s\n");
  281. tls_reg_write32(HR_I2S_INT_SRC, 0x40);
  282. }
  283. /*LZC */
  284. if (tls_bitband_read(HR_I2S_INT_SRC, 9))
  285. {
  286. tls_reg_write32(HR_I2S_INT_SRC, 0x200);
  287. }
  288. /*RZC */
  289. if (tls_bitband_read(HR_I2S_INT_SRC, 8) )
  290. {
  291. tls_reg_write32(HR_I2S_INT_SRC, 0x100);
  292. }
  293. /* Tx Done*/
  294. if (tls_bitband_read(HR_I2S_INT_SRC, 7) )
  295. {
  296. tls_reg_write32(HR_I2S_INT_SRC, 0x80);
  297. }
  298. /*TXOV*/
  299. if (tls_bitband_read(HR_I2S_INT_SRC, 5) )
  300. {
  301. tls_reg_write32(HR_I2S_INT_SRC, 0x20);
  302. }
  303. /*TXUD*/
  304. if (tls_bitband_read(HR_I2S_INT_SRC, 4) )
  305. {
  306. tls_reg_write32(HR_I2S_INT_SRC, 0x10);
  307. }
  308. /* Rx Done*/
  309. if (tls_bitband_read(HR_I2S_INT_SRC, 3) )
  310. {
  311. tls_reg_write32(HR_I2S_INT_SRC, 0x08);
  312. }
  313. /* RxTH */
  314. if (tls_bitband_read(HR_I2S_INT_SRC, 2) )
  315. {
  316. for(cnt = (I2S->INT_STATUS & 0x0F),temp = 0; temp < cnt; temp++)
  317. {
  318. if (wm_i2s_buf->rxhead < wm_i2s_buf->rxlen)
  319. {
  320. wm_i2s_buf->rxbuf[wm_i2s_buf->rxhead++] = I2S->RX;
  321. if (wm_i2s_buf->rxhead >= wm_i2s_buf->rxlen)
  322. {
  323. wm_i2s_buf->rxhead = 0;
  324. wm_i2s_buf->rxdata_ready = 1;
  325. tls_bitband_write(HR_I2S_INT_MASK, 2, 1);
  326. break;
  327. }
  328. }
  329. }
  330. tls_reg_write32(HR_I2S_INT_SRC, 0x04);
  331. }
  332. /*RXOV*/
  333. if (tls_bitband_read(HR_I2S_INT_SRC, 1) )
  334. {
  335. tls_reg_write32(HR_I2S_INT_SRC, 0x02);
  336. }
  337. /*RXUD*/
  338. if (tls_bitband_read(HR_I2S_INT_SRC, 0) )
  339. {
  340. tls_reg_write32(HR_I2S_INT_SRC, 0x01);
  341. }
  342. csi_kernel_intrpt_exit();
  343. }
  344. void i2s_DMA_TX_Channel_IRQHandler(void *p)
  345. {
  346. wm_dma_handler_type *hdma = (wm_dma_handler_type *)p;
  347. wm_dma_desc *dma_desc = &g_dma_desc_tx[0];
  348. if(p)
  349. {
  350. if(wm_i2s_buf->txdata_done)
  351. {
  352. wm_i2s_buf->txdata_done = 0;
  353. dma_desc[1].valid |= (1 << 31);
  354. if(hdma->XferCpltCallback)
  355. {
  356. hdma->XferCpltCallback(hdma);
  357. }
  358. }
  359. else
  360. {
  361. wm_i2s_buf->txdata_done = 1;
  362. dma_desc[0].valid |= (1 << 31);
  363. if(hdma->XferHalfCpltCallback)
  364. {
  365. hdma->XferHalfCpltCallback(hdma);
  366. }
  367. }
  368. }
  369. else
  370. {
  371. wm_i2s_buf->txdata_done = 1;
  372. }
  373. }
  374. void i2s_DMA_RX_Channel_IRQHandler(void *p)
  375. {
  376. wm_dma_handler_type *hdma = (wm_dma_handler_type *)p;
  377. wm_dma_desc *dma_desc = &g_dma_desc_rx[0];
  378. if(p)
  379. {
  380. if(wm_i2s_buf->rxdata_ready)
  381. {
  382. wm_i2s_buf->rxdata_ready = 0;
  383. dma_desc[1].valid |= (1 << 31);
  384. if(hdma->XferCpltCallback)
  385. {
  386. hdma->XferCpltCallback(hdma);
  387. }
  388. }
  389. else
  390. {
  391. wm_i2s_buf->rxdata_ready = 1;
  392. dma_desc[0].valid |= (1 << 31);
  393. if(hdma->XferHalfCpltCallback)
  394. {
  395. hdma->XferHalfCpltCallback(hdma);
  396. }
  397. }
  398. }
  399. else
  400. {
  401. wm_i2s_buf->rxdata_ready = 1;
  402. }
  403. }
  404. void wm_i2s_register_callback(tls_i2s_callback callback)
  405. {
  406. wm_i2s_buf->tx_callback = callback;
  407. }
  408. int wm_i2s_port_init(I2S_InitDef *opts)
  409. {
  410. I2S_InitDef opt = { I2S_MODE_MASTER, I2S_CTRL_STEREO, I2S_RIGHT_CHANNEL, I2S_Standard, I2S_DataFormat_16, 8000, 5000000 };
  411. if(NULL != opts)
  412. {
  413. memcpy(&opt, opts, sizeof(I2S_InitDef));
  414. }
  415. wm_i2s_module_reset();
  416. tls_reg_write32(HR_I2S_CTRL, 0);
  417. wm_i2s_set_mode(opt.I2S_Mode_MS);
  418. wm_i2s_int_clear_all();
  419. wm_i2s_int_mask_all();
  420. wm_i2s_mono_select(opt.I2S_Mode_SS);
  421. wm_i2s_left_channel_sel(opt.I2S_Mode_LR);
  422. wm_i2s_set_format(opt.I2S_Trans_STD);
  423. wm_i2s_set_word_len(opt.I2S_DataFormat);
  424. wm_i2s_set_freq(opt.I2S_AudioFreq, opt.I2S_MclkFreq);
  425. wm_i2s_set_txth(4);
  426. wm_i2s_set_rxth(4);
  427. // tx_channel = tls_dma_request(WM_I2S_TX_DMA_CHANNEL, TLS_DMA_FLAGS_CHANNEL_SEL(TLS_DMA_SEL_I2S_TX) | TLS_DMA_FLAGS_HARD_MODE);
  428. // rx_channel = tls_dma_request(WM_I2S_RX_DMA_CHANNEL, TLS_DMA_FLAGS_CHANNEL_SEL(TLS_DMA_SEL_I2S_RX) | TLS_DMA_FLAGS_HARD_MODE);
  429. //
  430. // if (tx_channel == 0 || rx_channel == 0)
  431. // {
  432. // return WM_FAILED;
  433. // }
  434. // if (tls_dma_stop(tx_channel) || tls_dma_stop(rx_channel))
  435. // {
  436. // return WM_FAILED;
  437. // }
  438. //
  439. // tls_dma_irq_register(tx_channel, i2s_DMA_TX_Channel_IRQHandler, NULL, TLS_DMA_IRQ_TRANSFER_DONE);
  440. // tls_dma_irq_register(rx_channel, i2s_DMA_RX_Channel_IRQHandler, NULL, TLS_DMA_IRQ_TRANSFER_DONE);
  441. return WM_SUCCESS;
  442. }
  443. void wm_i2s_tx_rx_stop(void)
  444. {
  445. // if( I2S_MODE_MASTER==wm_i2s_get_mode() )
  446. // {
  447. // int i;
  448. //
  449. // for(i = 0; i < APPEND_NUM; i++)
  450. // {
  451. // tls_reg_write32(HR_I2S_TX, 0x00);
  452. // }
  453. // wm_i2s_tx_enable(1);
  454. // while( tls_reg_read32(HR_I2S_STATUS)&0xF0 );
  455. // }
  456. wm_i2s_tx_enable(0);
  457. wm_i2s_rx_enable(0);
  458. tls_dma_free(tx_channel);
  459. tls_dma_free(rx_channel);
  460. wm_i2s_enable(0);
  461. }
  462. int wm_i2s_tx_int(int16_t *data, uint16_t len, int16_t *next_data)
  463. {
  464. volatile uint32_t temp;
  465. volatile uint8_t fifo_level;
  466. if((data == NULL) || (len == 0)) {
  467. return WM_FAILED;
  468. }
  469. wm_i2s_buf->txlen = (uint32_t)len;
  470. wm_i2s_buf->txtail = 0;
  471. wm_i2s_buf->txbuf = (uint32_t *)data;
  472. wm_i2s_buf->txdata_done = 0;
  473. wm_i2s_set_mode(I2S_MODE_MASTER);
  474. wm_i2s_txth_int_mask(0);
  475. wm_i2s_tx_fifo_clear();
  476. tls_irq_enable(I2S_IRQn);
  477. wm_i2s_tx_enable(1);
  478. for(fifo_level = ((I2S->INT_STATUS >> 4)& 0x0F),temp = 0; temp < 8-fifo_level; temp++)
  479. {
  480. tls_reg_write32(HR_I2S_TX, wm_i2s_buf->txbuf[wm_i2s_buf->txtail++]);
  481. }
  482. wm_i2s_enable(1);
  483. if((wm_i2s_buf->tx_callback != NULL) && (next_data != NULL))
  484. {
  485. wm_i2s_buf->tx_callback((uint32_t *)next_data, &len);
  486. }
  487. while( wm_i2s_buf->txdata_done == 0 );
  488. while( tls_reg_read32(HR_I2S_STATUS)&0xF0 );
  489. return WM_SUCCESS;
  490. }
  491. int wm_i2s_tx_dma(int16_t *data, uint16_t len, int16_t *next_data)
  492. {
  493. if((data == NULL) || (len == 0)) {
  494. return WM_FAILED;
  495. }
  496. wm_i2s_buf->txdata_done = 0;
  497. wm_i2s_set_mode(I2S_MODE_MASTER);
  498. wm_i2s_dma_tx_init(tx_channel, len*4, data);
  499. wm_i2s_dma_start(tx_channel);
  500. wm_i2s_tx_dma_enable(1);
  501. wm_i2s_tx_enable(1);
  502. wm_i2s_enable(1);
  503. if((wm_i2s_buf->tx_callback != NULL) && (next_data != NULL))
  504. {
  505. wm_i2s_buf->tx_callback((uint32_t *)next_data, &len);
  506. }
  507. while( wm_i2s_buf->txdata_done == 0 );
  508. while( tls_reg_read32(HR_I2S_STATUS)&0xF0 );
  509. return WM_SUCCESS;
  510. }
  511. int wm_i2s_tx_dma_link(int16_t *data, uint16_t len, int16_t *next_data)
  512. {
  513. if((data == NULL) || (next_data == NULL) || (len == 0)) {
  514. return WM_FAILED;
  515. }
  516. uint32_t dma_ctrl;
  517. wm_dma_desc dma_desc[2];
  518. wm_i2s_buf->txdata_done = 0;
  519. wm_i2s_set_mode(I2S_MODE_MASTER);
  520. dma_ctrl = DMA_CTRL_SRC_ADDR_INC | DMA_CTRL_DATA_SIZE_WORD | DMA_CTRL_BURST_SIZE1;
  521. dma_ctrl &= ~ 0xFFFF00;
  522. dma_ctrl |= ((len*2)<<8);
  523. dma_desc[0].next = &dma_desc[1];
  524. dma_desc[0].dest_addr = HR_I2S_TX;
  525. dma_desc[0].src_addr = (unsigned int)data;
  526. dma_desc[0].dma_ctrl = dma_ctrl>>1;
  527. dma_desc[0].valid = 0x80000000;
  528. dma_desc[1].next = &dma_desc[0];
  529. dma_desc[1].dest_addr = HR_I2S_TX;
  530. dma_desc[1].src_addr = (unsigned int)next_data;
  531. dma_desc[1].dma_ctrl = dma_ctrl>>1;
  532. dma_desc[1].valid = 0x80000000;
  533. DMA_INTMASK_REG &= ~(0x02<<(tx_channel*2));
  534. DMA_MODE_REG(tx_channel) = DMA_MODE_SEL_I2S_TX | DMA_MODE_CHAIN_MODE | DMA_MODE_HARD_MODE | (1<<6);
  535. tls_reg_write32(HR_DMA_CHNL0_LINK_DEST_ADDR + 0x30*tx_channel, (uint32_t)dma_desc);
  536. wm_i2s_dma_start(tx_channel);
  537. wm_i2s_tx_dma_enable(1);
  538. wm_i2s_tx_enable(1);
  539. wm_i2s_enable(1);
  540. while(1)
  541. {
  542. if( dma_desc[0].valid == 0 )
  543. {
  544. dma_desc[0].valid = 0x80000000;
  545. if(wm_i2s_buf->tx_callback != NULL)
  546. {
  547. wm_i2s_buf->tx_callback((uint32_t *)data, &len);
  548. }
  549. }
  550. if( dma_desc[1].valid == 0 )
  551. {
  552. dma_desc[1].valid = 0x80000000;
  553. if(wm_i2s_buf->tx_callback != NULL)
  554. {
  555. wm_i2s_buf->tx_callback((uint32_t *)next_data, &len);
  556. }
  557. }
  558. /* todo: a way to break this rountine */
  559. if( len == 0xFFFF )
  560. {
  561. break;
  562. }
  563. }
  564. return WM_SUCCESS;
  565. }
  566. int wm_i2s_rx_int(int16_t *data, uint16_t len)
  567. {
  568. if((data == NULL) || (len == 0)) {
  569. return WM_FAILED;
  570. }
  571. wm_i2s_buf->rxbuf = (uint32_t *)data;
  572. wm_i2s_buf->rxlen = (uint32_t)len;
  573. wm_i2s_buf->rxhead = 0;
  574. wm_i2s_buf->rxdata_ready = 0;
  575. wm_i2s_set_mode(I2S_MODE_SLAVE);
  576. wm_i2s_rxth_int_mask(0);
  577. wm_i2s_rx_fifo_clear();
  578. tls_irq_enable(I2S_IRQn);
  579. wm_i2s_rx_enable(1);
  580. wm_i2s_enable(1);
  581. while( wm_i2s_buf->rxdata_ready == 0 );
  582. return WM_SUCCESS;
  583. }
  584. int wm_i2s_rx_dma(int16_t *data, uint16_t len)
  585. {
  586. if((data == NULL) || (len == 0)) {
  587. return WM_FAILED;
  588. }
  589. wm_i2s_buf->rxdata_ready = 0;
  590. wm_i2s_set_mode(I2S_MODE_SLAVE);
  591. wm_i2s_dma_rx_init(rx_channel, len*4, data);
  592. wm_i2s_dma_start(rx_channel);
  593. wm_i2s_rx_dma_enable(1);
  594. wm_i2s_rx_enable(1);
  595. wm_i2s_enable(1);
  596. while( wm_i2s_buf->rxdata_ready == 0 );
  597. return WM_SUCCESS;
  598. }
  599. int wm_i2s_tx_rx_int(I2S_InitDef *opts, int16_t *data_tx, int16_t *data_rx, uint16_t len)
  600. {
  601. if((data_tx == NULL) || (data_rx == NULL) || (len == 0)) {
  602. return WM_FAILED;
  603. }
  604. wm_i2s_buf->txbuf = (uint32_t *)data_tx;
  605. wm_i2s_buf->txlen = (uint32_t)len;
  606. wm_i2s_buf->txtail = 0;
  607. wm_i2s_buf->txdata_done = 0;
  608. wm_i2s_buf->rxbuf = (uint32_t *)data_rx;
  609. wm_i2s_buf->rxlen = (uint32_t)len;
  610. wm_i2s_buf->rxhead = 0;
  611. wm_i2s_buf->rxdata_ready = 0;
  612. wm_i2s_set_mode(opts->I2S_Mode_MS);
  613. #if TEST_WITH_F401
  614. ( opts->I2S_Trans_STD==I2S_Standard || opts->I2S_Trans_STD==I2S_Standard_MSB )?(wm_i2s_clk_inverse(0)):(wm_i2s_clk_inverse(1));
  615. #endif
  616. wm_i2s_txth_int_mask(0);
  617. wm_i2s_rxth_int_mask(0);
  618. tls_irq_enable(I2S_IRQn);
  619. wm_i2s_tx_enable(1);
  620. wm_i2s_rx_enable(1);
  621. wm_i2s_enable(1);
  622. while( wm_i2s_buf->txdata_done == 0 || wm_i2s_buf->rxdata_ready == 0);
  623. while( tls_reg_read32(HR_I2S_STATUS)&0xF0 );
  624. return WM_SUCCESS;
  625. }
  626. int wm_i2s_tx_rx_dma(I2S_InitDef *opts, int16_t *data_tx, int16_t *data_rx, uint16_t len)
  627. {
  628. if((data_tx == NULL) || (data_rx == NULL) || (len == 0)) {
  629. return WM_FAILED;
  630. }
  631. wm_i2s_buf->txdata_done = 0;
  632. wm_i2s_buf->rxdata_ready = 0;
  633. wm_i2s_set_mode(opts->I2S_Mode_MS);
  634. #if TEST_WITH_F401
  635. ( opts->I2S_Trans_STD==I2S_Standard || opts->I2S_Trans_STD==I2S_Standard_MSB )?(wm_i2s_clk_inverse(0)):(wm_i2s_clk_inverse(1));
  636. #endif
  637. wm_i2s_tx_dma_enable(1);
  638. wm_i2s_rx_dma_enable(1);
  639. wm_i2s_tx_enable(1);
  640. wm_i2s_rx_enable(1);
  641. wm_i2s_dma_tx_init(tx_channel, len*4, data_tx);
  642. wm_i2s_dma_rx_init(rx_channel, len*4, data_rx);
  643. wm_i2s_dma_start(tx_channel);
  644. wm_i2s_dma_start(rx_channel);
  645. wm_i2s_enable(1);
  646. while( wm_i2s_buf->txdata_done == 0 || wm_i2s_buf->rxdata_ready == 0);
  647. while( tls_reg_read32(HR_I2S_STATUS)&0xF0 );
  648. return WM_SUCCESS;
  649. }
  650. int wm_i2s_receive_dma(wm_dma_handler_type *hdma, uint16_t *data, uint16_t len)
  651. {
  652. uint32_t dma_ctrl;
  653. wm_dma_desc *dma_desc = &g_dma_desc_rx[0];
  654. uint16_t *next_data = &data[(len/2)];
  655. if((data == NULL) || (len == 0)) {
  656. return WM_FAILED;
  657. }
  658. wm_i2s_buf->rxdata_ready = 0;
  659. //wm_i2s_set_mode(I2S_MODE_SLAVE);
  660. if(rx_channel)
  661. {
  662. tls_dma_free(rx_channel);
  663. }
  664. rx_channel = tls_dma_request(WM_I2S_RX_DMA_CHANNEL, TLS_DMA_FLAGS_CHANNEL_SEL(TLS_DMA_SEL_I2S_RX) | TLS_DMA_FLAGS_HARD_MODE);
  665. if (rx_channel == 0xFF)
  666. {
  667. return WM_FAILED;
  668. }
  669. hdma->channel = rx_channel;
  670. if (tls_dma_stop(rx_channel))
  671. {
  672. return WM_FAILED;
  673. }
  674. tls_dma_irq_register(rx_channel, i2s_DMA_RX_Channel_IRQHandler, hdma, TLS_DMA_IRQ_TRANSFER_DONE);
  675. dma_ctrl = DMA_CTRL_DEST_ADDR_INC | DMA_CTRL_DATA_SIZE_WORD | DMA_CTRL_BURST_SIZE1;
  676. dma_ctrl &= ~ 0xFFFF00;
  677. dma_ctrl |= ((len)<<8); //half length of data
  678. dma_desc[0].next = &dma_desc[1];
  679. dma_desc[0].dest_addr = (unsigned int)data;
  680. dma_desc[0].src_addr = HR_I2S_RX;
  681. dma_desc[0].dma_ctrl = dma_ctrl>>1;
  682. dma_desc[0].valid = 0x80000000;
  683. dma_desc[1].next = &dma_desc[0];
  684. dma_desc[1].dest_addr = (unsigned int)next_data;
  685. dma_desc[1].src_addr = HR_I2S_RX;
  686. dma_desc[1].dma_ctrl = dma_ctrl>>1;
  687. dma_desc[1].valid = 0x80000000;
  688. DMA_INTMASK_REG &= ~(0x02<<(rx_channel*2));
  689. DMA_MODE_REG(rx_channel) = DMA_MODE_SEL_I2S_RX | DMA_MODE_CHAIN_MODE | DMA_MODE_HARD_MODE | DMA_MODE_CHAIN_LINK_EN;
  690. tls_reg_write32(HR_DMA_CHNL0_LINK_DEST_ADDR + 0x30*rx_channel, (uint32_t)dma_desc);
  691. wm_i2s_dma_start(rx_channel);
  692. wm_i2s_rx_dma_enable(1);
  693. wm_i2s_rx_enable(1);
  694. wm_i2s_enable(1);
  695. return WM_SUCCESS;
  696. }
  697. int wm_i2s_transmit_dma(wm_dma_handler_type *hdma, uint16_t *data, uint16_t len)
  698. {
  699. uint32_t dma_ctrl;
  700. wm_dma_desc *dma_desc = &g_dma_desc_tx[0];
  701. uint16_t *next_data = &data[(len/2)];
  702. if((data == NULL) || (len == 0)) {
  703. return WM_FAILED;
  704. }
  705. wm_i2s_buf->txdata_done = 0;
  706. //wm_i2s_set_mode(I2S_MODE_MASTER);
  707. if(tx_channel)
  708. {
  709. tls_dma_free(tx_channel);
  710. }
  711. tx_channel = tls_dma_request(WM_I2S_TX_DMA_CHANNEL, TLS_DMA_FLAGS_CHANNEL_SEL(TLS_DMA_SEL_I2S_TX) | TLS_DMA_FLAGS_HARD_MODE);
  712. if (tx_channel == 0xFF)
  713. {
  714. return WM_FAILED;
  715. }
  716. hdma->channel = tx_channel;
  717. if (tls_dma_stop(tx_channel))
  718. {
  719. return WM_FAILED;
  720. }
  721. tls_dma_irq_register(tx_channel, i2s_DMA_TX_Channel_IRQHandler, hdma, TLS_DMA_IRQ_TRANSFER_DONE);
  722. dma_ctrl = DMA_CTRL_SRC_ADDR_INC | DMA_CTRL_DATA_SIZE_WORD | DMA_CTRL_BURST_SIZE1;
  723. dma_ctrl &= ~ 0xFFFF00;
  724. dma_ctrl |= ((len)<<8); //half length of data
  725. dma_desc[0].next = &dma_desc[1];
  726. dma_desc[0].dest_addr = HR_I2S_TX;
  727. dma_desc[0].src_addr = (unsigned int)data;
  728. dma_desc[0].dma_ctrl = dma_ctrl>>1;
  729. dma_desc[0].valid = 0x80000000;
  730. dma_desc[1].next = &dma_desc[0];
  731. dma_desc[1].dest_addr = HR_I2S_TX;
  732. dma_desc[1].src_addr = (unsigned int)next_data;
  733. dma_desc[1].dma_ctrl = dma_ctrl>>1;
  734. dma_desc[1].valid = 0x80000000;
  735. DMA_INTMASK_REG &= ~(0x02<<(tx_channel*2));
  736. DMA_MODE_REG(tx_channel) = DMA_MODE_SEL_I2S_TX | DMA_MODE_CHAIN_MODE | DMA_MODE_HARD_MODE | DMA_MODE_CHAIN_LINK_EN;
  737. tls_reg_write32(HR_DMA_CHNL0_LINK_DEST_ADDR + 0x30*tx_channel, (uint32_t)dma_desc);
  738. wm_i2s_dma_start(tx_channel);
  739. wm_i2s_tx_dma_enable(1);
  740. wm_i2s_tx_enable(1);
  741. wm_i2s_enable(1);
  742. return WM_SUCCESS;
  743. }
  744. int wm_i2s_tranceive_dma(uint32_t i2s_mode, wm_dma_handler_type *hdma_tx, wm_dma_handler_type *hdma_rx, uint16_t *data_tx, uint16_t *data_rx, uint16_t len)
  745. {
  746. uint32_t dma_ctrl;
  747. wm_dma_desc *dma_desc_tx = &g_dma_desc_tx[0];
  748. wm_dma_desc *dma_desc_rx = &g_dma_desc_rx[0];
  749. uint16_t *next_data_tx = &data_tx[(len/2)];
  750. uint16_t *next_data_rx = &data_rx[(len/2)];
  751. if((data_tx == NULL) || (data_rx == NULL) || (len == 0)) {
  752. return WM_FAILED;
  753. }
  754. wm_i2s_buf->txdata_done = 0;
  755. wm_i2s_buf->rxdata_ready = 0;
  756. wm_i2s_set_mode(i2s_mode);
  757. if(tx_channel)
  758. {
  759. tls_dma_free(tx_channel);
  760. }
  761. tx_channel = tls_dma_request(WM_I2S_TX_DMA_CHANNEL, TLS_DMA_FLAGS_CHANNEL_SEL(TLS_DMA_SEL_I2S_TX) | TLS_DMA_FLAGS_HARD_MODE);
  762. if (tx_channel == 0xFF)
  763. {
  764. return WM_FAILED;
  765. }
  766. hdma_tx->channel = tx_channel;
  767. if (tls_dma_stop(tx_channel))
  768. {
  769. return WM_FAILED;
  770. }
  771. tls_dma_irq_register(tx_channel, i2s_DMA_TX_Channel_IRQHandler, hdma_tx, TLS_DMA_IRQ_TRANSFER_DONE);
  772. dma_ctrl = DMA_CTRL_SRC_ADDR_INC | DMA_CTRL_DATA_SIZE_WORD | DMA_CTRL_BURST_SIZE1;
  773. dma_ctrl &= ~ 0xFFFF00;
  774. dma_ctrl |= ((len)<<8); //half length of data
  775. dma_desc_tx[0].next = &dma_desc_tx[1];
  776. dma_desc_tx[0].dest_addr = HR_I2S_TX;
  777. dma_desc_tx[0].src_addr = (unsigned int)data_tx;
  778. dma_desc_tx[0].dma_ctrl = dma_ctrl>>1;
  779. dma_desc_tx[0].valid = 0x80000000;
  780. dma_desc_tx[1].next = &dma_desc_tx[0];
  781. dma_desc_tx[1].dest_addr = HR_I2S_TX;
  782. dma_desc_tx[1].src_addr = (unsigned int)next_data_tx;
  783. dma_desc_tx[1].dma_ctrl = dma_ctrl>>1;
  784. dma_desc_tx[1].valid = 0x80000000;
  785. // DMA_INTMASK_REG |= (0x03<<(tx_channel*2));
  786. DMA_MODE_REG(tx_channel) = DMA_MODE_SEL_I2S_TX | DMA_MODE_CHAIN_MODE | DMA_MODE_HARD_MODE | DMA_MODE_CHAIN_LINK_EN;
  787. tls_reg_write32(HR_DMA_CHNL0_LINK_DEST_ADDR + 0x30*tx_channel, (uint32_t)dma_desc_tx);
  788. if(rx_channel)
  789. {
  790. tls_dma_free(rx_channel);
  791. }
  792. rx_channel = tls_dma_request(WM_I2S_RX_DMA_CHANNEL, TLS_DMA_FLAGS_CHANNEL_SEL(TLS_DMA_SEL_I2S_RX) | TLS_DMA_FLAGS_HARD_MODE);
  793. if (rx_channel == 0xFF)
  794. {
  795. return WM_FAILED;
  796. }
  797. hdma_rx->channel = rx_channel;
  798. if (tls_dma_stop(rx_channel))
  799. {
  800. return WM_FAILED;
  801. }
  802. tls_dma_irq_register(rx_channel, i2s_DMA_RX_Channel_IRQHandler, hdma_rx, TLS_DMA_IRQ_TRANSFER_DONE);
  803. dma_ctrl = DMA_CTRL_DEST_ADDR_INC | DMA_CTRL_DATA_SIZE_WORD | DMA_CTRL_BURST_SIZE1;
  804. dma_ctrl &= ~ 0xFFFF00;
  805. dma_ctrl |= ((len)<<8); //half length of data
  806. dma_desc_rx[0].next = &dma_desc_rx[1];
  807. dma_desc_rx[0].dest_addr = (unsigned int)data_rx;
  808. dma_desc_rx[0].src_addr = HR_I2S_RX;
  809. dma_desc_rx[0].dma_ctrl = dma_ctrl>>1;
  810. dma_desc_rx[0].valid = 0x80000000;
  811. dma_desc_rx[1].next = &dma_desc_rx[0];
  812. dma_desc_rx[1].dest_addr = (unsigned int)next_data_rx;
  813. dma_desc_rx[1].src_addr = HR_I2S_RX;
  814. dma_desc_rx[1].dma_ctrl = dma_ctrl>>1;
  815. dma_desc_rx[1].valid = 0x80000000;
  816. // DMA_INTMASK_REG &= ~(0x02<<(rx_channel*2));
  817. DMA_MODE_REG(rx_channel) = DMA_MODE_SEL_I2S_RX | DMA_MODE_CHAIN_MODE | DMA_MODE_HARD_MODE | DMA_MODE_CHAIN_LINK_EN;
  818. tls_reg_write32(HR_DMA_CHNL0_LINK_DEST_ADDR + 0x30*rx_channel, (uint32_t)dma_desc_rx);
  819. wm_i2s_dma_start(rx_channel);
  820. wm_i2s_rx_dma_enable(1);
  821. wm_i2s_rx_enable(1);
  822. wm_i2s_dma_start(tx_channel);
  823. wm_i2s_tx_dma_enable(1);
  824. wm_i2s_tx_enable(1);
  825. wm_i2s_enable(1);
  826. return WM_SUCCESS;
  827. }
  828. /**
  829. *******************************************************
  830. * TEST CODE IS BELOW
  831. *******************************************************
  832. */
  833. #if 0
  834. #define UNIT_SIZE 2*1024
  835. #define PCM_ADDRDSS 0x100000
  836. #define FIRM_SIZE 940
  837. int16_t data_1[2][UNIT_SIZE];
  838. void i2s_demo_callback_play(int16_t *data, uint32_t *len)
  839. {
  840. static int number = 0;
  841. tls_fls_read(PCM_ADDRDSS+number*UNIT_SIZE*2, data, UNIT_SIZE*2);
  842. number ++;
  843. if( number > FIRM_SIZE/UNIT_SIZE/1024/2 )
  844. {
  845. number = 0;
  846. *len = 0xFFFF;
  847. }
  848. printf("%d, %x\n", number, data[0]);
  849. }
  850. void wm_i2s_play_demo(void)
  851. {
  852. wm_i2s_ck_config(WM_IO_PB_08);
  853. wm_i2s_ws_config(WM_IO_PB_09);
  854. wm_i2s_di_config(WM_IO_PB_10);
  855. wm_i2s_do_config(WM_IO_PB_11);
  856. wm_i2s_mclk_config(WM_IO_PA_00);
  857. //wm_i2c_scl_config(WM_IO_PA_01);
  858. //wm_i2c_sda_config(WM_IO_PA_04);
  859. //CodecInit();
  860. //CodecSetSampleRate(cur_sample_rate);
  861. //CodecMute(1);
  862. //CodecMute(0);
  863. I2S_InitDef i2s_config = { I2S_MODE_MASTER, I2S_CTRL_MONO, I2S_RIGHT_CHANNEL, I2S_Standard, I2S_DataFormat_16, 8000, 5000000 };
  864. int i;
  865. wm_i2s_port_init(&i2s_config);
  866. wm_i2s_register_callback(i2s_demo_callback_play);
  867. memset(data_1[0], 1, sizeof(data_1[0]));
  868. memset(data_1[1], 2, sizeof(data_1[1]));
  869. printf("1\n");
  870. //wm_i2s_tx_int(data_1[0], UNIT_SIZE, data_1[1]);
  871. //wm_i2s_tx_dma(data_1[0], UNIT_SIZE, data_1[1]);
  872. //wm_i2s_tx_dma_link(data_1[0], UNIT_SIZE, data_1[1]);
  873. //wm_i2s_rx_int(data_1[0], UNIT_SIZE);
  874. //for( i=0; i<UNIT_SIZE; i++ ) { printf("%x\n", data_1[0][i]); }
  875. //wm_i2s_rx_dma(data_1[0], UNIT_SIZE);
  876. //for( i=0; i<UNIT_SIZE; i++ ) { printf("%x\n", data_1[0][i]); }
  877. //wm_i2s_tx_rx_int(&i2s_config, data_1[0], data_1[1], UNIT_SIZE);
  878. //for( i=0; i<UNIT_SIZE; i++ ) { printf("%x\n", data_1[1][i]); }
  879. wm_i2s_tx_rx_dma(&i2s_config, data_1[0], data_1[1], UNIT_SIZE);
  880. for( i=0; i<UNIT_SIZE; i++ ) { printf("%x\n", data_1[1][i]); }
  881. printf("2\n");
  882. wm_i2s_tx_rx_stop();
  883. printf("stop\n");
  884. }
  885. #endif