10 static const char *
const TAG =
"es7210";
12 static const size_t MCLK_DIV_FRE = 256;
15 #define ES7210_ERROR_FAILED(func) \ 17 this->mark_failed(); \ 22 #define ES7210_ERROR_CHECK(func) \ 28 ESP_LOGCONFIG(TAG,
"ES7210 audio ADC:");
30 ESP_LOGCONFIG(TAG,
" Sample Rate: %" PRIu32, this->
sample_rate_);
33 ESP_LOGE(TAG,
" Failed to initialize");
39 ESP_LOGCONFIG(TAG,
"Setting up ES7210...");
42 ES7210_ERROR_FAILED(this->
write_byte(ES7210_RESET_REG00, 0xff));
43 ES7210_ERROR_FAILED(this->
write_byte(ES7210_RESET_REG00, 0x32));
44 ES7210_ERROR_FAILED(this->
write_byte(ES7210_CLOCK_OFF_REG01, 0x3f));
47 ES7210_ERROR_FAILED(this->
write_byte(ES7210_TIME_CONTROL0_REG09, 0x30));
48 ES7210_ERROR_FAILED(this->
write_byte(ES7210_TIME_CONTROL1_REG0A, 0x30));
51 ES7210_ERROR_FAILED(this->
write_byte(ES7210_ADC12_HPF2_REG23, 0x2a));
52 ES7210_ERROR_FAILED(this->
write_byte(ES7210_ADC12_HPF1_REG22, 0x0a));
53 ES7210_ERROR_FAILED(this->
write_byte(ES7210_ADC34_HPF2_REG20, 0x0a));
54 ES7210_ERROR_FAILED(this->
write_byte(ES7210_ADC34_HPF1_REG21, 0x2a));
60 ES7210_ERROR_FAILED(this->
write_byte(ES7210_ANALOG_REG40, 0xC3));
63 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC12_BIAS_REG41, 0x70));
64 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC34_BIAS_REG42, 0x70));
72 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC1_POWER_REG47, 0x08));
73 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC2_POWER_REG48, 0x08));
74 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC3_POWER_REG49, 0x08));
75 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC4_POWER_REG4A, 0x08));
78 ES7210_ERROR_FAILED(this->
write_byte(ES7210_POWER_DOWN_REG06, 0x04));
81 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC12_POWER_REG4B, 0x0F));
82 ES7210_ERROR_FAILED(this->
write_byte(ES7210_MIC34_POWER_REG4C, 0x0F));
85 ES7210_ERROR_FAILED(this->
write_byte(ES7210_RESET_REG00, 0x71));
86 ES7210_ERROR_FAILED(this->
write_byte(ES7210_RESET_REG00, 0x41));
92 this->
mic_gain_ = clamp<float>(
mic_gain, ES7210_MIC_GAIN_MIN, ES7210_MIC_GAIN_MAX);
103 for (
int i = 0; i < (
sizeof(ES7210_COEFFICIENTS) /
sizeof(ES7210_COEFFICIENTS[0])); ++i) {
104 if (ES7210_COEFFICIENTS[i].lrclk == this->
sample_rate_ && ES7210_COEFFICIENTS[i].mclk == mclk_fre)
111 ES7210_ERROR_CHECK(this->
read_byte(ES7210_MAINCLK_REG02, ®v));
113 regv |= ES7210_COEFFICIENTS[coeff].adc_div;
114 regv |= ES7210_COEFFICIENTS[coeff].doubler << 6;
115 regv |= ES7210_COEFFICIENTS[coeff].dll << 7;
117 ES7210_ERROR_CHECK(this->
write_byte(ES7210_MAINCLK_REG02, regv));
120 regv = ES7210_COEFFICIENTS[coeff].osr;
121 ES7210_ERROR_CHECK(this->
write_byte(ES7210_OSR_REG07, regv));
123 regv = ES7210_COEFFICIENTS[coeff].lrck_h;
124 ES7210_ERROR_CHECK(this->
write_byte(ES7210_LRCK_DIVH_REG04, regv));
125 regv = ES7210_COEFFICIENTS[coeff].lrck_l;
126 ES7210_ERROR_CHECK(this->
write_byte(ES7210_LRCK_DIVL_REG05, regv));
129 ESP_LOGE(TAG,
"Invalid sample rate");
138 for (uint8_t i = 0; i < 4; ++i) {
141 ES7210_ERROR_CHECK(this->
write_byte(ES7210_MIC12_POWER_REG4B, 0xff));
142 ES7210_ERROR_CHECK(this->
write_byte(ES7210_MIC34_POWER_REG4C, 0xff));
146 ES7210_ERROR_CHECK(this->
write_byte(ES7210_MIC12_POWER_REG4B, 0x00));
152 ES7210_ERROR_CHECK(this->
write_byte(ES7210_MIC12_POWER_REG4B, 0x00));
158 ES7210_ERROR_CHECK(this->
write_byte(ES7210_MIC34_POWER_REG4C, 0x00));
164 ES7210_ERROR_CHECK(this->
write_byte(ES7210_MIC34_POWER_REG4C, 0x00));
174 if (mic_gain <= 33.0) {
175 return (uint8_t) mic_gain / 3;
177 if (mic_gain < 36.0) {
180 if (mic_gain < 37.0) {
208 ES7210_ERROR_CHECK(this->
write_byte(ES7210_SDP_INTERFACE1_REG11, reg_val));
211 ES7210_ERROR_CHECK(this->
write_byte(ES7210_SDP_INTERFACE2_REG12, 0x02));
214 ES7210_ERROR_CHECK(this->
write_byte(ES7210_SDP_INTERFACE2_REG12, 0x00));
222 ES7210_ERROR_CHECK(this->
read_byte(reg_addr, ®v));
223 regv = (regv & (~update_bits)) | (update_bits & data);
bool read_byte(uint8_t a_register, uint8_t *data, bool stop=true)
ES7210BitsPerSample bits_per_sample_
bool configure_mic_gain_()
void dump_config() override
bool configure_sample_rate_()
uint8_t es7210_gain_reg_value_(float mic_gain)
Convert floating point mic gain value to register value.
bool set_mic_gain(float mic_gain) override
bool configure_i2s_format_()
bool write_byte(uint8_t a_register, uint8_t data, bool stop=true)
bool es7210_update_reg_bit_(uint8_t reg_addr, uint8_t update_bits, uint8_t data)
Updates an I2C registry address by modifying the current state.
Implementation of SPI Controller mode.
float mic_gain() override