From c9728f47023b468a963228e4ada9d38bc121b6b0 Mon Sep 17 00:00:00 2001 From: Tristan Honscheid Date: Mon, 6 Dec 2021 15:48:44 -0700 Subject: zephyr: lis2dw12: Finish init() tests Add tests for the remainder of the LIS2DW12 init() function. Also added the CTRL3 register to the emulator since this is accessed in the init routine. BRANCH=None BUG=b:200046770 TEST=zmake -D configure --test test-drivers; make runhosttests Signed-off-by: Tristan Honscheid Change-Id: Iacb767f384474801c69159476a5ce446df1f9ae0 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3318820 Reviewed-by: Aaron Massey --- zephyr/emul/emul_lis2dw12.c | 10 ++++++ zephyr/test/drivers/src/lis2dw12.c | 72 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/zephyr/emul/emul_lis2dw12.c b/zephyr/emul/emul_lis2dw12.c index a4e6b46413..e14c184504 100644 --- a/zephyr/emul/emul_lis2dw12.c +++ b/zephyr/emul/emul_lis2dw12.c @@ -33,6 +33,8 @@ struct lis2dw12_emul_data { uint8_t ctrl1_reg; /** Emulated ctrl2 register */ uint8_t ctrl2_reg; + /** Emulated ctrl3 register */ + uint8_t ctrl3_reg; /** Emulated ctrl6 register */ uint8_t ctrl6_reg; /** Emulated status register */ @@ -69,6 +71,7 @@ void lis2dw12_emul_reset(const struct emul *emul) data->who_am_i_reg = LIS2DW12_WHO_AM_I; data->ctrl1_reg = 0; data->ctrl2_reg = 0; + data->ctrl3_reg = 0; data->ctrl6_reg = 0; data->status_reg = 0; data->soft_reset_count = 0; @@ -108,6 +111,10 @@ static int lis2dw12_emul_read_byte(struct i2c_emul *emul, int reg, uint8_t *val, __ASSERT_NO_MSG(bytes == 0); *val = data->ctrl2_reg; break; + case LIS2DW12_CTRL3_ADDR: + __ASSERT_NO_MSG(bytes == 0); + *val = data->ctrl3_reg; + break; case LIS2DW12_CTRL6_ADDR: __ASSERT_NO_MSG(bytes == 0); *val = data->ctrl6_reg; @@ -213,6 +220,9 @@ static int lis2dw12_emul_write_byte(struct i2c_emul *emul, int reg, uint8_t val, } data->ctrl2_reg = val & ~LIS2DW12_SOFT_RESET_MASK; break; + case LIS2DW12_CTRL3_ADDR: + data->ctrl3_reg = val; + break; case LIS2DW12_CTRL6_ADDR: data->ctrl6_reg = val; break; diff --git a/zephyr/test/drivers/src/lis2dw12.c b/zephyr/test/drivers/src/lis2dw12.c index 56521f8085..24218aea9f 100644 --- a/zephyr/test/drivers/src/lis2dw12.c +++ b/zephyr/test/drivers/src/lis2dw12.c @@ -122,6 +122,69 @@ static void test_lis2dw12_init__fail_set_bdu(void) "expected at least one soft reset"); } +static void test_lis2dw12_init__fail_set_lir(void) +{ + const struct emul *emul = emul_get_binding(EMUL_LABEL); + struct motion_sensor_t *ms = &motion_sensors[LIS2DW12_SENSOR_ID]; + int rv; + + i2c_common_emul_set_read_fail_reg(lis2dw12_emul_to_i2c_emul(emul), + LIS2DW12_LIR_ADDR); + + rv = ms->drv->init(ms); + zassert_equal(EC_ERROR_INVAL, rv, "init returned %d but expected %d", + rv, EC_ERROR_INVAL); + zassert_true(lis2dw12_emul_get_soft_reset_count(emul) > 0, + "expected at least one soft reset"); +} + +static int lis2dw12_test_mock_write_fail_set_power_mode(struct i2c_emul *emul, + int reg, uint8_t val, + int bytes, void *data) +{ + if (reg == LIS2DW12_ACC_LPMODE_ADDR && bytes == 1 && + (val & LIS2DW12_ACC_LPMODE_MASK) != 0) { + /* Cause an error when trying to set the LPMODE */ + return -EIO; + } + return 1; +} + +static void test_lis2dw12_init__fail_set_power_mode(void) +{ + const struct emul *emul = emul_get_binding(EMUL_LABEL); + struct motion_sensor_t *ms = &motion_sensors[LIS2DW12_SENSOR_ID]; + int rv; + + i2c_common_emul_set_write_func( + lis2dw12_emul_to_i2c_emul(emul), + lis2dw12_test_mock_write_fail_set_power_mode, NULL); + + rv = ms->drv->init(ms); + zassert_equal(EC_ERROR_INVAL, rv, "init returned %d but expected %d", + rv, EC_ERROR_INVAL); + zassert_true(lis2dw12_emul_get_soft_reset_count(emul) > 0, + "expected at least one soft reset"); +} + +static void test_lis2dw12_init__success(void) +{ + const struct emul *emul = emul_get_binding(EMUL_LABEL); + struct motion_sensor_t *ms = &motion_sensors[LIS2DW12_SENSOR_ID]; + struct stprivate_data *drvdata = ms->drv_data; + + int rv; + + rv = ms->drv->init(ms); + zassert_equal(EC_SUCCESS, rv, "init returned %d but expected %d", rv, + EC_SUCCESS); + zassert_true(lis2dw12_emul_get_soft_reset_count(emul) > 0, + "expected at least one soft reset"); + zassert_equal(LIS2DW12_RESOLUTION, drvdata->resol, + "Expected resolution of %d but got %d", + LIS2DW12_RESOLUTION, drvdata->resol); +} + static void test_lis2dw12_set_power_mode(void) { const struct emul *emul = emul_get_binding(EMUL_LABEL); @@ -383,6 +446,15 @@ void test_suite_lis2dw12(void) ztest_unit_test_setup_teardown( test_lis2dw12_init__fail_set_bdu, lis2dw12_setup, lis2dw12_setup), + ztest_unit_test_setup_teardown( + test_lis2dw12_init__fail_set_lir, + lis2dw12_setup, lis2dw12_setup), + ztest_unit_test_setup_teardown( + test_lis2dw12_init__fail_set_power_mode, + lis2dw12_setup, lis2dw12_setup), + ztest_unit_test_setup_teardown( + test_lis2dw12_init__success, + lis2dw12_setup, lis2dw12_setup), ztest_unit_test_setup_teardown( test_lis2dw12_set_power_mode, lis2dw12_setup, lis2dw12_setup), -- cgit v1.2.1