10static const char *
const TAG =
"es8388";
13#define ES8388_ERROR_FAILED(func) \
15 this->mark_failed(); \
20#define ES8388_ERROR_CHECK(func) \
26 ESP_LOGCONFIG(TAG,
"Running setup");
32 ES8388_ERROR_FAILED(this->
write_byte(ES8388_MASTERMODE, 0x00));
35 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CONTROL2, 0x50));
37 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0x00));
41 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CONTROL1, 0x12));
44 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL1, 0x18));
47 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL2, 0x02));
49 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL16, 0x00));
51 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL17, 0x90));
53 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL20, 0x90));
55 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL21, 0x80));
57 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL23, 0x00));
60 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCPOWER, 0xFF));
67 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL3, 0x02));
70 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL4, 0x0d));
72 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL5, 0x02));
75 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL8, 0x00));
76 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL9, 0x00));
82 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL10, 0xe2));
85 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL11, 0xa0));
87 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL12, 0x12));
90 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL13, 0x06));
93 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL14, 0xc3));
96 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL21, 0x80));
99 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0xF0));
101 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0x00));
110 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL7, 0x60));
112 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL3, 0x20));
115 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCPOWER, 0x09));
118 if (this->dac_output_select_ !=
nullptr) {
119 auto dac_power = this->get_dac_power();
120 if (dac_power.has_value()) {
121 auto dac_power_str = this->dac_output_select_->at(dac_power.value());
122 if (dac_power_str.has_value()) {
123 this->dac_output_select_->publish_state(dac_power_str.value());
125 ESP_LOGW(TAG,
"Unknown DAC output power value: %d", dac_power.value());
129 if (this->adc_input_mic_select_ !=
nullptr) {
130 auto mic_input = this->get_mic_input();
131 if (mic_input.has_value()) {
132 auto mic_input_str = this->adc_input_mic_select_->at(mic_input.value());
133 if (mic_input_str.has_value()) {
134 this->adc_input_mic_select_->publish_state(mic_input_str.value());
136 ESP_LOGW(TAG,
"Unknown ADC input mic value: %d", mic_input.value());
143void ES8388::dump_config() {
144 ESP_LOGCONFIG(TAG,
"ES8388 Audio Codec:");
145 LOG_I2C_DEVICE(
this);
147 LOG_SELECT(
" ",
"DacOutputSelect", this->dac_output_select_);
148 LOG_SELECT(
" ",
"ADCInputMicSelect", this->adc_input_mic_select_);
152 ESP_LOGCONFIG(TAG,
" Failed to initialize");
157bool ES8388::set_volume(
float volume) {
158 volume =
clamp(volume, 0.0f, 1.0f);
160 ESP_LOGD(TAG,
"Setting ES8388_DACCONTROL4 / ES8388_DACCONTROL5 to 0x%02X (volume: %f)", value, volume);
161 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL4, value));
162 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL5, value));
167float ES8388::volume() {
169 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL4, &value));
178 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL3, &value));
179 ESP_LOGV(TAG,
"Read ES8388_DACCONTROL3: 0x%02X", value);
185 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL3 to 0x%02X (muted: %s)", value, YESNO(mute_state));
186 return this->
write_byte(ES8388_DACCONTROL3, value);
191 uint8_t reg_out1 = 0;
192 uint8_t reg_out2 = 0;
193 uint8_t dac_power = 0;
199 dac_power = ES8388_DAC_OUTPUT_LOUT1_ROUT1;
203 dac_power = ES8388_DAC_OUTPUT_LOUT2_ROUT2;
208 dac_power = ES8388_DAC_OUTPUT_BOTH;
211 ESP_LOGE(TAG,
"Unknown DAC output line: %d", line);
215 ESP_LOGV(TAG,
"Setting ES8388_DACPOWER to 0x%02X", dac_power);
216 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL24 / ES8388_DACCONTROL25 to 0x%02X", reg_out1);
217 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL26 / ES8388_DACCONTROL27 to 0x%02X", reg_out2);
219 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL24, reg_out1));
220 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL25, reg_out1));
221 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL26, reg_out2));
222 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL27, reg_out2));
224 return this->
write_byte(ES8388_DACPOWER, dac_power);
227optional<DacOutputLine> ES8388::get_dac_power() {
229 if (!this->
read_byte(ES8388_DACPOWER, &dac_power)) {
234 case ES8388_DAC_OUTPUT_LOUT1_ROUT1:
236 case ES8388_DAC_OUTPUT_LOUT2_ROUT2:
238 case ES8388_DAC_OUTPUT_BOTH:
247 uint8_t mic_input = 0;
251 mic_input = ES8388_ADC_INPUT_LINPUT1_RINPUT1;
254 mic_input = ES8388_ADC_INPUT_LINPUT2_RINPUT2;
257 mic_input = ES8388_ADC_INPUT_DIFFERENCE;
260 ESP_LOGE(TAG,
"Unknown ADC input mic line: %d", line);
264 ESP_LOGV(TAG,
"Setting ES8388_ADCCONTROL2 to 0x%02X", mic_input);
265 ES8388_ERROR_CHECK(this->
write_byte(ES8388_ADCCONTROL2, mic_input));
270optional<AdcInputMicLine> ES8388::get_mic_input() {
272 if (!this->
read_byte(ES8388_ADCCONTROL2, &mic_input)) {
277 case ES8388_ADC_INPUT_LINPUT1_RINPUT1:
279 case ES8388_ADC_INPUT_LINPUT2_RINPUT2:
281 case ES8388_ADC_INPUT_DIFFERENCE: