diff --git a/drivers/charger/emul_sbs_charger.c b/drivers/charger/emul_sbs_charger.c index 7e5202b6f79..c8c71527674 100644 --- a/drivers/charger/emul_sbs_charger.c +++ b/drivers/charger/emul_sbs_charger.c @@ -72,6 +72,7 @@ static int sbs_charger_emul_transfer_i2c(const struct emul *target, struct i2c_m /* Largely copied from emul_sbs_gauge.c */ struct sbs_charger_emul_data *data; unsigned int val; + uint16_t value; int reg; int rc; @@ -79,6 +80,21 @@ static int sbs_charger_emul_transfer_i2c(const struct emul *target, struct i2c_m i2c_dump_msgs_rw(target->dev, msgs, num_msgs, addr, false); switch (num_msgs) { + case 1: + if (msgs->flags & I2C_MSG_READ) { + LOG_ERR("Unexpected single-message read"); + return -EIO; + } + if (msgs->len != 3) { + LOG_ERR("Unexpected msg0 length %d", msgs->len); + return -EIO; + } + reg = msgs->buf[0]; + + value = sys_get_le16(&(msgs->buf[1])); + + rc = emul_sbs_charger_reg_write(target, reg, value); + break; case 2: if (msgs->flags & I2C_MSG_READ) { LOG_ERR("Unexpected read"); @@ -113,7 +129,7 @@ static int sbs_charger_emul_transfer_i2c(const struct emul *target, struct i2c_m if (msgs->len != 2) { LOG_ERR("Unexpected msg1 length %d", msgs->len); } - uint16_t value = sys_get_le16(msgs->buf); + value = sys_get_le16(msgs->buf); rc = emul_sbs_charger_reg_write(target, reg, value); } diff --git a/drivers/charger/sbs_charger.c b/drivers/charger/sbs_charger.c index 15a5eeea773..75746ea61cf 100644 --- a/drivers/charger/sbs_charger.c +++ b/drivers/charger/sbs_charger.c @@ -40,11 +40,12 @@ static int sbs_cmd_reg_read(const struct device *dev, uint8_t reg_addr, uint16_t static int sbs_cmd_reg_write(const struct device *dev, uint8_t reg_addr, uint16_t val) { const struct sbs_charger_config *config = dev->config; - uint8_t buf[2]; + uint8_t buf[3]; - sys_put_le16(val, buf); + buf[0] = reg_addr; + sys_put_le16(val, &buf[1]); - return i2c_burst_write_dt(&config->i2c, reg_addr, buf, sizeof(buf)); + return i2c_write_dt(&config->i2c, buf, sizeof(buf)); } static int sbs_cmd_reg_update(const struct device *dev, uint8_t reg_addr, uint16_t mask,