summaryrefslogtreecommitdiff
path: root/zephyr/emul/emul_ln9310.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/emul/emul_ln9310.c')
-rw-r--r--zephyr/emul/emul_ln9310.c137
1 files changed, 61 insertions, 76 deletions
diff --git a/zephyr/emul/emul_ln9310.c b/zephyr/emul/emul_ln9310.c
index 3e6be65591..4b74c537cf 100644
--- a/zephyr/emul/emul_ln9310.c
+++ b/zephyr/emul/emul_ln9310.c
@@ -6,6 +6,8 @@
#define DT_DRV_COMPAT cros_ln9310_emul
#include <device.h>
+#include <devicetree/gpio.h>
+#include <drivers/gpio/gpio_emul.h>
#include <drivers/i2c.h>
#include <drivers/i2c_emul.h>
#include <emul.h>
@@ -37,6 +39,10 @@ enum functional_mode {
struct ln9310_emul_data {
/** Common I2C data */
struct i2c_common_emul_data common;
+ /** Emulated int_gpio port */
+ const struct device *gpio_int_port;
+ /** Emulated int_gpio pin */
+ gpio_pin_t gpio_int_pin;
/** The current emulated battery cell type */
enum battery_cell_type battery_cell_type;
/** Current Functional Mode */
@@ -100,22 +106,28 @@ struct i2c_emul *ln9310_emul_get_i2c_emul(const struct emul *emulator)
return &(data->common.emul);
}
-static void do_ln9310_interrupt(struct ln9310_emul_data *data)
+static void ln9310_emul_set_int_pin(struct ln9310_emul_data *data, bool val)
{
- /*
- * TODO(b/201437348): Use gpio interrupt pins properly instead of
- * making direct interrupt call as part of this or system test
- */
+ int res = gpio_emul_input_set(data->gpio_int_port, data->gpio_int_pin,
+ val);
+ __ASSERT_NO_MSG(res == 0);
+}
+static void ln9310_emul_assert_interrupt(struct ln9310_emul_data *data)
+{
data->int1_reg |= LN9310_INT1_MODE;
- ln9310_interrupt(0);
+ ln9310_emul_set_int_pin(data, false);
}
-static void mode_change(struct ln9310_emul_data *data)
+static void ln9310_emul_deassert_interrupt(struct ln9310_emul_data *data)
{
+ ln9310_emul_set_int_pin(data, true);
+}
+static void mode_change(struct ln9310_emul_data *data)
+{
bool new_mode_in_standby = data->startup_ctrl_reg &
- LN9310_STARTUP_STANDBY_EN;
+ LN9310_STARTUP_STANDBY_EN;
bool new_mode_in_switching_21 =
((data->power_ctrl_reg & LN9310_PWR_OP_MODE_MASK) ==
LN9310_PWR_OP_MODE_SWITCH21) &&
@@ -131,41 +143,35 @@ static void mode_change(struct ln9310_emul_data *data)
switch (data->current_mode) {
case FUNCTIONAL_MODE_STANDBY:
if (new_mode_in_switching_21) {
- data->current_mode =
- FUNCTIONAL_MODE_SWITCHING_21;
+ data->current_mode = FUNCTIONAL_MODE_SWITCHING_21;
data->sys_sts_reg = data->current_mode;
- do_ln9310_interrupt(data);
+ ln9310_emul_assert_interrupt(data);
} else if (new_mode_in_switching_31) {
- data->current_mode =
- FUNCTIONAL_MODE_SWITCHING_31;
+ data->current_mode = FUNCTIONAL_MODE_SWITCHING_31;
data->sys_sts_reg = data->current_mode;
- do_ln9310_interrupt(data);
+ ln9310_emul_assert_interrupt(data);
}
break;
case FUNCTIONAL_MODE_SWITCHING_21:
if (new_mode_in_standby) {
- data->current_mode =
- FUNCTIONAL_MODE_STANDBY;
+ data->current_mode = FUNCTIONAL_MODE_STANDBY;
data->sys_sts_reg = data->current_mode;
- do_ln9310_interrupt(data);
+ ln9310_emul_assert_interrupt(data);
} else if (new_mode_in_switching_31) {
- data->current_mode =
- FUNCTIONAL_MODE_SWITCHING_31;
+ data->current_mode = FUNCTIONAL_MODE_SWITCHING_31;
data->sys_sts_reg = data->current_mode;
- do_ln9310_interrupt(data);
+ ln9310_emul_assert_interrupt(data);
}
break;
case FUNCTIONAL_MODE_SWITCHING_31:
if (new_mode_in_standby) {
- data->current_mode =
- FUNCTIONAL_MODE_STANDBY;
+ data->current_mode = FUNCTIONAL_MODE_STANDBY;
data->sys_sts_reg = data->current_mode;
- do_ln9310_interrupt(data);
+ ln9310_emul_assert_interrupt(data);
} else if (new_mode_in_switching_21) {
- data->current_mode =
- FUNCTIONAL_MODE_SWITCHING_21;
+ data->current_mode = FUNCTIONAL_MODE_SWITCHING_21;
data->sys_sts_reg = data->current_mode;
- do_ln9310_interrupt(data);
+ ln9310_emul_assert_interrupt(data);
}
break;
default:
@@ -183,10 +189,17 @@ void ln9310_emul_reset(const struct emul *emulator)
struct ln9310_emul_data *data = emulator->data;
struct i2c_common_emul_data common = data->common;
+ gpio_pin_t gpio_int_pin = data->gpio_int_pin;
+ const struct device *gpio_int_port = data->gpio_int_port;
+
/* Only Reset the LN9310 Register Data */
memset(data, 0, sizeof(struct ln9310_emul_data));
data->common = common;
data->current_mode = LN9310_SYS_STANDBY;
+ data->gpio_int_pin = gpio_int_pin;
+ data->gpio_int_port = gpio_int_port;
+
+ ln9310_emul_deassert_interrupt(data);
}
void ln9310_emul_set_battery_cell_type(const struct emul *emulator,
@@ -253,104 +266,87 @@ 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);
+ __ASSERT(bytes == 1, "bytes 0x%x != 0x1 on reg 0x%x", bytes, reg);
+
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;
break;
case LN9310_REG_STARTUP_CTRL:
- __ASSERT_NO_MSG(bytes == 1);
data->startup_ctrl_reg = val;
break;
case LN9310_REG_LION_CTRL:
- __ASSERT_NO_MSG(bytes == 1);
data->lion_ctrl_reg = val;
break;
case LN9310_REG_BC_STS_B:
- __ASSERT_NO_MSG(bytes == 1);
data->bc_sts_b_reg = val;
break;
case LN9310_REG_BC_STS_C:
- LOG_ERR("Can't write to BC STS C register");
- return -EINVAL;
+ __ASSERT(false,
+ "Write to an unverified as safe "
+ "read-only register on 0x%x",
+ reg);
+ break;
case LN9310_REG_CFG_0:
- __ASSERT_NO_MSG(bytes == 1);
data->cfg_0_reg = val;
break;
case LN9310_REG_CFG_4:
- __ASSERT_NO_MSG(bytes == 1);
data->cfg_4_reg = val;
break;
case LN9310_REG_CFG_5:
- __ASSERT_NO_MSG(bytes == 1);
data->cfg_5_reg = val;
break;
case LN9310_REG_PWR_CTRL:
- __ASSERT_NO_MSG(bytes == 1);
data->power_ctrl_reg = val;
break;
case LN9310_REG_TIMER_CTRL:
- __ASSERT_NO_MSG(bytes == 1);
data->timer_ctrl_reg = val;
break;
case LN9310_REG_LB_CTRL:
- __ASSERT_NO_MSG(bytes = 1);
data->lower_bound_ctrl_reg = val;
break;
case LN9310_REG_SPARE_0:
- __ASSERT_NO_MSG(bytes == 1);
data->spare_0_reg = val;
break;
case LN9310_REG_SWAP_CTRL_0:
- __ASSERT_NO_MSG(bytes == 1);
data->swap_ctrl_0_reg = val;
break;
case LN9310_REG_SWAP_CTRL_1:
- __ASSERT_NO_MSG(bytes == 1);
data->swap_ctrl_1_reg = val;
break;
case LN9310_REG_SWAP_CTRL_2:
- __ASSERT_NO_MSG(bytes == 1);
data->swap_ctrl_2_reg = val;
break;
case LN9310_REG_SWAP_CTRL_3:
- __ASSERT_NO_MSG(bytes == 1);
data->swap_ctrl_3_reg = val;
break;
case LN9310_REG_TRACK_CTRL:
- __ASSERT_NO_MSG(bytes == 1);
data->track_ctrl_reg = val;
break;
case LN9310_REG_MODE_CHANGE_CFG:
- __ASSERT_NO_MSG(bytes == 1);
data->mode_change_cfg_reg = val;
break;
case LN9310_REG_SYS_CTRL:
- __ASSERT_NO_MSG(bytes == 1);
data->sys_ctrl_reg = val;
break;
case LN9310_REG_FORCE_SC21_CTRL_1:
- __ASSERT_NO_MSG(bytes == 1);
data->force_sc21_ctrl_1_reg = val;
break;
case LN9310_REG_FORCE_SC21_CTRL_2:
- __ASSERT_NO_MSG(bytes == 1);
data->force_sc21_ctrl_2_reg = val;
break;
case LN9310_REG_TEST_MODE_CTRL:
- __ASSERT_NO_MSG(bytes == 1);
data->test_mode_ctrl_reg = val;
break;
default:
- return -EINVAL;
+ __ASSERT(false, "Unimplemented Register Access Error on 0x%x",
+ reg);
}
mode_change(data);
return 0;
@@ -379,101 +375,82 @@ 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);
+ __ASSERT(bytes == 0, "bytes 0x%x != 0x0 on reg 0x%x", bytes, reg);
+
switch (reg) {
case LN9310_REG_INT1:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->int1_reg;
+ /* Reading clears interrupts */
+ data->int1_reg = 0;
+ ln9310_emul_deassert_interrupt(data);
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;
break;
case LN9310_REG_STARTUP_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->startup_ctrl_reg;
break;
case LN9310_REG_LION_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->lion_ctrl_reg;
break;
case LN9310_REG_BC_STS_B:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->bc_sts_b_reg;
break;
case LN9310_REG_BC_STS_C:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->bc_sts_c_reg;
break;
case LN9310_REG_CFG_0:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->cfg_0_reg;
break;
case LN9310_REG_CFG_4:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->cfg_4_reg;
break;
case LN9310_REG_CFG_5:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->cfg_5_reg;
break;
case LN9310_REG_PWR_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->power_ctrl_reg;
break;
case LN9310_REG_TIMER_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->timer_ctrl_reg;
break;
case LN9310_REG_LB_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->lower_bound_ctrl_reg;
break;
case LN9310_REG_SPARE_0:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->spare_0_reg;
break;
case LN9310_REG_SWAP_CTRL_0:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->swap_ctrl_0_reg;
break;
case LN9310_REG_SWAP_CTRL_1:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->swap_ctrl_1_reg;
break;
case LN9310_REG_SWAP_CTRL_2:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->swap_ctrl_2_reg;
break;
case LN9310_REG_SWAP_CTRL_3:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->swap_ctrl_3_reg;
break;
case LN9310_REG_TRACK_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->track_ctrl_reg;
break;
case LN9310_REG_MODE_CHANGE_CFG:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->mode_change_cfg_reg;
break;
case LN9310_REG_SYS_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->sys_ctrl_reg;
break;
case LN9310_REG_FORCE_SC21_CTRL_1:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->force_sc21_ctrl_1_reg;
break;
case LN9310_REG_FORCE_SC21_CTRL_2:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->force_sc21_ctrl_2_reg;
break;
case LN9310_REG_TEST_MODE_CTRL:
- __ASSERT_NO_MSG(bytes == 0);
*val = data->test_mode_ctrl_reg;
break;
default:
@@ -506,6 +483,12 @@ static int emul_ln9310_init(const struct emul *emul,
return i2c_emul_register(parent, emul->dev_label, &data->common.emul);
}
+#define LN9310_GET_GPIO_INT_PORT(n) \
+ DEVICE_DT_GET(DT_GPIO_CTLR(DT_INST_PROP(n, pg_int_gpio), gpios))
+
+#define LN9310_GET_GPIO_INT_PIN(n) \
+ DT_GPIO_PIN(DT_INST_PROP(n, pg_int_gpio), gpios)
+
#define INIT_LN9310(n) \
const struct ln9310_config_t ln9310_config = { \
.i2c_port = NAMED_I2C(power), \
@@ -521,6 +504,8 @@ static int emul_ln9310_init(const struct emul *emul,
.finish_read = ln9310_emul_finish_read, \
.access_reg = ln9310_emul_access_reg, \
}, \
+ .gpio_int_port = LN9310_GET_GPIO_INT_PORT(n), \
+ .gpio_int_pin = LN9310_GET_GPIO_INT_PIN(n), \
}; \
static const struct i2c_common_emul_cfg ln9310_emul_cfg_##n = { \
.i2c_label = DT_INST_BUS_LABEL(n), \