11#include "driver/spi_master.h"
12#include "driver/i2c_master.h"
13#include "driver/pulse_cnt.h"
14#include "driver/gpio.h"
18#define SGTL5000_SDA 15
19#define SGTL5000_SCL 16
21static const char *TAG =
"sgtl5000";
25static uint16_t ana_ctrl;
26static uint8_t i2c_addr = 0x0A;
29static bool semi_automated;
31static i2c_master_bus_handle_t bus;
32static i2c_master_dev_handle_t dev;
43 if (!cfg)
return ESP_ERR_INVALID_ARG;
45 i2c_master_bus_config_t bus_cfg = {
49 .clk_source = I2C_CLK_SRC_DEFAULT,
50 .glitch_ignore_cnt = 7,
52 .trans_queue_depth = 0,
53 .flags.enable_internal_pullup =
false,
56 esp_err_t err = i2c_new_master_bus(&bus_cfg, &bus);
57 if (err != ESP_OK)
return err;
59 i2c_device_config_t dev_cfg = {
60 .dev_addr_length = I2C_ADDR_BIT_LEN_7,
61 .device_address = i2c_addr,
62 .scl_speed_hz = cfg->
i2c_hz,
65 err = i2c_master_bus_add_device(bus, &dev_cfg, &dev);
78 i2c_master_bus_rm_device(dev);
82 i2c_device_config_t dev_cfg = {
83 .dev_addr_length = I2C_ADDR_BIT_LEN_7,
84 .device_address = i2c_addr,
85 .scl_speed_hz = 400000,
88 esp_err_t err = i2c_master_bus_add_device(bus, &dev_cfg, &dev);
95 if (!dev || !out_val)
return ESP_ERR_INVALID_STATE;
97 uint8_t addr_be[2] = { (uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF) };
98 uint8_t data[2] = {0, 0};
100 esp_err_t err = i2c_master_transmit_receive(dev, addr_be,
sizeof(addr_be), data,
sizeof(data), -1);
103 vTaskDelay(pdMS_TO_TICKS(2));
105 *out_val = ((uint16_t)data[0] << 8) | (uint16_t)data[1];
111 if (!dev)
return ESP_ERR_INVALID_STATE;
116 (uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF),
117 (uint8_t)(val >> 8), (uint8_t)(val & 0xFF)
120 esp_err_t err = i2c_master_transmit(dev, pkt,
sizeof(pkt), -1);
132 if (ret_val !=
NO_ERROR)
return ret_val;
134 uint16_t newv = (cur & ~mask) | (val & mask);
136 if (ret_val !=
NO_ERROR)
return ret_val;
138 if (out_newval) *out_newval = newv;
144 if (!dev)
return ESP_ERR_INVALID_STATE;
162 vTaskDelay(pdMS_TO_TICKS(400));
175 semi_automated =
true;
198 else if (n < 13) n = 13;
204 gpio_config_t cfg = {
205 .pin_bit_mask = 1ULL << 2,
206 .mode = GPIO_MODE_INPUT,
207 .pull_up_en = GPIO_PULLUP_DISABLE,
208 .pull_down_en = GPIO_PULLDOWN_DISABLE,
209 .intr_type = GPIO_INTR_DISABLE,
215static void read_and_print(uint16_t reg,
const char *name)
221 kest_printf(
"RD %-18s (0x%04X): ERROR\n", name, reg);
224 kest_printf(
"RD %-18s (0x%04X): 0x%04X\n", name, reg, v);
262 for (
size_t i = 0; i <
sizeof(reads)/
sizeof(reads[0]); i++) {
263 (void)read_and_print(reads[i].reg, reads[i].name);
280 vTaskDelay(pdMS_TO_TICKS(3000));
284 kest_printf(
"Initialise I2C bus with SGTL5000...\n");
287 kest_printf(
"Error initialising I2C bus with SGTL5000...\n");
void kest_printf(const char *fmt,...)
int sgtl5000_set_address_level(int cs_level_high)
int sgtl5000_read_reg(uint16_t reg, uint16_t *out_val)
void sgtl_power_gpio_init(void)
int sgtl5000_write_reg(uint16_t reg, uint16_t val)
int sgtl5000_line_in_level(uint8_t n)
void kest_sgtl5000_init(void *param)
int sgtl5000_line_out_level(uint8_t n)
void sgtl5000_readout_registers()
int sgtl5000_enable(void)
int sgtl5000_i2c_init(const sgtl5000_i2c_cfg_t *cfg)
int sgtl5000_modify_reg(uint16_t reg, uint16_t val, uint16_t mask, uint16_t *out_newval)
#define SGTL5000_I2C_ADDR_CS_LOW
#define CHIP_PAD_STRENGTH
#define CHIP_ANA_ADC_CTRL
#define CHIP_CLK_TOP_CTRL
#define CHIP_LINE_OUT_CTRL
#define CHIP_LINE_OUT_VOL
#define SGTL5000_I2C_ADDR_CS_HIGH