| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838 | /* * ESPRESSIF MIT License * * Copyright (c) 2018 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD> * * Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in which case, * it is free of charge, to any person obtaining a copy of this software and associated * documentation files (the "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished * to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */#include "es8311.h"#include <string.h>#include "esp_log.h"// #include "board.h"/* ES8311 address * 0x32:CE=1;0x30:CE=0 */#define ES8311_ADDR 0x32#define ES7243_ADDR 0x26/** to define the clock soure of MCLK*/#define FROM_MCLK_PIN 0#define FROM_SCLK_PIN 1/** to define work mode(master or slave)*/#define MASTER_MODE 0#define SLAVE_MODE 1/** to define serial digital audio format*/#define I2S_FMT 0#define LEFT_JUSTIFIED_FMT 1#define DPS_PCM_A_FMT 2#define DPS_PCM_B_FMT 3/** to define resolution of PCM interface*/#define LENGTH_16BIT 0#define LENGTH_24BIT 1#define LENGTH_32BIT 2/** codec private data*/struct es8311_private {  bool dmic_enable;  bool mclkinv;  bool sclkinv;  uint8_t master_slave_mode;  uint8_t pcm_format;  uint8_t pcm_resolution;  uint8_t mclk_src;};static struct es8311_private* es8311_priv;/** Clock coefficient structer*/struct _coeff_div {  uint32_t mclk;    /* mclk frequency */  uint32_t rate;    /* sample rate */  uint8_t prediv;   /* the pre divider with range from 1 to 8 */  uint8_t premulti; /* the pre multiplier with x1, x2, x4 and x8 selection */  uint8_t adcdiv;   /* adcclk divider */  uint8_t dacdiv;   /* dacclk divider */  uint8_t fsmode;   /* double speed or single speed, =0, ss, =1, ds */  uint8_t lrck_h;   /* adclrck divider and daclrck divider */  uint8_t lrck_l;  uint8_t bclkdiv; /* sclk divider */  uint8_t adcosr;  /* adc osr */  uint8_t dacosr;  /* dac osr */};/* codec hifi mclk clock divider coefficients */static const struct _coeff_div coeff_div[] = {    //mclk     rate   prediv  mult  adcdiv dacdiv fsmode lrch  lrcl  bckdiv osr    /* 8k */    {12288000, 8000, 0x06, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {18432000, 8000, 0x03, 0x02, 0x03, 0x03, 0x00, 0x05, 0xff, 0x18, 0x10,     0x10},    {16384000, 8000, 0x08, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {8192000, 8000, 0x04, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10},    {6144000, 8000, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10},    {4096000, 8000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10},    {3072000, 8000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10},    {2048000, 8000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10},    {1536000, 8000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10},    {1024000, 8000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10, 0x10},    /* 11.025k */    {11289600, 11025, 0x04, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {5644800, 11025, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {2822400, 11025, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1411200, 11025, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 12k */    {12288000, 12000, 0x04, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {6144000, 12000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {3072000, 12000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1536000, 12000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 16k */    {12288000, 16000, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {18432000, 16000, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0xff, 0x0c, 0x10,     0x10},    {16384000, 16000, 0x04, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {8192000, 16000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {6144000, 16000, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {4096000, 16000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {3072000, 16000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {2048000, 16000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1536000, 16000, 0x03, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1024000, 16000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 22.05k */    {11289600, 22050, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {5644800, 22050, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {2822400, 22050, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1411200, 22050, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 24k */    {12288000, 24000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {18432000, 24000, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {6144000, 24000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {3072000, 24000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1536000, 24000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 32k */    {12288000, 32000, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {18432000, 32000, 0x03, 0x04, 0x03, 0x03, 0x00, 0x02, 0xff, 0x0c, 0x10,     0x10},    {16384000, 32000, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {8192000, 32000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {6144000, 32000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {4096000, 32000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {3072000, 32000, 0x03, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {2048000, 32000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1536000, 32000, 0x03, 0x08, 0x01, 0x01, 0x01, 0x00, 0x7f, 0x02, 0x10,     0x10},    {1024000, 32000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 44.1k */    {11289600, 44100, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {5644800, 44100, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {2822400, 44100, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1411200, 44100, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 48k */    {12288000, 48000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {18432000, 48000, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {6144000, 48000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {3072000, 48000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1536000, 48000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    /* 64k */    {12288000, 64000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {18432000, 64000, 0x03, 0x04, 0x03, 0x03, 0x01, 0x01, 0x7f, 0x06, 0x10,     0x10},    {16384000, 64000, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {8192000, 64000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {6144000, 64000, 0x01, 0x04, 0x03, 0x03, 0x01, 0x01, 0x7f, 0x06, 0x10,     0x10},    {4096000, 64000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {3072000, 64000, 0x01, 0x08, 0x03, 0x03, 0x01, 0x01, 0x7f, 0x06, 0x10,     0x10},    {2048000, 64000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1536000, 64000, 0x01, 0x08, 0x01, 0x01, 0x01, 0x00, 0xbf, 0x03, 0x18,     0x18},    {1024000, 64000, 0x01, 0x08, 0x01, 0x01, 0x01, 0x00, 0x7f, 0x02, 0x10,     0x10},    /* 88.2k */    {11289600, 88200, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {5644800, 88200, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {2822400, 88200, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1411200, 88200, 0x01, 0x08, 0x01, 0x01, 0x01, 0x00, 0x7f, 0x02, 0x10,     0x10},    /* 96k */    {12288000, 96000, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {18432000, 96000, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {6144000, 96000, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {3072000, 96000, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0xff, 0x04, 0x10,     0x10},    {1536000, 96000, 0x01, 0x08, 0x01, 0x01, 0x01, 0x00, 0x7f, 0x02, 0x10,     0x10},};static char* TAG = "DRV8311";#define ES_ASSERT(a, format, b, ...)      \  if ((a) != 0) {                         \    ESP_LOGE(TAG, format, ##__VA_ARGS__); \    return b;                             \  }static int Es8311WriteReg(uint8_t regAdd, uint8_t data) {  int res = 0;  i2c_cmd_handle_t cmd = i2c_cmd_link_create();  res |= i2c_master_start(cmd);  res |= i2c_master_write_byte(cmd, ES8311_ADDR, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_write_byte(cmd, regAdd, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_write_byte(cmd, data, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_stop(cmd);  res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_PERIOD_MS);  i2c_cmd_link_delete(cmd);  ES_ASSERT(res, "Es8311 Write Reg error", -1);  return res;}int Es8311ReadReg(uint8_t regAdd) {  uint8_t data;  int res = 0;  i2c_cmd_handle_t cmd = i2c_cmd_link_create();  res |= i2c_master_start(cmd);  res |= i2c_master_write_byte(cmd, ES8311_ADDR, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_write_byte(cmd, regAdd, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_stop(cmd);  res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_PERIOD_MS);  i2c_cmd_link_delete(cmd);  cmd = i2c_cmd_link_create();  res |= i2c_master_start(cmd);  res |= i2c_master_write_byte(cmd, ES8311_ADDR | 0x01, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_read_byte(cmd, &data, 0x01 /*NACK_VAL*/);  res |= i2c_master_stop(cmd);  res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_PERIOD_MS);  i2c_cmd_link_delete(cmd);  ES_ASSERT(res, "Es8311 Read Reg error", -1);  return (int)data;}static int Es7243WriteReg(uint8_t regAdd, uint8_t data) {  int res = 0;  i2c_cmd_handle_t cmd = i2c_cmd_link_create();  res |= i2c_master_start(cmd);  res |= i2c_master_write_byte(cmd, ES7243_ADDR, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_write_byte(cmd, regAdd, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_write_byte(cmd, data, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_stop(cmd);  res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_PERIOD_MS);  i2c_cmd_link_delete(cmd);  ES_ASSERT(res, "Es7243 Write Reg error", -1);  return res;}int Es7243ReadReg(uint8_t regAdd) {  uint8_t data;  int res = 0;  i2c_cmd_handle_t cmd = i2c_cmd_link_create();  res |= i2c_master_start(cmd);  res |= i2c_master_write_byte(cmd, ES7243_ADDR, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_write_byte(cmd, regAdd, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_stop(cmd);  res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_PERIOD_MS);  i2c_cmd_link_delete(cmd);  cmd = i2c_cmd_link_create();  res |= i2c_master_start(cmd);  res |= i2c_master_write_byte(cmd, ES7243_ADDR | 0x01, 1 /*ACK_CHECK_EN*/);  res |= i2c_master_read_byte(cmd, &data, 0x01 /*NACK_VAL*/);  res |= i2c_master_stop(cmd);  res |= i2c_master_cmd_begin(0, cmd, 1000 / portTICK_PERIOD_MS);  i2c_cmd_link_delete(cmd);  ES_ASSERT(res, "Es7243 Read Reg error", -1);  return (int)data;}esp_err_t Es7243Init(void) {  esp_err_t ret = ESP_OK;  ret |= Es7243WriteReg(0x00, 0x01);  ret |= Es7243WriteReg(0x06, 0x00);  ret |= Es7243WriteReg(0x05, 0x1B);  ret |= Es7243WriteReg(0x01, 0x0C);  ret |= Es7243WriteReg(0x08, 0x43);  ret |= Es7243WriteReg(0x05, 0x13);  if (ret) {    ESP_LOGE(TAG, "Es7243 initialize failed!");    return ESP_FAIL;  }  return ret;}static int I2cInit(i2c_config_t* conf, int i2cMasterPort) {  int res;  res = i2c_param_config(i2cMasterPort, conf);  res |= i2c_driver_install(i2cMasterPort, conf->mode, 0, 0, 0);  ES_ASSERT(res, "I2cInit error", -1);  return res;}/** look for the coefficient in coeff_div[] table*/static int get_coeff(uint32_t mclk, uint32_t rate) {  for (int i = 0; i < (sizeof(coeff_div) / sizeof(coeff_div[0])); i++) {    if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)      return i;  }  return -1;}/** set es8311 clock parameter and PCM/I2S interface*/static void es8311_pcm_hw_params(uint32_t mclk, uint32_t lrck) {  int coeff;  uint8_t regv, datmp;  ESP_LOGI(TAG, "Enter into es8311_pcm_hw_params()\n");  coeff = get_coeff(mclk, lrck);  if (coeff < 0) {    ESP_LOGE(TAG, "Unable to configure sample rate %dHz with %dHz MCLK\n", lrck,             mclk);    return;  }  /*    * set clock parammeters    */  if (coeff >= 0) {    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG02) & 0x07;    regv |= (coeff_div[coeff].prediv - 1) << 5;    datmp = 0;    switch (coeff_div[coeff].premulti) {      case 1:        datmp = 0;        break;      case 2:        datmp = 1;        break;      case 4:        datmp = 2;        break;      case 8:        datmp = 3;        break;      default:        break;    }#if CONFIG_ESP32_KORVO_V1_1_BOARD    datmp = 3;#endif    regv |= (datmp) << 3;    Es8311WriteReg(ES8311_CLK_MANAGER_REG02, regv);    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG05) & 0x00;    regv |= (coeff_div[coeff].adcdiv - 1) << 4;    regv |= (coeff_div[coeff].dacdiv - 1) << 0;    Es8311WriteReg(ES8311_CLK_MANAGER_REG05, regv);    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG03) & 0x80;    regv |= coeff_div[coeff].fsmode << 6;    regv |= coeff_div[coeff].adcosr << 0;    Es8311WriteReg(ES8311_CLK_MANAGER_REG03, regv);    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG04) & 0x80;    regv |= coeff_div[coeff].dacosr << 0;    Es8311WriteReg(ES8311_CLK_MANAGER_REG04, regv);    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG07) & 0xC0;    regv |= coeff_div[coeff].lrck_h << 0;    Es8311WriteReg(ES8311_CLK_MANAGER_REG07, regv);    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG08) & 0x00;    regv |= coeff_div[coeff].lrck_l << 0;    Es8311WriteReg(ES8311_CLK_MANAGER_REG08, regv);    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG06) & 0xE0;    if (coeff_div[coeff].bclkdiv < 19) {      regv |= (coeff_div[coeff].bclkdiv - 1) << 0;    } else {      regv |= (coeff_div[coeff].bclkdiv) << 0;    }    Es8311WriteReg(ES8311_CLK_MANAGER_REG06, regv);  }}/** set data and clock in tri-state mode* if tristate = 0, tri-state is disabled for normal mode* if tristate = 1, tri-state is enabled*/// static void es8311_set_tristate(int tristate)// {//     uint8_t regv;//     ESP_LOGI(TAG, "Enter into es8311_set_tristate(), tristate = %d\n", tristate);//     regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG07) & 0xcf;//     if (tristate) {//         Es8311WriteReg(ES8311_CLK_MANAGER_REG07, regv | 0x30);//     } else {//         Es8311WriteReg(ES8311_CLK_MANAGER_REG07, regv);//     }// }/** set es8311 dac mute or not* if mute = 0, dac un-mute* if mute = 1, dac mute*/static void es8311_mute(int mute) {  uint8_t regv;  ESP_LOGI(TAG, "Enter into es8311_mute(), mute = %d\n", mute);  regv = Es8311ReadReg(ES8311_DAC_REG31) & 0x9f;  if (mute) {    Es8311WriteReg(ES8311_SYSTEM_REG12, 0x02);    Es8311WriteReg(ES8311_DAC_REG31, regv | 0x60);    Es8311WriteReg(ES8311_DAC_REG32, 0x00);    Es8311WriteReg(ES8311_DAC_REG37, 0x08);  } else {    Es8311WriteReg(ES8311_DAC_REG31, regv);    Es8311WriteReg(ES8311_SYSTEM_REG12, 0x00);  }}/** set es8311 into suspend mode*/// static void es8311_suspend(void)// {//     ESP_LOGI(TAG, "Enter into es8311_suspend()\n");//     Es8311WriteReg(ES8311_DAC_REG32, 0x00);//     Es8311WriteReg(ES8311_ADC_REG17, 0x00);//     Es8311WriteReg(ES8311_SYSTEM_REG0E, 0xFF);//     Es8311WriteReg(ES8311_SYSTEM_REG12, 0x02);//     Es8311WriteReg(ES8311_SYSTEM_REG14, 0x00);//     Es8311WriteReg(ES8311_SYSTEM_REG0D, 0xFA);//     Es8311WriteReg(ES8311_ADC_REG15, 0x00);//     Es8311WriteReg(ES8311_DAC_REG37, 0x08);//     Es8311WriteReg(ES8311_RESET_REG00, 0x00);//     Es8311WriteReg(ES8311_RESET_REG00, 0x1F);//     Es8311WriteReg(ES8311_CLK_MANAGER_REG01, 0x30);//     Es8311WriteReg(ES8311_CLK_MANAGER_REG01, 0x00);//     Es8311WriteReg(ES8311_GP_REG45, 0x01);// }/** initialize es8311 codec*/static void es8311_init(uint32_t mclk_freq, uint32_t lrck_freq) {  int regv;  Es8311WriteReg(ES8311_GP_REG45, 0x00);  Es8311WriteReg(ES8311_CLK_MANAGER_REG01, 0x30);  Es8311WriteReg(ES8311_CLK_MANAGER_REG02, 0x00);  Es8311WriteReg(ES8311_CLK_MANAGER_REG03, 0x10);  Es8311WriteReg(ES8311_ADC_REG16, 0x24);  Es8311WriteReg(ES8311_CLK_MANAGER_REG04, 0x10);  Es8311WriteReg(ES8311_CLK_MANAGER_REG05, 0x00);  Es8311WriteReg(ES8311_SYSTEM_REG0B, 0x00);  Es8311WriteReg(ES8311_SYSTEM_REG0C, 0x00);  Es8311WriteReg(ES8311_SYSTEM_REG10, 0x1F);  Es8311WriteReg(ES8311_SYSTEM_REG11, 0x7F);  Es8311WriteReg(ES8311_RESET_REG00, 0x80);  /*    * Set Codec into Master or Slave mode    */  regv = Es8311ReadReg(ES8311_RESET_REG00);  /* set master/slave audio interface */  switch (es8311_priv->master_slave_mode) {    case MASTER_MODE: /* MASTER MODE */      ESP_LOGI(TAG, "ES8311 in Master mode\n");      regv |= 0x40;      break;    case SLAVE_MODE: /* SLAVE MODE */      ESP_LOGI(TAG, "ES8311 in Slave mode\n");      regv &= 0xBF;      break;    default:      regv &= 0xBF;  }  Es8311WriteReg(ES8311_RESET_REG00, regv);  Es8311WriteReg(ES8311_SYSTEM_REG0D, 0x01);  Es8311WriteReg(ES8311_CLK_MANAGER_REG01, 0x3F);  /*    *   select clock source for internal mclk    */  switch (es8311_priv->mclk_src) {    case FROM_MCLK_PIN:      regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG01);      regv &= 0x7F;      Es8311WriteReg(ES8311_CLK_MANAGER_REG01, regv);      break;    case FROM_SCLK_PIN:      regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG01);      regv |= 0x80;      Es8311WriteReg(ES8311_CLK_MANAGER_REG01, regv);      break;    default:      regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG01);      regv &= 0x7F;      Es8311WriteReg(ES8311_CLK_MANAGER_REG01, regv);      break;  }  es8311_pcm_hw_params(lrck_freq * 256, lrck_freq);  /*    *   mclk inverted or not    */  if (es8311_priv->mclkinv == true) {    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG01);    regv |= 0x40;    Es8311WriteReg(ES8311_CLK_MANAGER_REG01, regv);  } else {    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG01);    regv &= ~(0x40);    Es8311WriteReg(ES8311_CLK_MANAGER_REG01, regv);  }  /*    *   sclk inverted or not    */  if (es8311_priv->sclkinv == true) {    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG06);    regv |= 0x20;    Es8311WriteReg(ES8311_CLK_MANAGER_REG06, regv);  } else {    regv = Es8311ReadReg(ES8311_CLK_MANAGER_REG06);    regv &= ~(0x20);    Es8311WriteReg(ES8311_CLK_MANAGER_REG06, regv);  }  Es8311WriteReg(ES8311_SYSTEM_REG14, 0x1A);  /*    *   pdm dmic enable or disable    */  if (es8311_priv->dmic_enable == true) {    regv = Es8311ReadReg(ES8311_SYSTEM_REG14);    regv |= 0x40;    Es8311WriteReg(ES8311_SYSTEM_REG14, regv);  } else {    regv = Es8311ReadReg(ES8311_SYSTEM_REG14);    regv &= ~(0x40);    Es8311WriteReg(ES8311_SYSTEM_REG14, regv);  }  Es8311WriteReg(ES8311_SYSTEM_REG13, 0x10);  Es8311WriteReg(ES8311_SYSTEM_REG0E, 0x02);  Es8311WriteReg(ES8311_ADC_REG15, 0x40);  Es8311WriteReg(ES8311_ADC_REG1B, 0x0A);  Es8311WriteReg(ES8311_ADC_REG1C, 0x6A);  Es8311WriteReg(ES8311_DAC_REG37, 0x48);  Es8311WriteReg(ES8311_GPIO_REG44, 0x08);  Es8311WriteReg(ES8311_DAC_REG32, 0xBF);#ifdef CONFIG_USE_ES7243  Es7243Init();#endif}/** set codec private data and initialize codec*/void es8311_Codec_Startup(uint32_t mclk_freq, uint32_t lrck_freq) {  ESP_LOGI(TAG, "Enter into es8311_Codec_Startup()\n");  es8311_priv->dmic_enable = false;  es8311_priv->mclkinv = false;  es8311_priv->sclkinv = false;  es8311_priv->pcm_format = I2S_FMT;  es8311_priv->pcm_resolution = LENGTH_16BIT;  es8311_priv->master_slave_mode = SLAVE_MODE;#ifdef CONFIG_ESP32_KORVO_V1_1_BOARD  es8311_priv->mclk_src = FROM_SCLK_PIN;#else  es8311_priv->mclk_src = FROM_MCLK_PIN;#endif  es8311_init(mclk_freq, lrck_freq);  ESP_LOGI(TAG, "Exit es8311_Codec_Startup()\n");}// static int Es8311SetAdcDacVolume(int mode, int volume, int dot)// {//     int res = 0;//     if ( volume < -96 || volume > 0 ) {//         ESP_LOGI(TAG, "Warning: volume < -96! or > 0!\n");//         if (volume < -96) {//             volume = -96;//         } else {//             volume = 0;//         }//     }//     dot = (dot >= 5 ? 1 : 0);//     return res;// }esp_err_t Es8311GetRef(bool flag) {  esp_err_t ret = ESP_OK;  uint8_t regv = 0;  if (flag) {    regv = Es8311ReadReg(ES8311_GPIO_REG44);    regv |= 0x50;    ret |= Es8311WriteReg(ES8311_GPIO_REG44, regv);  } else {    ret |= Es8311WriteReg(ES8311_GPIO_REG44, 0x08);  }  return ret;}int Es8311Init(Es8311Config* cfg) {  es8311_priv = calloc(1, sizeof(struct es8311_private));  I2cInit(&cfg->i2c_cfg, cfg->i2c_port_num);  // ESP32 in master mode  es8311_Codec_Startup(11289600, 44100);  return 0;}void Es8311Uninit() {  Es8311WriteReg(ES8311_RESET_REG00, 0x3f);  free(es8311_priv);  es8311_priv = NULL;}int Es8311ConfigFmt(ESCodecModule mode, ESCodecI2SFmt fmt) {  int res = 0;  uint8_t regAdc = 0, regDac = 0;  if (mode == ES_MODULE_ADC || mode == ES_MODULE_ADC_DAC) {    res |= Es8311WriteReg(ES8311_ADC_REG17, 0xBF);  }  if (mode == ES_MODULE_DAC || mode == ES_MODULE_ADC_DAC) {    res |= Es8311WriteReg(ES8311_SYSTEM_REG12, 0x00);  }  regAdc = Es8311ReadReg(ES8311_SDPIN_REG09);  regDac = Es8311ReadReg(ES8311_SDPOUT_REG0A);  switch (fmt) {    case ES_I2S_NORMAL:      ESP_LOGI(TAG, "ES8311 in I2S Format");      regAdc &= ~0x03;      regDac &= ~0x03;      break;    case ES_I2S_LEFT:    case ES_I2S_RIGHT:      ESP_LOGI(TAG, "ES8311 in LJ Format");      regAdc &= ~0x03;      regAdc |= 0x01;      regDac &= ~0x03;      regDac |= 0x01;      break;    case ES_I2S_DSP:      ESP_LOGI(TAG, "ES8311 in DSP Format");      regAdc |= 0x03;      regDac |= 0x03;      break;    default:      ESP_LOGE(TAG, "Not Supported Format");      break;  }  res |= Es8311WriteReg(ES8311_SDPIN_REG09, regAdc);  res |= Es8311WriteReg(ES8311_SDPOUT_REG0A, regDac);  return res;}int Es8311I2sConfigClock(ESCodecI2sClock cfg) {  int res = 0;  return res;}int Es8311SetBitsPerSample(ESCodecModule mode, BitsLength bitPerSample) {  int res = 0;  uint8_t reg = 0;  int bits = (int)bitPerSample;  if (mode == ES_MODULE_ADC || mode == ES_MODULE_ADC_DAC) {    reg = Es8311ReadReg(ES8311_SDPIN_REG09);    reg = reg & 0xe3;    res |= Es8311WriteReg(ES8311_SDPIN_REG09, reg | (bits << 2));  }  if (mode == ES_MODULE_DAC || mode == ES_MODULE_ADC_DAC) {    reg = Es8311ReadReg(ES8311_SDPOUT_REG0A);    reg = reg & 0xe3;    res |= Es8311WriteReg(ES8311_SDPOUT_REG0A, reg | (bits << 2));  }  return res;}int Es8311Start(ESCodecModule mode) {  int res = 0;  if (mode == ES_MODULE_ADC || mode == ES_MODULE_ADC_DAC) {    res |= Es8311WriteReg(ES8311_ADC_REG17, 0xBF);  }  if (mode == ES_MODULE_DAC || mode == ES_MODULE_ADC_DAC) {    res |= Es8311WriteReg(ES8311_SYSTEM_REG12,                          Es8311ReadReg(ES8311_SYSTEM_REG12) & 0xfd);  }  return res;}int Es8311Stop(ESCodecModule mode) {  int res = 0;  if (mode == ES_MODULE_ADC || mode == ES_MODULE_ADC_DAC) {    res |= Es8311WriteReg(ES8311_ADC_REG17, 0x00);  }  if (mode == ES_MODULE_DAC || mode == ES_MODULE_ADC_DAC) {    res |= Es8311WriteReg(ES8311_SYSTEM_REG12,                          Es8311ReadReg(ES8311_SYSTEM_REG12) | 0x02);  }  return res;}int Es8311SetVoiceVolume(int volume) {  int res = 0;  if (volume == 0) {    volume = 1;  }  Es8311WriteReg(ES8311_DAC_REG32, volume);  return res;}int Es8311GetVoiceVolume(int* volume) {  int res = ESP_OK;  int regv = Es8311ReadReg(ES8311_DAC_REG32);  if (regv == ESP_FAIL) {    *volume = 0;    res = ESP_FAIL;  } else {    *volume = regv * 100 / 256;  }  ESP_LOGI(TAG, "GET: res:%d, volume:%d\n", regv, *volume);  return res;}int Es8311SetVoiceMute(int enable) {  int res = 0;  ESP_LOGI(TAG, "Es8311SetVoiceMute volume:%d\n", enable);  es8311_mute(enable);  return res;}int Es8311GetVoiceMute(int* mute) {  int res = -1;  uint8_t reg = 0;  res = Es8311ReadReg(ES8311_DAC_REG31);  if (res != ESP_FAIL) {    reg = (res & 0x20) >> 5;  }  *mute = reg;  return res;}int Es8311SetMicGain(MicGain gain) {  int res = 0;  uint8_t gain_n = Es8311ReadReg(ES8311_ADC_REG16) & 0x07;  gain_n |= gain / 6;  res = Es8311WriteReg(ES8311_ADC_REG16, gain_n);  // MIC gain scale  return res;}int Es8311ConfigAdcInput(AdcInput input) {  int res = 0;  return res;}int Es8311SetAdcVolume(uint8_t adc_vol) {  int res = 0;  res = Es8311WriteReg(ES8311_ADC_REG17, adc_vol);  // MIC ADC Volume  return res;}int ES8311WriteReg(uint8_t regAdd, uint8_t data) {  return Es8311WriteReg(regAdd, data);}void Es8311ReadAll() {  for (int i = 0; i < 0x4A; i++) {    uint8_t reg = Es8311ReadReg(i);    // ets_printf("REG:%02x, %02x\n", reg, i);  }}
 |