10static const char *
const TAG =
"es8388";
13#define ES8388_ERROR_FAILED(func) \
15 this->mark_failed(); \
20#define ES8388_ERROR_CHECK(func) \
30 ES8388_ERROR_FAILED(this->
write_byte(ES8388_MASTERMODE, 0x00));
33 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CONTROL2, 0x50));
35 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0x00));
39 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CONTROL1, 0x12));
42 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL1, 0x18));
45 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL2, 0x02));
47 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL16, 0x00));
49 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL17, 0x90));
51 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL20, 0x90));
53 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL21, 0x80));
55 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL23, 0x00));
58 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCPOWER, 0xFF));
65 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL3, 0x02));
68 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL4, 0x0d));
70 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL5, 0x02));
73 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL8, 0x00));
74 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL9, 0x00));
80 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL10, 0xe2));
83 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL11, 0xa0));
85 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL12, 0x12));
88 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL13, 0x06));
91 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL14, 0xc3));
94 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL21, 0x80));
97 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0xF0));
99 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0x00));
108 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL7, 0x60));
110 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL3, 0x20));
113 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCPOWER, 0x09));
116 if (this->dac_output_select_ !=
nullptr) {
117 auto dac_power = this->get_dac_power();
118 if (dac_power.has_value()) {
119 if (this->dac_output_select_->has_index(dac_power.value())) {
120 this->dac_output_select_->publish_state(dac_power.value());
122 ESP_LOGW(TAG,
"Unknown DAC output power value: %d", dac_power.value());
126 if (this->adc_input_mic_select_ !=
nullptr) {
127 auto mic_input = this->get_mic_input();
128 if (mic_input.has_value()) {
129 if (this->adc_input_mic_select_->has_index(mic_input.value())) {
130 this->adc_input_mic_select_->publish_state(mic_input.value());
132 ESP_LOGW(TAG,
"Unknown ADC input mic value: %d", mic_input.value());
139void ES8388::dump_config() {
140 ESP_LOGCONFIG(TAG,
"ES8388 Audio Codec:");
141 LOG_I2C_DEVICE(
this);
143 LOG_SELECT(
" ",
"DacOutputSelect", this->dac_output_select_);
144 LOG_SELECT(
" ",
"ADCInputMicSelect", this->adc_input_mic_select_);
148 ESP_LOGCONFIG(TAG,
" Failed to initialize");
153bool ES8388::set_volume(
float volume) {
154 volume = clamp(volume, 0.0f, 1.0f);
156 ESP_LOGD(TAG,
"Setting ES8388_DACCONTROL4 / ES8388_DACCONTROL5 to 0x%02X (volume: %f)", value, volume);
157 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL4, value));
158 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL5, value));
163float ES8388::volume() {
165 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL4, &value));
174 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL3, &value));
175 ESP_LOGV(TAG,
"Read ES8388_DACCONTROL3: 0x%02X", value);
181 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL3 to 0x%02X (muted: %s)", value, YESNO(mute_state));
182 return this->
write_byte(ES8388_DACCONTROL3, value);
187 uint8_t reg_out1 = 0;
188 uint8_t reg_out2 = 0;
189 uint8_t dac_power = 0;
195 dac_power = ES8388_DAC_OUTPUT_LOUT1_ROUT1;
199 dac_power = ES8388_DAC_OUTPUT_LOUT2_ROUT2;
204 dac_power = ES8388_DAC_OUTPUT_BOTH;
207 ESP_LOGE(TAG,
"Unknown DAC output line: %d", line);
212 "Setting ES8388_DACPOWER to 0x%02X\n"
213 "Setting ES8388_DACCONTROL24 / ES8388_DACCONTROL25 to 0x%02X\n"
214 "Setting ES8388_DACCONTROL26 / ES8388_DACCONTROL27 to 0x%02X",
215 dac_power, reg_out1, reg_out2);
217 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL24, reg_out1));
218 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL25, reg_out1));
219 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL26, reg_out2));
220 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL27, reg_out2));
222 return this->
write_byte(ES8388_DACPOWER, dac_power);
225optional<DacOutputLine> ES8388::get_dac_power() {
227 if (!this->
read_byte(ES8388_DACPOWER, &dac_power)) {
232 case ES8388_DAC_OUTPUT_LOUT1_ROUT1:
234 case ES8388_DAC_OUTPUT_LOUT2_ROUT2:
236 case ES8388_DAC_OUTPUT_BOTH:
245 uint8_t mic_input = 0;
249 mic_input = ES8388_ADC_INPUT_LINPUT1_RINPUT1;
252 mic_input = ES8388_ADC_INPUT_LINPUT2_RINPUT2;
255 mic_input = ES8388_ADC_INPUT_DIFFERENCE;
258 ESP_LOGE(TAG,
"Unknown ADC input mic line: %d", line);
262 ESP_LOGV(TAG,
"Setting ES8388_ADCCONTROL2 to 0x%02X", mic_input);
263 ES8388_ERROR_CHECK(this->
write_byte(ES8388_ADCCONTROL2, mic_input));
268optional<AdcInputMicLine> ES8388::get_mic_input() {
270 if (!this->
read_byte(ES8388_ADCCONTROL2, &mic_input)) {
275 case ES8388_ADC_INPUT_LINPUT1_RINPUT1:
277 case ES8388_ADC_INPUT_LINPUT2_RINPUT2:
279 case ES8388_ADC_INPUT_DIFFERENCE: