summaryrefslogtreecommitdiff
path: root/zephyr/test/drivers/src/bmi160.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /zephyr/test/drivers/src/bmi160.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-release-R101-14588.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'zephyr/test/drivers/src/bmi160.c')
-rw-r--r--zephyr/test/drivers/src/bmi160.c1873
1 files changed, 0 insertions, 1873 deletions
diff --git a/zephyr/test/drivers/src/bmi160.c b/zephyr/test/drivers/src/bmi160.c
deleted file mode 100644
index ceb55896eb..0000000000
--- a/zephyr/test/drivers/src/bmi160.c
+++ /dev/null
@@ -1,1873 +0,0 @@
-/* Copyright 2021 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <zephyr.h>
-#include <ztest.h>
-
-#include "common.h"
-#include "i2c.h"
-#include "emul/emul_bmi.h"
-#include "emul/emul_common_i2c.h"
-
-#include "motion_sense_fifo.h"
-#include "driver/accelgyro_bmi160.h"
-#include "driver/accelgyro_bmi_common.h"
-
-#define BMI_ORD DT_DEP_ORD(DT_NODELABEL(accel_bmi160))
-#define BMI_ACC_SENSOR_ID SENSOR_ID(DT_NODELABEL(ms_bmi160_accel))
-#define BMI_GYR_SENSOR_ID SENSOR_ID(DT_NODELABEL(ms_bmi160_gyro))
-#define BMI_INT_EVENT \
- TASK_EVENT_MOTION_SENSOR_INTERRUPT(SENSOR_ID(DT_ALIAS(bmi160_int)))
-
-/** How accurate comparision of vectors should be */
-#define V_EPS 8
-
-/** Convert from one type of vector to another */
-#define convert_int3v_int16(v, r) do { \
- r[0] = v[0]; \
- r[1] = v[1]; \
- r[2] = v[2]; \
- } while (0)
-
-/** Rotation used in some tests */
-static const mat33_fp_t test_rotation = {
- { 0, FLOAT_TO_FP(1), 0},
- { FLOAT_TO_FP(-1), 0, 0},
- { 0, 0, FLOAT_TO_FP(-1)}
-};
-/** Rotate given vector by test rotation */
-static void rotate_int3v_by_test_rotation(intv3_t v)
-{
- int16_t t;
-
- t = v[0];
- v[0] = -v[1];
- v[1] = t;
- v[2] = -v[2];
-}
-
-/** Set emulator accelerometer offset values to intv3_t vector */
-static void set_emul_acc_offset(struct i2c_emul *emul, intv3_t offset)
-{
- bmi_emul_set_off(emul, BMI_EMUL_ACC_X, offset[0]);
- bmi_emul_set_off(emul, BMI_EMUL_ACC_Y, offset[1]);
- bmi_emul_set_off(emul, BMI_EMUL_ACC_Z, offset[2]);
-}
-
-/** Save emulator accelerometer offset values to intv3_t vector */
-static void get_emul_acc_offset(struct i2c_emul *emul, intv3_t offset)
-{
- offset[0] = bmi_emul_get_off(emul, BMI_EMUL_ACC_X);
- offset[1] = bmi_emul_get_off(emul, BMI_EMUL_ACC_Y);
- offset[2] = bmi_emul_get_off(emul, BMI_EMUL_ACC_Z);
-}
-
-/** Set emulator accelerometer values to intv3_t vector */
-static void set_emul_acc(struct i2c_emul *emul, intv3_t acc)
-{
- bmi_emul_set_value(emul, BMI_EMUL_ACC_X, acc[0]);
- bmi_emul_set_value(emul, BMI_EMUL_ACC_Y, acc[1]);
- bmi_emul_set_value(emul, BMI_EMUL_ACC_Z, acc[2]);
-}
-
-/** Set emulator gyroscope offset values to intv3_t vector */
-static void set_emul_gyr_offset(struct i2c_emul *emul, intv3_t offset)
-{
- bmi_emul_set_off(emul, BMI_EMUL_GYR_X, offset[0]);
- bmi_emul_set_off(emul, BMI_EMUL_GYR_Y, offset[1]);
- bmi_emul_set_off(emul, BMI_EMUL_GYR_Z, offset[2]);
-}
-
-/** Save emulator gyroscope offset values to intv3_t vector */
-static void get_emul_gyr_offset(struct i2c_emul *emul, intv3_t offset)
-{
- offset[0] = bmi_emul_get_off(emul, BMI_EMUL_GYR_X);
- offset[1] = bmi_emul_get_off(emul, BMI_EMUL_GYR_Y);
- offset[2] = bmi_emul_get_off(emul, BMI_EMUL_GYR_Z);
-}
-
-/** Set emulator gyroscope values to vector of three int16_t */
-static void set_emul_gyr(struct i2c_emul *emul, intv3_t gyr)
-{
- bmi_emul_set_value(emul, BMI_EMUL_GYR_X, gyr[0]);
- bmi_emul_set_value(emul, BMI_EMUL_GYR_Y, gyr[1]);
- bmi_emul_set_value(emul, BMI_EMUL_GYR_Z, gyr[2]);
-}
-
-/** Convert accelerometer read to units used by emulator */
-static void drv_acc_to_emul(intv3_t drv, int range, intv3_t out)
-{
- const int scale = MOTION_SCALING_FACTOR / BMI_EMUL_1G;
-
- out[0] = drv[0] * range / scale;
- out[1] = drv[1] * range / scale;
- out[2] = drv[2] * range / scale;
-}
-
-/** Convert gyroscope read to units used by emulator */
-static void drv_gyr_to_emul(intv3_t drv, int range, intv3_t out)
-{
- const int scale = MOTION_SCALING_FACTOR / BMI_EMUL_125_DEG_S;
-
- range /= 125;
- out[0] = drv[0] * range / scale;
- out[1] = drv[1] * range / scale;
- out[2] = drv[2] * range / scale;
-}
-
-/** Compare two vectors of intv3_t type */
-static void compare_int3v_f(intv3_t exp_v, intv3_t v, int eps, int line)
-{
- int i;
-
- for (i = 0; i < 3; i++) {
- zassert_within(exp_v[i], v[i], eps,
- "Expected [%d; %d; %d], got [%d; %d; %d]; line: %d",
- exp_v[0], exp_v[1], exp_v[2], v[0], v[1], v[2], line);
- }
-}
-#define compare_int3v_eps(exp_v, v, e) compare_int3v_f(exp_v, v, e, __LINE__)
-#define compare_int3v(exp_v, v) compare_int3v_eps(exp_v, v, V_EPS)
-
-/** Test get accelerometer offset with and without rotation */
-static void test_bmi_acc_get_offset(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- int16_t ret[3];
- intv3_t ret_v;
- intv3_t exp_v;
- int16_t temp;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- /* Set emulator offset */
- exp_v[0] = BMI_EMUL_1G / 10;
- exp_v[1] = BMI_EMUL_1G / 20;
- exp_v[2] = -(int)BMI_EMUL_1G / 30;
- set_emul_acc_offset(emul, exp_v);
- /* BMI driver returns value in mg units */
- exp_v[0] = 1000 / 10;
- exp_v[1] = 1000 / 20;
- exp_v[2] = -1000 / 30;
-
- /* Test fail on offset read */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_ACC70);
- zassert_equal(EC_ERROR_INVAL, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_ACC70 + 1);
- zassert_equal(EC_ERROR_INVAL, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_ACC70 + 2);
- zassert_equal(EC_ERROR_INVAL, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
-
- /* Test get offset without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- zassert_equal(temp, (int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, NULL);
- convert_int3v_int16(ret, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Setup rotation and rotate expected offset */
- ms->rot_standard_ref = &test_rotation;
- rotate_int3v_by_test_rotation(exp_v);
-
- /* Test get offset with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- zassert_equal(temp, (int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, NULL);
- convert_int3v_int16(ret, ret_v);
- compare_int3v(exp_v, ret_v);
-}
-
-/** Test get gyroscope offset with and without rotation */
-static void test_bmi_gyr_get_offset(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- int16_t ret[3];
- intv3_t ret_v;
- intv3_t exp_v;
- int16_t temp;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Do not fail on read */
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Set emulator offset */
- exp_v[0] = BMI_EMUL_125_DEG_S / 100;
- exp_v[1] = BMI_EMUL_125_DEG_S / 200;
- exp_v[2] = -(int)BMI_EMUL_125_DEG_S / 300;
- set_emul_gyr_offset(emul, exp_v);
- /* BMI driver returns value in mdeg/s units */
- exp_v[0] = 125000 / 100;
- exp_v[1] = 125000 / 200;
- exp_v[2] = -125000 / 300;
-
- /* Test fail on offset read */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_GYR70);
- zassert_equal(EC_ERROR_INVAL, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_GYR70 + 1);
- zassert_equal(EC_ERROR_INVAL, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_GYR70 + 2);
- zassert_equal(EC_ERROR_INVAL, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_EN_GYR98);
- zassert_equal(EC_ERROR_INVAL, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
-
- /* Test get offset without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- zassert_equal(temp, (int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, NULL);
- convert_int3v_int16(ret, ret_v);
- compare_int3v_eps(exp_v, ret_v, 64);
-
- /* Setup rotation and rotate expected offset */
- ms->rot_standard_ref = &test_rotation;
- rotate_int3v_by_test_rotation(exp_v);
-
- /* Test get offset with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->get_offset(ms, ret, &temp),
- NULL);
- zassert_equal(temp, (int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, NULL);
- convert_int3v_int16(ret, ret_v);
- compare_int3v_eps(exp_v, ret_v, 64);
-}
-
-/**
- * Test set accelerometer offset with and without rotation. Also test behaviour
- * on I2C error.
- */
-static void test_bmi_acc_set_offset(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- int16_t input_v[3];
- int16_t temp = 0;
- intv3_t ret_v;
- intv3_t exp_v;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- /* Test fail on OFFSET EN GYR98 register read and write */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_EN_GYR98);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_EN_GYR98);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test fail on offset write */
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_ACC70);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_ACC70 + 1);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_ACC70 + 2);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Set input offset */
- exp_v[0] = BMI_EMUL_1G / 10;
- exp_v[1] = BMI_EMUL_1G / 20;
- exp_v[2] = -(int)BMI_EMUL_1G / 30;
- /* BMI driver accept value in mg units */
- input_v[0] = 1000 / 10;
- input_v[1] = 1000 / 20;
- input_v[2] = -1000 / 30;
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
-
- /* Test set offset without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->set_offset(ms, input_v, temp), NULL);
- get_emul_acc_offset(emul, ret_v);
- /*
- * Depending on used range, accelerometer values may be up to 6 bits
- * more accurate then offset value resolution.
- */
- compare_int3v_eps(exp_v, ret_v, 64);
- /* Accelerometer offset should be enabled */
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_ACC_EN, NULL);
-
- /* Setup rotation and rotate input for set_offset function */
- ms->rot_standard_ref = &test_rotation;
- convert_int3v_int16(input_v, ret_v);
- rotate_int3v_by_test_rotation(ret_v);
- convert_int3v_int16(ret_v, input_v);
-
- /* Test set offset with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->set_offset(ms, input_v, temp), NULL);
- get_emul_acc_offset(emul, ret_v);
- compare_int3v_eps(exp_v, ret_v, 64);
- /* Accelerometer offset should be enabled */
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_ACC_EN, NULL);
-}
-
-/**
- * Test set gyroscope offset with and without rotation. Also test behaviour
- * on I2C error.
- */
-static void test_bmi_gyr_set_offset(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- int16_t input_v[3];
- int16_t temp = 0;
- intv3_t ret_v;
- intv3_t exp_v;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Test fail on OFFSET EN GYR98 register read and write */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_OFFSET_EN_GYR98);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_EN_GYR98);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test fail on offset write */
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_GYR70);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_GYR70 + 1);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, BMI160_OFFSET_GYR70 + 2);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_offset(ms, input_v, temp),
- NULL);
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Set input offset */
- exp_v[0] = BMI_EMUL_125_DEG_S / 100;
- exp_v[1] = BMI_EMUL_125_DEG_S / 200;
- exp_v[2] = -(int)BMI_EMUL_125_DEG_S / 300;
- /* BMI driver accept value in mdeg/s units */
- input_v[0] = 125000 / 100;
- input_v[1] = 125000 / 200;
- input_v[2] = -125000 / 300;
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
-
- /* Test set offset without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->set_offset(ms, input_v, temp), NULL);
- get_emul_gyr_offset(emul, ret_v);
- compare_int3v(exp_v, ret_v);
- /* Gyroscope offset should be enabled */
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_GYRO_EN, NULL);
-
- /* Setup rotation and rotate input for set_offset function */
- ms->rot_standard_ref = &test_rotation;
- convert_int3v_int16(input_v, ret_v);
- rotate_int3v_by_test_rotation(ret_v);
- convert_int3v_int16(ret_v, input_v);
-
- /* Test set offset with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->set_offset(ms, input_v, temp), NULL);
- get_emul_gyr_offset(emul, ret_v);
- compare_int3v(exp_v, ret_v);
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_GYRO_EN, NULL);
-}
-
-/**
- * Try to set accelerometer range and check if expected range was set
- * in driver and in emulator.
- */
-static void check_set_acc_range_f(struct i2c_emul *emul,
- struct motion_sensor_t *ms, int range,
- int rnd, int exp_range, int line)
-{
- uint8_t exp_range_reg;
- uint8_t range_reg;
-
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, range, rnd),
- "set_range failed; line: %d", line);
- zassert_equal(exp_range, ms->current_range,
- "Expected range %d, got %d; line %d",
- exp_range, ms->current_range, line);
- range_reg = bmi_emul_get_reg(emul, BMI160_ACC_RANGE);
-
- switch (exp_range) {
- case 2:
- exp_range_reg = BMI160_GSEL_2G;
- break;
- case 4:
- exp_range_reg = BMI160_GSEL_4G;
- break;
- case 8:
- exp_range_reg = BMI160_GSEL_8G;
- break;
- case 16:
- exp_range_reg = BMI160_GSEL_16G;
- break;
- default:
- /* Unknown expected range */
- zassert_unreachable(
- "Expected range %d not supported by device; line %d",
- exp_range, line);
- return;
- }
-
- zassert_equal(exp_range_reg, range_reg,
- "Expected range reg 0x%x, got 0x%x; line %d",
- exp_range_reg, range_reg, line);
-}
-#define check_set_acc_range(emul, ms, range, rnd, exp_range) \
- check_set_acc_range_f(emul, ms, range, rnd, exp_range, __LINE__)
-
-/** Test set accelerometer range with and without I2C errors */
-static void test_bmi_acc_set_range(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- int start_range;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- /* Setup starting range, shouldn't be changed on error */
- start_range = 2;
- ms->current_range = start_range;
- bmi_emul_set_reg(emul, BMI160_ACC_RANGE, BMI160_GSEL_2G);
- /* Setup emulator fail on write */
- i2c_common_emul_set_write_fail_reg(emul, BMI160_ACC_RANGE);
-
- /* Test fail on write */
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_range(ms, 12, 0), NULL);
- zassert_equal(start_range, ms->current_range, NULL);
- zassert_equal(BMI160_GSEL_2G,
- bmi_emul_get_reg(emul, BMI160_ACC_RANGE), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_range(ms, 12, 1), NULL);
- zassert_equal(start_range, ms->current_range, NULL);
- zassert_equal(BMI160_GSEL_2G,
- bmi_emul_get_reg(emul, BMI160_ACC_RANGE), NULL);
-
- /* Do not fail on write */
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test setting range with rounding down */
- check_set_acc_range(emul, ms, 1, 0, 2);
- check_set_acc_range(emul, ms, 2, 0, 2);
- check_set_acc_range(emul, ms, 3, 0, 2);
- check_set_acc_range(emul, ms, 4, 0, 4);
- check_set_acc_range(emul, ms, 5, 0, 4);
- check_set_acc_range(emul, ms, 6, 0, 4);
- check_set_acc_range(emul, ms, 7, 0, 4);
- check_set_acc_range(emul, ms, 8, 0, 8);
- check_set_acc_range(emul, ms, 9, 0, 8);
- check_set_acc_range(emul, ms, 15, 0, 8);
- check_set_acc_range(emul, ms, 16, 0, 16);
- check_set_acc_range(emul, ms, 17, 0, 16);
-
- /* Test setting range with rounding up */
- check_set_acc_range(emul, ms, 1, 1, 2);
- check_set_acc_range(emul, ms, 2, 1, 2);
- check_set_acc_range(emul, ms, 3, 1, 4);
- check_set_acc_range(emul, ms, 4, 1, 4);
- check_set_acc_range(emul, ms, 5, 1, 8);
- check_set_acc_range(emul, ms, 6, 1, 8);
- check_set_acc_range(emul, ms, 7, 1, 8);
- check_set_acc_range(emul, ms, 8, 1, 8);
- check_set_acc_range(emul, ms, 9, 1, 16);
- check_set_acc_range(emul, ms, 15, 1, 16);
- check_set_acc_range(emul, ms, 16, 1, 16);
- check_set_acc_range(emul, ms, 17, 1, 16);
-}
-
-/**
- * Try to set gyroscope range and check if expected range was set in driver and
- * in emulator.
- */
-static void check_set_gyr_range_f(struct i2c_emul *emul,
- struct motion_sensor_t *ms, int range,
- int rnd, int exp_range, int line)
-{
- uint8_t exp_range_reg;
- uint8_t range_reg;
-
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, range, rnd),
- "set_range failed; line: %d", line);
- zassert_equal(exp_range, ms->current_range,
- "Expected range %d, got %d; line %d",
- exp_range, ms->current_range, line);
- range_reg = bmi_emul_get_reg(emul, BMI160_GYR_RANGE);
-
- switch (exp_range) {
- case 125:
- exp_range_reg = BMI160_DPS_SEL_125;
- break;
- case 250:
- exp_range_reg = BMI160_DPS_SEL_250;
- break;
- case 500:
- exp_range_reg = BMI160_DPS_SEL_500;
- break;
- case 1000:
- exp_range_reg = BMI160_DPS_SEL_1000;
- break;
- case 2000:
- exp_range_reg = BMI160_DPS_SEL_2000;
- break;
- default:
- /* Unknown expected range */
- zassert_unreachable(
- "Expected range %d not supported by device; line %d",
- exp_range, line);
- return;
- }
-
- zassert_equal(exp_range_reg, range_reg,
- "Expected range reg 0x%x, got 0x%x; line %d",
- exp_range_reg, range_reg, line);
-}
-#define check_set_gyr_range(emul, ms, range, rnd, exp_range) \
- check_set_gyr_range_f(emul, ms, range, rnd, exp_range, __LINE__)
-
-/** Test set gyroscope range with and without I2C errors */
-static void test_bmi_gyr_set_range(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- int start_range;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Setup starting range, shouldn't be changed on error */
- start_range = 250;
- ms->current_range = start_range;
- bmi_emul_set_reg(emul, BMI160_GYR_RANGE, BMI160_DPS_SEL_250);
- /* Setup emulator fail on write */
- i2c_common_emul_set_write_fail_reg(emul, BMI160_GYR_RANGE);
-
- /* Test fail on write */
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_range(ms, 125, 0), NULL);
- zassert_equal(start_range, ms->current_range, NULL);
- zassert_equal(BMI160_DPS_SEL_250,
- bmi_emul_get_reg(emul, BMI160_GYR_RANGE), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_range(ms, 125, 1), NULL);
- zassert_equal(start_range, ms->current_range, NULL);
- zassert_equal(BMI160_DPS_SEL_250,
- bmi_emul_get_reg(emul, BMI160_GYR_RANGE), NULL);
-
- /* Do not fail on write */
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test setting range with rounding down */
- check_set_gyr_range(emul, ms, 1, 0, 125);
- check_set_gyr_range(emul, ms, 124, 0, 125);
- check_set_gyr_range(emul, ms, 125, 0, 125);
- check_set_gyr_range(emul, ms, 126, 0, 125);
- check_set_gyr_range(emul, ms, 249, 0, 125);
- check_set_gyr_range(emul, ms, 250, 0, 250);
- check_set_gyr_range(emul, ms, 251, 0, 250);
- check_set_gyr_range(emul, ms, 499, 0, 250);
- check_set_gyr_range(emul, ms, 500, 0, 500);
- check_set_gyr_range(emul, ms, 501, 0, 500);
- check_set_gyr_range(emul, ms, 999, 0, 500);
- check_set_gyr_range(emul, ms, 1000, 0, 1000);
- check_set_gyr_range(emul, ms, 1001, 0, 1000);
- check_set_gyr_range(emul, ms, 1999, 0, 1000);
- check_set_gyr_range(emul, ms, 2000, 0, 2000);
- check_set_gyr_range(emul, ms, 2001, 0, 2000);
-
- /* Test setting range with rounding up */
- check_set_gyr_range(emul, ms, 1, 1, 125);
- check_set_gyr_range(emul, ms, 124, 1, 125);
- check_set_gyr_range(emul, ms, 125, 1, 125);
- check_set_gyr_range(emul, ms, 126, 1, 250);
- check_set_gyr_range(emul, ms, 249, 1, 250);
- check_set_gyr_range(emul, ms, 250, 1, 250);
- check_set_gyr_range(emul, ms, 251, 1, 500);
- check_set_gyr_range(emul, ms, 499, 1, 500);
- check_set_gyr_range(emul, ms, 500, 1, 500);
- check_set_gyr_range(emul, ms, 501, 1, 1000);
- check_set_gyr_range(emul, ms, 999, 1, 1000);
- check_set_gyr_range(emul, ms, 1000, 1, 1000);
- check_set_gyr_range(emul, ms, 1001, 1, 2000);
- check_set_gyr_range(emul, ms, 1999, 1, 2000);
- check_set_gyr_range(emul, ms, 2000, 1, 2000);
- check_set_gyr_range(emul, ms, 2001, 1, 2000);
-}
-
-/** Test get resolution of acclerometer and gyroscope sensor */
-static void test_bmi_get_resolution(void)
-{
- struct motion_sensor_t *ms;
-
- /* Test accelerometer */
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- /* Resolution should be always 16 bits */
- zassert_equal(16, ms->drv->get_resolution(ms), NULL);
-
- /* Test gyroscope */
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Resolution should be always 16 bits */
- zassert_equal(16, ms->drv->get_resolution(ms), NULL);
-}
-
-/**
- * Try to set accelerometer data rate and check if expected rate was set
- * in driver and in emulator.
- */
-static void check_set_acc_rate_f(struct i2c_emul *emul,
- struct motion_sensor_t *ms, int rate, int rnd,
- int exp_rate, int line)
-{
- uint8_t exp_rate_reg;
- uint8_t rate_reg;
- int drv_rate;
-
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, rate, rnd),
- "set_data_rate failed; line: %d", line);
- drv_rate = ms->drv->get_data_rate(ms);
- zassert_equal(exp_rate, drv_rate, "Expected rate %d, got %d; line %d",
- exp_rate, drv_rate, line);
- rate_reg = bmi_emul_get_reg(emul, BMI160_ACC_CONF);
- rate_reg &= BMI_ODR_MASK;
-
- switch (exp_rate) {
- case 12500:
- exp_rate_reg = 0x5;
- break;
- case 25000:
- exp_rate_reg = 0x6;
- break;
- case 50000:
- exp_rate_reg = 0x7;
- break;
- case 100000:
- exp_rate_reg = 0x8;
- break;
- case 200000:
- exp_rate_reg = 0x9;
- break;
- case 400000:
- exp_rate_reg = 0xa;
- break;
- case 800000:
- exp_rate_reg = 0xb;
- break;
- case 1600000:
- exp_rate_reg = 0xc;
- break;
- default:
- /* Unknown expected rate */
- zassert_unreachable(
- "Expected rate %d not supported by device; line %d",
- exp_rate, line);
- return;
- }
-
- zassert_equal(exp_rate_reg, rate_reg,
- "Expected rate reg 0x%x, got 0x%x; line %d",
- exp_rate_reg, rate_reg, line);
-}
-#define check_set_acc_rate(emul, ms, rate, rnd, exp_rate) \
- check_set_acc_rate_f(emul, ms, rate, rnd, exp_rate, __LINE__)
-
-/** Test set and get accelerometer rate with and without I2C errors */
-static void test_bmi_acc_rate(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- uint8_t reg_rate;
- int pmu_status;
- int drv_rate;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- /* Test setting rate with rounding down */
- check_set_acc_rate(emul, ms, 12500, 0, 12500);
- check_set_acc_rate(emul, ms, 12501, 0, 12500);
- check_set_acc_rate(emul, ms, 24999, 0, 12500);
- check_set_acc_rate(emul, ms, 25000, 0, 25000);
- check_set_acc_rate(emul, ms, 25001, 0, 25000);
- check_set_acc_rate(emul, ms, 49999, 0, 25000);
- check_set_acc_rate(emul, ms, 50000, 0, 50000);
- check_set_acc_rate(emul, ms, 50001, 0, 50000);
- check_set_acc_rate(emul, ms, 99999, 0, 50000);
- check_set_acc_rate(emul, ms, 100000, 0, 100000);
- check_set_acc_rate(emul, ms, 100001, 0, 100000);
- check_set_acc_rate(emul, ms, 199999, 0, 100000);
- check_set_acc_rate(emul, ms, 200000, 0, 200000);
- check_set_acc_rate(emul, ms, 200001, 0, 200000);
- check_set_acc_rate(emul, ms, 399999, 0, 200000);
- /*
- * We cannot test frequencies from 400000 to 1600000 because
- * CONFIG_EC_MAX_SENSOR_FREQ_MILLIHZ is set to 250000
- */
-
- /* Test setting rate with rounding up */
- check_set_acc_rate(emul, ms, 6251, 1, 12500);
- check_set_acc_rate(emul, ms, 12499, 1, 12500);
- check_set_acc_rate(emul, ms, 12500, 1, 12500);
- check_set_acc_rate(emul, ms, 12501, 1, 25000);
- check_set_acc_rate(emul, ms, 24999, 1, 25000);
- check_set_acc_rate(emul, ms, 25000, 1, 25000);
- check_set_acc_rate(emul, ms, 25001, 1, 50000);
- check_set_acc_rate(emul, ms, 49999, 1, 50000);
- check_set_acc_rate(emul, ms, 50000, 1, 50000);
- check_set_acc_rate(emul, ms, 50001, 1, 100000);
- check_set_acc_rate(emul, ms, 99999, 1, 100000);
- check_set_acc_rate(emul, ms, 100000, 1, 100000);
- check_set_acc_rate(emul, ms, 100001, 1, 200000);
- check_set_acc_rate(emul, ms, 199999, 1, 200000);
- check_set_acc_rate(emul, ms, 200000, 1, 200000);
-
- /* Test out of range rate with rounding down */
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 1, 0), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 12499, 0), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 400000, 0), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 2000000, 0), NULL);
-
- /* Test out of range rate with rounding up */
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 1, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 6250, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 200001, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 400000, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 2000000, 1), NULL);
-
- /* Current rate shouldn't be changed on error */
- drv_rate = ms->drv->get_data_rate(ms);
- reg_rate = bmi_emul_get_reg(emul, BMI160_ACC_CONF);
-
- /* Setup emulator fail on read */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_CONF);
-
- /* Test fail on read */
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 0),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_ACC_CONF), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 1),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_ACC_CONF), NULL);
-
- /* Do not fail on read */
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Setup emulator fail on write */
- i2c_common_emul_set_write_fail_reg(emul, BMI160_ACC_CONF);
-
- /* Test fail on write */
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 0),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_ACC_CONF), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 1),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_ACC_CONF), NULL);
-
- /* Do not fail on write */
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test disabling sensor */
- pmu_status = BMI160_PMU_NORMAL << BMI160_PMU_ACC_OFFSET;
- pmu_status |= BMI160_PMU_NORMAL << BMI160_PMU_GYR_OFFSET;
- bmi_emul_set_reg(emul, BMI160_PMU_STATUS, pmu_status);
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 0, 0), NULL);
-
- bmi_read8(ms->port, ms->i2c_spi_addr_flags, BMI160_PMU_STATUS,
- &pmu_status);
- zassert_equal(BMI160_PMU_NORMAL << BMI160_PMU_GYR_OFFSET, pmu_status,
- "Gyroscope should be still enabled");
-
- /* Test enabling sensor */
- bmi_emul_set_reg(emul, BMI160_PMU_STATUS, 0);
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 50000, 0), NULL);
-
- bmi_read8(ms->port, ms->i2c_spi_addr_flags, BMI160_PMU_STATUS,
- &pmu_status);
- zassert_equal(BMI160_PMU_NORMAL << BMI160_PMU_ACC_OFFSET, pmu_status,
- "Accelerometer should be enabled");
-}
-
-/**
- * Try to set gyroscope data rate and check if expected rate was set
- * in driver and in emulator.
- */
-static void check_set_gyr_rate_f(struct i2c_emul *emul,
- struct motion_sensor_t *ms, int rate, int rnd,
- int exp_rate, int line)
-{
- uint8_t exp_rate_reg;
- uint8_t rate_reg;
- int drv_rate;
-
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, rate, rnd),
- "set_data_rate failed; line: %d", line);
- drv_rate = ms->drv->get_data_rate(ms);
- zassert_equal(exp_rate, drv_rate, "Expected rate %d, got %d; line %d",
- exp_rate, drv_rate, line);
- rate_reg = bmi_emul_get_reg(emul, BMI160_GYR_CONF);
- rate_reg &= BMI_ODR_MASK;
-
- switch (exp_rate) {
- case 25000:
- exp_rate_reg = 0x6;
- break;
- case 50000:
- exp_rate_reg = 0x7;
- break;
- case 100000:
- exp_rate_reg = 0x8;
- break;
- case 200000:
- exp_rate_reg = 0x9;
- break;
- case 400000:
- exp_rate_reg = 0xa;
- break;
- case 800000:
- exp_rate_reg = 0xb;
- break;
- case 1600000:
- exp_rate_reg = 0xc;
- break;
- case 3200000:
- exp_rate_reg = 0xc;
- break;
- default:
- /* Unknown expected rate */
- zassert_unreachable(
- "Expected rate %d not supported by device; line %d",
- exp_rate, line);
- return;
- }
-
- zassert_equal(exp_rate_reg, rate_reg,
- "Expected rate reg 0x%x, got 0x%x; line %d",
- exp_rate_reg, rate_reg, line);
-}
-#define check_set_gyr_rate(emul, ms, rate, rnd, exp_rate) \
- check_set_gyr_rate_f(emul, ms, rate, rnd, exp_rate, __LINE__)
-
-/** Test set and get gyroscope rate with and without I2C errors */
-static void test_bmi_gyr_rate(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- uint8_t reg_rate;
- int pmu_status;
- int drv_rate;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Test setting rate with rounding down */
- check_set_gyr_rate(emul, ms, 25000, 0, 25000);
- check_set_gyr_rate(emul, ms, 25001, 0, 25000);
- check_set_gyr_rate(emul, ms, 49999, 0, 25000);
- check_set_gyr_rate(emul, ms, 50000, 0, 50000);
- check_set_gyr_rate(emul, ms, 50001, 0, 50000);
- check_set_gyr_rate(emul, ms, 99999, 0, 50000);
- check_set_gyr_rate(emul, ms, 100000, 0, 100000);
- check_set_gyr_rate(emul, ms, 100001, 0, 100000);
- check_set_gyr_rate(emul, ms, 199999, 0, 100000);
- check_set_gyr_rate(emul, ms, 200000, 0, 200000);
- check_set_gyr_rate(emul, ms, 200001, 0, 200000);
- check_set_gyr_rate(emul, ms, 399999, 0, 200000);
- /*
- * We cannot test frequencies from 400000 to 3200000 because
- * CONFIG_EC_MAX_SENSOR_FREQ_MILLIHZ is set to 250000
- */
-
- /* Test setting rate with rounding up */
- check_set_gyr_rate(emul, ms, 12501, 1, 25000);
- check_set_gyr_rate(emul, ms, 24999, 1, 25000);
- check_set_gyr_rate(emul, ms, 25000, 1, 25000);
- check_set_gyr_rate(emul, ms, 25001, 1, 50000);
- check_set_gyr_rate(emul, ms, 49999, 1, 50000);
- check_set_gyr_rate(emul, ms, 50000, 1, 50000);
- check_set_gyr_rate(emul, ms, 50001, 1, 100000);
- check_set_gyr_rate(emul, ms, 99999, 1, 100000);
- check_set_gyr_rate(emul, ms, 100000, 1, 100000);
- check_set_gyr_rate(emul, ms, 100001, 1, 200000);
- check_set_gyr_rate(emul, ms, 199999, 1, 200000);
- check_set_gyr_rate(emul, ms, 200000, 1, 200000);
-
- /* Test out of range rate with rounding down */
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 1, 0), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 24999, 0), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 400000, 0), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 4000000, 0), NULL);
-
- /* Test out of range rate with rounding up */
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 1, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 12499, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 200001, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 400000, 1), NULL);
- zassert_equal(EC_RES_INVALID_PARAM,
- ms->drv->set_data_rate(ms, 4000000, 1), NULL);
-
- /* Current rate shouldn't be changed on error */
- drv_rate = ms->drv->get_data_rate(ms);
- reg_rate = bmi_emul_get_reg(emul, BMI160_GYR_CONF);
-
- /* Setup emulator fail on read */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_CONF);
-
- /* Test fail on read */
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 0),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_GYR_CONF), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 1),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_GYR_CONF), NULL);
-
- /* Do not fail on read */
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Setup emulator fail on write */
- i2c_common_emul_set_write_fail_reg(emul, BMI160_GYR_CONF);
-
- /* Test fail on write */
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 0),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_GYR_CONF), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 50000, 1),
- NULL);
- zassert_equal(drv_rate, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(reg_rate, bmi_emul_get_reg(emul, BMI160_GYR_CONF), NULL);
-
- /* Do not fail on write */
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test disabling sensor */
- pmu_status = BMI160_PMU_NORMAL << BMI160_PMU_ACC_OFFSET;
- pmu_status |= BMI160_PMU_NORMAL << BMI160_PMU_GYR_OFFSET;
- bmi_emul_set_reg(emul, BMI160_PMU_STATUS, pmu_status);
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 0, 0), NULL);
-
- bmi_read8(ms->port, ms->i2c_spi_addr_flags, BMI160_PMU_STATUS,
- &pmu_status);
- zassert_equal(BMI160_PMU_NORMAL << BMI160_PMU_ACC_OFFSET, pmu_status,
- "Accelerometer should be still enabled");
-
- /* Test enabling sensor */
- bmi_emul_set_reg(emul, BMI160_PMU_STATUS, 0);
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 50000, 0), NULL);
-
- bmi_read8(ms->port, ms->i2c_spi_addr_flags, BMI160_PMU_STATUS,
- &pmu_status);
- zassert_equal(BMI160_PMU_NORMAL << BMI160_PMU_GYR_OFFSET, pmu_status,
- "Gyroscope should be enabled");
-}
-
-/**
- * Test setting and getting scale in accelerometer and gyroscope sensors.
- * Correct appling scale to results is checked in "read" test.
- */
-static void test_bmi_scale(void)
-{
- struct motion_sensor_t *ms;
- int16_t ret_scale[3];
- int16_t exp_scale[3] = {100, 231, 421};
- int16_t t;
-
- /* Test accelerometer */
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- zassert_equal(EC_SUCCESS, ms->drv->set_scale(ms, exp_scale, 0), NULL);
- zassert_equal(EC_SUCCESS, ms->drv->get_scale(ms, ret_scale, &t), NULL);
-
- zassert_equal(t, (int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, NULL);
- zassert_equal(exp_scale[0], ret_scale[0], NULL);
- zassert_equal(exp_scale[1], ret_scale[1], NULL);
- zassert_equal(exp_scale[2], ret_scale[2], NULL);
-
- /* Test gyroscope */
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- zassert_equal(EC_SUCCESS, ms->drv->set_scale(ms, exp_scale, 0), NULL);
- zassert_equal(EC_SUCCESS, ms->drv->get_scale(ms, ret_scale, &t), NULL);
-
- zassert_equal(t, (int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, NULL);
- zassert_equal(exp_scale[0], ret_scale[0], NULL);
- zassert_equal(exp_scale[1], ret_scale[1], NULL);
- zassert_equal(exp_scale[2], ret_scale[2], NULL);
-}
-
-/** Test reading temperature using accelerometer and gyroscope sensors */
-static void test_bmi_read_temp(void)
-{
- struct motion_sensor_t *ms_acc, *ms_gyr;
- struct i2c_emul *emul;
- int ret_temp;
- int exp_temp;
-
- emul = bmi_emul_get(BMI_ORD);
- ms_acc = &motion_sensors[BMI_ACC_SENSOR_ID];
- ms_gyr = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Setup emulator fail on read */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_TEMPERATURE_0);
- zassert_equal(EC_ERROR_NOT_POWERED,
- ms_acc->drv->read_temp(ms_acc, &ret_temp), NULL);
- zassert_equal(EC_ERROR_NOT_POWERED,
- ms_gyr->drv->read_temp(ms_gyr, &ret_temp), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_TEMPERATURE_1);
- zassert_equal(EC_ERROR_NOT_POWERED,
- ms_acc->drv->read_temp(ms_acc, &ret_temp), NULL);
- zassert_equal(EC_ERROR_NOT_POWERED,
- ms_gyr->drv->read_temp(ms_gyr, &ret_temp), NULL);
- /* Do not fail on read */
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Fail on invalid temperature */
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_0, 0x00);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_1, 0x80);
- zassert_equal(EC_ERROR_NOT_POWERED,
- ms_acc->drv->read_temp(ms_acc, &ret_temp), NULL);
- zassert_equal(EC_ERROR_NOT_POWERED,
- ms_gyr->drv->read_temp(ms_gyr, &ret_temp), NULL);
-
- /*
- * Test correct values. Both motion sensors should return the same
- * temperature.
- */
- exp_temp = C_TO_K(23);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_0, 0x00);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_1, 0x00);
- zassert_equal(EC_SUCCESS, ms_acc->drv->read_temp(ms_acc, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
- zassert_equal(EC_SUCCESS, ms_gyr->drv->read_temp(ms_gyr, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
-
- exp_temp = C_TO_K(87);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_0, 0xff);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_1, 0x7f);
- zassert_equal(EC_SUCCESS, ms_acc->drv->read_temp(ms_acc, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
- zassert_equal(EC_SUCCESS, ms_gyr->drv->read_temp(ms_gyr, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
-
- exp_temp = C_TO_K(-41);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_0, 0x01);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_1, 0x80);
- zassert_equal(EC_SUCCESS, ms_acc->drv->read_temp(ms_acc, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
- zassert_equal(EC_SUCCESS, ms_gyr->drv->read_temp(ms_gyr, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
-
- exp_temp = C_TO_K(47);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_0, 0x00);
- bmi_emul_set_reg(emul, BMI160_TEMPERATURE_1, 0x30);
- zassert_equal(EC_SUCCESS, ms_acc->drv->read_temp(ms_acc, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
- zassert_equal(EC_SUCCESS, ms_gyr->drv->read_temp(ms_gyr, &ret_temp),
- NULL);
- zassert_equal(exp_temp, ret_temp, NULL);
-}
-
-/** Test reading accelerometer sensor data */
-static void test_bmi_acc_read(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- intv3_t ret_v;
- intv3_t exp_v;
- int16_t scale[3] = {MOTION_SENSE_DEFAULT_SCALE,
- MOTION_SENSE_DEFAULT_SCALE,
- MOTION_SENSE_DEFAULT_SCALE};
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- /* Set offset 0 to simplify test */
- bmi_emul_set_off(emul, BMI_EMUL_ACC_X, 0);
- bmi_emul_set_off(emul, BMI_EMUL_ACC_Y, 0);
- bmi_emul_set_off(emul, BMI_EMUL_ACC_Z, 0);
-
- /* Fail on read status */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_STATUS);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
-
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* When not ready, driver should return saved raw value */
- exp_v[0] = 100;
- exp_v[1] = 200;
- exp_v[2] = 300;
- ms->raw_xyz[0] = exp_v[0];
- ms->raw_xyz[1] = exp_v[1];
- ms->raw_xyz[2] = exp_v[2];
-
- /* Status not ready */
- bmi_emul_set_reg(emul, BMI160_STATUS, 0);
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- compare_int3v(exp_v, ret_v);
-
- /* Status only GYR ready */
- bmi_emul_set_reg(emul, BMI160_STATUS, BMI160_DRDY_GYR);
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- compare_int3v(exp_v, ret_v);
-
- /* Status ACC ready */
- bmi_emul_set_reg(emul, BMI160_STATUS, BMI160_DRDY_ACC);
-
- /* Set input accelerometer values */
- exp_v[0] = BMI_EMUL_1G / 10;
- exp_v[1] = BMI_EMUL_1G / 20;
- exp_v[2] = -(int)BMI_EMUL_1G / 30;
- set_emul_acc(emul, exp_v);
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
- /* Set scale */
- zassert_equal(EC_SUCCESS, ms->drv->set_scale(ms, scale, 0), NULL);
- /* Set range to 2G */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 2, 0), NULL);
-
- /* Test read without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_acc_to_emul(ret_v, 2, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Set range to 4G */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 4, 0), NULL);
-
- /* Test read without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_acc_to_emul(ret_v, 4, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Setup rotation and rotate expected vector */
- ms->rot_standard_ref = &test_rotation;
- rotate_int3v_by_test_rotation(exp_v);
- /* Set range to 2G */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 2, 0), NULL);
-
- /* Test read with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_acc_to_emul(ret_v, 2, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Set range to 4G */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 4, 0), NULL);
-
- /* Test read with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_acc_to_emul(ret_v, 4, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Fail on read of data registers */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_X_L_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_X_H_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_Y_L_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_Y_H_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_Z_L_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_Z_H_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
-
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
- ms->rot_standard_ref = NULL;
-}
-
-/** Test reading gyroscope sensor data */
-static void test_bmi_gyr_read(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- intv3_t ret_v;
- intv3_t exp_v;
- int16_t scale[3] = {MOTION_SENSE_DEFAULT_SCALE,
- MOTION_SENSE_DEFAULT_SCALE,
- MOTION_SENSE_DEFAULT_SCALE};
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Set offset 0 to simplify test */
- bmi_emul_set_off(emul, BMI_EMUL_GYR_X, 0);
- bmi_emul_set_off(emul, BMI_EMUL_GYR_Y, 0);
- bmi_emul_set_off(emul, BMI_EMUL_GYR_Z, 0);
-
- /* Fail on read status */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_STATUS);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
-
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* When not ready, driver should return saved raw value */
- exp_v[0] = 100;
- exp_v[1] = 200;
- exp_v[2] = 300;
- ms->raw_xyz[0] = exp_v[0];
- ms->raw_xyz[1] = exp_v[1];
- ms->raw_xyz[2] = exp_v[2];
-
- /* Status not ready */
- bmi_emul_set_reg(emul, BMI160_STATUS, 0);
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- compare_int3v(exp_v, ret_v);
-
- /* Status only ACC ready */
- bmi_emul_set_reg(emul, BMI160_STATUS, BMI160_DRDY_ACC);
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- compare_int3v(exp_v, ret_v);
-
- /* Status GYR ready */
- bmi_emul_set_reg(emul, BMI160_STATUS, BMI160_DRDY_GYR);
-
- /* Set input accelerometer values */
- exp_v[0] = BMI_EMUL_125_DEG_S / 10;
- exp_v[1] = BMI_EMUL_125_DEG_S / 20;
- exp_v[2] = -(int)BMI_EMUL_125_DEG_S / 30;
- set_emul_gyr(emul, exp_v);
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
- /* Set scale */
- zassert_equal(EC_SUCCESS, ms->drv->set_scale(ms, scale, 0), NULL);
- /* Set range to 125°/s */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 125, 0), NULL);
-
- /* Test read without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_gyr_to_emul(ret_v, 125, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Set range to 1000°/s */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 1000, 0), NULL);
-
- /* Test read without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_gyr_to_emul(ret_v, 1000, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Setup rotation and rotate expected vector */
- ms->rot_standard_ref = &test_rotation;
- rotate_int3v_by_test_rotation(exp_v);
- /* Set range to 125°/s */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 125, 0), NULL);
-
- /* Test read with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_gyr_to_emul(ret_v, 125, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Set range to 1000°/s */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 1000, 0), NULL);
-
- /* Test read with rotation */
- zassert_equal(EC_SUCCESS, ms->drv->read(ms, ret_v), NULL);
- drv_gyr_to_emul(ret_v, 1000, ret_v);
- compare_int3v(exp_v, ret_v);
-
- /* Fail on read of data registers */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_X_L_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_X_H_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_Y_L_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_Y_H_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_Z_L_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_Z_H_G);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, ret_v), NULL);
-
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
- ms->rot_standard_ref = NULL;
-}
-
-/**
- * Custom emulatro read function which always return not ready STATUS register.
- * Used in calibration test.
- */
-static int emul_nrdy(struct i2c_emul *emul, int reg, uint8_t *val, int byte,
- void *data)
-{
- if (reg == BMI160_STATUS) {
- bmi_emul_set_reg(emul, BMI160_STATUS, 0);
- *val = 0;
-
- return 0;
- }
-
- return 1;
-}
-
-/** Test acceleromtere calibration */
-static void test_bmi_acc_perform_calib(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- uint8_t pmu_status;
- intv3_t start_off;
- intv3_t exp_off;
- intv3_t ret_off;
- int range;
- int rate;
- mat33_fp_t rot = {
- { FLOAT_TO_FP(1), 0, 0},
- { 0, FLOAT_TO_FP(1), 0},
- { 0, 0, FLOAT_TO_FP(-1)}
- };
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
-
- /* Enable sensors */
- pmu_status = BMI160_PMU_NORMAL << BMI160_PMU_ACC_OFFSET;
- pmu_status |= BMI160_PMU_NORMAL << BMI160_PMU_GYR_OFFSET;
- bmi_emul_set_reg(emul, BMI160_PMU_STATUS, pmu_status);
-
- /* Range and rate cannot change after calibration */
- range = 4;
- rate = 50000;
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, range, 0), NULL);
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, rate, 0), NULL);
-
- /* Set offset 0 */
- start_off[0] = 0;
- start_off[1] = 0;
- start_off[2] = 0;
- set_emul_acc_offset(emul, start_off);
-
- /* Set input accelerometer values */
- exp_off[0] = BMI_EMUL_1G / 10;
- exp_off[1] = BMI_EMUL_1G / 20;
- exp_off[2] = BMI_EMUL_1G - (int)BMI_EMUL_1G / 30;
- set_emul_acc(emul, exp_off);
-
- /*
- * Expected offset is [-X, -Y, 1G - Z] for no rotation or positive
- * rotation on Z axis
- */
- exp_off[0] = -exp_off[0];
- exp_off[1] = -exp_off[1];
- exp_off[2] = BMI_EMUL_1G - exp_off[2];
-
- /* Test fail on rate set */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_ACC_CONF);
- zassert_equal(EC_ERROR_INVAL, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
-
- /* Test fail on status read */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_STATUS);
- zassert_equal(EC_ERROR_INVAL, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- /* Stop fast offset compensation before next test */
- bmi_emul_set_reg(emul, BMI160_CMD_REG, BMI160_CMD_NOOP);
-
- /* Test fail on data not ready */
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
- i2c_common_emul_set_read_func(emul, emul_nrdy, NULL);
- zassert_equal(EC_RES_TIMEOUT, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- /* Remove custom emulator read function */
- i2c_common_emul_set_read_func(emul, NULL, NULL);
- /* Stop fast offset compensation before next test */
- bmi_emul_set_reg(emul, BMI160_CMD_REG, BMI160_CMD_NOOP);
-
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
- /* Test successful offset compenastion without rotation */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- get_emul_acc_offset(emul, ret_off);
- /*
- * Depending on used range, accelerometer values may be up to 6 bits
- * more accurate then offset value resolution.
- */
- compare_int3v_eps(exp_off, ret_off, 64);
- /* Acelerometer offset should be enabled */
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_ACC_EN, NULL);
-
- /* Enable rotation with negative value on Z axis */
- ms->rot_standard_ref = &rot;
- /* Expected offset -1G - accelerometer[Z] */
- bmi_emul_set_value(emul, BMI_EMUL_ACC_Z, -(int)BMI_EMUL_1G - 1234);
- exp_off[2] = 1234;
-
- /* Test successful offset compenastion with negative Z rotation */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- get_emul_acc_offset(emul, ret_off);
- compare_int3v_eps(exp_off, ret_off, 64);
- /* Acelerometer offset should be enabled */
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_ACC_EN, NULL);
-
- /* Set positive rotation on Z axis */
- rot[2][2] = FLOAT_TO_FP(1);
- /* Expected offset 1G - accelerometer[Z] */
- bmi_emul_set_value(emul, BMI_EMUL_ACC_Z, BMI_EMUL_1G - 1234);
- exp_off[2] = 1234;
-
- /* Test successful offset compenastion with positive Z rotation */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- get_emul_acc_offset(emul, ret_off);
- compare_int3v_eps(exp_off, ret_off, 64);
- /* Acelerometer offset should be enabled */
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_ACC_EN, NULL);
- /* Disable rotation */
- ms->rot_standard_ref = NULL;
-}
-
-/** Test gyroscope calibration */
-static void test_bmi_gyr_perform_calib(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- uint8_t pmu_status;
- intv3_t start_off;
- intv3_t exp_off;
- intv3_t ret_off;
- int range;
- int rate;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Enable sensors */
- pmu_status = BMI160_PMU_NORMAL << BMI160_PMU_ACC_OFFSET;
- pmu_status |= BMI160_PMU_NORMAL << BMI160_PMU_GYR_OFFSET;
- bmi_emul_set_reg(emul, BMI160_PMU_STATUS, pmu_status);
-
- /* Range and rate cannot change after calibration */
- range = 250;
- rate = 50000;
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, range, 0), NULL);
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, rate, 0), NULL);
-
- /* Set offset 0 */
- start_off[0] = 0;
- start_off[1] = 0;
- start_off[2] = 0;
- set_emul_gyr_offset(emul, start_off);
-
- /* Set input accelerometer values */
- exp_off[0] = BMI_EMUL_125_DEG_S / 100;
- exp_off[1] = BMI_EMUL_125_DEG_S / 200;
- exp_off[2] = -(int)BMI_EMUL_125_DEG_S / 300;
- set_emul_gyr(emul, exp_off);
-
- /* Expected offset is [-X, -Y, -Z] */
- exp_off[0] = -exp_off[0];
- exp_off[1] = -exp_off[1];
- exp_off[2] = -exp_off[2];
-
- /* Test success on disabling calibration */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 0), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
-
- /* Test fail on rate set */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_GYR_CONF);
- zassert_equal(EC_ERROR_INVAL, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
-
- /* Test fail on status read */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_STATUS);
- zassert_equal(EC_ERROR_INVAL, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- /* Stop fast offset compensation before next test */
- bmi_emul_set_reg(emul, BMI160_CMD_REG, BMI160_CMD_NOOP);
-
- /* Test fail on data not ready */
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
- i2c_common_emul_set_read_func(emul, emul_nrdy, NULL);
- zassert_equal(EC_RES_TIMEOUT, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- /* Remove custom emulator read function */
- i2c_common_emul_set_read_func(emul, NULL, NULL);
- /* Stop fast offset compensation before next test */
- bmi_emul_set_reg(emul, BMI160_CMD_REG, BMI160_CMD_NOOP);
-
- /* Test successful offset compenastion */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(range, ms->current_range, NULL);
- zassert_equal(rate, ms->drv->get_data_rate(ms), NULL);
- get_emul_gyr_offset(emul, ret_off);
- /*
- * Depending on used range, gyroscope values may be up to 4 bits
- * more accurate then offset value resolution.
- */
- compare_int3v_eps(exp_off, ret_off, 32);
- /* Gyroscope offset should be enabled */
- zassert_true(bmi_emul_get_reg(emul, BMI160_OFFSET_EN_GYR98) &
- BMI160_OFFSET_GYRO_EN, NULL);
-}
-
-/** Test init function of BMI160 accelerometer and gyroscope sensors */
-static void test_bmi_init(void)
-{
- struct motion_sensor_t *ms_acc, *ms_gyr;
- struct i2c_emul *emul;
-
- emul = bmi_emul_get(BMI_ORD);
- ms_acc = &motion_sensors[BMI_ACC_SENSOR_ID];
- ms_gyr = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Test successful init */
- zassert_equal(EC_RES_SUCCESS, ms_acc->drv->init(ms_acc), NULL);
-
- zassert_equal(EC_RES_SUCCESS, ms_gyr->drv->init(ms_gyr), NULL);
-}
-
-/** Data for custom emulator read function used in FIFO test */
-struct fifo_func_data {
- uint16_t interrupts;
-};
-
-/**
- * Custom emulator read function used in FIFO test. It sets interrupt registers
- * to value passed as additional data. It sets interrupt registers to 0 after
- * access.
- */
-static int emul_fifo_func(struct i2c_emul *emul, int reg, uint8_t *val,
- int byte, void *data)
-{
- struct fifo_func_data *d = data;
-
- if (reg + byte == BMI160_INT_STATUS_0) {
- bmi_emul_set_reg(emul, BMI160_INT_STATUS_0,
- d->interrupts & 0xff);
- d->interrupts &= 0xff00;
- } else if (reg + byte == BMI160_INT_STATUS_1) {
- bmi_emul_set_reg(emul, BMI160_INT_STATUS_1,
- (d->interrupts >> 8) & 0xff);
- d->interrupts &= 0xff;
- }
-
- return 1;
-}
-
-/**
- * Run irq handler on accelerometer sensor and check if committed data in FIFO
- * match what was set in FIFO frames in emulator.
- */
-static void check_fifo_f(struct motion_sensor_t *ms_acc,
- struct motion_sensor_t *ms_gyr,
- struct bmi_emul_frame *frame,
- int acc_range, int gyr_range,
- int line)
-{
- struct ec_response_motion_sensor_data vector;
- struct bmi_emul_frame *f_acc, *f_gyr;
- uint32_t event = BMI_INT_EVENT;
- uint16_t size;
- intv3_t exp_v;
- intv3_t ret_v;
-
- /* Find first frame of acc and gyr type */
- f_acc = frame;
- while (f_acc != NULL && !(f_acc->type & BMI_EMUL_FRAME_ACC)) {
- f_acc = f_acc->next;
- }
-
- f_gyr = frame;
- while (f_gyr != NULL && !(f_gyr->type & BMI_EMUL_FRAME_GYR)) {
- f_gyr = f_gyr->next;
- }
-
- /* Read FIFO in driver */
- zassert_equal(EC_SUCCESS, ms_acc->drv->irq_handler(ms_acc, &event),
- NULL);
-
- /* Read all data committed to FIFO */
- while (motion_sense_fifo_read(sizeof(vector), 1, &vector, &size)) {
- /* Ignore timestamp frames */
- if (vector.flags == MOTIONSENSE_SENSOR_FLAG_TIMESTAMP) {
- continue;
- }
-
- /* Check acclerometer frames */
- if (ms_acc - motion_sensors == vector.sensor_num) {
- if (f_acc == NULL) {
- zassert_unreachable(
- "Not expected acclerometer data in FIFO, line %d",
- line);
- }
-
- convert_int3v_int16(vector.data, ret_v);
- drv_acc_to_emul(ret_v, acc_range, ret_v);
- exp_v[0] = f_acc->acc_x;
- exp_v[1] = f_acc->acc_y;
- exp_v[2] = f_acc->acc_z;
- compare_int3v_f(exp_v, ret_v, V_EPS, line);
- f_acc = f_acc->next;
- }
-
- /* Check gyroscope frames */
- if (ms_gyr - motion_sensors == vector.sensor_num) {
- if (f_gyr == NULL) {
- zassert_unreachable(
- "Not expected gyroscope data in FIFO, line %d",
- line);
- }
-
- convert_int3v_int16(vector.data, ret_v);
- drv_gyr_to_emul(ret_v, gyr_range, ret_v);
- exp_v[0] = f_gyr->gyr_x;
- exp_v[1] = f_gyr->gyr_y;
- exp_v[2] = f_gyr->gyr_z;
- compare_int3v_f(exp_v, ret_v, V_EPS, line);
- f_gyr = f_gyr->next;
- }
- }
-
- /* Skip frames of different type at the end */
- while (f_acc != NULL && !(f_acc->type & BMI_EMUL_FRAME_ACC)) {
- f_acc = f_acc->next;
- }
-
- while (f_gyr != NULL && !(f_gyr->type & BMI_EMUL_FRAME_GYR)) {
- f_gyr = f_gyr->next;
- }
-
- /* All frames are readed */
- zassert_is_null(f_acc, "Not all accelerometer frames are read, line %d",
- line);
- zassert_is_null(f_gyr, "Not all gyroscope frames are read, line %d",
- line);
-}
-#define check_fifo(ms_acc, ms_gyr, frame, acc_range, gyr_range) \
- check_fifo_f(ms_acc, ms_gyr, frame, acc_range, gyr_range, __LINE__)
-
-/** Test irq handler of accelerometer sensor */
-static void test_bmi_acc_fifo(void)
-{
- struct motion_sensor_t *ms, *ms_gyr;
- struct fifo_func_data func_data;
- struct bmi_emul_frame f[3];
- struct i2c_emul *emul;
- int gyr_range = 125;
- int acc_range = 2;
- int event;
-
- emul = bmi_emul_get(BMI_ORD);
- ms = &motion_sensors[BMI_ACC_SENSOR_ID];
- ms_gyr = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Need to be set to collect all data in FIFO */
- ms->oversampling_ratio = 1;
- ms_gyr->oversampling_ratio = 1;
- /* Only BMI event should be handled */
- event = 0x1234 & ~BMI_INT_EVENT;
- zassert_equal(EC_ERROR_NOT_HANDLED, ms->drv->irq_handler(ms, &event),
- NULL);
-
- event = BMI_INT_EVENT;
-
- /* Test fail to read interrupt status registers */
- i2c_common_emul_set_read_fail_reg(emul, BMI160_INT_STATUS_0);
- zassert_equal(EC_ERROR_INVAL, ms->drv->irq_handler(ms, &event), NULL);
- i2c_common_emul_set_read_fail_reg(emul, BMI160_INT_STATUS_1);
- zassert_equal(EC_ERROR_INVAL, ms->drv->irq_handler(ms, &event), NULL);
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test no interrupt */
- bmi_emul_set_reg(emul, BMI160_INT_STATUS_0, 0);
- bmi_emul_set_reg(emul, BMI160_INT_STATUS_1, 0);
-
- /* Trigger irq handler and check results */
- check_fifo(ms, ms_gyr, NULL, acc_range, gyr_range);
-
- /* Set custom function for FIFO test */
- i2c_common_emul_set_read_func(emul, emul_fifo_func, &func_data);
- /* Enable sensor FIFO */
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 50000, 0), NULL);
- /* Set range */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, acc_range, 0), NULL);
- zassert_equal(EC_SUCCESS, ms_gyr->drv->set_range(ms_gyr, gyr_range, 0),
- NULL);
- /* Setup single accelerometer frame */
- f[0].type = BMI_EMUL_FRAME_ACC;
- f[0].acc_x = BMI_EMUL_1G / 10;
- f[0].acc_y = BMI_EMUL_1G / 20;
- f[0].acc_z = -(int)BMI_EMUL_1G / 30;
- f[0].next = NULL;
- bmi_emul_append_frame(emul, f);
- /* Setup interrupts register */
- func_data.interrupts = BMI160_FWM_INT;
-
- /* Trigger irq handler and check results */
- check_fifo(ms, ms_gyr, f, acc_range, gyr_range);
-
- /* Setup second accelerometer frame */
- f[1].type = BMI_EMUL_FRAME_ACC;
- f[1].acc_x = -(int)BMI_EMUL_1G / 40;
- f[1].acc_y = BMI_EMUL_1G / 50;
- f[1].acc_z = BMI_EMUL_1G / 60;
- f[0].next = &(f[1]);
- f[1].next = NULL;
- bmi_emul_append_frame(emul, f);
- /* Setup interrupts register */
- func_data.interrupts = BMI160_FWM_INT;
-
- /* Trigger irq handler and check results */
- check_fifo(ms, ms_gyr, f, acc_range, gyr_range);
-
- /* Enable sensor FIFO */
- zassert_equal(EC_SUCCESS, ms_gyr->drv->set_data_rate(ms_gyr, 50000, 0),
- NULL);
-
- /* Setup first gyroscope frame (after two accelerometer frames) */
- f[2].type = BMI_EMUL_FRAME_GYR;
- f[2].gyr_x = -(int)BMI_EMUL_125_DEG_S / 100;
- f[2].gyr_y = BMI_EMUL_125_DEG_S / 200;
- f[2].gyr_z = BMI_EMUL_125_DEG_S / 300;
- f[1].next = &(f[2]);
- f[2].next = NULL;
- bmi_emul_append_frame(emul, f);
- /* Setup interrupts register */
- func_data.interrupts = BMI160_FWM_INT;
-
- /* Trigger irq handler and check results */
- check_fifo(ms, ms_gyr, f, acc_range, gyr_range);
-
- /* Setup second accelerometer frame to by gyroscope frame too */
- f[1].type |= BMI_EMUL_FRAME_GYR;
- f[1].gyr_x = -(int)BMI_EMUL_125_DEG_S / 300;
- f[1].gyr_y = BMI_EMUL_125_DEG_S / 400;
- f[1].gyr_z = BMI_EMUL_125_DEG_S / 500;
- bmi_emul_append_frame(emul, f);
- /* Setup interrupts register */
- func_data.interrupts = BMI160_FWM_INT;
-
- /* Trigger irq handler and check results */
- check_fifo(ms, ms_gyr, f, acc_range, gyr_range);
-
- /* Skip frame should be ignored by driver */
- bmi_emul_set_skipped_frames(emul, 8);
- bmi_emul_append_frame(emul, f);
- /* Setup interrupts register */
- func_data.interrupts = BMI160_FWM_INT;
-
- /* Trigger irq handler and check results */
- check_fifo(ms, ms_gyr, f, acc_range, gyr_range);
-
- /* Setup second frame as an config frame */
- f[1].type = BMI_EMUL_FRAME_CONFIG;
- /* Indicate that accelerometer range changed */
- f[1].config = 0x1;
- bmi_emul_append_frame(emul, f);
- /* Setup interrupts register */
- func_data.interrupts = BMI160_FWM_INT;
-
- /* Trigger irq handler and check results */
- check_fifo(ms, ms_gyr, f, acc_range, gyr_range);
-
- /* Remove custom emulator read function */
- i2c_common_emul_set_read_func(emul, NULL, NULL);
-}
-
-/** Test irq handler of gyroscope sensor */
-static void test_bmi_gyr_fifo(void)
-{
- struct motion_sensor_t *ms;
- uint32_t event;
-
- ms = &motion_sensors[BMI_GYR_SENSOR_ID];
-
- /* Interrupt shuldn't be triggered for gyroscope motion sense */
- event = BMI_INT_EVENT;
- zassert_equal(EC_ERROR_NOT_HANDLED, ms->drv->irq_handler(ms, &event),
- NULL);
-}
-
-void test_suite_bmi160(void)
-{
- ztest_test_suite(bmi160,
- ztest_user_unit_test(test_bmi_acc_get_offset),
- ztest_user_unit_test(test_bmi_gyr_get_offset),
- ztest_user_unit_test(test_bmi_acc_set_offset),
- ztest_user_unit_test(test_bmi_gyr_set_offset),
- ztest_user_unit_test(test_bmi_acc_set_range),
- ztest_user_unit_test(test_bmi_gyr_set_range),
- ztest_user_unit_test(test_bmi_get_resolution),
- ztest_user_unit_test(test_bmi_acc_rate),
- ztest_user_unit_test(test_bmi_gyr_rate),
- ztest_user_unit_test(test_bmi_scale),
- ztest_user_unit_test(test_bmi_read_temp),
- ztest_user_unit_test(test_bmi_acc_read),
- ztest_user_unit_test(test_bmi_gyr_read),
- ztest_user_unit_test(test_bmi_acc_perform_calib),
- ztest_user_unit_test(test_bmi_gyr_perform_calib),
- ztest_user_unit_test(test_bmi_init),
- ztest_user_unit_test(test_bmi_acc_fifo),
- ztest_user_unit_test(test_bmi_gyr_fifo));
- ztest_run_test_suite(bmi160);
-}