#ifndef _XC_DRV_CODEC_H_ #define _XC_DRV_CODEC_H_ #if 1 #include "xc6xxx.h" #define CODEC_ADC_FIFO_LEN (3) #define CODEC_DAC_FIFO_LEN (8) typedef void (*codec_finish_callback)(uint8_t); typedef struct { codec_finish_callback codec_adc_receive_finish_callback; codec_finish_callback codec_dac_trans_finish_callback; } codec_finish_callback_t; #define ADINSEL_SINGLE_ENDED 0x01 #define ADINSEL_DIFFERENTIAL_ENDED 0x03 #define ADINSEL_FM 0x04 #define ADINSEL_MIC 0x08 #define JACK_DET_EN 0x40 #define TXFIFO_UNDERFLOW_EN 0x20 #define TXFIFO_OVERFLOW_EN 0x10 #define TXFIFO_DATA_READY_EN 0x08 #define RXFIFO_UNDERFLOW_EN 0x04 #define RXFIFO_OVERFLOW_EN 0x02 #define RXFIFO_DATA_READY_EN 0x01 #define CODEC_DMA_TX_EN 0x20000 #define CODEC_DMA_RX_EN 0x10000 #define __write_hw_reg32(reg,val) ((*reg) = (val)) #define __read_hw_reg32(reg, val) ((val) = (*reg)) #define CPR_M4_NEW_REG1 ((volatile unsigned *)(0x40000000 +0x1B4)) #define CPR_M4_NEW_REG2 ((volatile unsigned *)(0x40000000 +0x1B8)) #define CODEC_BASE 0x50004000 #define CDC_ANA_REG0 ((volatile unsigned *)(CODEC_BASE +0)) #define CDC_ANA_REG1 ((volatile unsigned *)(CODEC_BASE + 0x04)) #define CDC_ANA_REG2 ((volatile unsigned *)(CODEC_BASE + 0x08)) #define CDC_ANA_REG3 ((volatile unsigned *)(CODEC_BASE + 0x0c)) #define CDC_ANA_REG4 ((volatile unsigned *)(CODEC_BASE + 0x10)) #define CDC_ANA_REG5 ((volatile unsigned *)(CODEC_BASE + 0x14)) #define CDC_ANA_REG6 ((volatile unsigned *)(CODEC_BASE + 0x18)) #define CDC_ANA_REG7 ((volatile unsigned *)(CODEC_BASE + 0x1c)) #define CDC_RXFIFO_DATA ((volatile unsigned *)(CODEC_BASE +0x20)) #define CDC_FIFO_STATUS ((volatile unsigned *)(CODEC_BASE +0x24)) #define CDC_DMA_CONFIG ((volatile unsigned *)(CODEC_BASE +0x28)) #define CDC_INT ((volatile unsigned *)(CODEC_BASE +0x2C)) #define CDC_INT_RAW ((volatile unsigned *)(CODEC_BASE +0x30)) #define CDC_INT_EN ((volatile unsigned *)(CODEC_BASE +0x34)) #define CDC_TXFIFO_DATA ((volatile unsigned *)(CODEC_BASE +0x38)) #define buff_UNIT_type_t uint32_t #define LENGTH_BUFFER 16//256 #define BUFFER_UNIT (sizeof(buff_UNIT_type_t)) #define BUFF_NUM 20 /*60seconds contain 3000 frames of 20ms, and every 20ms will be encoded into 20bytes so 1min=60000bytes */ #define ENCODED_FRAME_SIZE 32 #define FRAME_SIZE (32/4) #define _1MIN_SIZE 60000 #define _1MIN_NB_OF_FRAMES (_1MIN_SIZE/ENCODED_FRAME_SIZE) #define MIC_SAMPLING_DEBUG 1 #define USER_KEY_EN 0 // KEY #define PCM_DATA_DEBUG_EN 1 // uart DEBUG pcm data #define CODEC_DEBUG(fmt, ...) //printf(fmt, ##__VA_ARGS__) #define CODEC_DAC_DMA_CHANNEL (DMA_CHANNEL0) #define CODEC_ADC_DMA_CHANNEL (DMA_CHANNEL1) typedef enum { CODEC_MCLK_12M = 0U, CODEC_MCLK_13M = 1U, } Codec_clk_e; typedef enum { STEREO_MONO = 0U, /* Stereo Data Input */ LEFT_MONO = 1U, /* L Mono */ RIGHT_MONO = 2U, /* R Mono */ L_R_AVE_MONO = 3U, /* (L+R)/2 Mono */ } Codec_Mono_e; typedef enum { LRCK_8KHZ = 0U, LRCK_11_025KHZ = 1U, LRCK_12KHZ = 2U, LRCK_16KHZ = 3U, LRCK_22_05KHZ = 4U, LRCK_24KHZ = 5U, LRCK_32KHZ = 6U, LRCK_44_1KHZ = 7U, LRCK_48KHZ = 8U, LRCK_96KHZ = 9U, }Codec_SampleRate_e; typedef enum { RATE_44_1KHZ = 0U, RATE_48KHZ = 1U, RATE_96KHZ = 2U, RATE_OTHERS = 3U, /* Others */ } Codec_Filter_e; typedef enum { SINGLE_LINE_INPUT = 1, // Single Ended Line Input Selection DIFF_INPUT = 3, // Differential Line Input Selection(Default) FM_INPUT = 4, // FM Input Selection MIC_INPUT = 8, // MIC Input Selection } Input_Select_e; typedef enum { MIC1 = 0, // use Mic 0 MIC2 = 1, // use Mic 1 } Mic_INDEX_e; typedef enum { MIC_PGA_GAIN_0DB = 0, MIC_PGA_GAIN_20DB = 1, } Mic_PGA_Gain_e; typedef enum { STO_PGA_GAIN_0DB = 0, STO_PGA_GAIN_1_6DB, STO_PGA_GAIN_3_2DB, STO_PGA_GAIN_4_8DB, STO_PGA_GAIN_6_4DB, STO_PGA_GAIN_8_0DB, STO_PGA_GAIN_9_6DB, STO_PGA_GAIN_11_2DB, STO_PGA_GAIN_12_8DB, STO_PGA_GAIN_14_4DB, STO_PGA_GAIN_16_0DB, STO_PGA_GAIN_17_6DB, STO_PGA_GAIN_19_2DB, STO_PGA_GAIN_20_8DB, STO_PGA_GAIN_22_4DB, STO_PGA_GAIN_MUTE, } STO_PGA_Gain_e; typedef enum { ADC_ANALOG_VOL_0DB = 0, ADC_ANALOG_VOL_1_6DB, ADC_ANALOG_VOL_3_2DB, ADC_ANALOG_VOL_4_8DB, ADC_ANALOG_VOL_6_4DB, ADC_ANALOG_VOL_8_0DB, ADC_ANALOG_VOL_9_6DB, ADC_ANALOG_VOL_11_2DB, ADC_ANALOG_VOL_12_8DB, ADC_ANALOG_VOL_14_4DB, ADC_ANALOG_VOL_16_0DB, ADC_ANALOG_VOL_17_6DB, ADC_ANALOG_VOL_19_2DB, ADC_ANALOG_VOL_20_8DB, ADC_ANALOG_VOL_22_4DB, ADC_ANALOG_VOL_MUTE, } ADC_Analog_Vol_e; typedef enum { DAC_ANALOG_VOL_6DB = 0, /* 6DB */ DAC_ANALOG_VOL_4DB, /* 4DB */ DAC_ANALOG_VOL_2DB, /* 2DB */ DAC_ANALOG_VOL_0DB, /* 0DB */ DAC_ANALOG_VOL_2NDB, /* -2DB */ DAC_ANALOG_VOL_4NDB, /* -4DB */ DAC_ANALOG_VOL_6NDB, /* -6DB */ DAC_ANALOG_VOL_8NDB, /* -8DB */ DAC_ANALOG_VOL_10NDB, /* -10DB */ DAC_ANALOG_VOL_12NDB, /* -12DB */ DAC_ANALOG_VOL_14NDB, /* -14DB */ DAC_ANALOG_VOL_16NDB, /* -16DB */ DAC_ANALOG_VOL_18NDB, /* -18DB */ DAC_ANALOG_VOL_20NDB, /* -20DB */ DAC_ANALOG_VOL_22NDB, /* -22DB */ DAC_ANALOG_VOL_24NDB, /* -24DB */ DAC_ANALOG_VOL_26NDB, /* -26DB */ DAC_ANALOG_VOL_28NDB, /* -28DB */ DAC_ANALOG_VOL_30NDB, /* -30DB */ DAC_ANALOG_VOL_32NDB, /* -32DB */ DAC_ANALOG_VOL_34NDB, /* -34DB */ DAC_ANALOG_VOL_36NDB, /* -36DB */ DAC_ANALOG_VOL_38NDB, /* -38DB */ DAC_ANALOG_VOL_40NDB, /* -40DB */ DAC_ANALOG_VOL_42NDB, /* -42DB */ DAC_ANALOG_VOL_44NDB, /* -44DB */ DAC_ANALOG_VOL_46NDB, /* -46DB */ DAC_ANALOG_VOL_48NDB, /* -48DB */ DAC_ANALOG_VOL_50NDB, /* -50DB */ DAC_ANALOG_VOL_52NDB, /* -52DB */ DAC_ANALOG_VOL_54NDB, /* -54DB */ DAC_ANALOG_VOL_MUTE, /* MUTE */ } DAC_Analog_Vol_e; typedef struct { Codec_clk_e codec_clk; /* codec clk set*/ Input_Select_e input_mode; /* ADC Channel Input Selection */ Codec_SampleRate_e sampleRate; /* ADC sampleRate set */ uint8_t digital_vol; /* ADC Right and Left Channel digital Gain Control:3FH: Max Volume (Step -1.5dB) (0x00: 0dB) */ ADC_Analog_Vol_e analog_vol_r; /* ADC Right Channel PGA Gain Control */ ADC_Analog_Vol_e analog_vol_l; /* ADC Left Channel PGA Gain Control */ Mic_PGA_Gain_e mic_pga_gain; /* ADC Mic-phone Input PGA Gain Control */ STO_PGA_Gain_e sto_pga_gain; /* ADC Sidetone PGA Gain Control */ #ifdef USE_DMA uint32_t transf_size; uint32_t *voice_buffer; #endif } codec_adc_config_t; typedef struct { Codec_clk_e codec_clk; /* codec clk set*/ Codec_Mono_e mono_mode; /* DAC Digital Input Control Signal */ Codec_SampleRate_e sampleRate; /* DAC sampleRate set*/ uint8_t digital_vol_r; /* DAC Right Channel digital Gain Control:80H: Max Volume (Step 1/128) (0x00: 0 * VFS) VFS=AVDD_DA/3.3v, AVDD_DA=2.5v(typ), VFS=2.5/3.3=0.757575...(v) */ uint8_t digital_vol_l; /* DAC Left Channel digital Gain Control:80H: Max Volume (Step 1/128) (0x00: 0 * VFS) VFS=AVDD_DA/3.3v, AVDD_DA=2.5v(typ), VFS=2.5/3.3=0.757575...(v) */ DAC_Analog_Vol_e analog_vol_r; /* DAC Right Channel analog Gain Control:1FH: Max Volume (Step -2dB) (0x00: +6dB) */ DAC_Analog_Vol_e analog_vol_l; /* DAC Left Channel analog Gain Control:1FH: Max Volume (Step -2dB) (0x00: +6dB) */ #ifdef USE_DMA uint32_t transf_size; uint32_t *voice_buffer; #endif } codec_dac_config_t; void xc_codec_clk_disable(uint8_t clk); void xc_codec_adc_init(codec_adc_config_t *cfg); void xc_codec_adc_start(void* cb); void xc_codec_dac_init(codec_dac_config_t *cfg); void xc_codec_dac_start(void* cb); void xc_codec_dac_stop(void); #endif #endif