9static const char *
const TAG =
"es8388";
12#define ES8388_ERROR_FAILED(func) \
14 this->mark_failed(); \
19#define ES8388_ERROR_CHECK(func) \
29 ES8388_ERROR_FAILED(this->
write_byte(ES8388_MASTERMODE, 0x00));
32 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CONTROL2, 0x50));
34 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0x00));
38 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CONTROL1, 0x12));
41 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL1, 0x18));
44 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL2, 0x02));
46 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL16, 0x00));
48 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL17, 0x90));
50 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL20, 0x90));
52 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL21, 0x80));
54 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL23, 0x00));
57 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCPOWER, 0xFF));
64 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL3, 0x02));
67 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL4, 0x0d));
69 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL5, 0x02));
72 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL8, 0x00));
73 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL9, 0x00));
79 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL10, 0xe2));
82 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL11, 0xa0));
84 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL12, 0x12));
87 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL13, 0x06));
90 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL14, 0xc3));
93 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL21, 0x80));
96 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0xF0));
98 ES8388_ERROR_FAILED(this->
write_byte(ES8388_CHIPPOWER, 0x00));
107 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCCONTROL7, 0x60));
109 ES8388_ERROR_FAILED(this->
write_byte(ES8388_DACCONTROL3, 0x20));
112 ES8388_ERROR_FAILED(this->
write_byte(ES8388_ADCPOWER, 0x09));
115 if (this->dac_output_select_ !=
nullptr) {
116 auto dac_power = this->get_dac_power();
117 if (dac_power.has_value()) {
118 if (this->dac_output_select_->has_index(dac_power.value())) {
119 this->dac_output_select_->publish_state(dac_power.value());
121 ESP_LOGW(TAG,
"Unknown DAC output power value: %d", dac_power.value());
125 if (this->adc_input_mic_select_ !=
nullptr) {
126 auto mic_input = this->get_mic_input();
127 if (mic_input.has_value()) {
128 if (this->adc_input_mic_select_->has_index(mic_input.value())) {
129 this->adc_input_mic_select_->publish_state(mic_input.value());
131 ESP_LOGW(TAG,
"Unknown ADC input mic value: %d", mic_input.value());
138void ES8388::dump_config() {
139 ESP_LOGCONFIG(TAG,
"ES8388 Audio Codec:");
140 LOG_I2C_DEVICE(
this);
142 LOG_SELECT(
" ",
"DacOutputSelect", this->dac_output_select_);
143 LOG_SELECT(
" ",
"ADCInputMicSelect", this->adc_input_mic_select_);
147 ESP_LOGCONFIG(TAG,
" Failed to initialize");
152bool ES8388::set_volume(
float volume) {
153 volume = clamp(volume, 0.0f, 1.0f);
155 ESP_LOGD(TAG,
"Setting ES8388_DACCONTROL4 / ES8388_DACCONTROL5 to 0x%02X (volume: %f)", value, volume);
156 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL4, value));
157 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL5, value));
162float ES8388::volume() {
164 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL4, &value));
173 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL3, &value));
174 ESP_LOGV(TAG,
"Read ES8388_DACCONTROL3: 0x%02X", value);
180 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL3 to 0x%02X (muted: %s)", value, YESNO(mute_state));
181 return this->
write_byte(ES8388_DACCONTROL3, value);
186 uint8_t reg_out1 = 0;
187 uint8_t reg_out2 = 0;
188 uint8_t dac_power = 0;
194 dac_power = ES8388_DAC_OUTPUT_LOUT1_ROUT1;
198 dac_power = ES8388_DAC_OUTPUT_LOUT2_ROUT2;
203 dac_power = ES8388_DAC_OUTPUT_BOTH;
206 ESP_LOGE(TAG,
"Unknown DAC output line: %d",
line);
211 "DAC output config:\n"
212 " DACPOWER: 0x%02X\n"
213 " DACCONTROL24/25: 0x%02X\n"
214 " DACCONTROL26/27: 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: