From 4d68121111735bfee748a42225e8c8e5e1ea0fbf Mon Sep 17 00:00:00 2001 From: philippe44 Date: Thu, 6 Feb 2020 16:33:41 -0800 Subject: [PATCH] ac101 tweaks --- components/services/services.c | 2 +- components/squeezelite/a1s/ac101.c | 70 +++++++++++++++--------------- components/squeezelite/a1s/ac101.h | 2 +- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/components/services/services.c b/components/services/services.c index f038b870..3f430e59 100644 --- a/components/services/services.c +++ b/components/services/services.c @@ -70,7 +70,7 @@ void services_init(void) { i2c_param_config(i2c_system_port, i2c_config); i2c_driver_install(i2c_system_port, i2c_config->mode, 0, 0, 0 ); } else { - ESP_LOGE(TAG, "can't initialize I2C"); + ESP_LOGW(TAG, "no I2C configured"); } ESP_LOGD(TAG,"Configuring LEDs"); diff --git a/components/squeezelite/a1s/ac101.c b/components/squeezelite/a1s/ac101.c index b46a816f..148e2397 100644 --- a/components/squeezelite/a1s/ac101.c +++ b/components/squeezelite/a1s/ac101.c @@ -37,6 +37,7 @@ const static char TAG[] = "AC101"; #define SPKOUT_EN ((1 << 11) | (1 << 7)) #define EAROUT_EN ((1 << 11) | (1 << 12) | (1 << 13)) +#define BIN(a,b,c,d) 0b##a##b##c##d #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) @@ -90,51 +91,52 @@ static bool init(int i2c_port_num, int i2s_num, i2s_config_t *i2s_config) { ESP_LOGI(TAG, "DAC using I2C sda:%u, scl:%u", i2c_config.sda_io_num, i2c_config.scl_io_num); res = i2c_write_reg(CHIP_AUDIO_RS, 0x123); - //huh? - //vTaskDelay(1000 / portTICK_PERIOD_MS); + // huh? + vTaskDelay(100 / portTICK_PERIOD_MS); if (ESP_OK != res) { ESP_LOGE(TAG, "AC101 reset failed! %d", res); return false; } - // Enable the PLL from 256*44.1KHz MCLK source - i2c_write_reg(PLL_CTRL1, 0x014f); - //res |= i2c_write_reg(PLL_CTRL2, 0x83c0); - i2c_write_reg(PLL_CTRL2, 0x8600); + // enable the PLL from BCLK source + i2c_write_reg(PLL_CTRL1, BIN(0000,0001,0100,1111)); // F=1,M=1,PLL,INT=31 (medium) + i2c_write_reg(PLL_CTRL2, BIN(1000,0110,0000,0000)); // PLL, F=96,N_i=1024-96,F=0,N_f=0*0.2; + // i2c_write_reg(PLL_CTRL2, BIN(1000,0011,1100,0000)); - //Clocking system - i2c_write_reg(SYSCLK_CTRL, 0x8b08); - i2c_write_reg(MOD_CLK_ENA, 0x800c); - i2c_write_reg(MOD_RST_CTRL, 0x800c); - i2c_write_reg(I2S_SR_CTRL, 0x7000); //sample rate + // clocking system + i2c_write_reg(SYSCLK_CTRL, BIN(1010,1010,0000,1000)); // PLLCLK, BCLK1, IS1CLK, PLL, SYSCLK + i2c_write_reg(MOD_CLK_ENA, BIN(1000,0000,0000,1100)); // IS21, ADC, DAC + i2c_write_reg(MOD_RST_CTRL, BIN(1000,0000,0000,1100)); // IS21, ADC, DAC + i2c_write_reg(I2S_SR_CTRL, BIN(0111,0000,0000,0000)); // 44.1kHz - //AIF config - i2c_write_reg(I2S1LCK_CTRL, 0x8850); //BCLK/LRCK - i2c_write_reg(I2S1_SDOUT_CTRL, 0xc000); - i2c_write_reg(I2S1_SDIN_CTRL, 0xc000); - i2c_write_reg(I2S1_MXR_SRC, 0x2200); - - i2c_write_reg(ADC_SRCBST_CTRL, 0xccc4); - i2c_write_reg(ADC_SRC, 0x2020); - i2c_write_reg(ADC_DIG_CTRL, 0x8000); - i2c_write_reg(ADC_APC_CTRL, 0xbbc3); + // analogue config + i2c_write_reg(I2S1LCK_CTRL, BIN(1000,1000,0101,0000)); // Slave, BCLK=I2S/8,LRCK=32,16bits,I2Smode, Stereo + i2c_write_reg(I2S1_SDOUT_CTRL, BIN(1100,0000,0000,0000)); // I2S1ADC (R&L) + i2c_write_reg(I2S1_SDIN_CTRL, BIN(1100,0000,0000,0000)); // IS21DAC (R&L) + i2c_write_reg(I2S1_MXR_SRC, BIN(0010,0010,0000,0000)); // ADCL, ADCR + i2c_write_reg(ADC_SRCBST_CTRL, BIN(0100,0100,0100,0000)); // disable all boost (default) +#if ENABLE_ADC + i2c_write_reg(ADC_SRC, BIN(0000,0100,0000,1000)); // source=linein(R/L) + i2c_write_reg(ADC_DIG_CTRL, BIN(1000,0000,0000,0000)); // enable digital ADC + i2c_write_reg(ADC_ANA_CTRL, BIN(1011, 1011,0000,0000)); // enable analogue R/L, 0dB +#else + i2c_write_reg(ADC_SRC, BIN(0000,0000,0000,0000)); // source=none + i2c_write_reg(ADC_DIG_CTRL, BIN(0000,0000,0000,0000)); // disable digital ADC + i2c_write_reg(ADC_ANA_CTRL, BIN(0011, 0011,0000,0000)); // disable analogue R/L, 0dB +#endif //Path Configuration - i2c_write_reg(DAC_MXR_SRC, 0xcc00); - i2c_write_reg(DAC_DIG_CTRL, 0x8000); - i2c_write_reg(OMIXER_SR, 0x0081); - i2c_write_reg(OMIXER_DACA_CTRL, 0xf080); + i2c_write_reg(DAC_MXR_SRC, BIN(1000,1000,0000,0000)); // DAC from I2S + i2c_write_reg(DAC_DIG_CTRL, BIN(1000,0000,0000,0000)); // enable DAC + i2c_write_reg(OMIXER_DACA_CTRL, BIN(1111,0000,0000,000)); // enable DAC/Analogue (see note on offset removal and PA) + i2c_write_reg(OMIXER_DACA_CTRL, BIN(1100,0000,0000,000)); // enable DAC/Analogue (see note on offset removal and PA) +#if ENABLE_ADC + i2c_write_reg(OMIXER_SR, BIN(0000,0001,0000,0010)); // source=DAC(R/L) (are DACR and DACL really inverted in bitmap?) +#else + i2c_write_reg(OMIXER_SR, BIN(0000,0101,0000,1010)); // source=DAC(R/L) and LINEIN(R/L) +#endif - // configure I2S - uint16_t regval = i2c_read_reg(I2S1LCK_CTRL); - regval &= 0xffc3; - regval |= (AC_MODE_SLAVE << 15); - regval |= (BIT_LENGTH_16_BITS << 4); - regval |= (AC_MODE_SLAVE << 2); - res |= i2c_write_reg(I2S1LCK_CTRL, regval); - res |= i2c_write_reg(I2S_SR_CTRL, SAMPLE_RATE_44100); - // configure I2S pins & install driver i2s_pin_config_t i2s_pin_config = (i2s_pin_config_t) { .bck_io_num = 27, .ws_io_num = 26, .data_out_num = 25, .data_in_num = 35 //Not used diff --git a/components/squeezelite/a1s/ac101.h b/components/squeezelite/a1s/ac101.h index 00cddb7a..39c17379 100644 --- a/components/squeezelite/a1s/ac101.h +++ b/components/squeezelite/a1s/ac101.h @@ -61,7 +61,7 @@ #define DAC_VOL_CTRL 0x49 #define DAC_MXR_SRC 0x4c #define DAC_MXR_GAIN 0x4d -#define ADC_APC_CTRL 0x50 +#define ADC_ANA_CTRL 0x50 #define ADC_SRC 0x51 #define ADC_SRCBST_CTRL 0x52 #define OMIXER_DACA_CTRL 0x53