123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #ifndef _BSP_IIS_H
- #define _BSP_IIS_H
- //iis 基本配置类型
- #define IISCFG_TX BIT(0)
- #define IISCFG_RX BIT(1)
- #define IISCFG_SRC BIT(2)
- #define IISCFG_DMA BIT(3)
- #define IISCFG_ONEWIRE BIT(4)
- #define IISCFG_MASTER BIT(7) //master or slave sel: 1 master, 0 slave
- //iis组合类型
- #define IISCFG_RAMTX (IISCFG_TX | IISCFG_DMA)
- #define IISCFG_RAMRX (IISCFG_RX | IISCFG_DMA)
- //iis MASK BIT
- #define IISCFG_TXMASK (IISCFG_TX | IISCFG_SRC | IISCFG_DMA)
- #define IISCFG_RXMASK (IISCFG_RX | IISCFG_DMA)
- #define IISCFG_TXRXMASK (IISCFG_TX | IISCFG_RX | IISCFG_SRC | IISCFG_DMA)
- #define IRQ_I2S_VECTOR 27
- //***************************************
- //IIS及audio可能用到的寄存器
- //#define IISCON0 SFR_RW (SFR5_BASE + 0x00*4)
- //#define IISBAUD SFR_RW (SFR5_BASE + 0x01*4)
- //#define IISDMACNT SFR_RW (SFR5_BASE + 0x02*4)
- //#define IISDMAOADR0 SFR_RW (SFR5_BASE + 0x03*4)
- //#define IISDMAOADR1 SFR_RW (SFR5_BASE + 0x04*4)
- //#define IISDMAIADR0 SFR_RW (SFR5_BASE + 0x05*4)
- //#define IISDMAIADR1 SFR_RW (SFR5_BASE + 0x06*4)
- #define AUBUF0DATA SFR_RW (SFR12_BASE + 0x01*4)
- #define AUBUF0SIZE SFR_RW (SFR12_BASE + 0x03*4)
- #define AUBUF0FIFOCNT SFR_RW (SFR12_BASE + 0x04*4)
- #define PHASECOMP SFR_RW (SFR13_BASE + 0x0a*4)
- #define AUBUF0CON SFR_RW (SFR12_BASE + 0x00*4)
- #define AU0DMAICON SFR_RW (SFR13_BASE + 0x18*4)
- #define AU0DMAIADR SFR_RW (SFR13_BASE + 0x19*4)
- #define AU0DMAISIZE SFR_RW (SFR13_BASE + 0x1a*4)
- #define SETB(REG,POS) ((REG) |= (1ul << (POS)))
- #define CLRB(REG,POS) ((REG) &= (~(1ul << (POS))))
- #define XORB(REG,POS) ((REG) ^= (1ul << (POS)))
- #define CKB1(REG,POS) REG & (1ul << POS)) //检测相应的BIT是否为1
- #define CKB0(REG,POS) (!(REG & (1ul << POS))) //检测相应的BIT是否为1
- #define IS_IIS_32BIT() (IISCON0 & BIT(2))
- #define IS_IIS_MASTER() (CKB0(IISCON0,1))
- #define SETB(REG,POS) ((REG) |= (1ul << (POS)))
- #define CLRB(REG,POS) ((REG) &= (~(1ul << (POS))))
- #define XORB(REG,POS) ((REG) ^= (1ul << (POS)))
- #define CKB1(REG,POS) REG & (1ul << POS)) //检测相应的BIT是否为1
- #define CKB0(REG,POS) (!(REG & (1ul << POS))) //检测相应的BIT是否为1
- #define IS_IIS_32BIT() (IISCON0 & BIT(2))
- #define IS_IIS_MASTER() (CKB0(IISCON0,1))
- typedef void (*isr_t)(void);
- isr_t register_isr(int vector, isr_t isr);
- typedef enum { //io_map
- IIS_G1 = 0, //MCLK_PA4, BCLK_PA5, LRC_PA6, DO_PA7, DI_PB3
- IIS_G2 = 1, //MCLK_PE4, BCLK_PE5, LRC_PE6, DO_PE7, DI_PE0
- IIS_G3 = 2, //MCLK_PB4, BCLK_PB0, LRC_PB1, DO_PB2, DI_PB5
- }TYPE_IIS_IO;
- typedef enum { //bit_mode
- IIS_16BIT = 0,
- IIS_32BIT = 1,
- }TYPE_IIS_BIT;
- typedef enum { //data_mode
- IIS_DATA_LEFT_JUSTIFIED = 0, //left-justified mode (data delay 0 clock after WS change)
- IIS_DATA_NORMAL = 1, //IIS normal mode (data delay 1 clock after WS change)
- }TYPE_IIS_DATA_FORMAT;
- //iis一共有可以配置出8种用法
- typedef enum { //iis_mode
- //主机 src 发数据
- IIS_MASTER_SRCTX = (IISCFG_MASTER |IISCFG_TX |IISCFG_SRC),
- //主机 DMA 发数据
- IIS_MASTER_RAMTX = (IISCFG_MASTER |IISCFG_TX |IISCFG_DMA),
- //主机 DMA 收发数据同时
- IIS_MASTER_RAMTX_RAMRX = (IISCFG_MASTER | IISCFG_TX | IISCFG_RX | IISCFG_DMA),
- //主机 SRC发数据 DMA收数据
- IIS_MASTER_SRCTX_RAMRX = (IISCFG_MASTER | IISCFG_TX | IISCFG_SRC | IISCFG_RX | IISCFG_DMA),
- //主机 DMA收数据
- IIS_MASTER_RAMRX = (IISCFG_MASTER | IISCFG_RX | IISCFG_DMA),
- //主机 DMA收数据 (单线模式,DO配置成DI)
- IIS_MASTER_RAMRX_ONEWIRE = (IISCFG_MASTER | IISCFG_RX | IISCFG_DMA |IISCFG_ONEWIRE),
- //从机 DMA收数据
- IIS_SLAVE_RAMRX = IISCFG_RAMRX,
- //从机 DMA收数据 (单线模式,DO配置成DI)
- IIS_SLAVE_RAMRX_ONEWIRE = (IISCFG_RAMRX | IISCFG_ONEWIRE),
- //从机 DMA发数据
- IIS_SLAVE_RAMTX = IISCFG_RAMTX,
- //从机 DMA 收发数据同时
- IIS_SLAVE_RAMTX_RAMRX = (IISCFG_TX | IISCFG_RX | IISCFG_DMA),
- }TYPE_IIS_MODE;
- typedef enum{ //fs指MCLK/LRC // MCLK = fs * LRC
- IIS_MCLK_64FS = 64,
- IIS_MCLK_128FS = 128,
- IIS_MCLK_256FS = 256,
- }TYPE_MCLK_SEL;
- typedef enum{
- IIS_SPR_48000 = 48000,
- IIS_SPR_44100 = 44100,
- IIS_SPR_16000 = 16000,
- }TYPE_SPR_SEL;
- typedef enum{
- IIS_MCLK_OUT_DIS = 0,
- IIS_MCLK_OUT_EN = 1, //只有MASTER模式才可能输出MCLK
- }TYPE_MCLK_OUT_SEL;
- typedef struct {
- u16 samples;
- u16 dmabuf_len;
- u8* dmabuf_ptr; //TX_RX同时存在时前一半是TX,后一版半是RX, 如果只有TX或RX,则全部用于TX或RX
- void(*iis_isr_rx_callbck)(void *buf, u32 samples, bool iis_32bit); //rx_dma收完一个DMA后起中断,可以从buf中取出接收到数据
- void(*iis_isr_tx_callbck)(void *buf, u32 samples, bool iis_32bit); //tx_dma发完一个DMA后起中断,要求向buf中填入数据,以备下一次发送
- u8* txbuf_start_addr;
- u8* rxbuf_start_addr;
- volatile u32 txbuf_idx;
- volatile u32 rxbuf_idx;
- }iis_dma_cfg_t;
- typedef struct {
- u8 mode;
- u8 iomap : 2;
- u8 bit_mode : 1;
- u8 data_mode : 1;
- u8 mclk_out_en : 1;
- u8 dma_en : 1;
- u16 mclk_sel;
- u16 spr_sel;
- //DMA_CFG
- iis_dma_cfg_t dma_cfg;
- }iis_cfg_t;
- typedef struct IIS_MODE_STR_T {
- u8 iis_mode;
- const char * iis_str_info;
- }IIS_MODE_INFO_TBL;
- u32 iis_tx_dma_addr_inc(void);
- u32 iis_rx_dma_addr_inc(void);
- void iis_irq_init(void);
- //API接口函数
- void iis_cfg_init(iis_cfg_t *cfg);
- void iis_start(void);
- void iis_stop(void);
- void bt_aec_process(u8 *ptr, u32 samples, int ch_mode);
- void bt_sco_tx_process(u8 *ptr, u32 samples, int ch_mode);
- void bsp_iis_sco_init(void);
- #endif
|