13#define ES8388_ERROR_FAILED(func) \
15 this->mark_failed(LOG_STR("Failed to initialize")); \
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));
115#ifdef USE_ES8388_SELECT
116 if (this->dac_output_select_ !=
nullptr) {
119 ES8388_ERROR_FAILED(this->set_dac_output(line));
120 this->dac_output_select_->publish_state(
static_cast<size_t>(line));
122 auto dac_power = this->get_dac_power();
123 if (dac_power.has_value()) {
124 if (this->dac_output_select_->has_index(dac_power.value())) {
125 this->dac_output_select_->publish_state(dac_power.value());
127 ESP_LOGW(TAG,
"Unknown DAC output power value: %d", dac_power.value());
132 if (this->adc_input_mic_select_ !=
nullptr) {
135 ES8388_ERROR_FAILED(this->set_adc_input_mic(line));
136 this->adc_input_mic_select_->publish_state(
static_cast<size_t>(line));
138 auto mic_input = this->get_mic_input();
139 if (mic_input.has_value()) {
140 if (this->adc_input_mic_select_->has_index(mic_input.value())) {
141 this->adc_input_mic_select_->publish_state(mic_input.value());
143 ESP_LOGW(TAG,
"Unknown ADC input mic value: %d", mic_input.value());
151void ES8388::dump_config() {
152 ESP_LOGCONFIG(TAG,
"ES8388 Audio Codec:");
153 LOG_I2C_DEVICE(
this);
154#ifdef USE_ES8388_SELECT
155 LOG_SELECT(
" ",
"DacOutputSelect", this->dac_output_select_);
156 LOG_SELECT(
" ",
"ADCInputMicSelect", this->adc_input_mic_select_);
160bool ES8388::set_volume(
float volume) {
161 volume = clamp(volume, 0.0f, 1.0f);
163 ESP_LOGD(TAG,
"Setting ES8388_DACCONTROL4 / ES8388_DACCONTROL5 to 0x%02X (volume: %f)", value, volume);
164 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL4, value));
165 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL5, value));
170float ES8388::volume() {
172 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL4, &value));
181 ES8388_ERROR_CHECK(this->
read_byte(ES8388_DACCONTROL3, &value));
182 ESP_LOGV(TAG,
"Read ES8388_DACCONTROL3: 0x%02X", value);
188 assign_bits(value, ES8388_DACCONTROL3_DAC_MUTE, mute_state);
190 ESP_LOGV(TAG,
"Setting ES8388_DACCONTROL3 to 0x%02X (muted: %s)", value, YESNO(mute_state));
191 return this->
write_byte(ES8388_DACCONTROL3, value);
196 uint8_t reg_out1 = 0;
197 uint8_t reg_out2 = 0;
198 uint8_t dac_power = 0;
204 dac_power = ES8388_DAC_OUTPUT_LOUT1_ROUT1;
208 dac_power = ES8388_DAC_OUTPUT_LOUT2_ROUT2;
213 dac_power = ES8388_DAC_OUTPUT_BOTH;
216 ESP_LOGE(TAG,
"Unknown DAC output line: %d", line);
221 "DAC output config:\n"
222 " DACPOWER: 0x%02X\n"
223 " DACCONTROL24/25: 0x%02X\n"
224 " DACCONTROL26/27: 0x%02X",
225 dac_power, reg_out1, reg_out2);
227 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL24, reg_out1));
228 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL25, reg_out1));
229 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL26, reg_out2));
230 ES8388_ERROR_CHECK(this->
write_byte(ES8388_DACCONTROL27, reg_out2));
232 return this->
write_byte(ES8388_DACPOWER, dac_power);
235optional<DacOutputLine> ES8388::get_dac_power() {
237 if (!this->
read_byte(ES8388_DACPOWER, &dac_power)) {
242 case ES8388_DAC_OUTPUT_LOUT1_ROUT1:
244 case ES8388_DAC_OUTPUT_LOUT2_ROUT2:
246 case ES8388_DAC_OUTPUT_BOTH:
255 uint8_t mic_input = 0;
259 mic_input = ES8388_ADC_INPUT_LINPUT1_RINPUT1;
262 mic_input = ES8388_ADC_INPUT_LINPUT2_RINPUT2;
265 mic_input = ES8388_ADC_INPUT_DIFFERENCE;
268 ESP_LOGE(TAG,
"Unknown ADC input mic line: %d", line);
272 ESP_LOGV(TAG,
"Setting ES8388_ADCCONTROL2 to 0x%02X", mic_input);
273 ES8388_ERROR_CHECK(this->
write_byte(ES8388_ADCCONTROL2, mic_input));
278optional<AdcInputMicLine> ES8388::get_mic_input() {
280 if (!this->
read_byte(ES8388_ADCCONTROL2, &mic_input)) {
285 case ES8388_ADC_INPUT_LINPUT1_RINPUT1:
287 case ES8388_ADC_INPUT_LINPUT2_RINPUT2:
289 case ES8388_ADC_INPUT_DIFFERENCE: