continue work on es8311

This commit is contained in:
2026-05-11 15:17:49 +02:00
parent 0a7e80a16a
commit 8bd373b8a4
3 changed files with 465 additions and 148 deletions
+111 -57
View File
@@ -9,6 +9,7 @@
#include "i2c.h"
#include "pins.h"
#include <math.h>
#include <stdint.h>
i2c_master_dev_handle_t es8311_i2c_dev;
@@ -21,14 +22,29 @@ int es8311_write(uint8_t reg, uint8_t val) {
return 0;
}
void es8311_set_dac_volume(uint8_t vol) {
es8311_write(ES8311_DAC_VOL_L, vol);
es8311_write(ES8311_DAC_VOL_R, vol);
void es8311_set_dac_volume(float vol) {
if (vol < -95.5f) {
vol = -95.5f;
}
if (vol > 32) {
vol = 32;
}
vol *= 2;
uint8_t volByte = vol;
es8311_write(ES8311_DAC_REG32, volByte);
}
void es8311_set_adc_volume(uint8_t vol) { es8311_write(ES8311_ADC_VOL, vol); }
void es8311_set_adc_volume(float vol) {
if (vol < -95.5f) {
vol = -95.5f;
}
if (vol > 32) {
vol = 32;
}
vol *= 2;
uint8_t volByte = vol;
es8311_write(ES8311_ADC_REG17, volByte);
}
uint8_t es8311_read(uint8_t reg) {
uint8_t val;
@@ -40,18 +56,6 @@ uint8_t es8311_read(uint8_t reg) {
return val;
}
void es8311_verify_init(void) {
printf("ES8311 Register Dump:\n");
printf("PWR_UP_DOWN (0x0C): 0x%02X\n", es8311_read(0x0C));
printf("PWR_ANALOG (0x0D): 0x%02X\n", es8311_read(0x0D));
printf("SER_FMT (0x10): 0x%02X\n", es8311_read(0x10));
printf("DAC_VOL_L (0x33): 0x%02X\n", es8311_read(0x33));
printf("DAC_VOL_R (0x34): 0x%02X\n", es8311_read(0x34));
}
void es8311_init(void) {
printf("ES8311: Starting initialization...\n");
@@ -66,55 +70,105 @@ void es8311_init(void) {
return;
}
// Reset chip
printf("ES8311: Resetting...\n");
es8311_write(ES8311_RESET, ES8311_RESET_CMD);
vTaskDelay(pdMS_TO_TICKS(ES8311_RESET_DELAY_MS));
es8311_write(ES8311_SDPIN_REG,
ES8311_SDPIN_FORMAT_I2S | ES8311_SDPIN_WORD_24BIT |
ES8311_SDPIN_LR_NORMAL_POLARITY | ES8311_SDPIN_UNMUTE |
ES8311_SDPIN_SEL_LEFT_TO_DAC);
// Configure clock
printf("ES8311: Configuring clocks...\n");
es8311_write(ES8311_CLK_MANAGE, ES8311_CLK_ALL_EN);
es8311_write(ES8311_CLK_DIV, ES8311_CLK_DIV_DEFAULT);
es8311_write(ES8311_SDPOUT_REG,
ES8311_SDPOUT_FORMAT_I2S | ES8311_SDPOUT_WORD_24BIT |
ES8311_SDPOUT_LR_NORMAL_POLARITY | ES8311_SDPOUT_UNMUTE);
// Power up sequence
printf("ES8311: Powering up...\n");
es8311_write(ES8311_PWR_ANALOG, ES8311_PWR_ANALOG_OFF);
vTaskDelay(pdMS_TO_TICKS(ES8311_POWER_DELAY_MS));
es8311_write(ES8311_RESET_REG00,
ES8311_RESET_CSM_MSC_SLAVE | ES8311_RESET_CSM_ON);
es8311_write(ES8311_PWR_ANALOG, ES8311_PWR_ANALOG_ON);
vTaskDelay(pdMS_TO_TICKS(ES8311_POWER_DELAY_MS));
es8311_write(ES8311_CLK_MANAGER_REG07,
ES8311_CLK_MANAGER_REG07_ADCDAT_NORMAL_MODE |
ES8311_CLK_MANAGER_REG07_BCLK_LRCLK_NORMAL_MODE);
// I2S format
printf("ES8311: Configuring I2S format...\n");
es8311_write(ES8311_SER_FMT, ES8311_FMT_I2S | ES8311_WORD_LEN_16);
es8311_write(ES8311_CLK_MANAGER_REG01,
ES8311_CLK_MANAGER_REG01_MCLK_INV_OFF |
ES8311_CLK_MANAGER_REG01_MCLK_OFF |
ES8311_CLK_MANAGER_REG01_MCLK_SEL_FROM_BCLK |
ES8311_CLK_MANAGER_REG01_BCLK_OFF);
// ADC configuration
printf("ES8311: Configuring ADC...\n");
es8311_write(ES8311_ADC_CTRL1, ES8311_ADC_CTRL1_DEFAULT);
es8311_write(ES8311_ADC_CTRL2, ES8311_ADC_CTRL2_DEFAULT);
es8311_set_adc_volume(ES8311_ADC_VOL_DEFAULT);
// mclk 12.288 MHz LRCK 48kHz
es8311_write(ES8311_CLK_MANAGER_REG02, 0x00);
es8311_write(ES8311_CLK_MANAGER_REG03, 0x10);
es8311_write(ES8311_CLK_MANAGER_REG04, 0x10);
es8311_write(ES8311_CLK_MANAGER_REG05, 0x00);
es8311_write(ES8311_ADC_REG16, 0x04); // 24 db gain
// off in slave mode, we dont care
es8311_write(ES8311_CLK_MANAGER_REG06,
ES8311_CLK_MANAGER_REG06_CONTINUAL_BCLK |
ES8311_CLK_MANAGER_REG06_NORMAL_BCLK |
ES8311_CLK_MANAGER_REG06_DIV_BCLK_3);
// DAC configuration
printf("ES8311: Configuring DAC...\n");
es8311_write(ES8311_DAC_CTRL1, ES8311_DAC_CTRL1_DEFAULT);
es8311_write(ES8311_DAC_CTRL2, ES8311_DAC_CTRL2_DEFAULT);
es8311_set_dac_volume(ES8311_DAC_VOL_DEFAULT);
// lrck divider is ignored, since we are in slave mode
// Output configuration
printf("ES8311: Configuring outputs...\n");
es8311_write(ES8311_HP_CTRL, ES8311_HP_CTRL_DEFAULT);
es8311_write(ES8311_SPK_CTRL, ES8311_SPK_CTRL_MAX);
es8311_write(ES8311_RESET_REG00,
ES8311_RESET_CSM_MSC_SLAVE | ES8311_RESET_CSM_ON |
ES8311_RESET_DIGITAL_RUN | ES8311_RESET_CLOCK_MANAGER_RUN |
ES8311_RESET_MASTER_RUN | ES8311_RESET_ADC_DIGITAL_RUN |
ES8311_RESET_DAC_DIGITAL_RUN);
// Enable ADC and DAC
printf("ES8311: Enabling ADC/DAC...\n");
es8311_write(ES8311_PWR_UP_DOWN, ES8311_PWR_DAC_EN | ES8311_PWR_ADC_EN);
vTaskDelay(pdMS_TO_TICKS(ES8311_STARTUP_DELAY_MS));
es8311_write(ES8311_SYSTEM_REG0D,
ES8311_SYSTEM_REG0D_ANALOG_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_BIAS_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_ADC_BIAS_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_ADC_REFERENCE_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_DAC_REFERENCE_ENABLED |
ES8311_SYSTEM_REG0D_VMID_START_NORMAL_SPEED);
printf("ES8311: Initializing I2S...\n");
audio_i2s_init();
es8311_write(ES8311_SYSTEM_REG0D,
ES8311_SYSTEM_REG0D_ANALOG_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_BIAS_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_ADC_BIAS_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_ADC_REFERENCE_ENABLED |
ES8311_SYSTEM_REG0D_ANALOG_DAC_REFERENCE_ENABLED |
ES8311_SYSTEM_REG0D_VMID_NORMAL);
printf("ES8311: Initialization complete\n");
es8311_verify_init();
es8311_write(ES8311_SYSTEM_REG0F,
ES8311_SYSTEM_REG0F_DAC_NORMAL_MODE |
ES8311_SYSTEM_REG0F_PGA_NORMAL_MODE |
ES8311_SYSTEM_REG0F_PGA_OUTPUT_NORMAL_MODE |
ES8311_SYSTEM_REG0F_VCMMOD_NORMAL_MODE |
ES8311_SYSTEM_REG0F_ADC_REFERENCE_NORMAL_MODE |
ES8311_SYSTEM_REG0F_DAC_REFERENCE_NORMAL_MODE |
ES8311_SYSTEM_REG0F_FLASH_NORMAL_MODE |
ES8311_SYSTEM_REG0F_INT1_NORMAL_MODE);
es8311_write(ES8311_SYSTEM_REG0E,
ES8311_SYSTEM_REG0E_PGA_ENABLE |
ES8311_SYSTEM_REG0E_PDN_MOD_ENABLE |
ES8311_SYSTEM_REG0E_MOD_NORMAL
);
es8311_write(ES8311_SYSTEM_REG14,
ES8311_SYSTEM_REG14_DMIC_OFF |
ES8311_SYSTEM_REG14_MIC1 |
ES8311_SYSTEM_REG14_GAIN_30DB
);
es8311_write(ES8311_ADC_REG1C,
ES8311_ADC_REG1C_HPF_DYNAMIC_HPF |
ES8311_ADC_REG1C_ADCEQ_BYPASS
);
es8311_write(ES8311_ADC_REG18,
ES8311_ADC_REG18_AUTO_LEVEL_CONTROL_ENABLE |
ES8311_ADC_REG18_AUTO_MUTE_DISABLE |
ES8311_ADC_REG18_0_25DB_PER_65536LRCK
);
es8311_write(ES8311_ADC_REG19,
ES8311_ADC_REG19_ALC_MIN_LEVEL_NEG_30_1DB |
ES8311_ADC_REG19_ALC_MAX_LEVEL_NEG_6_0DB
);
es8311_write(ES8311_ADC_REG1A,
ES8311_ADC_REG1A_AUTOMUTE_NEG_96DB |
ES8311_ADC_REG1A_AUTOMUTE_32768_SAMPLES
);
}
int audio_write(const int16_t *samples, size_t count) {