Add I2C register8 functions

This commit is contained in:
Ken Van Hoeylandt 2026-02-15 16:06:35 +01:00
parent 3a24d058c9
commit b7a2503a21
3 changed files with 39 additions and 3 deletions

View File

@ -237,7 +237,7 @@ static error_t stop(Device* device) {
return ERROR_NONE; return ERROR_NONE;
} }
const static I2cControllerApi esp32_i2c_api = { static constexpr I2cControllerApi ESP32_I2C_API = {
.read = read, .read = read,
.write = write, .write = write,
.write_read = write_read, .write_read = write_read,
@ -245,14 +245,14 @@ const static I2cControllerApi esp32_i2c_api = {
.write_register = write_register .write_register = write_register
}; };
extern struct Module platform_module; extern Module platform_module;
Driver esp32_i2c_driver = { Driver esp32_i2c_driver = {
.name = "esp32_i2c", .name = "esp32_i2c",
.compatible = (const char*[]) { "espressif,esp32-i2c", nullptr }, .compatible = (const char*[]) { "espressif,esp32-i2c", nullptr },
.start_device = start, .start_device = start,
.stop_device = stop, .stop_device = stop,
.api = (void*)&esp32_i2c_api, .api = &ESP32_I2C_API,
.device_type = &I2C_CONTROLLER_TYPE, .device_type = &I2C_CONTROLLER_TYPE,
.owner = &platform_module, .owner = &platform_module,
.internal = nullptr .internal = nullptr

View File

@ -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_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. * @brief Writes an array of register-value pairs to an I2C device.
* @param[in] device the I2C controller device * @param[in] device the I2C controller device

View File

@ -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); 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) { 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); const auto* driver = device_get_driver(device);
if (dataSize % 2 != 0) { if (dataSize % 2 != 0) {