bsp_iis.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #ifndef _BSP_IIS_H
  2. #define _BSP_IIS_H
  3. //iis 基本配置类型
  4. #define IISCFG_TX BIT(0)
  5. #define IISCFG_RX BIT(1)
  6. #define IISCFG_SRC BIT(2)
  7. #define IISCFG_DMA BIT(3)
  8. #define IISCFG_ONEWIRE BIT(4)
  9. #define IISCFG_MASTER BIT(7) //master or slave sel: 1 master, 0 slave
  10. //iis组合类型
  11. #define IISCFG_RAMTX (IISCFG_TX | IISCFG_DMA)
  12. #define IISCFG_RAMRX (IISCFG_RX | IISCFG_DMA)
  13. //iis MASK BIT
  14. #define IISCFG_TXMASK (IISCFG_TX | IISCFG_SRC | IISCFG_DMA)
  15. #define IISCFG_RXMASK (IISCFG_RX | IISCFG_DMA)
  16. #define IISCFG_TXRXMASK (IISCFG_TX | IISCFG_RX | IISCFG_SRC | IISCFG_DMA)
  17. #define IRQ_I2S_VECTOR 27
  18. //***************************************
  19. //IIS及audio可能用到的寄存器
  20. //#define IISCON0 SFR_RW (SFR5_BASE + 0x00*4)
  21. //#define IISBAUD SFR_RW (SFR5_BASE + 0x01*4)
  22. //#define IISDMACNT SFR_RW (SFR5_BASE + 0x02*4)
  23. //#define IISDMAOADR0 SFR_RW (SFR5_BASE + 0x03*4)
  24. //#define IISDMAOADR1 SFR_RW (SFR5_BASE + 0x04*4)
  25. //#define IISDMAIADR0 SFR_RW (SFR5_BASE + 0x05*4)
  26. //#define IISDMAIADR1 SFR_RW (SFR5_BASE + 0x06*4)
  27. #define AUBUF0DATA SFR_RW (SFR12_BASE + 0x01*4)
  28. #define AUBUF0SIZE SFR_RW (SFR12_BASE + 0x03*4)
  29. #define AUBUF0FIFOCNT SFR_RW (SFR12_BASE + 0x04*4)
  30. #define PHASECOMP SFR_RW (SFR13_BASE + 0x0a*4)
  31. #define AUBUF0CON SFR_RW (SFR12_BASE + 0x00*4)
  32. #define AU0DMAICON SFR_RW (SFR13_BASE + 0x18*4)
  33. #define AU0DMAIADR SFR_RW (SFR13_BASE + 0x19*4)
  34. #define AU0DMAISIZE SFR_RW (SFR13_BASE + 0x1a*4)
  35. #define SETB(REG,POS) ((REG) |= (1ul << (POS)))
  36. #define CLRB(REG,POS) ((REG) &= (~(1ul << (POS))))
  37. #define XORB(REG,POS) ((REG) ^= (1ul << (POS)))
  38. #define CKB1(REG,POS) REG & (1ul << POS)) //检测相应的BIT是否为1
  39. #define CKB0(REG,POS) (!(REG & (1ul << POS))) //检测相应的BIT是否为1
  40. #define IS_IIS_32BIT() (IISCON0 & BIT(2))
  41. #define IS_IIS_MASTER() (CKB0(IISCON0,1))
  42. #define SETB(REG,POS) ((REG) |= (1ul << (POS)))
  43. #define CLRB(REG,POS) ((REG) &= (~(1ul << (POS))))
  44. #define XORB(REG,POS) ((REG) ^= (1ul << (POS)))
  45. #define CKB1(REG,POS) REG & (1ul << POS)) //检测相应的BIT是否为1
  46. #define CKB0(REG,POS) (!(REG & (1ul << POS))) //检测相应的BIT是否为1
  47. #define IS_IIS_32BIT() (IISCON0 & BIT(2))
  48. #define IS_IIS_MASTER() (CKB0(IISCON0,1))
  49. typedef void (*isr_t)(void);
  50. isr_t register_isr(int vector, isr_t isr);
  51. typedef enum { //io_map
  52. IIS_G1 = 0, //MCLK_PA4, BCLK_PA5, LRC_PA6, DO_PA7, DI_PB3
  53. IIS_G2 = 1, //MCLK_PE4, BCLK_PE5, LRC_PE6, DO_PE7, DI_PE0
  54. IIS_G3 = 2, //MCLK_PB4, BCLK_PB0, LRC_PB1, DO_PB2, DI_PB5
  55. }TYPE_IIS_IO;
  56. typedef enum { //bit_mode
  57. IIS_16BIT = 0,
  58. IIS_32BIT = 1,
  59. }TYPE_IIS_BIT;
  60. typedef enum { //data_mode
  61. IIS_DATA_LEFT_JUSTIFIED = 0, //left-justified mode (data delay 0 clock after WS change)
  62. IIS_DATA_NORMAL = 1, //IIS normal mode (data delay 1 clock after WS change)
  63. }TYPE_IIS_DATA_FORMAT;
  64. //iis一共有可以配置出8种用法
  65. typedef enum { //iis_mode
  66. //主机 src 发数据
  67. IIS_MASTER_SRCTX = (IISCFG_MASTER |IISCFG_TX |IISCFG_SRC),
  68. //主机 DMA 发数据
  69. IIS_MASTER_RAMTX = (IISCFG_MASTER |IISCFG_TX |IISCFG_DMA),
  70. //主机 DMA 收发数据同时
  71. IIS_MASTER_RAMTX_RAMRX = (IISCFG_MASTER | IISCFG_TX | IISCFG_RX | IISCFG_DMA),
  72. //主机 SRC发数据 DMA收数据
  73. IIS_MASTER_SRCTX_RAMRX = (IISCFG_MASTER | IISCFG_TX | IISCFG_SRC | IISCFG_RX | IISCFG_DMA),
  74. //主机 DMA收数据
  75. IIS_MASTER_RAMRX = (IISCFG_MASTER | IISCFG_RX | IISCFG_DMA),
  76. //主机 DMA收数据 (单线模式,DO配置成DI)
  77. IIS_MASTER_RAMRX_ONEWIRE = (IISCFG_MASTER | IISCFG_RX | IISCFG_DMA |IISCFG_ONEWIRE),
  78. //从机 DMA收数据
  79. IIS_SLAVE_RAMRX = IISCFG_RAMRX,
  80. //从机 DMA收数据 (单线模式,DO配置成DI)
  81. IIS_SLAVE_RAMRX_ONEWIRE = (IISCFG_RAMRX | IISCFG_ONEWIRE),
  82. //从机 DMA发数据
  83. IIS_SLAVE_RAMTX = IISCFG_RAMTX,
  84. //从机 DMA 收发数据同时
  85. IIS_SLAVE_RAMTX_RAMRX = (IISCFG_TX | IISCFG_RX | IISCFG_DMA),
  86. }TYPE_IIS_MODE;
  87. typedef enum{ //fs指MCLK/LRC // MCLK = fs * LRC
  88. IIS_MCLK_64FS = 64,
  89. IIS_MCLK_128FS = 128,
  90. IIS_MCLK_256FS = 256,
  91. }TYPE_MCLK_SEL;
  92. typedef enum{
  93. IIS_SPR_48000 = 48000,
  94. IIS_SPR_44100 = 44100,
  95. IIS_SPR_16000 = 16000,
  96. }TYPE_SPR_SEL;
  97. typedef enum{
  98. IIS_MCLK_OUT_DIS = 0,
  99. IIS_MCLK_OUT_EN = 1, //只有MASTER模式才可能输出MCLK
  100. }TYPE_MCLK_OUT_SEL;
  101. typedef struct {
  102. u16 samples;
  103. u16 dmabuf_len;
  104. u8* dmabuf_ptr; //TX_RX同时存在时前一半是TX,后一版半是RX, 如果只有TX或RX,则全部用于TX或RX
  105. void(*iis_isr_rx_callbck)(void *buf, u32 samples, bool iis_32bit); //rx_dma收完一个DMA后起中断,可以从buf中取出接收到数据
  106. void(*iis_isr_tx_callbck)(void *buf, u32 samples, bool iis_32bit); //tx_dma发完一个DMA后起中断,要求向buf中填入数据,以备下一次发送
  107. u8* txbuf_start_addr;
  108. u8* rxbuf_start_addr;
  109. volatile u32 txbuf_idx;
  110. volatile u32 rxbuf_idx;
  111. }iis_dma_cfg_t;
  112. typedef struct {
  113. u8 mode;
  114. u8 iomap : 2;
  115. u8 bit_mode : 1;
  116. u8 data_mode : 1;
  117. u8 mclk_out_en : 1;
  118. u8 dma_en : 1;
  119. u16 mclk_sel;
  120. u16 spr_sel;
  121. //DMA_CFG
  122. iis_dma_cfg_t dma_cfg;
  123. }iis_cfg_t;
  124. typedef struct IIS_MODE_STR_T {
  125. u8 iis_mode;
  126. const char * iis_str_info;
  127. }IIS_MODE_INFO_TBL;
  128. u32 iis_tx_dma_addr_inc(void);
  129. u32 iis_rx_dma_addr_inc(void);
  130. void iis_irq_init(void);
  131. //API接口函数
  132. void iis_cfg_init(iis_cfg_t *cfg);
  133. void iis_start(void);
  134. void iis_stop(void);
  135. void bt_aec_process(u8 *ptr, u32 samples, int ch_mode);
  136. void bt_sco_tx_process(u8 *ptr, u32 samples, int ch_mode);
  137. void bsp_iis_sco_init(void);
  138. #endif