diff --git a/Platforms/platform-esp32/source/drivers/esp32_i2c.cpp b/Platforms/platform-esp32/source/drivers/esp32_i2c.cpp index 42330eea..16359741 100644 --- a/Platforms/platform-esp32/source/drivers/esp32_i2c.cpp +++ b/Platforms/platform-esp32/source/drivers/esp32_i2c.cpp @@ -237,7 +237,7 @@ static error_t stop(Device* device) { return ERROR_NONE; } -const static I2cControllerApi esp32_i2c_api = { +static constexpr I2cControllerApi ESP32_I2C_API = { .read = read, .write = write, .write_read = write_read, @@ -245,14 +245,14 @@ const static I2cControllerApi esp32_i2c_api = { .write_register = write_register }; -extern struct Module platform_module; +extern Module platform_module; Driver esp32_i2c_driver = { .name = "esp32_i2c", .compatible = (const char*[]) { "espressif,esp32-i2c", nullptr }, .start_device = start, .stop_device = stop, - .api = (void*)&esp32_i2c_api, + .api = &ESP32_I2C_API, .device_type = &I2C_CONTROLLER_TYPE, .owner = &platform_module, .internal = nullptr diff --git a/TactilityKernel/include/tactility/drivers/i2c_controller.h b/TactilityKernel/include/tactility/drivers/i2c_controller.h index 96ce39fd..3dbae2f6 100644 --- a/TactilityKernel/include/tactility/drivers/i2c_controller.h +++ b/TactilityKernel/include/tactility/drivers/i2c_controller.h @@ -143,6 +143,14 @@ error_t i2c_controller_read_register(struct Device* device, uint8_t address, uin */ error_t i2c_controller_write_register(struct Device* device, uint8_t address, uint8_t reg, const uint8_t* data, uint16_t dataSize, TickType_t timeout); +error_t i2c_controller_register8_set(struct Device* device, uint8_t address, uint8_t reg, uint8_t value, TickType_t timeout); + +error_t i2c_controller_register8_get(struct Device* device, uint8_t address, uint8_t reg, uint8_t* value, TickType_t timeout); + +error_t i2c_controller_register8_set_bits(struct Device* device, uint8_t address, uint8_t reg, uint8_t bits_to_set, TickType_t timeout); + +error_t i2c_controller_register8_reset_bits(struct Device* device, uint8_t address, uint8_t reg, uint8_t bits_to_reset, TickType_t timeout); + /** * @brief Writes an array of register-value pairs to an I2C device. * @param[in] device the I2C controller device diff --git a/TactilityKernel/source/drivers/i2c_controller.cpp b/TactilityKernel/source/drivers/i2c_controller.cpp index 0fbafaf3..c82a9f2d 100644 --- a/TactilityKernel/source/drivers/i2c_controller.cpp +++ b/TactilityKernel/source/drivers/i2c_controller.cpp @@ -31,6 +31,34 @@ error_t i2c_controller_write_register(Device* device, uint8_t address, uint8_t r return I2C_DRIVER_API(driver)->write_register(device, address, reg, data, dataSize, timeout); } +error_t i2c_controller_register8_set(Device* device, uint8_t address, uint8_t reg, uint8_t value, TickType_t timeout) { + const auto* driver = device_get_driver(device); + return I2C_DRIVER_API(driver)->write_register(device, address, reg, &value, 1, timeout); +} + +error_t i2c_controller_register8_get(Device* device, uint8_t address, uint8_t reg, uint8_t* value, TickType_t timeout) { + const auto* driver = device_get_driver(device); + return I2C_DRIVER_API(driver)->read_register(device, address, reg, value, 1, timeout); +} + +error_t i2c_controller_register8_set_bits(Device* device, uint8_t address, uint8_t reg, uint8_t bits_to_set, TickType_t timeout) { + const auto* driver = device_get_driver(device); + uint8_t data = 0; + auto error = I2C_DRIVER_API(driver)->read_register(device, address, reg, &data, 1, timeout); + if (error != ERROR_NONE) return error; + data |= bits_to_set; + return I2C_DRIVER_API(driver)->write_register(device, address, reg, &data, 1, timeout); +} + +error_t i2c_controller_register8_reset_bits(Device* device, uint8_t address, uint8_t reg, uint8_t bits_to_reset, TickType_t timeout) { + const auto* driver = device_get_driver(device); + uint8_t data = 0; + auto error = I2C_DRIVER_API(driver)->read_register(device, address, reg, &data, 1, timeout); + if (error != ERROR_NONE) return error; + data &= ~bits_to_reset; + return I2C_DRIVER_API(driver)->write_register(device, address, reg, &data, 1, timeout); +} + error_t i2c_controller_write_register_array(Device* device, uint8_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout) { const auto* driver = device_get_driver(device); if (dataSize % 2 != 0) {