source i2c_manager files from https://github.com/ropg/i2c_manager master
This commit is contained in:
parent
785b7d5c28
commit
8f72cfaa94
|
@ -6,10 +6,8 @@ menu "I2C Port 0"
|
||||||
if I2C_MANAGER_0_ENABLED
|
if I2C_MANAGER_0_ENABLED
|
||||||
config I2C_MANAGER_0_SDA
|
config I2C_MANAGER_0_SDA
|
||||||
int "SDA (GPIO pin)"
|
int "SDA (GPIO pin)"
|
||||||
default 0
|
|
||||||
config I2C_MANAGER_0_SCL
|
config I2C_MANAGER_0_SCL
|
||||||
int "SCL (GPIO pin)"
|
int "SCL (GPIO pin)"
|
||||||
default 0
|
|
||||||
config I2C_MANAGER_0_FREQ_HZ
|
config I2C_MANAGER_0_FREQ_HZ
|
||||||
int "Frequency (Hz)"
|
int "Frequency (Hz)"
|
||||||
default 400000
|
default 400000
|
||||||
|
|
|
@ -42,7 +42,7 @@ SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
#if defined __has_include
|
#if defined __has_include
|
||||||
#if __has_include ("esp_idf_version.h")
|
#if __has_include ("esp_idf_version.h")
|
||||||
#include "esp_idf_version.h"
|
#include "esp_idf_version.h"
|
||||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
|
||||||
#define HAS_CLK_FLAGS
|
#define HAS_CLK_FLAGS
|
||||||
|
@ -58,29 +58,29 @@ static SemaphoreHandle_t* I2C_FN(_mutex) = &I2C_FN(_local_mutex)[0];
|
||||||
|
|
||||||
static const uint8_t ACK_CHECK_EN = 1;
|
static const uint8_t ACK_CHECK_EN = 1;
|
||||||
|
|
||||||
#if defined (CONFIG_I2C_MANAGER_0_ENABLED)
|
#if defined (I2C_NUM_0) && defined (CONFIG_I2C_MANAGER_0_ENABLED)
|
||||||
#define I2C_ZERO I2C_NUM_0
|
#define I2C_ZERO I2C_NUM_0
|
||||||
#if defined (CONFIG_I2C_MANAGER_0_PULLUPS)
|
#if defined (CONFIG_I2C_MANAGER_0_PULLUPS)
|
||||||
#define I2C_MANAGER_0_PULLUPS true
|
#define I2C_MANAGER_0_PULLUPS true
|
||||||
#else
|
#else
|
||||||
#define I2C_MANAGER_0_PULLUPS false
|
#define I2C_MANAGER_0_PULLUPS false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define I2C_MANAGER_0_TIMEOUT ( CONFIG_I2C_MANAGER_0_TIMEOUT / portTICK_PERIOD_MS )
|
#define I2C_MANAGER_0_TIMEOUT ( pdMS_TO_TICKS( CONFIG_I2C_MANAGER_0_TIMEOUT ) )
|
||||||
#define I2C_MANAGER_0_LOCK_TIMEOUT ( CONFIG_I2C_MANAGER_0_LOCK_TIMEOUT / portTICK_PERIOD_MS )
|
#define I2C_MANAGER_0_LOCK_TIMEOUT ( ( pdMS_TO_TICKS( CONFIG_I2C_MANAGER_0_LOCK_TIMEOUT ) )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined (CONFIG_I2C_MANAGER_1_ENABLED)
|
#if defined (I2C_NUM_1) && defined (CONFIG_I2C_MANAGER_1_ENABLED)
|
||||||
#define I2C_ONE I2C_NUM_1
|
#define I2C_ONE I2C_NUM_1
|
||||||
#if defined (CONFIG_I2C_MANAGER_1_PULLUPS)
|
#if defined (CONFIG_I2C_MANAGER_1_PULLUPS)
|
||||||
#define I2C_MANAGER_1_PULLUPS true
|
#define I2C_MANAGER_1_PULLUPS true
|
||||||
#else
|
#else
|
||||||
#define I2C_MANAGER_1_PULLUPS false
|
#define I2C_MANAGER_1_PULLUPS false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define I2C_MANAGER_1_TIMEOUT ( CONFIG_I2C_MANAGER_1_TIMEOUT / portTICK_PERIOD_MS )
|
#define I2C_MANAGER_1_TIMEOUT ( pdMS_TO_TICKS( CONFIG_I2C_MANAGER_1_TIMEOUT ) )
|
||||||
#define I2C_MANAGER_1_LOCK_TIMEOUT ( CONFIG_I2C_MANAGER_1_LOCK_TIMEOUT / portTICK_PERIOD_MS )
|
#define I2C_MANAGER_1_LOCK_TIMEOUT ( pdMS_TO_TICKS( CONFIG_I2C_MANAGER_1_LOCK_TIMEOUT ) )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ERROR_PORT(port, fail) { \
|
#define ERROR_PORT(port, fail) { \
|
||||||
|
@ -89,19 +89,19 @@ static const uint8_t ACK_CHECK_EN = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(I2C_ZERO) && defined (I2C_ONE)
|
#if defined(I2C_ZERO) && defined (I2C_ONE)
|
||||||
#define I2C_PORT_CHECK(port, fail) \
|
#define I2C_PORT_CHECK(port, fail) \
|
||||||
if (port != I2C_NUM_0 && port != I2C_NUM_1) ERROR_PORT(port, fail);
|
if (port != I2C_NUM_0 && port != I2C_NUM_1) ERROR_PORT(port, fail);
|
||||||
#else
|
#else
|
||||||
#if defined(I2C_ZERO)
|
#if defined(I2C_ZERO)
|
||||||
#define I2C_PORT_CHECK(port, fail) \
|
#define I2C_PORT_CHECK(port, fail) \
|
||||||
if (port != I2C_NUM_0) ERROR_PORT(port, fail);
|
if (port != I2C_NUM_0) ERROR_PORT(port, fail);
|
||||||
#elif defined(I2C_ONE)
|
#elif defined(I2C_ONE)
|
||||||
#define I2C_PORT_CHECK(port, fail) \
|
#define I2C_PORT_CHECK(port, fail) \
|
||||||
if (port != I2C_NUM_1) ERROR_PORT(port, fail);
|
if (port != I2C_NUM_1) ERROR_PORT(port, fail);
|
||||||
#else
|
#else
|
||||||
#define I2C_PORT_CHECK(port, fail) \
|
#define I2C_PORT_CHECK(port, fail) \
|
||||||
ERROR_PORT(port, fail);
|
ERROR_PORT(port, fail);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void i2c_send_address(i2c_cmd_handle_t cmd, uint16_t addr, i2c_rw_t rw) {
|
static void i2c_send_address(i2c_cmd_handle_t cmd, uint16_t addr, i2c_rw_t rw) {
|
||||||
|
@ -134,11 +134,11 @@ esp_err_t I2C_FN(_init)(i2c_port_t port) {
|
||||||
|
|
||||||
i2c_config_t conf = {0};
|
i2c_config_t conf = {0};
|
||||||
|
|
||||||
#ifdef HAS_CLK_FLAGS
|
#ifdef HAS_CLK_FLAGS
|
||||||
conf.clk_flags = 0;
|
conf.clk_flags = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (I2C_ZERO)
|
#if defined (I2C_ZERO)
|
||||||
if (port == I2C_NUM_0) {
|
if (port == I2C_NUM_0) {
|
||||||
conf.sda_io_num = CONFIG_I2C_MANAGER_0_SDA;
|
conf.sda_io_num = CONFIG_I2C_MANAGER_0_SDA;
|
||||||
conf.scl_io_num = CONFIG_I2C_MANAGER_0_SCL;
|
conf.scl_io_num = CONFIG_I2C_MANAGER_0_SCL;
|
||||||
|
@ -146,9 +146,9 @@ esp_err_t I2C_FN(_init)(i2c_port_t port) {
|
||||||
conf.scl_pullup_en = conf.sda_pullup_en;
|
conf.scl_pullup_en = conf.sda_pullup_en;
|
||||||
conf.master.clk_speed = CONFIG_I2C_MANAGER_0_FREQ_HZ;
|
conf.master.clk_speed = CONFIG_I2C_MANAGER_0_FREQ_HZ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (I2C_ONE)
|
#if defined (I2C_ONE)
|
||||||
if (port == I2C_NUM_1) {
|
if (port == I2C_NUM_1) {
|
||||||
conf.sda_io_num = CONFIG_I2C_MANAGER_1_SDA;
|
conf.sda_io_num = CONFIG_I2C_MANAGER_1_SDA;
|
||||||
conf.scl_io_num = CONFIG_I2C_MANAGER_1_SCL;
|
conf.scl_io_num = CONFIG_I2C_MANAGER_1_SCL;
|
||||||
|
@ -156,7 +156,7 @@ esp_err_t I2C_FN(_init)(i2c_port_t port) {
|
||||||
conf.scl_pullup_en = conf.sda_pullup_en;
|
conf.scl_pullup_en = conf.sda_pullup_en;
|
||||||
conf.master.clk_speed = CONFIG_I2C_MANAGER_1_FREQ_HZ;
|
conf.master.clk_speed = CONFIG_I2C_MANAGER_1_FREQ_HZ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
conf.mode = I2C_MODE_MASTER;
|
conf.mode = I2C_MODE_MASTER;
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ esp_err_t I2C_FN(_init)(i2c_port_t port) {
|
||||||
ESP_LOGW(TAG, "If it was already open, we'll use it with whatever settings were used "
|
ESP_LOGW(TAG, "If it was already open, we'll use it with whatever settings were used "
|
||||||
"to open it. See I2C Manager README for details.");
|
"to open it. See I2C Manager README for details.");
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGI(TAG, "Initialised port %d (SDA: %d, SCL: %d, speed: %lu Hz.)",
|
ESP_LOGI(TAG, "Initialised port %d (SDA: %d, SCL: %d, speed: %d Hz.)",
|
||||||
port, conf.sda_io_num, conf.scl_io_num, conf.master.clk_speed);
|
port, conf.sda_io_num, conf.scl_io_num, conf.master.clk_speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,19 +186,19 @@ esp_err_t I2C_FN(_read)(i2c_port_t port, uint16_t addr, uint32_t reg, uint8_t *b
|
||||||
// May seem weird, but init starts with a check if it's needed, no need for that check twice.
|
// May seem weird, but init starts with a check if it's needed, no need for that check twice.
|
||||||
I2C_FN(_init)(port);
|
I2C_FN(_init)(port);
|
||||||
|
|
||||||
ESP_LOGV(TAG, "Reading port %d, addr 0x%03x, reg 0x%04lx", port, addr, reg);
|
ESP_LOGV(TAG, "Reading port %d, addr 0x%03x, reg 0x%04x", port, addr, reg);
|
||||||
|
|
||||||
TickType_t timeout = 0;
|
TickType_t timeout = 0;
|
||||||
#if defined (I2C_ZERO)
|
#if defined (I2C_ZERO)
|
||||||
if (port == I2C_NUM_0) {
|
if (port == I2C_NUM_0) {
|
||||||
timeout = I2C_MANAGER_0_TIMEOUT;
|
timeout = I2C_MANAGER_0_TIMEOUT;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined (I2C_ONE)
|
#if defined (I2C_ONE)
|
||||||
if (port == I2C_NUM_1) {
|
if (port == I2C_NUM_1) {
|
||||||
timeout = I2C_MANAGER_1_TIMEOUT;
|
timeout = I2C_MANAGER_1_TIMEOUT;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (I2C_FN(_lock)((int)port) == ESP_OK) {
|
if (I2C_FN(_lock)((int)port) == ESP_OK) {
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||||
|
@ -222,7 +222,7 @@ esp_err_t I2C_FN(_read)(i2c_port_t port, uint16_t addr, uint32_t reg, uint8_t *b
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != ESP_OK) {
|
if (result != ESP_OK) {
|
||||||
ESP_LOGW(TAG, "Error: %d", result);
|
ESP_LOGD(TAG, "Error: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_LOG_BUFFER_HEX_LEVEL(TAG, buffer, size, ESP_LOG_VERBOSE);
|
ESP_LOG_BUFFER_HEX_LEVEL(TAG, buffer, size, ESP_LOG_VERBOSE);
|
||||||
|
@ -239,19 +239,19 @@ esp_err_t I2C_FN(_write)(i2c_port_t port, uint16_t addr, uint32_t reg, const uin
|
||||||
// May seem weird, but init starts with a check if it's needed, no need for that check twice.
|
// May seem weird, but init starts with a check if it's needed, no need for that check twice.
|
||||||
I2C_FN(_init)(port);
|
I2C_FN(_init)(port);
|
||||||
|
|
||||||
ESP_LOGV(TAG, "Writing port %d, addr 0x%03x, reg 0x%04lx", port, addr, reg);
|
ESP_LOGV(TAG, "Writing port %d, addr 0x%03x, reg 0x%04x", port, addr, reg);
|
||||||
|
|
||||||
TickType_t timeout = 0;
|
TickType_t timeout = 0;
|
||||||
#if defined (I2C_ZERO)
|
#if defined (I2C_ZERO)
|
||||||
if (port == I2C_NUM_0) {
|
if (port == I2C_NUM_0) {
|
||||||
timeout = (CONFIG_I2C_MANAGER_0_TIMEOUT) / portTICK_PERIOD_MS;
|
timeout = pdMS_TO_TICKS( CONFIG_I2C_MANAGER_0_TIMEOUT );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined (I2C_ONE)
|
#if defined (I2C_ONE)
|
||||||
if (port == I2C_NUM_1) {
|
if (port == I2C_NUM_1) {
|
||||||
timeout = (CONFIG_I2C_MANAGER_1_TIMEOUT) / portTICK_PERIOD_MS;
|
timeout = pdMS_TO_TICKS( CONFIG_I2C_MANAGER_1_TIMEOUT );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (I2C_FN(_lock)((int)port) == ESP_OK) {
|
if (I2C_FN(_lock)((int)port) == ESP_OK) {
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||||
|
@ -271,7 +271,7 @@ esp_err_t I2C_FN(_write)(i2c_port_t port, uint16_t addr, uint32_t reg, const uin
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != ESP_OK) {
|
if (result != ESP_OK) {
|
||||||
ESP_LOGW(TAG, "Error: %d", result);
|
ESP_LOGD(TAG, "Error: %d", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_LOG_BUFFER_HEX_LEVEL(TAG, buffer, size, ESP_LOG_VERBOSE);
|
ESP_LOG_BUFFER_HEX_LEVEL(TAG, buffer, size, ESP_LOG_VERBOSE);
|
||||||
|
@ -292,16 +292,16 @@ esp_err_t I2C_FN(_lock)(i2c_port_t port) {
|
||||||
ESP_LOGV(TAG, "Mutex lock set for %d.", (int)port);
|
ESP_LOGV(TAG, "Mutex lock set for %d.", (int)port);
|
||||||
|
|
||||||
TickType_t timeout;
|
TickType_t timeout;
|
||||||
#if defined (I2C_ZERO)
|
#if defined (I2C_ZERO)
|
||||||
if (port == I2C_NUM_0) {
|
if (port == I2C_NUM_0) {
|
||||||
timeout = (CONFIG_I2C_MANAGER_0_LOCK_TIMEOUT) / portTICK_PERIOD_MS;
|
timeout = pdMS_TO_TICKS( CONFIG_I2C_MANAGER_0_LOCK_TIMEOUT );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined (I2C_ONE)
|
#if defined (I2C_ONE)
|
||||||
if (port == I2C_NUM_1) {
|
if (port == I2C_NUM_1) {
|
||||||
timeout = (CONFIG_I2C_MANAGER_1_LOCK_TIMEOUT) / portTICK_PERIOD_MS;
|
timeout = pdMS_TO_TICKS( CONFIG_I2C_MANAGER_1_LOCK_TIMEOUT );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (xSemaphoreTake(I2C_FN(_mutex)[port], timeout) == pdTRUE) {
|
if (xSemaphoreTake(I2C_FN(_mutex)[port], timeout) == pdTRUE) {
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
|
@ -331,16 +331,16 @@ esp_err_t I2C_FN(_force_unlock)(i2c_port_t port) {
|
||||||
|
|
||||||
#ifdef I2C_OEM
|
#ifdef I2C_OEM
|
||||||
|
|
||||||
void I2C_FN(_locking)(void* leader) {
|
void I2C_FN(_locking)(void* leader) {
|
||||||
if (leader) {
|
if (leader) {
|
||||||
ESP_LOGI(TAG, "Now following I2C Manager for locking");
|
ESP_LOGI(TAG, "Now following I2C Manager for locking");
|
||||||
I2C_FN(_mutex) = (SemaphoreHandle_t*)leader;
|
I2C_FN(_mutex) = (SemaphoreHandle_t*)leader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void* i2c_manager_locking() {
|
void* i2c_manager_locking() {
|
||||||
return (void*)i2c_manager_mutex;
|
return (void*)i2c_manager_mutex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,9 @@ extern "C" {
|
||||||
#define STR_QUOTE(s) STR_EXPAND(STR_EXPAND(s))
|
#define STR_QUOTE(s) STR_EXPAND(STR_EXPAND(s))
|
||||||
|
|
||||||
#ifdef I2C_OEM
|
#ifdef I2C_OEM
|
||||||
#define I2C_NAME_PREFIX CONCAT(I2C_OEM, _i2c)
|
#define I2C_NAME_PREFIX CONCAT(I2C_OEM, _i2c)
|
||||||
#else
|
#else
|
||||||
#define I2C_NAME_PREFIX i2c_manager
|
#define I2C_NAME_PREFIX i2c_manager
|
||||||
#endif
|
#endif
|
||||||
#define I2C_TAG STR_EXPAND(I2C_NAME_PREFIX)
|
#define I2C_TAG STR_EXPAND(I2C_NAME_PREFIX)
|
||||||
|
|
||||||
|
@ -53,19 +53,19 @@ esp_err_t I2C_FN(_force_unlock)(i2c_port_t port);
|
||||||
|
|
||||||
#ifdef I2C_OEM
|
#ifdef I2C_OEM
|
||||||
|
|
||||||
void I2C_FN(_locking)(void* leader);
|
void I2C_FN(_locking)(void* leader);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void* i2c_manager_locking();
|
void* i2c_manager_locking();
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t (* read)(void *handle, uint8_t address, uint8_t reg, uint8_t *buffer, uint16_t size);
|
int32_t (* read)(void *handle, uint8_t address, uint8_t reg, uint8_t *buffer, uint16_t size);
|
||||||
int32_t (* write)(void *handle, uint8_t address, uint8_t reg, const uint8_t *buffer, uint16_t size);
|
int32_t (* write)(void *handle, uint8_t address, uint8_t reg, const uint8_t *buffer, uint16_t size);
|
||||||
void *handle;
|
void *handle;
|
||||||
} i2c_hal_t;
|
} i2c_hal_t;
|
||||||
|
|
||||||
void* i2c_hal(i2c_port_t port);
|
void* i2c_hal(i2c_port_t port);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue