summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Massey <aaronmassey@google.com>2021-09-27 14:52:34 -0600
committerCommit Bot <commit-bot@chromium.org>2021-10-02 18:27:36 +0000
commitce01ddef20bb8ab21facb71bed25fe9afbc33522 (patch)
treebcfb258e93a6adb9e7fd585388d587c1e217297e
parent22f0be7feeb165102e5e260c2219125c0758a4bf (diff)
downloadchrome-ec-ce01ddef20bb8ab21facb71bed25fe9afbc33522.tar.gz
zephyr: emul: ln9310 test fixed chip rev ln9310_power_good()
Add functional modes to emulator & test ln9310_power_good() with 2S & 3S batteries on fixed chip revision. BRANCH=none BUG=b:184856083 TEST=zmake configure --test zephyr/test/drivers Signed-off-by: Aaron Massey <aaronmassey@chromium.org> Cq-Depend: chromium:3179310 Change-Id: I52d19f0115dfc0e792a4b321a95df0deb42b5fa1 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3188557 Reviewed-by: Yuval Peress <peress@google.com> Reviewed-by: Jeremy Bettis <jbettis@chromium.org> Tested-by: Aaron Massey <aaronmassey@google.com> Commit-Queue: Aaron Massey <aaronmassey@google.com>
-rw-r--r--driver/ln9310.c8
-rw-r--r--include/driver/ln9310.h5
-rw-r--r--zephyr/emul/emul_ln9310.c150
-rw-r--r--zephyr/test/drivers/src/ln9310.c34
4 files changed, 171 insertions, 26 deletions
diff --git a/driver/ln9310.c b/driver/ln9310.c
index 3464cf46a2..5a46efc3bb 100644
--- a/driver/ln9310.c
+++ b/driver/ln9310.c
@@ -570,4 +570,10 @@ void ln9310_software_enable(int enable)
!enable);
}
return;
-} \ No newline at end of file
+}
+
+__test_only void ln9310_reset_to_initial_state(void)
+{
+ power_good = 0;
+ startup_workaround_required = 0;
+}
diff --git a/include/driver/ln9310.h b/include/driver/ln9310.h
index 0ae7af4c4c..ca969ce143 100644
--- a/include/driver/ln9310.h
+++ b/include/driver/ln9310.h
@@ -235,4 +235,9 @@ enum battery_cell_type {
enum battery_cell_type board_get_battery_cell_type(void);
+/**
+ * @brief Resets LN9310 Driver State
+ */
+__test_only void ln9310_reset_to_initial_state(void);
+
#endif /* __CROS_EC_LN9310_H */
diff --git a/zephyr/emul/emul_ln9310.c b/zephyr/emul/emul_ln9310.c
index 472c1c366e..0c26e35258 100644
--- a/zephyr/emul/emul_ln9310.c
+++ b/zephyr/emul/emul_ln9310.c
@@ -24,13 +24,29 @@ LOG_MODULE_REGISTER(ln9310_emul, CONFIG_LN9310_EMUL_LOG_LEVEL);
CONTAINER_OF(CONTAINER_OF(_emul, struct i2c_common_emul_data, emul), \
struct ln9310_emul_data, common)
+enum functional_mode {
+ /* TODO shutdown_mode, */
+ /* TODO bypass, */
+ FUNCTIONAL_MODE_STANDBY = LN9310_SYS_STANDBY,
+ FUNCTIONAL_MODE_SWITCHING_21 =
+ LN9310_SYS_SWITCHING21_ACTIVE,
+ FUNCTIONAL_MODE_SWITCHING_31 =
+ LN9310_SYS_SWITCHING31_ACTIVE
+};
+
struct ln9310_emul_data {
/** Common I2C data */
struct i2c_common_emul_data common;
/** The current emulated battery cell type */
enum battery_cell_type battery_cell_type;
+ /** Current Functional Mode */
+ enum functional_mode current_mode;
+ /** Emulated SYS STS register */
+ uint8_t sys_sts_reg;
/** Emulated INT1 MSK register */
uint8_t int1_msk_reg;
+ /** Emulated INT1 register */
+ uint8_t int1_reg;
/** Emulated Lion control register */
uint8_t lion_ctrl_reg;
/** Emulated startup control register */
@@ -63,14 +79,87 @@ struct ln9310_emul_data {
uint8_t swap_ctrl_3_reg;
/** Emulated track control register */
uint8_t track_ctrl_reg;
- /** Emulated mode change register */
- uint8_t mode_change_reg;
+ /** Emulated mode change cfg register */
+ uint8_t mode_change_cfg_reg;
/** Emulated system control register */
uint8_t sys_ctrl_reg;
};
static const struct emul *singleton;
+
+static void do_ln9310_interrupt(struct ln9310_emul_data *data)
+{
+ /*
+ * TODO(b/201437348): Use gpio interrupt pins properly instead of
+ * making direct interrupt call as part of this or system test
+ */
+
+ data->int1_reg |= LN9310_INT1_MODE;
+ ln9310_interrupt(0);
+}
+
+static void mode_change(struct ln9310_emul_data *data)
+{
+
+ bool now_in_standby = data->startup_ctrl_reg &
+ LN9310_STARTUP_STANDBY_EN;
+ bool now_in_switching_21 =
+ ((data->power_ctrl_reg & LN9310_PWR_OP_MODE_MASK) ==
+ LN9310_PWR_OP_MODE_SWITCH21) &&
+ !now_in_standby;
+ bool now_in_switching_31 =
+ ((data->power_ctrl_reg & LN9310_PWR_OP_MODE_MASK) ==
+ LN9310_PWR_OP_MODE_SWITCH31) &&
+ !now_in_standby;
+
+ __ASSERT_NO_MSG(!(now_in_switching_21 && now_in_switching_31));
+
+ switch (data->current_mode) {
+ case FUNCTIONAL_MODE_STANDBY:
+ if (now_in_switching_21) {
+ data->current_mode =
+ FUNCTIONAL_MODE_SWITCHING_21;
+ data->sys_sts_reg = data->current_mode;
+ do_ln9310_interrupt(data);
+ } else if (now_in_switching_31) {
+ data->current_mode =
+ FUNCTIONAL_MODE_SWITCHING_31;
+ data->sys_sts_reg = data->current_mode;
+ do_ln9310_interrupt(data);
+ }
+ break;
+ case FUNCTIONAL_MODE_SWITCHING_21:
+ if (now_in_standby) {
+ data->current_mode =
+ FUNCTIONAL_MODE_SWITCHING_21;
+ data->sys_sts_reg = data->current_mode;
+ do_ln9310_interrupt(data);
+ } else if (now_in_switching_31) {
+ data->current_mode =
+ FUNCTIONAL_MODE_SWITCHING_31;
+ data->sys_sts_reg = data->current_mode;
+ do_ln9310_interrupt(data);
+ }
+ break;
+ case FUNCTIONAL_MODE_SWITCHING_31:
+ if (now_in_standby) {
+ data->current_mode =
+ FUNCTIONAL_MODE_STANDBY;
+ data->sys_sts_reg = data->current_mode;
+ do_ln9310_interrupt(data);
+ } else if (now_in_switching_21) {
+ data->current_mode =
+ FUNCTIONAL_MODE_SWITCHING_21;
+ data->sys_sts_reg = data->current_mode;
+ do_ln9310_interrupt(data);
+ }
+ break;
+ default:
+ __ASSERT(0, "Unrecognized mode");
+ }
+}
+
void ln9310_emul_set_context(const struct emul *emulator)
{
singleton = emulator;
@@ -79,24 +168,12 @@ void ln9310_emul_set_context(const struct emul *emulator)
void ln9310_emul_reset(const struct emul *emulator)
{
struct ln9310_emul_data *data = emulator->data;
+ struct i2c_common_emul_data common = data->common;
- data->lion_ctrl_reg = 0;
- data->startup_ctrl_reg = 0;
- data->bc_sts_b_reg = 0;
- data->cfg_0_reg = 0;
- data->cfg_4_reg = 0;
- data->cfg_5_reg = 0;
- data->power_ctrl_reg = 0;
- data->timer_ctrl_reg = 0;
- data->lower_bound_ctrl_reg = 0;
- data->spare_0_reg = 0;
- data->swap_ctrl_0_reg = 0;
- data->swap_ctrl_1_reg = 0;
- data->swap_ctrl_2_reg = 0;
- data->swap_ctrl_3_reg = 0;
- data->track_ctrl_reg = 0;
- data->mode_change_reg = 0;
- data->sys_ctrl_reg = 0;
+ /* Only Reset the LN9310 Register Data */
+ memset(data, 0, sizeof(struct ln9310_emul_data));
+ data->common = common;
+ data->current_mode = LN9310_SYS_STANDBY;
}
void ln9310_emul_set_battery_cell_type(const struct emul *emulator,
@@ -154,6 +231,14 @@ static int ln9310_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val,
struct ln9310_emul_data *data = LN9310_DATA_FROM_I2C_EMUL(emul);
switch (reg) {
+ case LN9310_REG_INT1:
+ __ASSERT_NO_MSG(bytes == 1);
+ data->int1_reg = val;
+ break;
+ case LN9310_REG_SYS_STS:
+ __ASSERT_NO_MSG(bytes == 1);
+ data->sys_sts_reg = val;
+ break;
case LN9310_REG_INT1_MSK:
__ASSERT_NO_MSG(bytes == 1);
data->int1_msk_reg = val;
@@ -188,6 +273,12 @@ static int ln9310_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val,
case LN9310_REG_PWR_CTRL:
__ASSERT_NO_MSG(bytes == 1);
data->power_ctrl_reg = val;
+ bool reset_standby = ((val & LN9310_PWR_OP_MODE_SWITCH21) ||
+ (val & LN9310_PWR_OP_MODE_SWITCH31)) &&
+ data->bc_sts_c_reg >=
+ LN9310_BC_STS_C_CHIP_REV_FIXED;
+ if (reset_standby)
+ data->startup_ctrl_reg &= ~LN9310_STARTUP_STANDBY_EN;
break;
case LN9310_REG_TIMER_CTRL:
__ASSERT_NO_MSG(bytes == 1);
@@ -223,7 +314,7 @@ static int ln9310_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val,
break;
case LN9310_REG_MODE_CHANGE_CFG:
__ASSERT_NO_MSG(bytes == 1);
- data->mode_change_reg = val;
+ data->mode_change_cfg_reg = val;
break;
case LN9310_REG_SYS_CTRL:
__ASSERT_NO_MSG(bytes == 1);
@@ -232,6 +323,7 @@ static int ln9310_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val,
default:
return -EINVAL;
}
+ mode_change(data);
return 0;
}
@@ -242,6 +334,14 @@ static int ln9310_emul_start_read(struct i2c_emul *emul, int reg)
static int ln9310_emul_finish_read(struct i2c_emul *emul, int reg, int bytes)
{
+ struct ln9310_emul_data *data = LN9310_DATA_FROM_I2C_EMUL(emul);
+
+ switch (reg) {
+ case LN9310_REG_INT1:
+ /* Reading the interrupt clears it. */
+ data->int1_reg = 0;
+ break;
+ }
return 0;
}
@@ -251,6 +351,14 @@ static int ln9310_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val,
struct ln9310_emul_data *data = LN9310_DATA_FROM_I2C_EMUL(emul);
switch (reg) {
+ case LN9310_REG_INT1:
+ __ASSERT_NO_MSG(bytes == 0);
+ *val = data->int1_reg;
+ break;
+ case LN9310_REG_SYS_STS:
+ __ASSERT_NO_MSG(bytes == 0);
+ *val = data->sys_sts_reg;
+ break;
case LN9310_REG_INT1_MSK:
__ASSERT_NO_MSG(bytes == 0);
*val = data->int1_msk_reg;
@@ -321,7 +429,7 @@ static int ln9310_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val,
break;
case LN9310_REG_MODE_CHANGE_CFG:
__ASSERT_NO_MSG(bytes == 0);
- *val = data->mode_change_reg;
+ *val = data->mode_change_cfg_reg;
break;
case LN9310_REG_SYS_CTRL:
__ASSERT_NO_MSG(bytes == 0);
diff --git a/zephyr/test/drivers/src/ln9310.c b/zephyr/test/drivers/src/ln9310.c
index 0033931039..a9e4d8829c 100644
--- a/zephyr/test/drivers/src/ln9310.c
+++ b/zephyr/test/drivers/src/ln9310.c
@@ -5,10 +5,19 @@
#include <ztest.h>
#include <drivers/emul.h>
+#include <kernel.h>
+#include <ztest_assert.h>
+
#include "driver/ln9310.h"
#include "emul/emul_ln9310.h"
-void test_ln9310_2s_no_startup__passes_init(void)
+/*
+ * TODO(b/201420132): Implement approach for tests to immediately schedule work
+ * to avoid any sleeping
+ */
+#define TEST_DELAY_MS 50
+
+static void test_ln9310_2s_powers_up(void)
{
const struct emul *emulator =
emul_get_binding(DT_LABEL(DT_NODELABEL(ln9310)));
@@ -22,9 +31,13 @@ void test_ln9310_2s_no_startup__passes_init(void)
zassert_ok(ln9310_init(), NULL);
zassert_true(ln9310_emul_is_init(emulator), NULL);
+
+ k_msleep(TEST_DELAY_MS);
+
+ zassert_true(ln9310_power_good(), NULL);
}
-void test_ln9310_3s_no_startup__passes_init(void)
+static void test_ln9310_3s_powers_up(void)
{
const struct emul *emulator =
emul_get_binding(DT_LABEL(DT_NODELABEL(ln9310)));
@@ -38,13 +51,26 @@ void test_ln9310_3s_no_startup__passes_init(void)
zassert_ok(ln9310_init(), NULL);
zassert_true(ln9310_emul_is_init(emulator), NULL);
+
+ k_msleep(TEST_DELAY_MS);
+
+ zassert_true(ln9310_power_good(), NULL);
+}
+
+static void reset_ln9310_state(void)
+{
+ ln9310_reset_to_initial_state();
}
void test_suite_ln9310(void)
{
ztest_test_suite(
ln9310,
- ztest_unit_test(test_ln9310_2s_no_startup__passes_init),
- ztest_unit_test(test_ln9310_3s_no_startup__passes_init));
+ ztest_unit_test_setup_teardown(test_ln9310_2s_powers_up,
+ reset_ln9310_state,
+ reset_ln9310_state),
+ ztest_unit_test_setup_teardown(test_ln9310_3s_powers_up,
+ reset_ln9310_state,
+ reset_ln9310_state));
ztest_run_test_suite(ln9310);
}