320 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			320 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | |
| 
 | |
| This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | |
| be copied by any method or incorporated into another program without
 | |
| the express written consent of Aerospace C.Power. This Information or any portion
 | |
| thereof remains the property of Aerospace C.Power. The Information contained herein
 | |
| is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | |
| liability for its use in any way and conveys no license or title under
 | |
| any patent or copyright and makes no representation or warranty that this
 | |
| Information is free from patent or copyright infringement.
 | |
| 
 | |
| ****************************************************************************/
 | |
| 
 | |
| #ifndef _IOT_I2S_API_H
 | |
| #define _IOT_I2S_API_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /** \defgroup BSP_APIs I2S APIs
 | |
|  *  @brief I2S APIs
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /** @addtogroup I2S_APIs
 | |
|  *  @{
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @brief Usage:
 | |
| 
 | |
|     uint32_t iot_dtest_dma_recv(uint8_t *buf, uint32_t len) {
 | |
|         //callback function
 | |
|         ......;
 | |
|     }
 | |
| 
 | |
|     uint32_t iot_dtest_dma_send(uint8_t *buf, uint32_t len) {
 | |
|         // callback function
 | |
|     }
 | |
| 
 | |
|     // prepare i2s config struction, this example is to enable dual-channel
 | |
|     // transfer and receive config
 | |
|     i2s_config_t i2s_cfg = {0};
 | |
| 
 | |
|     i2s_cfg.clk = 44000;
 | |
|     i2s_cfg.type = I2S_TYPE_MSTR_TX | I2S_TYPE_SLAV_RX;
 | |
|     i2s_cfg.bit_mode = I2S_BITS_24BIT;
 | |
|     i2s_cfg.msb_right = I2S_MSB_RIGHT_BIT1;
 | |
| 
 | |
|     i2s_cfg.tx_cfg.data_fmt = I2S_DATA_FMT_DUAL_BIT16;
 | |
|     i2s_cfg.tx_cfg.chl_sel = I2S_CHL_SEL_DUAL;
 | |
|     i2s_cfg.tx_cfg.msb_shift = I2S_SHIFT_PHILIPS_ENA;
 | |
|     i2s_cfg.tx_cfg.tx_desc_num = 8;
 | |
|     i2s_cfg.tx_cfg.send = iot_dtest_dma_send;
 | |
| 
 | |
|     i2s_cfg.rx_cfg.data_fmt = I2S_DATA_FMT_DUAL_BIT16;
 | |
|     i2s_cfg.rx_cfg.chl_sel = I2S_CHL_SEL_DUAL;
 | |
|     i2s_cfg.rx_cfg.msb_shift = I2S_SHIFT_PHILIPS_ENA;
 | |
|     i2s_cfg.rx_cfg.rx_eof_len = 160;
 | |
|     i2s_cfg.rx_cfg.recv = iot_dtest_dma_recv;
 | |
| 
 | |
|     i2s_pin_sel_t pin_master = {8, 9, 10};
 | |
|     i2s_pin_sel_t pin_slave = {22, 23, 28};
 | |
|     i2s_cfg.pin_master = &pin_master;
 | |
|     i2s_cfg.pin_slave = &pin_slave;
 | |
| 
 | |
|     // call init function
 | |
|     if (iot_i2s_module_init(&i2s_cfg)) {
 | |
|         // ... error
 | |
|     }
 | |
| 
 | |
|     // send i2s data
 | |
|     while(1) {
 | |
|         if (iot_i2s_push_pool(data, data_len)) {
 | |
|             // some error, retry
 | |
|         } else {
 | |
|             // send data successful
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
|     // call deinit function
 | |
|     if (iot_i2s_module_deinit(&i2s_cfg)) {
 | |
|         // ... error
 | |
|     }
 | |
|  */
 | |
| #define I2S_MASTER_MODE    0
 | |
| #define I2S_SLAVE_MODE     1
 | |
| 
 | |
| #define I2S_PDM_MASTER_MODE 0
 | |
| #define I2S_PDM_SLAVE_MODE 1
 | |
| 
 | |
| #define STANDARD_MODE  1
 | |
| 
 | |
| #define I2S_DIR_TX    1
 | |
| #define I2S_DIR_RX    0
 | |
| 
 | |
| typedef uint32_t (*iot_i2s_dma_rcv_func) (unsigned char port, uint8_t* buf, uint32_t len);
 | |
| typedef uint32_t (*iot_i2s_dma_send_func) (unsigned char port, uint8_t *buf, uint32_t len,
 | |
|                                               uint8_t seq_num);
 | |
| 
 | |
| typedef enum {
 | |
|     I2S_TYPE_MSTR_TX = 1,
 | |
|     I2S_TYPE_MSTR_RX = 2,
 | |
|     I2S_TYPE_SLAV_TX = 4,
 | |
|     I2S_TYPE_SLAV_RX = 8,
 | |
|     I2S_TYPE_PDM_MODE_MSTR_RX = 0x10,
 | |
|     I2S_TYPE_PDM_MODE_MSTR_TX = 0x20,
 | |
|     I2S_TYPE_PDM_MODE_SLAV_RX = 0x40,
 | |
|     I2S_TYPE_PDM_MODE_SLAV_TX = 0x80,
 | |
| } i2s_type_t;
 | |
| 
 | |
| typedef enum {
 | |
|     I2S_BITS_16BIT = 0,
 | |
|     I2S_BITS_24BIT = 8,
 | |
| } i2s_bits_sample_t;
 | |
| 
 | |
| typedef enum {
 | |
|     I2S_0 = 0,
 | |
|     I2S_1 = 1,
 | |
|     I2S_2 = 2,
 | |
|     I2S_3 = 3,
 | |
|     I2S_4 = 4,
 | |
|     I2S_MAX,
 | |
| } i2s_port_t;
 | |
| 
 | |
| 
 | |
| typedef enum {
 | |
|     I2S_DATA_FMT_DUAL_BIT16 = 0,
 | |
|     I2S_DATA_FMT_SIG_BIT16 = 1,
 | |
|     I2S_DATA_FMT_DUAL_BIT24 = 2,
 | |
|     I2S_DATA_FMT_SIG_BIT24 = 3,
 | |
| } i2s_data_fmt_t;
 | |
| 
 | |
| typedef enum {
 | |
|     I2S_CHL_SEL_DUAL = 0,
 | |
|     I2S_CHL_SEL_SIG_LEFT = 1,
 | |
|     I2S_CHL_SEL_SIG_RIGHT = 2,
 | |
|     I2S_CHL_SEL_SIG_LEFT_REG = 3,
 | |
|     I2S_CHL_SEL_SIG_RIGHT_REG = 4,
 | |
| } i2s_chl_sel_t;
 | |
| 
 | |
| typedef enum {
 | |
|     I2S_MSB_RIGHT_BIT0 = 0,
 | |
|     I2S_MSB_RIGHT_BIT1 = 1,
 | |
| } i2s_msb_right_t;
 | |
| 
 | |
| typedef enum {
 | |
|     I2S_SHIFT_PHILIPS_DIS = 0,
 | |
|     I2S_SHIFT_PHILIPS_ENA =1,
 | |
| } i2s_msb_shift_t;
 | |
| 
 | |
| typedef struct _i2s_pin_sel {
 | |
|     uint8_t bck;
 | |
|     uint8_t ws;
 | |
|     uint8_t data;
 | |
| } i2s_pin_sel_t;
 | |
| 
 | |
| typedef struct _i2s_pdm_dir {
 | |
|     uint8_t dir;
 | |
|     uint8_t mode;
 | |
|     uint8_t phase;
 | |
|     uint8_t hp_bypass;
 | |
|     uint8_t sinc16;
 | |
|     uint8_t rx_hp_dsample;
 | |
|     uint8_t tx_sd_scale;
 | |
|     uint32_t clk;
 | |
|     i2s_pin_sel_t *pin;
 | |
| } i2s_pdm_dir_t;
 | |
| 
 | |
| typedef struct _i2s_tx_cfg {
 | |
|     /** tx descript number */
 | |
|     uint8_t tx_desc_num;
 | |
|     /** tx dma send callback function */
 | |
|     iot_i2s_dma_send_func send;
 | |
|     /** tx channel format */
 | |
|     i2s_data_fmt_t data_fmt;
 | |
|     /** tx channel mode select */
 | |
|     i2s_chl_sel_t chl_sel;
 | |
|     /** set this bit to enable Philips mode */
 | |
|     i2s_msb_shift_t msb_shift;
 | |
| } i2s_tx_cfg_t;
 | |
| 
 | |
| typedef struct _i2s_rx_cfg {
 | |
|     /** rx descript number */
 | |
|     uint8_t rx_desc_num;
 | |
|     /** rx frame length to indicate dma the end */
 | |
|     uint32_t rx_eof_len;
 | |
|     /** rx dma recv callback function */
 | |
|     iot_i2s_dma_rcv_func recv;
 | |
|     /** rx channel format */
 | |
|     i2s_data_fmt_t data_fmt;
 | |
|     /** rx channel mode select */
 | |
|     i2s_chl_sel_t chl_sel;
 | |
|     /** set this bit to enable Philips mode */
 | |
|     i2s_msb_shift_t msb_shift;
 | |
| } i2s_rx_cfg_t;
 | |
| 
 | |
| typedef struct _i2s_config {
 | |
|     uint8_t port;
 | |
|     uint8_t rx_mic_mode;
 | |
|     uint32_t clk;
 | |
|     i2s_type_t type;
 | |
|     i2s_bits_sample_t bit_mode;
 | |
|     i2s_msb_right_t msb_right;
 | |
|     i2s_tx_cfg_t tx_cfg;
 | |
|     i2s_rx_cfg_t rx_cfg;
 | |
|     i2s_pin_sel_t *pin_master;
 | |
|     i2s_pin_sel_t *pin_slave;
 | |
| } i2s_config_t;
 | |
| 
 | |
| typedef struct _i2s_pdm_cfg {
 | |
|     uint8_t port;
 | |
|     uint8_t rx_mic_mode;
 | |
|     i2s_type_t type;
 | |
|     i2s_pdm_dir_t *pdm_tx;
 | |
|     i2s_pdm_dir_t *pdm_rx;
 | |
|     iot_i2s_dma_rcv_func recv;
 | |
|     iot_i2s_dma_send_func send;
 | |
|     uint32_t lphp_filter;
 | |
| } i2s_pdm_cfg_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_i2s_module_init() - i2s module init function
 | |
|  * @param i2c_config:   i2s configure instruction
 | |
|  *
 | |
|  * @return              other -- fail
 | |
|  * @return              0 -- success
 | |
|  *
 | |
|  */
 | |
| uint8_t iot_i2s_module_init(i2s_config_t *cfg);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * @brief iot_i2s_module_deinit() - i2s module deinit function
 | |
|  * @param i2c_config:   i2s configure instruction
 | |
|  *
 | |
|  * @return              other -- fail
 | |
|  * @return              0 -- success
 | |
|  *
 | |
|  */
 | |
| uint8_t iot_i2s_module_deinit(i2s_config_t *cfg);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * @brief iot_i2s_push_pool() - push(write) data to I2S rx buffer
 | |
|  * @param port:         IIS port num
 | |
|  * @param src:          pointer to buffer
 | |
|  * @param size:         the size of data
 | |
|  *
 | |
|  * @return              other -- fail
 | |
|  * @return              ERR_OK -- success
 | |
|  * @return              ERR_BUSY -- ring buffer full
 | |
|  *
 | |
|  */
 | |
| uint8_t iot_i2s_push_pool(uint8_t port, char *src, uint32_t size);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * @brief iot_i2s_start_record() - start I2S's record.
 | |
|  * @param port:         IIS port num
 | |
|  *
 | |
|  * @return              ERR_FAIL -- fail
 | |
|  * @return              ERR_OK -- success
 | |
|  *
 | |
|  */
 | |
| uint8_t iot_i2s_start_record(uint8_t port);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * @brief iot_i2s_pause_record() - pause I2S's record.
 | |
|  * @param port:         IIS port num
 | |
|  *
 | |
|  * @return              ERR_FAIL -- fail
 | |
|  * @return              ERR_OK -- success
 | |
| 
 | |
|  *
 | |
|  */
 | |
| uint8_t iot_i2s_pause_record(uint8_t port);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * @brief iot_i2s_pdm_init() - i2s pdm init function
 | |
|  * @param i2s_pdm_cfg_t i2s configure instruction
 | |
|  *
 | |
|  * @return              other -- fail
 | |
|  * @return              0 -- success
 | |
|  *
 | |
|  */
 | |
| uint8_t iot_i2s_pdm_init(i2s_pdm_cfg_t *cfg);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_i2s_set_mclk() - i2s set mclk
 | |
|  * @param gpio          gpio number
 | |
|  * @param clk           mclk frequency
 | |
|  *
 | |
|  * @return              other -- fail
 | |
|  * @return              0 -- success
 | |
|  *
 | |
|  */
 | |
| uint8_t iot_i2s_set_mclk(uint8_t gpio, uint32_t clk);
 | |
| 
 | |
| /**
 | |
|  * @}
 | |
|  */
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif // _IOT_LOG_API_H
 | |
| 
 |