1*40ba5099Scuichaochao #ifndef ES8388_H 2*40ba5099Scuichaochao 3*40ba5099Scuichaochao #define ES8388_H 4*40ba5099Scuichaochao 5*40ba5099Scuichaochao #include "esp_types.h" 6*40ba5099Scuichaochao #include "driver/i2c.h" 7*40ba5099Scuichaochao 8*40ba5099Scuichaochao /* ES8388 address */ 9*40ba5099Scuichaochao #define ES8388_ADDR 0x20 // 0x22:CE=1;0x20:CE=0 10*40ba5099Scuichaochao 11*40ba5099Scuichaochao /* ES8388 register */ 12*40ba5099Scuichaochao #define ES8388_CONTROL1 0x00 13*40ba5099Scuichaochao #define ES8388_CONTROL2 0x01 14*40ba5099Scuichaochao 15*40ba5099Scuichaochao #define ES8388_CHIPPOWER 0x02 16*40ba5099Scuichaochao 17*40ba5099Scuichaochao #define ES8388_ADCPOWER 0x03 18*40ba5099Scuichaochao #define ES8388_DACPOWER 0x04 19*40ba5099Scuichaochao 20*40ba5099Scuichaochao #define ES8388_CHIPLOPOW1 0x05 21*40ba5099Scuichaochao #define ES8388_CHIPLOPOW2 0x06 22*40ba5099Scuichaochao 23*40ba5099Scuichaochao #define ES8388_ANAVOLMANAG 0x07 24*40ba5099Scuichaochao 25*40ba5099Scuichaochao #define ES8388_MASTERMODE 0x08 26*40ba5099Scuichaochao /* ADC */ 27*40ba5099Scuichaochao #define ES8388_ADCCONTROL1 0x09 28*40ba5099Scuichaochao #define ES8388_ADCCONTROL2 0x0a 29*40ba5099Scuichaochao #define ES8388_ADCCONTROL3 0x0b 30*40ba5099Scuichaochao #define ES8388_ADCCONTROL4 0x0c 31*40ba5099Scuichaochao #define ES8388_ADCCONTROL5 0x0d 32*40ba5099Scuichaochao #define ES8388_ADCCONTROL6 0x0e 33*40ba5099Scuichaochao #define ES8388_ADCCONTROL7 0x0f 34*40ba5099Scuichaochao #define ES8388_ADCCONTROL8 0x10 35*40ba5099Scuichaochao #define ES8388_ADCCONTROL9 0x11 36*40ba5099Scuichaochao #define ES8388_ADCCONTROL10 0x12 37*40ba5099Scuichaochao #define ES8388_ADCCONTROL11 0x13 38*40ba5099Scuichaochao #define ES8388_ADCCONTROL12 0x14 39*40ba5099Scuichaochao #define ES8388_ADCCONTROL13 0x15 40*40ba5099Scuichaochao #define ES8388_ADCCONTROL14 0x16 41*40ba5099Scuichaochao /* DAC */ 42*40ba5099Scuichaochao #define ES8388_DACCONTROL1 0x17 43*40ba5099Scuichaochao #define ES8388_DACCONTROL2 0x18 44*40ba5099Scuichaochao #define ES8388_DACCONTROL3 0x19 45*40ba5099Scuichaochao #define ES8388_DACCONTROL4 0x1a 46*40ba5099Scuichaochao #define ES8388_DACCONTROL5 0x1b 47*40ba5099Scuichaochao #define ES8388_DACCONTROL6 0x1c 48*40ba5099Scuichaochao #define ES8388_DACCONTROL7 0x1d 49*40ba5099Scuichaochao #define ES8388_DACCONTROL8 0x1e 50*40ba5099Scuichaochao #define ES8388_DACCONTROL9 0x1f 51*40ba5099Scuichaochao #define ES8388_DACCONTROL10 0x20 52*40ba5099Scuichaochao #define ES8388_DACCONTROL11 0x21 53*40ba5099Scuichaochao #define ES8388_DACCONTROL12 0x22 54*40ba5099Scuichaochao #define ES8388_DACCONTROL13 0x23 55*40ba5099Scuichaochao #define ES8388_DACCONTROL14 0x24 56*40ba5099Scuichaochao #define ES8388_DACCONTROL15 0x25 57*40ba5099Scuichaochao #define ES8388_DACCONTROL16 0x26 58*40ba5099Scuichaochao #define ES8388_DACCONTROL17 0x27 59*40ba5099Scuichaochao #define ES8388_DACCONTROL18 0x28 60*40ba5099Scuichaochao #define ES8388_DACCONTROL19 0x29 61*40ba5099Scuichaochao #define ES8388_DACCONTROL20 0x2a 62*40ba5099Scuichaochao #define ES8388_DACCONTROL21 0x2b 63*40ba5099Scuichaochao #define ES8388_DACCONTROL22 0x2c 64*40ba5099Scuichaochao #define ES8388_DACCONTROL23 0x2d 65*40ba5099Scuichaochao #define ES8388_DACCONTROL24 0x2e 66*40ba5099Scuichaochao #define ES8388_DACCONTROL25 0x2f 67*40ba5099Scuichaochao #define ES8388_DACCONTROL26 0x30 68*40ba5099Scuichaochao #define ES8388_DACCONTROL27 0x31 69*40ba5099Scuichaochao #define ES8388_DACCONTROL28 0x32 70*40ba5099Scuichaochao #define ES8388_DACCONTROL29 0x33 71*40ba5099Scuichaochao #define ES8388_DACCONTROL30 0x34 72*40ba5099Scuichaochao 73*40ba5099Scuichaochao typedef enum { 74*40ba5099Scuichaochao ES_MODULE_MIN = -1, 75*40ba5099Scuichaochao ES_MODULE_ADC = 0x01, 76*40ba5099Scuichaochao ES_MODULE_DAC = 0x02, 77*40ba5099Scuichaochao ES_MODULE_ADC_DAC = 0x03, 78*40ba5099Scuichaochao ES_MODULE_LINE = 0x04, 79*40ba5099Scuichaochao ES_MODULE_MAX 80*40ba5099Scuichaochao } es_codec_module_t; 81*40ba5099Scuichaochao 82*40ba5099Scuichaochao typedef enum { 83*40ba5099Scuichaochao ES_ = -1, 84*40ba5099Scuichaochao ES_I2S_NORMAL = 0, 85*40ba5099Scuichaochao ES_I2S_LEFT = 1, 86*40ba5099Scuichaochao ES_I2S_RIGHT = 2, 87*40ba5099Scuichaochao ES_I2S_DSP = 3, 88*40ba5099Scuichaochao ES_I2S_MAX 89*40ba5099Scuichaochao } es_codec_i2s_fmt_t; 90*40ba5099Scuichaochao 91*40ba5099Scuichaochao typedef enum { 92*40ba5099Scuichaochao MclkDiv_MIN = -1, 93*40ba5099Scuichaochao MclkDiv_1 = 1, 94*40ba5099Scuichaochao MclkDiv_2 = 2, 95*40ba5099Scuichaochao MclkDiv_3 = 3, 96*40ba5099Scuichaochao MclkDiv_4 = 4, 97*40ba5099Scuichaochao MclkDiv_6 = 5, 98*40ba5099Scuichaochao MclkDiv_8 = 6, 99*40ba5099Scuichaochao MclkDiv_9 = 7, 100*40ba5099Scuichaochao MclkDiv_11 = 8, 101*40ba5099Scuichaochao MclkDiv_12 = 9, 102*40ba5099Scuichaochao MclkDiv_16 = 10, 103*40ba5099Scuichaochao MclkDiv_18 = 11, 104*40ba5099Scuichaochao MclkDiv_22 = 12, 105*40ba5099Scuichaochao MclkDiv_24 = 13, 106*40ba5099Scuichaochao MclkDiv_33 = 14, 107*40ba5099Scuichaochao MclkDiv_36 = 15, 108*40ba5099Scuichaochao MclkDiv_44 = 16, 109*40ba5099Scuichaochao MclkDiv_48 = 17, 110*40ba5099Scuichaochao MclkDiv_66 = 18, 111*40ba5099Scuichaochao MclkDiv_72 = 19, 112*40ba5099Scuichaochao MclkDiv_5 = 20, 113*40ba5099Scuichaochao MclkDiv_10 = 21, 114*40ba5099Scuichaochao MclkDiv_15 = 22, 115*40ba5099Scuichaochao MclkDiv_17 = 23, 116*40ba5099Scuichaochao MclkDiv_20 = 24, 117*40ba5099Scuichaochao MclkDiv_25 = 25, 118*40ba5099Scuichaochao MclkDiv_30 = 26, 119*40ba5099Scuichaochao MclkDiv_32 = 27, 120*40ba5099Scuichaochao MclkDiv_34 = 28, 121*40ba5099Scuichaochao MclkDiv_7 = 29, 122*40ba5099Scuichaochao MclkDiv_13 = 30, 123*40ba5099Scuichaochao MclkDiv_14 = 31, 124*40ba5099Scuichaochao MclkDiv_MAX, 125*40ba5099Scuichaochao } sclk_div_t; 126*40ba5099Scuichaochao 127*40ba5099Scuichaochao typedef enum { 128*40ba5099Scuichaochao LclkDiv_MIN = -1, 129*40ba5099Scuichaochao LclkDiv_128 = 0, 130*40ba5099Scuichaochao LclkDiv_192 = 1, 131*40ba5099Scuichaochao LclkDiv_256 = 2, 132*40ba5099Scuichaochao LclkDiv_384 = 3, 133*40ba5099Scuichaochao LclkDiv_512 = 4, 134*40ba5099Scuichaochao LclkDiv_576 = 5, 135*40ba5099Scuichaochao LclkDiv_768 = 6, 136*40ba5099Scuichaochao LclkDiv_1024 = 7, 137*40ba5099Scuichaochao LclkDiv_1152 = 8, 138*40ba5099Scuichaochao LclkDiv_1408 = 9, 139*40ba5099Scuichaochao LclkDiv_1536 = 10, 140*40ba5099Scuichaochao LclkDiv_2112 = 11, 141*40ba5099Scuichaochao LclkDiv_2304 = 12, 142*40ba5099Scuichaochao 143*40ba5099Scuichaochao LclkDiv_125 = 16, 144*40ba5099Scuichaochao LclkDiv_136 = 17, 145*40ba5099Scuichaochao LclkDiv_250 = 18, 146*40ba5099Scuichaochao LclkDiv_272 = 19, 147*40ba5099Scuichaochao LclkDiv_375 = 20, 148*40ba5099Scuichaochao LclkDiv_500 = 21, 149*40ba5099Scuichaochao LclkDiv_544 = 22, 150*40ba5099Scuichaochao LclkDiv_750 = 23, 151*40ba5099Scuichaochao LclkDiv_1000 = 24, 152*40ba5099Scuichaochao LclkDiv_1088 = 25, 153*40ba5099Scuichaochao LclkDiv_1496 = 26, 154*40ba5099Scuichaochao LclkDiv_1500 = 27, 155*40ba5099Scuichaochao LclkDiv_MAX, 156*40ba5099Scuichaochao } lclk_div_t; 157*40ba5099Scuichaochao 158*40ba5099Scuichaochao 159*40ba5099Scuichaochao typedef struct { 160*40ba5099Scuichaochao sclk_div_t sclk_div; 161*40ba5099Scuichaochao lclk_div_t lclk_div; 162*40ba5099Scuichaochao } es_codec_i2s_clock_t; 163*40ba5099Scuichaochao 164*40ba5099Scuichaochao typedef enum { 165*40ba5099Scuichaochao BIT_LENGTH_MIN = -1, 166*40ba5099Scuichaochao BIT_LENGTH_16BITS = 0x03, 167*40ba5099Scuichaochao BIT_LENGTH_18BITS = 0x02, 168*40ba5099Scuichaochao BIT_LENGTH_20BITS = 0x01, 169*40ba5099Scuichaochao BIT_LENGTH_24BITS = 0x00, 170*40ba5099Scuichaochao BIT_LENGTH_32BITS = 0x04, 171*40ba5099Scuichaochao BIT_LENGTH_MAX, 172*40ba5099Scuichaochao } es_codec_bits_len_t; 173*40ba5099Scuichaochao 174*40ba5099Scuichaochao typedef enum { 175*40ba5099Scuichaochao MIC_GAIN_MIN = -1, 176*40ba5099Scuichaochao MIC_GAIN_0DB = 0, 177*40ba5099Scuichaochao MIC_GAIN_3DB = 3, 178*40ba5099Scuichaochao MIC_GAIN_6DB = 6, 179*40ba5099Scuichaochao MIC_GAIN_9DB = 9, 180*40ba5099Scuichaochao MIC_GAIN_12DB = 12, 181*40ba5099Scuichaochao MIC_GAIN_15DB = 15, 182*40ba5099Scuichaochao MIC_GAIN_18DB = 18, 183*40ba5099Scuichaochao MIC_GAIN_21DB = 21, 184*40ba5099Scuichaochao MIC_GAIN_24DB = 24, 185*40ba5099Scuichaochao MIC_GAIN_MAX, 186*40ba5099Scuichaochao } es_codec_mic_gain_t; 187*40ba5099Scuichaochao 188*40ba5099Scuichaochao 189*40ba5099Scuichaochao 190*40ba5099Scuichaochao typedef enum { 191*40ba5099Scuichaochao DAC_OUTPUT_MIN = -1, 192*40ba5099Scuichaochao DAC_OUTPUT_LOUT1 = 0x04, 193*40ba5099Scuichaochao DAC_OUTPUT_LOUT2 = 0x08, 194*40ba5099Scuichaochao DAC_OUTPUT_SPK = 0x09, 195*40ba5099Scuichaochao DAC_OUTPUT_ROUT1 = 0x10, 196*40ba5099Scuichaochao DAC_OUTPUT_ROUT2 = 0x20, 197*40ba5099Scuichaochao DAC_OUTPUT_ALL = 0x3c, 198*40ba5099Scuichaochao DAC_OUTPUT_MAX, 199*40ba5099Scuichaochao } es_codec_dac_output_t; 200*40ba5099Scuichaochao 201*40ba5099Scuichaochao typedef enum { 202*40ba5099Scuichaochao ADC_INPUT_MIN = -1, 203*40ba5099Scuichaochao ADC_INPUT_LINPUT1_RINPUT1 = 0x00, 204*40ba5099Scuichaochao ADC_INPUT_MIC1 = 0x05, 205*40ba5099Scuichaochao ADC_INPUT_MIC2 = 0x06, 206*40ba5099Scuichaochao ADC_INPUT_LINPUT2_RINPUT2 = 0x50, 207*40ba5099Scuichaochao ADC_INPUT_DIFFERENCE = 0xf0, 208*40ba5099Scuichaochao ADC_INPUT_MAX, 209*40ba5099Scuichaochao } es_codec_adc_input_t; 210*40ba5099Scuichaochao 211*40ba5099Scuichaochao 212*40ba5099Scuichaochao typedef enum { 213*40ba5099Scuichaochao ES_MODE_MIN = -1, 214*40ba5099Scuichaochao ES_MODE_SLAVE = 0x00, 215*40ba5099Scuichaochao ES_MODE_MASTER = 0x01, 216*40ba5099Scuichaochao ES_MODE_MAX, 217*40ba5099Scuichaochao } es_codec_mode_t; 218*40ba5099Scuichaochao 219*40ba5099Scuichaochao typedef struct { 220*40ba5099Scuichaochao es_codec_mode_t es_mode; 221*40ba5099Scuichaochao i2c_port_t i2c_port_num; 222*40ba5099Scuichaochao i2c_config_t i2c_cfg; 223*40ba5099Scuichaochao es_codec_dac_output_t dac_output; 224*40ba5099Scuichaochao es_codec_adc_input_t adc_input; 225*40ba5099Scuichaochao } es8388_config_t; 226*40ba5099Scuichaochao 227*40ba5099Scuichaochao 228*40ba5099Scuichaochao #define AUDIO_CODEC_ES8388_DEFAULT(){ \ 229*40ba5099Scuichaochao .es_mode = ES_MODE_SLAVE, \ 230*40ba5099Scuichaochao .i2c_port_num = I2C_NUM_0, \ 231*40ba5099Scuichaochao .i2c_cfg = { \ 232*40ba5099Scuichaochao .mode = I2C_MODE_MASTER, \ 233*40ba5099Scuichaochao .sda_io_num = IIC_DATA, \ 234*40ba5099Scuichaochao .scl_io_num = IIC_CLK, \ 235*40ba5099Scuichaochao .sda_pullup_en = GPIO_PULLUP_ENABLE,\ 236*40ba5099Scuichaochao .scl_pullup_en = GPIO_PULLUP_ENABLE,\ 237*40ba5099Scuichaochao .master.clk_speed = 100000\ 238*40ba5099Scuichaochao }, \ 239*40ba5099Scuichaochao .adc_input= ADC_INPUT_LINPUT1_RINPUT1,\ 240*40ba5099Scuichaochao .dac_output = DAC_OUTPUT_LOUT1 | DAC_OUTPUT_LOUT2 | DAC_OUTPUT_ROUT1 | DAC_OUTPUT_ROUT2,\ 241*40ba5099Scuichaochao }; 242*40ba5099Scuichaochao 243*40ba5099Scuichaochao int es8388_init(es8388_config_t *cfg); 244*40ba5099Scuichaochao void es8388_uninit(); 245*40ba5099Scuichaochao 246*40ba5099Scuichaochao int es8388_config_fmt(es_codec_module_t mode, es_codec_i2s_fmt_t fmt); 247*40ba5099Scuichaochao 248*40ba5099Scuichaochao int es8388_i2s_config_clock(es_codec_i2s_clock_t cfg); 249*40ba5099Scuichaochao int es8388_set_bits_per_sample(es_codec_module_t mode, es_codec_bits_len_t bits); 250*40ba5099Scuichaochao 251*40ba5099Scuichaochao int es8388_start(es_codec_module_t mode); 252*40ba5099Scuichaochao int es8388_stop(es_codec_module_t mode); 253*40ba5099Scuichaochao 254*40ba5099Scuichaochao int es8388_set_volume(int volume); 255*40ba5099Scuichaochao int es8388_get_volume(int *volume); 256*40ba5099Scuichaochao 257*40ba5099Scuichaochao int es8388_set_mute(int enable); 258*40ba5099Scuichaochao int es8388_get_mute(int *enable); 259*40ba5099Scuichaochao int es8388_set_mic_gain(es_codec_mic_gain_t gain); 260*40ba5099Scuichaochao 261*40ba5099Scuichaochao int es8388_set_adc_input(es_codec_adc_input_t input); 262*40ba5099Scuichaochao int es8388_set_dac_ouput(es_codec_dac_output_t output); 263*40ba5099Scuichaochao void es8388_pa_power(bool enable); 264*40ba5099Scuichaochao 265*40ba5099Scuichaochao 266*40ba5099Scuichaochao #endif 267