mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-07 12:07:09 +03:00
Merge remote-tracking branch 'origin/master-cmake' into master-cmake
This commit is contained in:
@@ -71,7 +71,7 @@ typedef enum {
|
||||
} parse_state_t;
|
||||
static const char *TAG = "cmd_config";
|
||||
extern struct arg_end *getParmsEnd(struct arg_hdr * * argtable);
|
||||
//bck=<gpio>,ws=<gpio>,do=<gpio>[,mute=<gpio>[:0|1][,model=TAS57xx|TAS5713|AC101|I2S][,sda=<gpio>,scl=gpio[,i2c=<addr>]]
|
||||
//bck=<gpio>,ws=<gpio>,do=<gpio>[,mute=<gpio>[:0|1][,model=TAS57xx|TAS5713|AC101|WM8978|I2S][,sda=<gpio>,scl=gpio[,i2c=<addr>]]
|
||||
static struct {
|
||||
struct arg_str *model_name;
|
||||
struct arg_int *clock;
|
||||
@@ -861,7 +861,7 @@ static char * get_log_level_options(const char * longname){
|
||||
return options;
|
||||
}
|
||||
static void register_i2s_config(void){
|
||||
i2s_args.model_name = arg_str1(NULL,"model_name","TAS57xx|TAS5713|AC101|I2S","DAC Model Name");
|
||||
i2s_args.model_name = arg_str1(NULL,"model_name","TAS57xx|TAS5713|AC101|WM8978|I2S","DAC Model Name");
|
||||
i2s_args.clear = arg_lit0(NULL, "clear", "Clear configuration");
|
||||
i2s_args.clock = arg_int1(NULL,"clock","<n>","Clock GPIO. e.g. 33");
|
||||
i2s_args.wordselect = arg_int1(NULL,"wordselect","<n>","Word Select GPIO. e.g. 25");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
idf_component_register( SRC_DIRS . external ac101 tas57xx
|
||||
idf_component_register( SRC_DIRS . external ac101 tas57xx wm8978
|
||||
INCLUDE_DIRS . ac101
|
||||
PRIV_REQUIRES
|
||||
codecs
|
||||
|
||||
@@ -28,6 +28,7 @@ struct adac_s {
|
||||
extern const struct adac_s dac_tas57xx;
|
||||
extern const struct adac_s dac_tas5713;
|
||||
extern const struct adac_s dac_ac101;
|
||||
extern const struct adac_s dac_wm8978;
|
||||
extern const struct adac_s dac_external;
|
||||
|
||||
int adac_init(char *config, int i2c_port);
|
||||
|
||||
@@ -20,7 +20,7 @@ CFLAGS += -O3 -DLINKALL -DLOOPBACK -DNO_FAAD -DRESAMPLE16 -DEMBEDDED -DTREMOR_ON
|
||||
|
||||
# -I$(COMPONENT_PATH)/../codecs/inc/faad2
|
||||
|
||||
COMPONENT_SRCDIRS := . tas57xx ac101 external
|
||||
COMPONENT_SRCDIRS := . tas57xx ac101 external wm8978
|
||||
COMPONENT_ADD_INCLUDEDIRS := . ./tas57xx ./ac101
|
||||
COMPONENT_EMBED_FILES := vu.data
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ extern struct buffer *streambuf;
|
||||
extern struct buffer *outputbuf;
|
||||
extern u8_t *silencebuf;
|
||||
|
||||
const struct adac_s *dac_set[] = { &dac_tas57xx, &dac_tas5713, &dac_ac101, NULL };
|
||||
const struct adac_s *dac_set[] = { &dac_tas57xx, &dac_tas5713, &dac_ac101, &dac_wm8978, NULL };
|
||||
const struct adac_s *adac = &dac_external;
|
||||
|
||||
static log_level loglevel;
|
||||
|
||||
@@ -59,7 +59,6 @@ static const struct tas57xx_cmd_s tas57xx_cmd[] = {
|
||||
};
|
||||
|
||||
static uint8_t tas57_addr;
|
||||
int i2c_port_x;
|
||||
|
||||
static void dac_cmd(dac_cmd_e cmd, ...);
|
||||
static int tas57_detect(void);
|
||||
@@ -69,10 +68,9 @@ static int tas57_detect(void);
|
||||
*/
|
||||
static bool init(char *config, int i2c_port, i2s_config_t *i2s_config) {
|
||||
// find which TAS we are using (if any)
|
||||
i2c_port_x = i2c_port;
|
||||
adac_init(config, i2c_port);
|
||||
tas57_addr = tas57_detect();
|
||||
|
||||
tas57_addr = adac_init(config, i2c_port);
|
||||
if (!tas57_addr) tas57_addr = tas57_detect();
|
||||
|
||||
if (!tas57_addr) {
|
||||
ESP_LOGW(TAG, "No TAS57xx detected");
|
||||
adac_deinit();
|
||||
|
||||
98
components/squeezelite/wm8978/wm8978.c
Normal file
98
components/squeezelite/wm8978/wm8978.c
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Squeezelite for esp32
|
||||
*
|
||||
* (c) Wizmo 2021
|
||||
* Sebastien 2019
|
||||
* Philippe G. 2019, philippe_44@outlook.com
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
#include <driver/i2s.h>
|
||||
#include "driver/i2c.h"
|
||||
#include "esp_log.h"
|
||||
#include "adac.h"
|
||||
|
||||
static const char TAG[] = "WM8978";
|
||||
|
||||
static void speaker(bool active) { }
|
||||
static void headset(bool active) { }
|
||||
static bool volume(unsigned left, unsigned right) { return false; }
|
||||
static void power(adac_power_e mode);
|
||||
static bool init(char *config, int i2c_port_num, i2s_config_t *i2s_config);
|
||||
|
||||
static esp_err_t i2c_write_shadow(uint8_t reg, uint16_t val);
|
||||
static uint16_t i2c_read_shadow(uint8_t reg);
|
||||
|
||||
static int WM8978;
|
||||
|
||||
const struct adac_s dac_wm8978 = { "WM8978", init, adac_deinit, power, speaker, headset, volume };
|
||||
|
||||
// initiation table for non-readbale 9-bit i2c registers
|
||||
static uint16_t WM8978_REGVAL_TBL[58] = {
|
||||
0X0000, 0X0000, 0X0000, 0X0000, 0X0050, 0X0000, 0X0140, 0X0000,
|
||||
0X0000, 0X0000, 0X0000, 0X00FF, 0X00FF, 0X0000, 0X0100, 0X00FF,
|
||||
0X00FF, 0X0000, 0X012C, 0X002C, 0X002C, 0X002C, 0X002C, 0X0000,
|
||||
0X0032, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
|
||||
0X0038, 0X000B, 0X0032, 0X0000, 0X0008, 0X000C, 0X0093, 0X00E9,
|
||||
0X0000, 0X0000, 0X0000, 0X0000, 0X0003, 0X0010, 0X0010, 0X0100,
|
||||
0X0100, 0X0002, 0X0001, 0X0001, 0X0039, 0X0039, 0X0039, 0X0039,
|
||||
0X0001, 0X0001
|
||||
};
|
||||
|
||||
/****************************************************************************************
|
||||
* init
|
||||
*/
|
||||
static bool init(char *config, int i2c_port, i2s_config_t *i2s_config) {
|
||||
WM8978 = adac_init(config, i2c_port);
|
||||
|
||||
if (!WM8978) WM8978 = 0x1a;
|
||||
ESP_LOGI(TAG, "WM8978 detected @%d", WM8978);
|
||||
|
||||
// init sequence
|
||||
i2c_write_shadow(0, 0);
|
||||
i2c_write_shadow(4, 16);
|
||||
i2c_write_shadow(6, 0);
|
||||
i2c_write_shadow(10, 8);
|
||||
i2c_write_shadow(43, 16);
|
||||
i2c_write_shadow(49, 102);
|
||||
|
||||
// Configure system clk to GPIO0 for DAC MCLK input
|
||||
ESP_LOGI(TAG, "Configuring MCLK on pin:%d", 0);
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1);
|
||||
REG_WRITE(PIN_CTRL, 0xFFFFFFF0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* power
|
||||
*/
|
||||
static void power(adac_power_e mode) {
|
||||
uint16_t *data, off[] = {0, 0, 0}, on[] = {11, 384, 111};
|
||||
data = (mode == ADAC_STANDBY || mode == ADAC_OFF) ? off : on;
|
||||
i2c_write_shadow(1, data[0]);
|
||||
i2c_write_shadow(2, data[1]);
|
||||
i2c_write_shadow(3, data[2]);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* Write with custom reg/value structure
|
||||
*/
|
||||
static esp_err_t i2c_write_shadow(uint8_t reg, uint16_t val) {
|
||||
WM8978_REGVAL_TBL[reg] = val;
|
||||
reg = (reg << 1) | ((val >> 8) & 0x01);
|
||||
val &= 0xff;
|
||||
return adac_write_byte(WM8978, reg, val);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* Return local register value
|
||||
*/
|
||||
static uint16_t i2c_read_shadow(uint8_t reg) {
|
||||
return WM8978_REGVAL_TBL[reg];
|
||||
}
|
||||
@@ -124,7 +124,7 @@
|
||||
"help": "DAC Options",
|
||||
"hascb": true,
|
||||
"argtable": [{
|
||||
"datatype": "TAS57xx|TAS5713|AC101|I2S",
|
||||
"datatype": "TAS57xx|TAS5713|AC101|WM8978|I2S",
|
||||
"glossary": "DAC Model Name",
|
||||
"longopts": "model_name",
|
||||
"checkbox": false,
|
||||
@@ -202,7 +202,7 @@
|
||||
"mincount": 0,
|
||||
"maxcount": 1
|
||||
}],
|
||||
"hint": " --model_name=TAS57xx|TAS5713|AC101|I2S --clock=<n> --wordselect=<n> --data=<n> [--mute_gpio=<n>] [--mute_level] [--dac_sda=<n>] [--dac_scl=<n>] [--dac_i2c=<n>] [--clear]",
|
||||
"hint": " --model_name=TAS57xx|TAS5713|AC101|WM8978|I2S --clock=<n> --wordselect=<n> --data=<n> [--mute_gpio=<n>] [--mute_level] [--dac_sda=<n>] [--dac_scl=<n>] [--dac_i2c=<n>] [--clear]",
|
||||
"name": "cfg-hw-dac"
|
||||
}, {
|
||||
"help": "SPDIF Options",
|
||||
|
||||
Reference in New Issue
Block a user