/*
 * drv_aic_i2s.h
 *
 *  Created on: 2016Äê4ÔÂ1ÈÕ
 *      Author: Urey
 */

#ifndef DRIVER_DRV_AIC_I2S_H_
#define DRIVER_DRV_AIC_I2S_H_

#include "board.h"


#ifdef RT_USING_ICODEC
#	define CODEC_AS_MASTER

#define CODEC_DEF_RATE    (24000000)
#else
//#	undef CODEC_AS_MASTER
//#	define CODEC_AS_MASTER

#define CODEC_DEF_RATE    (44100)
#endif

#ifdef RT_USING_ECODEC_WM8978
#	define CFG_AIC_I2S_EXT_CODEC
#endif

#define CFG_AIC_SOC_CLKOUT
//#define CFG_AIC_SOC_CLKIN

#define CFG_I2S_DMA_PAGE_SIZE	(32 * 1024)
#define CFG_I2S_DMA_PAGE_NUM	8

enum
{
    I2S_TRIGGER_STOP  = 0,
    I2S_TRIGGER_START ,
	I2S_TRIGGER_PAUSE_PUSH ,
	I2S_TRIGGER_PAUSE_RELEASE ,
    I2S_TRIGGER_SUSPEND ,
    I2S_TRIGGER_RESUME,
};



/*********************************************************************************************************
**   Êý¾Ý½á¹¹
*********************************************************************************************************/
struct jz_i2s
{
    struct jz_aic   *aic;
    int i2s_init;
#define I2S_WRITE 0x1
#define I2S_READ  0x2
#define I2S_INCODEC (0x1 <<4)
#define I2S_EXCODEC (0x2 <<4)
#define I2S_SLAVE (0x1 << 8)
#define I2S_MASTER (0x2 << 8)
    int i2s_mode;
    uint32_t    tx_dr_base;

	int channels;
	int fmt_width;
	int rates;

    /* used for DMA transform */
    struct rt_dma_channel *tx_dmac;
    struct rt_dma_channel *rx_dmac;
};

/*********************************************************************************************************
**   º¯ÊýÉêÃ÷
*********************************************************************************************************/
int aic_set_rate(struct jz_aic *aic, uint32_t freq);

struct jz_i2s *rt_hw_aic_i2s_init(void);

//void aic_i2s_start_substream(struct jz_i2s *i2s,int stream);
//void aic_i2s_stop_substream(struct jz_i2s *i2s,int stream);
int aic_i2s_set_sysclk(struct jz_i2s *i2s,uint32_t freq);
int aic_i2s_set_clkdiv(struct jz_i2s *i2s,int div_id, int div);
int aic_i2s_startup(struct jz_i2s *i2s,int stream);
int aic_i2s_trigger(struct jz_i2s* i2s,int cmd,int stream);

int aic_i2s_hw_params(struct jz_i2s* i2s,int stream);
void aic_i2s_shutdown(struct jz_i2s *i2s,int stream);

rt_size_t aic_i2s_send(struct jz_i2s *i2s, const void* buffer, rt_size_t size,void (*tx_callback)(void *,void *), void *tx_arg);
rt_size_t aic_i2s_recv(struct jz_i2s *i2s,        void* buffer, rt_size_t size,void (*rx_callback)(void *,void *), void *rx_arg);


void aic_i2s_set_rate(struct jz_i2s *i2s,int rate);
#endif /* DRIVER_DRV_AIC_I2S_H_ */