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 auto dac_power_str = this->dac_output_select_->at(dac_power.value());
120 if (dac_power_str.has_value()) {
121 this->dac_output_select_->publish_state(dac_power_str.value());
123 ESP_LOGW(TAG,
"Unknown DAC output power value: %d", dac_power.value());
127 if (this->adc_input_mic_select_ !=
nullptr) {
128 auto mic_input = this->get_mic_input();
129 if (mic_input.has_value()) {
130 auto mic_input_str = this->adc_input_mic_select_->at(mic_input.value());
131 if (mic_input_str.has_value()) {
132 this->adc_input_mic_select_->publish_state(mic_input_str.value());
134 ESP_LOGW(TAG,
"Unknown ADC input mic value: %d", mic_input.value());
141void ES8388::dump_config() {
142 ESP_LOGCONFIG(TAG,
"ES8388 Audio Codec:");
143 LOG_I2C_DEVICE(
this);
145 LOG_SELECT(
" ",
"DacOutputSelect", this->dac_output_select_);
146 LOG_SELECT(
" ",
"ADCInputMicSelect", this->adc_input_mic_select_);
150 ESP_LOGCONFIG(TAG,
" Failed to initialize");
155bool ES8388::set_volume(
float volume) {
156 volume = clamp(volume, 0.0f, 1.0f);
158 ESP_LOGD(TAG,
"Setting ES8388_DACCONTROL4 / ES8388_DACCONTROL5 to 0x%02X (volume: %f)", value, volume);
159 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL4, value));
160 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL5, value));
165float ES8388::volume() {
167 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL4, &value));
176 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL3, &value));
177 ESP_LOGV(TAG,
"Read ES8388_DACCONTROL3: 0x%02X", value);
183 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL3 to 0x%02X (muted: %s)", value, YESNO(mute_state));
184 return this->
write_byte(ES8388_DACCONTROL3, value);
189 uint8_t reg_out1 = 0;
190 uint8_t reg_out2 = 0;
191 uint8_t dac_power = 0;
197 dac_power = ES8388_DAC_OUTPUT_LOUT1_ROUT1;
201 dac_power = ES8388_DAC_OUTPUT_LOUT2_ROUT2;
206 dac_power = ES8388_DAC_OUTPUT_BOTH;
209 ESP_LOGE(TAG,
"Unknown DAC output line: %d", line);
213 ESP_LOGV(TAG,
"Setting ES8388_DACPOWER to 0x%02X", dac_power);
214 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL24 / ES8388_DACCONTROL25 to 0x%02X", reg_out1);
215 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL26 / ES8388_DACCONTROL27 to 0x%02X", 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: