Files
cardputerfw/main/drivers/es8311.c
2026-05-08 14:56:29 +02:00

89 lines
1.8 KiB
C

#include "es8311.h"
#include "drivers/i2s.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2s_std.h"
#include "i2c.h"
#include "pins.h"
void es8311_write(uint8_t reg, uint8_t val) {
i2c_write_reg(ES8311_I2C_ADDR, reg, val);
}
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_adc_volume(uint8_t vol) { es8311_write(ES8311_ADC_VOL, vol); }
void es8311_init(void) {
es8311_write(ES8311_RESET, ES8311_RESET_CMD);
vTaskDelay(pdMS_TO_TICKS(20));
// enable ADC + DAC
es8311_write(ES8311_PWR_UP_DOWN, ES8311_PWR_DAC_EN | ES8311_PWR_ADC_EN);
es8311_write(ES8311_PWR_ANALOG, ES8311_ALL_ON);
// I2S 16-bit
es8311_write(ES8311_SER_FMT, ES8311_FMT_I2S | ES8311_WORD_LEN_16);
// ADC config
es8311_write(ES8311_ADC_CTRL1, 0x44);
es8311_write(ES8311_ADC_CTRL2, 0x0C);
// DAC config
es8311_write(ES8311_DAC_CTRL1, 0x04);
es8311_write(ES8311_DAC_CTRL2, 0x0C);
es8311_set_dac_volume(0xBF);
es8311_set_adc_volume(0x88);
es8311_write(ES8311_SPK_CTRL, 0xFF);
audio_i2s_init();
}
int audio_write(const int16_t *samples, size_t count) {
size_t written;
esp_err_t r = i2s_channel_write(i2s_tx, samples, count * sizeof(int16_t),
&written, portMAX_DELAY);
if (r != ESP_OK)
return -1;
return written / sizeof(int16_t);
}
int audio_read(int16_t *samples, size_t count) {
size_t read;
esp_err_t r = i2s_channel_read(i2s_rx, samples, count * sizeof(int16_t),
&read, portMAX_DELAY);
if (r != ESP_OK)
return -1;
return read / sizeof(int16_t);
}
void audio_beep(void) {
static int16_t buf[4410];
for (int i = 0; i < 4410; i++) {
int phase = (i / 20) & 1;
buf[i] = phase ? 12000 : -12000;
}
audio_write(buf, 4410);
}