** Function: _setup_codec_speaker ** Handles audio CODEC to enable/disable speaker ** Configures ES8311 for I2S slave mode, 16-bit, with MCLK from ESP32 **********************************************************************/
| 337 | ** Configures ES8311 for I2S slave mode, 16-bit, with MCLK from ESP32 |
| 338 | **********************************************************************/ |
| 339 | void _setup_codec_speaker(bool enable) { |
| 340 | // Enable/disable amplifier (FM8002E is active LOW) |
| 341 | digitalWrite(ES3C28P_AMP_EN, enable ? LOW : HIGH); |
| 342 | |
| 343 | if (enable) { |
| 344 | // Reset codec (exact sequence from LCD Wiki es8311_init) |
| 345 | es8311_write_reg(ES8311_REG00_RESET, 0x1F); |
| 346 | delay(20); |
| 347 | es8311_write_reg(ES8311_REG00_RESET, 0x00); // Clear reset |
| 348 | es8311_write_reg(ES8311_REG00_RESET, 0x80); // Power on |
| 349 | |
| 350 | // Clock config: MCLK from MCLK pin, enable all clocks |
| 351 | es8311_write_reg(ES8311_REG01_CLK_MGR, 0x3F); |
| 352 | |
| 353 | // Clock dividers for 44100Hz sample rate with MCLK from I2S master |
| 354 | // The ESP8266Audio library generates MCLK automatically |
| 355 | // Use coefficients matching the I2S MCLK output |
| 356 | // pre_div=1, pre_multi=0, adc_div=1, dac_div=1, fs=0, lrck=0x00FF, bclk_div=4 |
| 357 | es8311_write_reg(ES8311_REG02_CLK_MGR, 0x00); // pre_div=1, pre_multi=1x |
| 358 | es8311_write_reg(ES8311_REG03_CLK_MGR, 0x10); // ADC OSR = 0x10 |
| 359 | es8311_write_reg(ES8311_REG04_CLK_MGR, 0x10); // DAC OSR = 0x10 |
| 360 | es8311_write_reg(ES8311_REG05_CLK_MGR, 0x00); // ADC/DAC clk div = 1 |
| 361 | es8311_write_reg(ES8311_REG06_CLK_MGR, 0x03); // BCLK divider |
| 362 | es8311_write_reg(ES8311_REG07_CLK_MGR, 0x00); // LRCK divider high |
| 363 | es8311_write_reg(ES8311_REG08_CLK_MGR, 0xFF); // LRCK divider low |
| 364 | |
| 365 | // SDP format: slave mode, 16-bit I2S (bits[3:2] = 11 = 16-bit) |
| 366 | es8311_write_reg(ES8311_REG09_SDPIN, 0x0C); // SDP in: 16-bit |
| 367 | es8311_write_reg(ES8311_REG0A_SDPOUT, 0x0C); // SDP out: 16-bit |
| 368 | |
| 369 | // Power up analog and DAC (from LCD Wiki es8311_init) |
| 370 | es8311_write_reg(ES8311_REG0D_SYSTEM, 0x01); // Power up analog circuitry |
| 371 | es8311_write_reg(ES8311_REG0E_SYSTEM, 0x02); // Enable analog PGA, ADC modulator |
| 372 | es8311_write_reg(ES8311_REG12_SYSTEM, 0x00); // Power up DAC |
| 373 | es8311_write_reg(ES8311_REG13_SYSTEM, 0x10); // Enable output to HP drive |
| 374 | es8311_write_reg(ES8311_REG1C_ADC, 0x6A); // ADC EQ bypass, cancel DC offset |
| 375 | es8311_write_reg(ES8311_REG37_DAC, 0x08); // Bypass DAC equalizer |
| 376 | |
| 377 | // Set volume (85% like LCD Wiki example) |
| 378 | es8311_write_reg(ES8311_REG32_DAC, 0xD8); // ~85% volume |
| 379 | |
| 380 | Serial.println("ES8311 speaker enabled"); |
| 381 | } else { |
| 382 | // Power down codec |
| 383 | es8311_write_reg(ES8311_REG0D_SYSTEM, 0xFC); // Power down analog |
| 384 | es8311_write_reg(ES8311_REG00_RESET, 0x00); // Power down |
| 385 | Serial.println("ES8311 speaker disabled"); |
| 386 | } |
| 387 | } |
| 388 | |
| 389 | /********************************************************************* |
| 390 | ** Function: _setup_codec_mic |
nothing calls this directly
no test coverage detected