6#if defined(ARDUINO) && !AUDIO_DRIVER_FORCE_IDF
10#elif defined(ESP32_CMAKE)
13# include "driver/i2c_master.h"
14#elif defined(__zephyr__)
17# include <zephyr/drivers/i2c.h>
18# include <zephyr/kernel.h>
29#if !defined(__zephyr__)
40#if defined(ARDUINO) && !AUDIO_DRIVER_FORCE_IDF
44 assert(config !=
nullptr);
47 assert(p_wire !=
nullptr);
49 if (pins.scl == -1 || pins.sda == -1) {
50 AD_LOGI(
"setting up I2C w/o pins");
54 AD_LOGI(
"setting up I2C scl: %d, sda: %d", pins.scl, pins.sda);
55 p_wire->begin(pins.sda, pins.scl);
56#elif defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_STM32)
57 AD_LOGI(
"setting up I2C scl: %d, sda: %d", pins.scl, pins.sda);
58 p_wire->setSCL(pins.scl);
59 p_wire->setSDA(pins.sda);
62 AD_LOGW(
"setting up I2C w/o pins");
65 if (pins.frequency > 0) {
66 AD_LOGI(
"Setting i2c clock: %u", pins.frequency);
67 p_wire->setClock(pins.frequency);
74 TwoWire *p_wire = (TwoWire *)bus;
75 assert(p_wire !=
nullptr);
76#if !defined(ESP8266) && FORCE_WIRE_CLOSE
84inline const char *ad_log_hex(
char *out,
size_t out_size,
const uint8_t *bytes,
87 for (
int i = 0; i < len && pos + 2 < out_size; i++) {
88 pos += snprintf(out + pos, out_size - pos,
"%02X", bytes[i]);
95 int reglen, uint8_t *data,
int datalen) {
98 AD_LOGD(
"i2c_bus_write_bytes: addr=0x%X reg=0x%s data=0x%s", addr,
99 ad_log_hex(reg_hex,
sizeof(reg_hex), reg, reglen),
100 ad_log_hex(data_hex,
sizeof(data_hex), data, datalen));
101 TwoWire *p_wire = (TwoWire *)bus;
102 assert(p_wire !=
nullptr);
104 p_wire->beginTransmission(addr);
105 if (reglen > 0) p_wire->write(reg, reglen);
106 if (datalen > 0) p_wire->write(data, datalen);
107 int rc = p_wire->endTransmission(
I2C_END);
109 AD_LOGE(
"->p_wire->endTransmission: %d", rc);
116 int reglen, uint8_t *outdata,
int datalen,
bool stopBit=
true) {
118 AD_LOGD(
"i2c_bus_read_bytes: addr=0x%X reg=0x%s", addr,
119 ad_log_hex(reg_hex,
sizeof(reg_hex), reg, reglen));
120 TwoWire *p_wire = (TwoWire *)bus;
121 assert(p_wire !=
nullptr);
123 memset(outdata, 0, datalen);
126 p_wire->beginTransmission(addr);
127 p_wire->write(reg, reglen);
128 int rc = p_wire->endTransmission(stopBit);
130 AD_LOGE(
"->p_wire->endTransmission: %d", rc);
133 uint8_t result_len = p_wire->requestFrom(addr, datalen, (
int)
I2C_END);
134 if (result_len > 0) {
135 result_len = p_wire->readBytes(outdata, datalen);
137 AD_LOGD(
"i2c_bus_read_bytes: addr=0x%X reg=0x%s -> data=0x%s", addr,
138 ad_log_hex(reg_hex,
sizeof(reg_hex), reg, reglen),
139 ad_log_hex(data_hex,
sizeof(data_hex), outdata, datalen));
141 AD_LOGE(
"->p_wire->requestFrom %d->%d", datalen, result_len);
148#elif defined(ESP32_CMAKE)
150static I2CConfig *i2c_configs[5];
153 for (
int j = 0; j < 5; j++) {
154 if (i2c_configs[j]->p_wire == hdl) {
155 return i2c_configs[j];
161inline error_t i2c_bus_create(
struct I2CConfig *config) {
162 I2CConfig &pins = *config;
163 i2c_port_t i2c_slave_port = (i2c_port_t)pins.port;
164 i2c_configs[pins.port] = config;
166 AD_LOGI(
"i2c_bus_create port: %d scl: %d, sda: %d address: 0x%x", pins.port,
167 pins.scl, pins.sda, pins.address);
169 i2c_master_bus_config_t i2c_mst_config = {};
170 i2c_mst_config.clk_source = I2C_CLK_SRC_DEFAULT;
171 i2c_mst_config.i2c_port = i2c_slave_port;
172 i2c_mst_config.scl_io_num = (gpio_num_t)pins.scl;
173 i2c_mst_config.sda_io_num = (gpio_num_t)pins.sda;
174 i2c_mst_config.glitch_ignore_cnt = 7;
175 i2c_mst_config.flags.enable_internal_pullup =
true;
177 i2c_master_bus_handle_t bus_handle;
178 if (i2c_new_master_bus(&i2c_mst_config, &bus_handle) != ESP_OK) {
183 if (i2c_master_probe(bus_handle, pins.address, -1) !=
RESULT_OK) {
184 AD_LOGE(
"Address check failed: scanning addresses:");
185 for (
int j = 0; j < 127; j++) {
186 auto rc = i2c_master_probe(bus_handle, j, -1);
187 AD_LOGE(
"- address: 0x%x -> %d", j, rc);
192 pins.p_wire = bus_handle;
197 if (i2c_del_master_bus((i2c_master_bus_handle_t)bus) != ESP_OK) {
203 int reglen, uint8_t *data,
int datalen) {
204 AD_LOGD(
"i2c_bus_write_bytes address: 0x%x", addr);
205 i2c_master_bus_handle_t bus_handle = (i2c_master_bus_handle_t)bus;
207 I2CConfig *cfg = get_config(bus);
208 assert(cfg !=
nullptr);
209 assert(cfg->address == addr);
211 i2c_device_config_t dev_cfg = {};
212 dev_cfg.dev_addr_length = I2C_ADDR_BIT_LEN_7;
213 dev_cfg.device_address = cfg->address;
214 dev_cfg.scl_speed_hz = cfg->frequency;
216 i2c_master_dev_handle_t dev_handle;
217 if (i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle) != ESP_OK) {
222 int total_len = reglen + datalen;
223 uint8_t total_data[total_len];
224 memcpy(total_data, reg, reglen);
225 memcpy(total_data + reglen, data, datalen);
227 esp_err_t ret = ESP_OK;
228 ret |= i2c_master_transmit(dev_handle, total_data, total_len, -1);
230 ret = i2c_master_bus_wait_all_done(bus_handle, -1);
231 if (ret != ESP_OK)
AD_LOGE(
"i2c_master_bus_wait_all_done");
233 AD_LOGE(
"i2c_master_transmit");
236 if (i2c_master_bus_rm_device(dev_handle) != ESP_OK) {
237 AD_LOGE(
"i2c_master_bus_rm_device");
241 AD_LOGE(
"i2c_bus_write_bytes");
247 int reglen, uint8_t *read_buffer,
int read_size) {
248 AD_LOGD(
"i2c_bus_read_bytes address: 0x%x", addr);
249 i2c_master_bus_handle_t bus_handle = (i2c_master_bus_handle_t)bus;
251 I2CConfig *cfg = get_config(bus);
252 assert(cfg !=
nullptr);
253 assert(cfg->address == addr);
255 i2c_device_config_t dev_cfg = {};
256 dev_cfg.dev_addr_length = I2C_ADDR_BIT_LEN_7;
257 dev_cfg.device_address = cfg->address;
258 dev_cfg.scl_speed_hz = cfg->frequency;
260 i2c_master_dev_handle_t dev_handle;
261 if (i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle) != ESP_OK) {
262 AD_LOGE(
"i2c_master_bus_add_device");
266 int write_size = reglen;
267 uint8_t write_buffer[write_size];
268 memcpy(write_buffer, reg, reglen);
270 esp_err_t ret = ESP_OK;
271 ret = i2c_master_transmit_receive(dev_handle, write_buffer, write_size,
272 read_buffer, read_size, -1);
273 ret = i2c_master_bus_wait_all_done(bus_handle, -1);
277 if (i2c_master_bus_rm_device(dev_handle) != ESP_OK) {
278 AD_LOGI(
"i2c_master_bus_rm_device");
285#elif defined(__zephyr__)
287inline error_t i2c_bus_create(
struct I2CConfig *config) {
289 assert(config != NULL);
291 struct device *dev = (
struct device *)config->p_wire;
294 if (!device_is_ready(dev)) {
295 AD_LOGE(
"I2C device not ready");
299 if (config->frequency > 0) {
300 uint32_t i2c_cfg = I2C_MODE_CONTROLLER;
302 if (config->frequency <= 100000) {
303 i2c_cfg |= I2C_SPEED_SET(I2C_SPEED_STANDARD);
304 }
else if (config->frequency <= 400000) {
305 i2c_cfg |= I2C_SPEED_SET(I2C_SPEED_FAST);
306 }
else if (config->frequency <= 1000000) {
307 i2c_cfg |= I2C_SPEED_SET(I2C_SPEED_FAST_PLUS);
309 i2c_cfg |= I2C_SPEED_SET(I2C_SPEED_HIGH);
312 int rc = i2c_configure(dev, i2c_cfg);
314 AD_LOGE(
"Failed to configure I2C: %d", rc);
317 AD_LOGI(
"Setting I2C clock: %u Hz", config->frequency);
328 int reglen, uint8_t *data,
int datalen) {
329 AD_LOGD(
"i2c_bus_write_bytes: addr=0x%X reglen=%d datalen=%d reg=0x%02X",
330 addr, reglen, datalen, reglen > 0 ? reg[0] : 0);
332 struct device *dev = (
struct device *)bus;
335 struct i2c_msg msgs[2];
336 uint8_t num_msgs = 0;
339 msgs[num_msgs].buf = reg;
340 msgs[num_msgs].len = reglen;
341 msgs[num_msgs].flags = I2C_MSG_WRITE;
346 msgs[num_msgs].buf = data;
347 msgs[num_msgs].len = datalen;
348 msgs[num_msgs].flags = I2C_MSG_WRITE;
353 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
356 int rc = i2c_transfer(dev, msgs, num_msgs, (uint16_t)addr);
358 AD_LOGE(
"i2c_transfer (write) failed: %d", rc);
365 int reglen, uint8_t *outdata,
int datalen) {
366 AD_LOGD(
"i2c_bus_read_bytes: addr=0x%X reglen=%d datalen=%d reg=0x%02X", addr,
367 reglen, datalen, reglen > 0 ? reg[0] : 0);
369 struct device *dev = (
struct device *)bus;
373 memset(outdata, 0, datalen);
375 struct i2c_msg msgs[2] = {
378 .len = (uint32_t)reglen,
379 .flags = I2C_MSG_WRITE,
383 .len = (uint32_t)datalen,
384 .flags = I2C_MSG_READ | I2C_MSG_STOP,
388 int rc = i2c_transfer(dev, msgs, 2, (uint16_t)addr);
390 AD_LOGE(
"i2c_transfer (read) failed: %d", rc);
#define RESULT_OK
Definition DriverCommon.h:74
#define I2C_END
Definition DriverCommon.h:83
#define RESULT_FAIL
Definition DriverCommon.h:75
#define AD_LOGD(...)
Definition Logger.h:12
#define AD_LOGI(...)
Definition Logger.h:13
#define AD_LOGE(...)
Definition Logger.h:15
#define AD_LOGW(...)
Definition Logger.h:14
Namespace for audio driver components.
Definition AudioBoard.h:5
int16_t GpioPin
Definition DriverCommon.h:153
int error_t
Definition DriverCommon.h:150
void * i2c_bus_handle_t
Definition DriverCommon.h:155
GpioPin scl
Definition API_I2C.h:30
int address
Definition API_I2C.h:27
i2c_bus_handle_t p_wire
Definition API_I2C.h:24
int port
Definition API_I2C.h:26
uint32_t frequency
Definition API_I2C.h:25
GpioPin sda
Definition API_I2C.h:31