xref: /btstack/port/esp32/components/btstack/es8388.h (revision 40ba509983b4d9cd253b0cec289d762b1f1ba934)
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