diff options
-rw-r--r-- | zephyr/emul/emul_isl923x.c | 19 | ||||
-rw-r--r-- | zephyr/test/drivers/src/isl923x.c | 57 |
2 files changed, 75 insertions, 1 deletions
diff --git a/zephyr/emul/emul_isl923x.c b/zephyr/emul/emul_isl923x.c index 5ee94dfaec..dcbaaf641b 100644 --- a/zephyr/emul/emul_isl923x.c +++ b/zephyr/emul/emul_isl923x.c @@ -43,6 +43,9 @@ LOG_MODULE_REGISTER(isl923x_emul, CONFIG_ISL923X_EMUL_LOG_LEVEL); /** Mask used for the control 1 register */ #define REG_CONTROL1_MASK (GENMASK(15, 8) | GENMASK(6, 0)) +/** Mask used for the control 2 register */ +#define REG_CONTROL2_MASK GENMASK(15, 0) + /** Mask used for the AC PROCHOT register */ #define REG_PROCHOT_AC_MASK GENMASK(12, 7) @@ -68,6 +71,8 @@ struct isl923x_emul_data { uint16_t control_0_reg; /** Emulated control 1 register */ uint16_t control_1_reg; + /** Emulated control 2 register */ + uint16_t control_2_reg; /** Emulated AC PROCHOT register */ uint16_t ac_prochot_reg; /** Emulated DC PROCHOT register */ @@ -196,6 +201,13 @@ static int isl923x_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val, else *val = (uint8_t)((data->control_1_reg >> 8) & 0xff); break; + case ISL923X_REG_CONTROL2: + __ASSERT_NO_MSG(bytes == 0 || bytes == 1); + if (bytes == 0) + *val = (uint8_t)(data->control_2_reg & 0xff); + else + *val = (uint8_t)((data->control_2_reg >> 8) & 0xff); + break; case ISL923X_REG_PROCHOT_AC: __ASSERT_NO_MSG(bytes == 0 || bytes == 1); if (bytes == 0) @@ -270,6 +282,13 @@ static int isl923x_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val, else data->control_1_reg |= (val << 8) & REG_CONTROL1_MASK; break; + case ISL923X_REG_CONTROL2: + __ASSERT_NO_MSG(bytes == 1 || bytes == 2); + if (bytes == 1) + data->control_2_reg = val & REG_CONTROL2_MASK; + else + data->control_2_reg |= (val << 8) & REG_CONTROL2_MASK; + break; case ISL923X_REG_PROCHOT_AC: __ASSERT_NO_MSG(bytes == 1 || bytes == 2); if (bytes == 1) diff --git a/zephyr/test/drivers/src/isl923x.c b/zephyr/test/drivers/src/isl923x.c index 908aa18766..e70874f7a3 100644 --- a/zephyr/test/drivers/src/isl923x.c +++ b/zephyr/test/drivers/src/isl923x.c @@ -43,6 +43,13 @@ BUILD_ASSERT(IS_ENABLED(CONFIG_CHARGER_ISL9238), #define CHARGER_NUM get_charger_num(&isl923x_drv) #define ISL923X_EMUL emul_get_binding(DT_LABEL(DT_NODELABEL(isl923x_emul))) +static int mock_write_fn_always_fail(struct i2c_emul *emul, int reg, + uint8_t val, int bytes, void *data) +{ + ztest_test_fail(); + return 0; +} + void test_isl923x_set_current(void) { const struct emul *isl923x_emul = ISL923X_EMUL; @@ -432,6 +439,53 @@ void test_set_dc_prochot(void) } } +void test_comparator_inversion(void) +{ + const struct emul *isl923x_emul = ISL923X_EMUL; + const struct device *i2c_dev = isl923x_emul_get_parent(isl923x_emul); + struct i2c_emul *i2c_emul = isl923x_emul_get_i2c_emul(isl923x_emul); + uint8_t reg_addr = ISL923X_REG_CONTROL2; + uint16_t reg_value; + uint8_t tx_buf[] = { reg_addr, 0, 0 }; + + /* Test failed read, should not write */ + i2c_common_emul_set_read_fail_reg(i2c_emul, ISL923X_REG_CONTROL2); + i2c_common_emul_set_write_func(i2c_emul, mock_write_fn_always_fail, + NULL); + zassert_equal(EC_ERROR_INVAL, + isl923x_set_comparator_inversion(CHARGER_NUM, false), + NULL); + i2c_common_emul_set_read_fail_reg(i2c_emul, + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_write_func(i2c_emul, NULL, NULL); + + /* Test failed write */ + zassert_ok(i2c_write(i2c_dev, tx_buf, sizeof(tx_buf), i2c_emul->addr), + "Failed to clear CTRL2 register"); + i2c_common_emul_set_write_fail_reg(i2c_emul, ISL923X_REG_CONTROL2); + zassert_equal(EC_ERROR_INVAL, + isl923x_set_comparator_inversion(CHARGER_NUM, true), + NULL); + i2c_common_emul_set_write_fail_reg(i2c_emul, + I2C_COMMON_EMUL_NO_FAIL_REG); + + /* Test enable comparator inversion */ + zassert_ok(isl923x_set_comparator_inversion(CHARGER_NUM, true), NULL); + zassert_ok(i2c_write_read(i2c_dev, i2c_emul->addr, ®_addr, + sizeof(reg_addr), ®_value, + sizeof(reg_value)), + "Failed to read CTRL 2 register"); + zassert_true((reg_value & ISL923X_C2_INVERT_CMOUT) != 0, NULL); + + /* Test disable comparator inversion */ + zassert_ok(isl923x_set_comparator_inversion(CHARGER_NUM, false), NULL); + zassert_ok(i2c_write_read(i2c_dev, i2c_emul->addr, ®_addr, + sizeof(reg_addr), ®_value, + sizeof(reg_value)), + "Failed to read CTRL 2 register"); + zassert_true((reg_value & ISL923X_C2_INVERT_CMOUT) == 0, NULL); +} + void test_suite_isl923x(void) { ztest_test_suite(isl923x, @@ -446,6 +500,7 @@ void test_suite_isl923x(void) ztest_unit_test(test_set_mode), ztest_unit_test(test_post_init), ztest_unit_test(test_set_ac_prochot), - ztest_unit_test(test_set_dc_prochot)); + ztest_unit_test(test_set_dc_prochot), + ztest_unit_test(test_comparator_inversion)); ztest_run_test_suite(isl923x); } |