arduino-audio-driver
Loading...
Searching...
No Matches
ES8388.h
Go to the documentation of this file.
1/*
2 * ESPRESSIF MIT License
3 *
4 * Copyright (c) 2018 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
5 *
6 * Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in
7 * which case, it is free of charge, to any person obtaining a copy of this
8 * software and associated documentation files (the "Software"), to deal in the
9 * Software without restriction, including without limitation the rights to use,
10 * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 * the Software, and to permit persons to whom the Software is furnished to do
12 * so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 */
26
27#pragma once
28
30#include "DriverCommon.h"
31#include "Platforms/API_I2C.h"
32#include "stdbool.h"
33#include <string.h>
34
35
36namespace audio_driver {
37
48
58
64class ES8388 {
65 public:
66 static constexpr int ES8388_ADDR = 0x10;
67 static constexpr uint8_t ES8388_CONTROL1 = 0x00;
68 static constexpr uint8_t ES8388_CONTROL2 = 0x01;
69 static constexpr uint8_t ES8388_CHIPPOWER = 0x02;
70 static constexpr uint8_t ES8388_ADCPOWER = 0x03;
71 static constexpr uint8_t ES8388_DACPOWER = 0x04;
72 static constexpr uint8_t ES8388_CHIPLOPOW1 = 0x05;
73 static constexpr uint8_t ES8388_CHIPLOPOW2 = 0x06;
74 static constexpr uint8_t ES8388_ANAVOLMANAG = 0x07;
75 static constexpr uint8_t ES8388_MASTERMODE = 0x08;
76 static constexpr uint8_t ES8388_ADCCONTROL1 = 0x09;
77 static constexpr uint8_t ES8388_ADCCONTROL2 = 0x0a;
78 static constexpr uint8_t ES8388_ADCCONTROL3 = 0x0b;
79 static constexpr uint8_t ES8388_ADCCONTROL4 = 0x0c;
80 static constexpr uint8_t ES8388_ADCCONTROL5 = 0x0d;
81 static constexpr uint8_t ES8388_ADCCONTROL6 = 0x0e;
82 static constexpr uint8_t ES8388_ADCCONTROL7 = 0x0f;
83 static constexpr uint8_t ES8388_ADCCONTROL8 = 0x10;
84 static constexpr uint8_t ES8388_ADCCONTROL9 = 0x11;
85 static constexpr uint8_t ES8388_ADCCONTROL10 = 0x12;
86 static constexpr uint8_t ES8388_ADCCONTROL11 = 0x13;
87 static constexpr uint8_t ES8388_ADCCONTROL12 = 0x14;
88 static constexpr uint8_t ES8388_ADCCONTROL13 = 0x15;
89 static constexpr uint8_t ES8388_ADCCONTROL14 = 0x16;
90 static constexpr uint8_t ES8388_DACCONTROL1 = 0x17;
91 static constexpr uint8_t ES8388_DACCONTROL2 = 0x18;
92 static constexpr uint8_t ES8388_DACCONTROL3 = 0x19;
93 static constexpr uint8_t ES8388_DACCONTROL4 = 0x1a;
94 static constexpr uint8_t ES8388_DACCONTROL5 = 0x1b;
95 static constexpr uint8_t ES8388_DACCONTROL6 = 0x1c;
96 static constexpr uint8_t ES8388_DACCONTROL7 = 0x1d;
97 static constexpr uint8_t ES8388_DACCONTROL8 = 0x1e;
98 static constexpr uint8_t ES8388_DACCONTROL9 = 0x1f;
99 static constexpr uint8_t ES8388_DACCONTROL10 = 0x20;
100 static constexpr uint8_t ES8388_DACCONTROL11 = 0x21;
101 static constexpr uint8_t ES8388_DACCONTROL12 = 0x22;
102 static constexpr uint8_t ES8388_DACCONTROL13 = 0x23;
103 static constexpr uint8_t ES8388_DACCONTROL14 = 0x24;
104 static constexpr uint8_t ES8388_DACCONTROL15 = 0x25;
105 static constexpr uint8_t ES8388_DACCONTROL16 = 0x26;
106 static constexpr uint8_t ES8388_DACCONTROL17 = 0x27;
107 static constexpr uint8_t ES8388_DACCONTROL18 = 0x28;
108 static constexpr uint8_t ES8388_DACCONTROL19 = 0x29;
109 static constexpr uint8_t ES8388_DACCONTROL20 = 0x2a;
110 static constexpr uint8_t ES8388_DACCONTROL21 = 0x2b;
111 static constexpr uint8_t ES8388_DACCONTROL22 = 0x2c;
112 static constexpr uint8_t ES8388_DACCONTROL23 = 0x2d;
113 static constexpr uint8_t ES8388_DACCONTROL24 = 0x2e;
114 static constexpr uint8_t ES8388_DACCONTROL25 = 0x2f;
115 static constexpr uint8_t ES8388_DACCONTROL26 = 0x30;
116 static constexpr uint8_t ES8388_DACCONTROL27 = 0x31;
117 static constexpr uint8_t ES8388_DACCONTROL28 = 0x32;
118 static constexpr uint8_t ES8388_DACCONTROL29 = 0x33;
119 static constexpr uint8_t ES8388_DACCONTROL30 = 0x34;
120 ES8388() = default;
121
123 void setWire(i2c_bus_handle_t handle) { i2c_handle = handle; }
124
126 void setAddress(int addr) {
127 if (addr > 0) i2c_addr = addr;
128 }
129
131 void setVolumeHack(int volumeHack) { volume_hack = volumeHack; }
132
134 int getVolumeHack() { return volume_hack; }
135
137 void readAll() {
138 AD_TRACED();
139 for (int i = 0; i < 50; i++) {
140 uint8_t reg = 0;
141 readReg(i, &reg);
142 AD_LOGI("%x: %x", i, reg);
143 }
144 }
145
147 error_t setVoiceMute(bool enable) {
148 AD_TRACED();
149 error_t res = RESULT_OK;
150 uint8_t reg = 0;
151 res = readReg(ES8388_DACCONTROL3, &reg);
152 reg = reg & 0xC3; // keep 11000011
153 int value = enable ? 0x3C : 0; // enable is 00111100 / disable is 00000000
154 res |= writeReg(ES8388_DACCONTROL3, value | reg);
155 return res;
156 }
157
160 AD_TRACED();
161 error_t res = RESULT_OK;
162 uint8_t reg = 0;
163 res = readReg(ES8388_DACCONTROL3, &reg);
164 if (res == RESULT_OK) {
165 reg = (reg & 0x04) >> 2;
166 }
167 return res == RESULT_OK ? reg : res;
168 }
169
172 AD_LOGD("es8388_set_mic_gain: %d", gain);
173 error_t res, gain_n;
174 gain_n = (int)gain / 3;
175 gain_n = (gain_n << 4) + gain_n;
176 res = writeReg(ES8388_ADCCONTROL1, gain_n); // MIC PGA
177 return res;
178 }
179
185 switch (volume_hack) {
186 case 0:
187 return setVoiceVolume0(volume);
188 case 1:
189 return setVoiceVolume1(volume);
190 case 2:
191 return setVoiceVolume2(volume);
192 default:
193 return setVoiceVolume0(volume);
194 }
195 }
196
198 error_t getVoiceVolume(int* volume) {
199 AD_TRACED();
200 error_t res = RESULT_OK;
201 uint8_t reg = 0;
202 res = readReg(ES8388_DACCONTROL24, &reg);
203 if (res == RESULT_FAIL) {
204 *volume = 0;
205 } else {
206 *volume = reg;
207 *volume *= 3;
208 if (*volume == 99) *volume = 100;
209 }
210 return res;
211 }
212
215 AD_TRACED();
216 error_t res;
217 uint8_t reg = 0;
218 res = readReg(ES8388_ADCCONTROL2, &reg);
219 reg = reg & 0x0f;
220 res |= writeReg(ES8388_ADCCONTROL2, reg | input);
221 return res;
222 }
223
226 AD_TRACED();
227 AD_LOGI("output_device: %d", output_device);
228
229 uint8_t reg = 0;
230 error_t res = readReg(ES8388_DACPOWER, &reg);
231 reg = reg & 0xC3; // keep 11000011
232
233 uint8_t value = 0;
234 switch (output_device) {
235 case DAC_OUTPUT_LINE1:
237 AD_LOGI("DAC_OUTPUT_LINE2: 0x%x", reg | value);
238 break;
239 case DAC_OUTPUT_LINE2:
241 AD_LOGI("DAC_OUTPUT_LINE1: 0x%x", reg | value);
242 break;
243 case DAC_OUTPUT_ALL:
246 AD_LOGI("DAC_OUTPUT_ALL: 0x%x", reg | value);
247 break;
248 case DAC_OUTPUT_NONE:
249 value = 0;
250 AD_LOGI("DAC_OUTPUT_NONE: 0x%x", reg | value);
251 break;
252 }
253 res |= writeReg(ES8388_DACPOWER, reg | value);
254 return res;
255 }
256
266 AD_TRACED();
267 error_t res = RESULT_OK;
268
269 // select LIN1/RIN1 or LIN2/RIN2 as source for the output mixer
270 uint8_t mixer_sel = 0x00;
271 switch (in) {
272 case ADC_INPUT_LINE1:
273 mixer_sel = 0x00; // LIN1/RIN1
274 break;
275 case ADC_INPUT_LINE2:
276 mixer_sel = 0x09; // LIN2/RIN2
277 break;
278 default:
279 AD_LOGE("route: unsupported input %d", in);
280 return RESULT_FAIL;
281 }
282 res |= writeReg(ES8388_DACCONTROL16, mixer_sel);
283
284 // enable input -> mixer path at 0dB (left and right)
285 res |= writeReg(ES8388_DACCONTROL17, 0x50);
286 res |= writeReg(ES8388_DACCONTROL20, 0x50);
287
288 // power up the requested outputs
289 uint8_t reg = 0;
290 res |= readReg(ES8388_DACPOWER, &reg);
291 reg = reg & 0xC3; // keep reserved bits
292
293 uint8_t value = 0;
294 switch (out) {
295 case DAC_OUTPUT_LINE1:
297 break;
298 case DAC_OUTPUT_LINE2:
300 break;
301 case DAC_OUTPUT_ALL:
302 value = ES8388_OUTPUT_ALL;
303 break;
304 case DAC_OUTPUT_NONE:
305 default:
306 value = 0;
307 break;
308 }
309 res |= writeReg(ES8388_DACPOWER, reg | value);
310
311 // set the output volumes to 4.5dB
312 if (out == DAC_OUTPUT_LINE1 || out == DAC_OUTPUT_ALL) {
313 res |= writeReg(ES8388_DACCONTROL24, 0x21);
314 res |= writeReg(ES8388_DACCONTROL25, 0x21);
315 }
316 if (out == DAC_OUTPUT_LINE2 || out == DAC_OUTPUT_ALL) {
317 res |= writeReg(ES8388_DACCONTROL26, 0x21);
318 res |= writeReg(ES8388_DACCONTROL27, 0x21);
319 }
320
321 return res;
322 }
323
326
329 AD_TRACED();
330 error_t res = RESULT_OK;
331 int tmp = 0;
332 res |= configFmt(CODEC_MODE_BOTH, iface->fmt);
333 if (iface->bits == BIT_LENGTH_16BITS) {
334 tmp = BIT_LENGTH_16BITS;
335 } else if (iface->bits == BIT_LENGTH_24BITS) {
336 tmp = BIT_LENGTH_24BITS;
337 } else {
338 tmp = BIT_LENGTH_32BITS;
339 }
341 return res;
342 }
343
345 error_t init(codec_config_t* cfg, int volumeHack) {
346 AD_TRACED();
347 volume_hack = volumeHack;
348
349 int res = 0;
350
352 0x04); // 0x04 mute/0x00 unmute&ramp;DAC unmute and
353 // disabled digital volume control soft ramp
354 /* Chip Control and Power Management */
355 res |= writeReg(ES8388_CONTROL2, 0x50);
356 res |= writeReg(ES8388_CHIPPOWER, 0x00); // normal all and power up all
357
358 // Disable the internal DLL to improve 8K sample rate
359 res |= writeReg(0x35, 0xA0);
360 res |= writeReg(0x37, 0xD0);
361 res |= writeReg(0x39, 0xD0);
362
364 cfg->i2s.mode); // CODEC IN I2S SLAVE MODE
365
366 /* dac */
368 0xC0); // disable DAC and disable Lout/Rout/1/2
369 res |= writeReg(
371 0x12); // Enfr=0,Play&Record Mode,(0x17-both of mic&paly)
372 // res |= writeReg(ES8388_CONTROL2, 0);
373 // //LPVrefBuf=0,Pdn_ana=0
375 0x18); // 1a 0x18:16bit iis , 0x00:24
377 0x02); // DACFsMode,SINGLE SPEED; DACFsRatio,256
379 0x00); // 0x00 audio on LIN1&RIN1, 0x09 LIN2&RIN2
381 0x90); // only left DAC to left mixer enable 0db
383 0x90); // only right DAC to right mixer enable 0db
385 0x80); // set internal ADC and DAC use the same LRCK
386 // clock, ADC LRCK as internal LRCK
387 res |= writeReg(ES8388_DACCONTROL23, 0x00); // vroi=0
388 res |= setAdcDacVolume(CODEC_MODE_DECODE, 0, 0); // 0db
389 dac_power = 0;
390 AD_LOGI("output_device: %d", cfg->output_device);
391 if (DAC_OUTPUT_LINE1 == cfg->output_device) {
393 } else if (DAC_OUTPUT_LINE2 == cfg->output_device) {
395 } else if (DAC_OUTPUT_ALL == cfg->output_device) {
398 }
399 res |= writeReg(
401 dac_power); // 0x3c Enable DAC and Enable Lout/Rout/1/2
402 /* adc */
403 res |= writeReg(ES8388_ADCPOWER, 0xFF);
404
405 // // AudioDriver: WORKAROUND_MIC_LINEIN_MIXED
407 // TODO
408 // if (WORKAROUND_MIC_LINEIN_MIXED ){
409 // // logic for Audiokit: line 1 does not work, so we also use line2
410 // but with a different gain if (ADC_INPUT_LINE1 ==
411 // cfg->input_device){
412 // mic_gain = (es_mic_gain_t)WORKAROUND_ES8388_LINE1_GAIN;
413 // cfg->input_device= ADC_INPUT_LINE2;
414 // }
415 // }
416 // res |= writeReg(ES8388_ADCCONTROL1, 0xbb); // MIC Left and
417 // Right channel PGA gain res |= writeReg(ES8388_ADCCONTROL1,
418 // ES8388_DEFAULT_INPUT_GAIN); // MIC Left and Right channel PGA gain
419 res |= setMicGain(mic_gain);
420 int tmp = 0;
421 if (ADC_INPUT_LINE1 == cfg->input_device) {
423 } else if (ADC_INPUT_LINE2 == cfg->input_device) {
425 } else {
427 }
429 tmp); // 0x00 LINSEL & RINSEL, LIN1/RIN1 as ADC Input;
430 // DSSEL,use one DS Reg11; DSR, LINPUT1-RINPUT1
431 res |= writeReg(ES8388_ADCCONTROL3, 0x02);
433 0x0d); // Left/Right data, Left/Right justified mode,
434 // Bits length, I2S format
436 0x02); // ADCFsMode,singel SPEED,RATIO=256
437 // ALC for Microphone
438 res |= setAdcDacVolume(CODEC_MODE_ENCODE, 0, 0); // 0db
440 0x09); // Power on ADC, Enable LIN&RIN, Power off
441 // MICBIAS, set int1lp to low power mode
442 // es8388_pa_power(cfg->_DAC_OUTPUT!=ES8388_OUTPUT_LINE2);
443 // AD_LOGI("init,out:%02x, in:%02x", cfg->_DAC_OUTPUT, cfg->input_device);
444 return res;
445 }
446
449 AD_TRACED();
450 int res = 0;
451 res = writeReg(ES8388_CHIPPOWER, 0xFF); // reset and stop es8388
452#ifdef CONFIG_ESP_LYRAT_V4_3_BOARD
453 headphone_detect_deinit();
454#endif
455
456 return res;
457 }
458
460 error_t ctrlStateActive(codec_mode_t mode, bool ctrl_state_active) {
461 AD_LOGD("es8388_ctrl_state_active: %d, %d", mode, ctrl_state_active);
462 int res = 0;
463 int es_mode_t = 0;
464 switch (mode) {
466 es_mode_t = CODEC_MODE_ENCODE;
467 break;
469 es_mode_t = CODEC_MODE_LINE_IN;
470 break;
472 es_mode_t = CODEC_MODE_DECODE;
473 break;
474 case CODEC_MODE_BOTH:
475 es_mode_t = CODEC_MODE_BOTH;
476 break;
477 default:
478 es_mode_t = CODEC_MODE_DECODE;
479 AD_LOGW("Codec mode not support, default is decode mode");
480 break;
481 }
482 if (!ctrl_state_active) {
483 res = stop((codec_mode_t)es_mode_t);
484 } else {
485 res = start((codec_mode_t)es_mode_t);
486 AD_LOGD("start default is decode mode:%d", es_mode_t);
487 }
488 return res;
489 }
490 error_t writeReg(uint8_t reg_add, uint8_t data) {
491 return i2c_bus_write_bytes(i2c_handle, i2c_addr, &reg_add, sizeof(reg_add),
492 &data, sizeof(data));
493 }
494
495 error_t readReg(uint8_t reg_add, uint8_t* p_data) {
496 return i2c_bus_read_bytes(i2c_handle, i2c_addr, &reg_add, sizeof(reg_add),
497 p_data, 1);
498 }
499
500 error_t setAdcDacVolume(int mode, int volume, int dot) {
501 AD_LOGD("es8388_set_adc_dac_volume: %d.%d", volume, dot);
502 error_t res = RESULT_OK;
503 if (volume < -96 || volume > 0) {
504 AD_LOGW("Warning: volume < -96! or > 0!");
505 if (volume < -96)
506 volume = -96;
507 else
508 volume = 0;
509 }
510 dot = (dot >= 5 ? 1 : 0);
511 volume = (-volume << 1) + dot;
512 if (mode == CODEC_MODE_ENCODE || mode == CODEC_MODE_BOTH) {
513 res |= writeReg(ES8388_ADCCONTROL8, volume);
514 res |= writeReg(ES8388_ADCCONTROL9, volume); // ADC Right Volume=0db
515 }
516 if (mode == CODEC_MODE_DECODE || mode == CODEC_MODE_BOTH) {
517 res |= writeReg(ES8388_DACCONTROL5, volume);
518 res |= writeReg(ES8388_DACCONTROL4, volume);
519 }
520 return res;
521 }
522
524 AD_LOGD("es8388_set_voice_volume: %d", volume);
525 error_t res = RESULT_OK;
526 if (volume < 0)
527 volume = 0;
528 else if (volume > 100)
529 volume = 100;
530 volume /= 3;
531 // ROUT1VOL LOUT1VOL 0 -> -45dB; 33 -> – 4.5dB
532 res = writeReg(ES8388_DACCONTROL24, volume);
533 res |= writeReg(ES8388_DACCONTROL25, volume);
534 // DAC LDACVOL RDACVOL default 0 = 0DB; Default value 192 = – -96 dB
535 res |= writeReg(ES8388_DACCONTROL26, 0);
536 res |= writeReg(ES8388_DACCONTROL27, 0);
537 return res;
538 }
539
541 AD_LOGD("es8388_set_voice_volume (HACK 1): %d", volume);
542 error_t res = RESULT_OK;
543 if (volume < 0)
544 volume = 0;
545 else if (volume > 100)
546 volume = 100;
547 volume /= 3;
548 // DAC LDACVOL RDACVOL default 0 = 0DB; Default value 192 = – -96 dB
550 res |= writeReg(ES8388_DACCONTROL5, 0);
551 // LOUT1 LOUT1 volume: dataheet says only 6 bits
552 res |= writeReg(ES8388_DACCONTROL24, volume);
553 res |= writeReg(ES8388_DACCONTROL25, volume);
554 // LOUT2 ROUT2 volume: datasheet says only 6 bits
555 res |= writeReg(ES8388_DACCONTROL26, volume);
556 res |= writeReg(ES8388_DACCONTROL27, volume);
557 return res;
558 }
559
561 AD_LOGD("es8388_set_voice_volume (HACK 2): %d", volume);
562 error_t res = RESULT_OK;
563 if (volume < 0)
564 volume = 0;
565 else if (volume > 100)
566 volume = 100;
567 volume = (volume * 63) / 100;
568 // LOUT1 RLOUT1 volume: dataheet says only 6 bits
569 res = writeReg(ES8388_DACCONTROL24, volume);
570 res |= writeReg(ES8388_DACCONTROL25, volume);
571 // DAC LDACVOL RDACVOL default 0 = 0DB; Default value 192 = – -96 dB
572 res |= writeReg(ES8388_DACCONTROL26, 0);
573 res |= writeReg(ES8388_DACCONTROL27, 0);
574 // 30-bit a coefficient for shelving filter
575 res |= writeReg(ES8388_DACCONTROL8, 192 >> 2);
576 res |= writeReg(ES8388_DACCONTROL9, 192 >> 2);
577 return res;
578 }
579
582 AD_TRACED();
583 error_t res = RESULT_OK;
584 uint8_t prev_data = 0, data = 0;
585 readReg(ES8388_DACCONTROL21, &prev_data);
586 if (mode == CODEC_MODE_LINE_IN) {
587 res |= writeReg(
589 0x09); // 0x00 audio on LIN1&RIN1, 0x09 LIN2&RIN2 by pass enable
590 res |= writeReg(
592 0x50); // left DAC to left mixer enable and LIN signal
593 // to left mixer enable 0db : bupass enable
594 res |= writeReg(
596 0x50); // right DAC to right mixer enable and LIN signal
597 // to right mixer enable 0db : bupass enable
598 res |= writeReg(ES8388_DACCONTROL21, 0xC0); // enable adc
599 } else {
600 res |= writeReg(ES8388_DACCONTROL21, 0x80); // enable dac
601 }
603 if (prev_data != data) {
604 res |= writeReg(ES8388_CHIPPOWER, 0xF0); // start state machine
605 // res |= writeReg(ES8388_CONTROL1, 0x16);
606 // res |= writeReg(ES8388_CONTROL2, 0x50);
607 res |= writeReg(ES8388_CHIPPOWER, 0x00); // start state machine
608 }
609 if (mode == CODEC_MODE_ENCODE || mode == CODEC_MODE_BOTH ||
610 mode == CODEC_MODE_LINE_IN) {
611 res |= writeReg(ES8388_ADCPOWER, 0x00); // power up adc and line in
612 AD_LOGD("es8388_start default is mode:%d", mode);
613 }
614 if (mode == CODEC_MODE_DECODE || mode == CODEC_MODE_BOTH ||
615 mode == CODEC_MODE_LINE_IN) {
616 res |= writeReg(ES8388_DACPOWER, dac_power); // power up dac and line out
617 res |= setVoiceMute(false);
618 AD_LOGD("es8388_start default is mode:%d", mode);
619 }
620
621 return res;
622 }
623
626 AD_TRACED();
627 error_t res = RESULT_OK;
628 if (mode == CODEC_MODE_LINE_IN) {
629 res |= writeReg(ES8388_DACCONTROL21, 0x80); // enable dac
631 0x00); // 0x00 audio on LIN1&RIN1, 0x09 LIN2&RIN2
633 0x90); // only left DAC to left mixer enable 0db
635 0x90); // only right DAC to right mixer enable 0db
636 return res;
637 }
638 if (mode == CODEC_MODE_DECODE || mode == CODEC_MODE_BOTH) {
639 res |= writeReg(ES8388_DACPOWER, 0x00);
640 res |= setVoiceMute(true);
641 // res |= Es8388SetAdcDacVolume(CODEC_MODE_DECODE, -96, 5); // 0db
642 // res |= writeReg(ES8388_DACPOWER, 0xC0); //power down
643 // dac and line out
644 }
645 if (mode == CODEC_MODE_ENCODE || mode == CODEC_MODE_BOTH) {
646 // res |= Es8388SetAdcDacVolume(CODEC_MODE_ENCODE, -96, 5); // 0db
647 res |= writeReg(ES8388_ADCPOWER, 0xFF); // power down adc and line in
648 }
649 if (mode == CODEC_MODE_BOTH) {
650 res |= writeReg(ES8388_DACCONTROL21, 0x9C); // disable
651 // mclk
652 // res |= writeReg(ES8388_CONTROL1, 0x00);
653 // res |= writeReg(ES8388_CONTROL2, 0x58);
654 // res |= writeReg(ES8388_CHIPPOWER, 0xF3); //stop
655 // state machine
656 }
657
658 return res;
659 }
660
663 AD_TRACED();
664 error_t res = RESULT_OK;
665 uint8_t reg = 0;
666 if (mod == CODEC_MODE_ENCODE || mod == CODEC_MODE_BOTH) {
667 res = readReg(ES8388_ADCCONTROL4, &reg);
668 reg = reg & 0xfc;
669 res |= writeReg(ES8388_ADCCONTROL4, reg | cfg);
670 }
671 if (mod == CODEC_MODE_DECODE || mod == CODEC_MODE_BOTH) {
672 res = readReg(ES8388_DACCONTROL1, &reg);
673 reg = reg & 0xf9;
674 res |= writeReg(ES8388_DACCONTROL1, reg | (cfg << 1));
675 }
676 return res;
677 }
678
681 AD_TRACED();
682 error_t res = RESULT_OK;
685 cfg.lclk_div); // ADCFsMode,singel SPEED,RATIO=256
687 cfg.lclk_div); // ADCFsMode,singel SPEED,RATIO=256
688 return res;
689 }
690
693 AD_TRACED();
694 error_t res = RESULT_OK;
695 uint8_t reg = 0;
696 int bits = (int)bit_per_sample;
697
698 if (mode == CODEC_MODE_ENCODE || mode == CODEC_MODE_BOTH) {
699 res = readReg(ES8388_ADCCONTROL4, &reg);
700 reg = reg & 0xe3;
701 res |= writeReg(ES8388_ADCCONTROL4, reg | (bits << 2));
702 }
703 if (mode == CODEC_MODE_DECODE || mode == CODEC_MODE_BOTH) {
704 res = readReg(ES8388_DACCONTROL1, &reg);
705 reg = reg & 0xc7;
706 res |= writeReg(ES8388_DACCONTROL1, reg | (bits << 3));
707 }
708 return res;
709 }
710
711 protected:
714 int dac_power = 0x3c;
716};
717
718} // namespace audio_driver
#define ES8388_DEFAULT_INPUT_GAIN
Definition ConfigAudioDriver.h:27
#define AI_THINKER_ES8388_VOLUME_HACK
Definition ConfigAudioDriver.h:20
#define RESULT_OK
Definition DriverCommon.h:74
#define RESULT_FAIL
Definition DriverCommon.h:75
#define AD_LOGD(...)
Definition Logger.h:12
#define AD_LOGI(...)
Definition Logger.h:13
#define AD_LOGE(...)
Definition Logger.h:15
#define AD_LOGW(...)
Definition Logger.h:14
#define AD_TRACED()
Definition Logger.h:17
Header-only driver class for the ES8388 codec chip.
Definition ES8388.h:64
static constexpr uint8_t ES8388_ADCCONTROL11
Definition ES8388.h:86
static constexpr uint8_t ES8388_ADCCONTROL2
Definition ES8388.h:77
error_t configFmt(codec_mode_t mod, i2s_format_t cfg)
Configure ES8388 I2S format.
Definition ES8388.h:662
int getVolumeHack()
Provides the volume hack in use.
Definition ES8388.h:134
error_t writeReg(uint8_t reg_add, uint8_t data)
Definition ES8388.h:490
static constexpr uint8_t ES8388_DACCONTROL6
Definition ES8388.h:95
static constexpr uint8_t ES8388_ADCCONTROL9
Definition ES8388.h:84
static constexpr uint8_t ES8388_DACCONTROL22
Definition ES8388.h:111
static constexpr uint8_t ES8388_ADCCONTROL13
Definition ES8388.h:88
static constexpr uint8_t ES8388_CHIPPOWER
Definition ES8388.h:69
error_t ctrlStateActive(codec_mode_t mode, bool ctrl_state_active)
Control ES8388 codec chip.
Definition ES8388.h:460
error_t setBitsPerSample(codec_mode_t mode, sample_bits_t bit_per_sample)
Configure ES8388 data sample bits.
Definition ES8388.h:692
static constexpr uint8_t ES8388_DACCONTROL25
Definition ES8388.h:114
static constexpr uint8_t ES8388_DACCONTROL5
Definition ES8388.h:94
static constexpr uint8_t ES8388_ADCCONTROL8
Definition ES8388.h:83
void setAddress(int addr)
Defines the I2C device address.
Definition ES8388.h:126
static constexpr uint8_t ES8388_DACCONTROL3
Definition ES8388.h:92
static constexpr uint8_t ES8388_ADCCONTROL3
Definition ES8388.h:78
error_t deinit(void)
Deinitialize ES8388 codec chip.
Definition ES8388.h:448
static constexpr uint8_t ES8388_ADCCONTROL4
Definition ES8388.h:79
error_t setVoiceMute(bool enable)
Configure ES8388 DAC mute or not.
Definition ES8388.h:147
error_t start(codec_mode_t mode)
Start ES8388 codec chip.
Definition ES8388.h:581
static constexpr uint8_t ES8388_DACCONTROL30
Definition ES8388.h:119
static constexpr uint8_t ES8388_DACCONTROL20
Definition ES8388.h:109
static constexpr uint8_t ES8388_CHIPLOPOW2
Definition ES8388.h:73
static constexpr uint8_t ES8388_DACCONTROL28
Definition ES8388.h:117
static constexpr uint8_t ES8388_ADCCONTROL5
Definition ES8388.h:80
static constexpr uint8_t ES8388_DACCONTROL13
Definition ES8388.h:102
static constexpr uint8_t ES8388_DACCONTROL7
Definition ES8388.h:96
static constexpr uint8_t ES8388_ADCCONTROL12
Definition ES8388.h:87
static constexpr int ES8388_ADDR
Definition ES8388.h:66
static constexpr uint8_t ES8388_ADCCONTROL6
Definition ES8388.h:81
int volume_hack
Definition ES8388.h:715
int i2c_addr
Definition ES8388.h:713
static constexpr uint8_t ES8388_DACCONTROL18
Definition ES8388.h:107
error_t setVoiceVolume0(int volume)
Definition ES8388.h:523
error_t configI2S(codec_mode_t mode, I2SDefinition *iface)
Configure ES8388 codec mode and I2S interface.
Definition ES8388.h:328
static constexpr uint8_t ES8388_DACCONTROL24
Definition ES8388.h:113
void setVolumeHack(int volumeHack)
Defines the volume hack to use (see AI_THINKER_ES8388_VOLUME_HACK)
Definition ES8388.h:131
static constexpr uint8_t ES8388_ADCPOWER
Definition ES8388.h:70
error_t readReg(uint8_t reg_add, uint8_t *p_data)
Definition ES8388.h:495
static constexpr uint8_t ES8388_DACCONTROL17
Definition ES8388.h:106
static constexpr uint8_t ES8388_DACCONTROL16
Definition ES8388.h:105
static constexpr uint8_t ES8388_ADCCONTROL7
Definition ES8388.h:82
error_t setAdcDacVolume(int mode, int volume, int dot)
Definition ES8388.h:500
static constexpr uint8_t ES8388_DACCONTROL4
Definition ES8388.h:93
static constexpr uint8_t ES8388_ADCCONTROL14
Definition ES8388.h:89
void setWire(i2c_bus_handle_t handle)
Defines the I2C bus instance to be used.
Definition ES8388.h:123
static constexpr uint8_t ES8388_DACCONTROL14
Definition ES8388.h:103
static constexpr uint8_t ES8388_DACCONTROL15
Definition ES8388.h:104
static constexpr uint8_t ES8388_DACCONTROL10
Definition ES8388.h:99
error_t configOutputDevice(output_device_t output_device)
Set ES8388 dac output mode.
Definition ES8388.h:225
int dac_power
Definition ES8388.h:714
static constexpr uint8_t ES8388_DACCONTROL11
Definition ES8388.h:100
static constexpr uint8_t ES8388_DACCONTROL27
Definition ES8388.h:116
error_t setVoiceVolume2(int volume)
Definition ES8388.h:560
static constexpr uint8_t ES8388_CONTROL2
Definition ES8388.h:68
void readAll()
Print all ES8388 registers.
Definition ES8388.h:137
static constexpr uint8_t ES8388_CONTROL1
Definition ES8388.h:67
i2c_bus_handle_t i2c_handle
Definition ES8388.h:712
error_t configInputDevice(es8388_input_device_t input)
Set ES8388 adc input mode.
Definition ES8388.h:214
static constexpr uint8_t ES8388_DACCONTROL23
Definition ES8388.h:112
error_t routeIn2toOut1()
Routes LIN2/RIN2 directly to LOUT1/ROUT1 (analog passthrough)
Definition ES8388.h:325
error_t getVoiceMute(void)
Get ES8388 DAC mute status.
Definition ES8388.h:159
static constexpr uint8_t ES8388_CHIPLOPOW1
Definition ES8388.h:72
error_t init(codec_config_t *cfg, int volumeHack)
Initialize ES8388 codec chip.
Definition ES8388.h:345
error_t route(input_device_t in, output_device_t out)
Routes an analog input directly to an analog output, bypassing the ADC/DAC (e.g. for an analog monito...
Definition ES8388.h:265
error_t setVoiceVolume(int volume)
Set voice volume.
Definition ES8388.h:184
error_t stop(codec_mode_t mode)
Stop ES8388 codec chip.
Definition ES8388.h:625
static constexpr uint8_t ES8388_ADCCONTROL1
Definition ES8388.h:76
static constexpr uint8_t ES8388_DACCONTROL19
Definition ES8388.h:108
static constexpr uint8_t ES8388_DACCONTROL9
Definition ES8388.h:98
error_t setVoiceVolume1(int volume)
Definition ES8388.h:540
static constexpr uint8_t ES8388_DACCONTROL26
Definition ES8388.h:115
error_t setMicGain(es_mic_gain_t gain)
Set ES8388 mic gain.
Definition ES8388.h:171
static constexpr uint8_t ES8388_DACCONTROL2
Definition ES8388.h:91
static constexpr uint8_t ES8388_DACPOWER
Definition ES8388.h:71
static constexpr uint8_t ES8388_ANAVOLMANAG
Definition ES8388.h:74
static constexpr uint8_t ES8388_DACCONTROL12
Definition ES8388.h:101
static constexpr uint8_t ES8388_DACCONTROL8
Definition ES8388.h:97
error_t getVoiceVolume(int *volume)
Get voice volume (0~100)
Definition ES8388.h:198
static constexpr uint8_t ES8388_DACCONTROL21
Definition ES8388.h:110
static constexpr uint8_t ES8388_ADCCONTROL10
Definition ES8388.h:85
static constexpr uint8_t ES8388_DACCONTROL29
Definition ES8388.h:118
static constexpr uint8_t ES8388_DACCONTROL1
Definition ES8388.h:90
error_t i2sConfigClock(es_i2s_clock_t cfg)
Configure I2S clock in MASTER mode.
Definition ES8388.h:680
static constexpr uint8_t ES8388_MASTERMODE
Definition ES8388.h:75
Namespace for audio driver components.
Definition AudioBoard.h:5
es_output_device_t
Definition ES8388.h:38
@ ES8388_OUTPUT_MIN
Definition ES8388.h:39
@ ES8388_OUTPUT_SPK
Definition ES8388.h:42
@ ES8388_OUTPUT_LOUT1
Definition ES8388.h:40
@ ES8388_OUTPUT_ALL
Definition ES8388.h:45
@ ES8388_OUTPUT_MAX
Definition ES8388.h:46
@ ES8388_OUTPUT_LOUT2
Definition ES8388.h:43
@ ES8388_OUTPUT_ROUT2
Definition ES8388.h:44
@ ES8388_OUTPUT_ROUT1
Definition ES8388.h:41
input_device_t
Definition DriverCommon.h:170
@ ADC_INPUT_LINE1
Definition DriverCommon.h:172
@ ADC_INPUT_LINE2
Definition DriverCommon.h:173
sample_bits_t
Definition DriverCommon.h:235
@ BIT_LENGTH_24BITS
Definition DriverCommon.h:240
@ BIT_LENGTH_32BITS
Definition DriverCommon.h:241
@ BIT_LENGTH_16BITS
Definition DriverCommon.h:237
codec_mode_t
Definition DriverCommon.h:290
@ CODEC_MODE_ENCODE
Definition DriverCommon.h:293
@ CODEC_MODE_BOTH
Definition DriverCommon.h:295
@ CODEC_MODE_DECODE
Definition DriverCommon.h:294
@ CODEC_MODE_LINE_IN
Definition DriverCommon.h:296
int error_t
Definition DriverCommon.h:150
output_device_t
Definition DriverCommon.h:186
@ DAC_OUTPUT_LINE1
Definition DriverCommon.h:188
@ DAC_OUTPUT_ALL
Definition DriverCommon.h:190
@ DAC_OUTPUT_NONE
Definition DriverCommon.h:187
@ DAC_OUTPUT_LINE2
Definition DriverCommon.h:189
es_mic_gain_t
Definition DriverCommon.h:305
i2s_format_t
Definition DriverCommon.h:250
es8388_input_device_t
Definition ES8388.h:49
@ ESP8388_INPUT_LINPUT2_RINPUT2
Definition ES8388.h:54
@ ESP8388_INPUT_DIFFERENCE
Definition ES8388.h:55
@ ESP8388_INPUT_MIC1
Definition ES8388.h:52
@ ESP8388_INPUT_LINPUT1_RINPUT1
Definition ES8388.h:51
@ ESP8388_INPUT_MIC2
Definition ES8388.h:53
@ ESP8388_INPUT_MIN
Definition ES8388.h:50
@ ESP8388_INPUT_MAX
Definition ES8388.h:56
void * i2c_bus_handle_t
Definition DriverCommon.h:155
I2S interface parameters for the audio codec.
Definition DriverCommon.h:384
i2s_format_t fmt
Definition DriverCommon.h:386
i2s_master_slave_t mode
Definition DriverCommon.h:385
sample_bits_t bits
Definition DriverCommon.h:388
Top-level codec configuration passed to the audio driver at init.
Definition DriverCommon.h:397
output_device_t output_device
Definition DriverCommon.h:399
I2SDefinition i2s
Definition DriverCommon.h:400
input_device_t input_device
Definition DriverCommon.h:398
i2s clock configuration structure for es8388 and es8374
Definition CodecConstants.h:78
es_lclk_div_t lclk_div
Definition CodecConstants.h:80
es_sclk_div_t sclk_div
Definition CodecConstants.h:79