summaryrefslogtreecommitdiff
path: root/zephyr/test/drivers/src/tcs3400.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/test/drivers/src/tcs3400.c')
-rw-r--r--zephyr/test/drivers/src/tcs3400.c622
1 files changed, 0 insertions, 622 deletions
diff --git a/zephyr/test/drivers/src/tcs3400.c b/zephyr/test/drivers/src/tcs3400.c
deleted file mode 100644
index c20137c1ad..0000000000
--- a/zephyr/test/drivers/src/tcs3400.c
+++ /dev/null
@@ -1,622 +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_tcs3400.h"
-#include "emul/emul_common_i2c.h"
-
-#include "motion_sense.h"
-#include "motion_sense_fifo.h"
-#include "driver/als_tcs3400.h"
-
-#define TCS_ORD DT_DEP_ORD(DT_NODELABEL(tcs_emul))
-#define TCS_CLR_SENSOR_ID SENSOR_ID(DT_NODELABEL(tcs3400_clear))
-#define TCS_RGB_SENSOR_ID SENSOR_ID(DT_NODELABEL(tcs3400_rgb))
-#define TCS_INT_EVENT \
- TASK_EVENT_MOTION_SENSOR_INTERRUPT(SENSOR_ID(DT_ALIAS(tcs3400_int)))
-
-/** How accurate comparision of rgb sensors should be */
-#define V_EPS 8
-
-/** Test initialization of light sensor driver and device */
-static void test_tcs_init(void)
-{
- struct motion_sensor_t *ms, *ms_rgb;
- struct i2c_emul *emul;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
- ms_rgb = &motion_sensors[TCS_RGB_SENSOR_ID];
-
- /* RGB sensor initialization is always successful */
- zassert_equal(EC_SUCCESS, ms_rgb->drv->init(ms_rgb), NULL);
-
- /* Fail init on communication errors */
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_FAIL_ALL_REG);
- zassert_equal(EC_ERROR_INVAL, ms->drv->init(ms), NULL);
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Fail on bad ID */
- tcs_emul_set_reg(emul, TCS_I2C_ID, 0);
- zassert_equal(EC_ERROR_ACCESS_DENIED, ms->drv->init(ms), NULL);
- /* Restore ID */
- tcs_emul_set_reg(emul, TCS_I2C_ID,
- DT_STRING_TOKEN(DT_NODELABEL(tcs_emul), device_id));
-
- /* Test successful init. ATIME and AGAIN should be changed on init */
- zassert_equal(EC_SUCCESS, ms->drv->init(ms), NULL);
- zassert_equal(TCS_DEFAULT_ATIME,
- tcs_emul_get_reg(emul, TCS_I2C_ATIME), NULL);
- zassert_equal(TCS_DEFAULT_AGAIN,
- tcs_emul_get_reg(emul, TCS_I2C_CONTROL), NULL);
-}
-
-/** Test if read function leaves device in correct mode to accuire data */
-static void test_tcs_read(void)
-{
- struct motion_sensor_t *ms;
- struct i2c_emul *emul;
- uint8_t enable;
- intv3_t v;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
-
- /* Test error on writing registers */
- i2c_common_emul_set_write_fail_reg(emul, TCS_I2C_ATIME);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, v), NULL);
- i2c_common_emul_set_write_fail_reg(emul, TCS_I2C_CONTROL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, v), NULL);
- i2c_common_emul_set_write_fail_reg(emul, TCS_I2C_ENABLE);
- zassert_equal(EC_ERROR_INVAL, ms->drv->read(ms, v), NULL);
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test starting read with calibration */
- tcs_emul_set_reg(emul, TCS_I2C_ATIME, 0);
- tcs_emul_set_reg(emul, TCS_I2C_CONTROL, 0);
- tcs_emul_set_reg(emul, TCS_I2C_ENABLE, 0);
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 1), NULL);
- zassert_equal(EC_RES_IN_PROGRESS, ms->drv->read(ms, v), NULL);
- zassert_equal(TCS_CALIBRATION_ATIME,
- tcs_emul_get_reg(emul, TCS_I2C_ATIME), NULL);
- zassert_equal(TCS_CALIBRATION_AGAIN,
- tcs_emul_get_reg(emul, TCS_I2C_CONTROL), NULL);
- enable = tcs_emul_get_reg(emul, TCS_I2C_ENABLE);
- zassert_true(enable & TCS_I2C_ENABLE_POWER_ON, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_ADC_ENABLE, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_INT_ENABLE, NULL);
-
- /* Test starting read without calibration */
- tcs_emul_set_reg(emul, TCS_I2C_ATIME, 0);
- tcs_emul_set_reg(emul, TCS_I2C_CONTROL, 0);
- tcs_emul_set_reg(emul, TCS_I2C_ENABLE, 0);
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 0), NULL);
- zassert_equal(EC_RES_IN_PROGRESS, ms->drv->read(ms, v), NULL);
- enable = tcs_emul_get_reg(emul, TCS_I2C_ENABLE);
- zassert_true(enable & TCS_I2C_ENABLE_POWER_ON, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_ADC_ENABLE, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_INT_ENABLE, NULL);
-}
-
-/** Check if FIFO for RGB and clear sensor is empty */
-static void check_fifo_empty_f(struct motion_sensor_t *ms,
- struct motion_sensor_t *ms_rgb, int line)
-{
- struct ec_response_motion_sensor_data vector;
- uint16_t size;
-
- /* 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;
- }
-
- if (ms - motion_sensors == vector.sensor_num) {
- zassert_unreachable(
- "Unexpected frame for clear sensor");
- }
-
- if (ms_rgb - motion_sensors == vector.sensor_num) {
- zassert_unreachable("Unexpected frame for rgb sensor");
- }
- }
-}
-#define check_fifo_empty(ms, ms_rgb) \
- check_fifo_empty_f(ms, ms_rgb, __LINE__)
-
-/**
- * Test different conditions where irq handler fail or commit no data
- * to fifo
- */
-static void test_tcs_irq_handler_fail(void)
-{
- struct motion_sensor_t *ms, *ms_rgb;
- struct i2c_emul *emul;
- uint32_t event;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
- ms_rgb = &motion_sensors[TCS_RGB_SENSOR_ID];
-
- /* Fail on wrong event */
- event = 0x1234 & ~TCS_INT_EVENT;
- zassert_equal(EC_ERROR_NOT_HANDLED, ms->drv->irq_handler(ms, &event),
- NULL);
- check_fifo_empty(ms, ms_rgb);
-
- event = TCS_INT_EVENT;
- /* Test error on reading status */
- i2c_common_emul_set_read_fail_reg(emul, TCS_I2C_STATUS);
- 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);
- check_fifo_empty(ms, ms_rgb);
-
- /* Test fail on changing device power state */
- i2c_common_emul_set_write_fail_reg(emul, TCS_I2C_ENABLE);
- zassert_equal(EC_ERROR_INVAL, ms->drv->irq_handler(ms, &event), NULL);
- i2c_common_emul_set_write_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
- check_fifo_empty(ms, ms_rgb);
-
- /* Test that no data is committed when status is 0 */
- tcs_emul_set_reg(emul, TCS_I2C_STATUS, 0);
- zassert_equal(EC_SUCCESS, ms->drv->irq_handler(ms, &event), NULL);
- check_fifo_empty(ms, ms_rgb);
-}
-
-/**
- * Check if last data committed to FIFO for RGB and clear sensor equals to
- * expected value.
- */
-static void check_fifo_f(struct motion_sensor_t *ms,
- struct motion_sensor_t *ms_rgb,
- int *exp_v, int eps, int line)
-{
- struct ec_response_motion_sensor_data vector;
- uint16_t size;
- int ret_v[4] = {-1, -1, -1, -1};
- int i;
-
- /* 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;
- }
-
- /* Get clear frame */
- if (ms - motion_sensors == vector.sensor_num) {
- ret_v[0] = vector.udata[0];
- }
-
- /* Get rgb frame */
- if (ms_rgb - motion_sensors == vector.sensor_num) {
- ret_v[1] = vector.udata[0];
- ret_v[2] = vector.udata[1];
- ret_v[3] = vector.udata[2];
- }
- }
-
- if (ret_v[0] == -1) {
- zassert_unreachable("No frame for clear sensor, line %d", line);
- }
-
- if (ret_v[1] == -1) {
- zassert_unreachable("No frame for rgb sensor, line %d", line);
- }
-
- /* Compare with last committed data */
- for (i = 0; i < 4; i++) {
- zassert_within(exp_v[i], ret_v[i], eps,
- "Expected [%d; %d; %d; %d], got [%d; %d; %d; %d]; line: %d",
- exp_v[0], exp_v[1], exp_v[2], exp_v[3],
- ret_v[0], ret_v[1], ret_v[2], ret_v[3], line);
- }
-}
-#define check_fifo(ms, ms_rgb, exp_v, eps) \
- check_fifo_f(ms, ms_rgb, exp_v, eps, __LINE__)
-
-/** Test calibration mode reading of light sensor values */
-static void test_tcs_read_calibration(void)
-{
- struct motion_sensor_t *ms, *ms_rgb;
- struct i2c_emul *emul;
- uint32_t event = TCS_INT_EVENT;
- int emul_v[4];
- int exp_v[4];
- intv3_t v;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
- ms_rgb = &motion_sensors[TCS_RGB_SENSOR_ID];
-
- /* Need to be set to collect all data in FIFO */
- ms->oversampling_ratio = 1;
- ms_rgb->oversampling_ratio = 1;
- /* Enable calibration mode */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 1), NULL);
- /* Setup AGAIN and ATIME for calibration */
- zassert_equal(EC_RES_IN_PROGRESS, ms->drv->read(ms, v), NULL);
-
- /* Test data that are in calibration range */
- exp_v[0] = 12;
- exp_v[1] = 123;
- exp_v[2] = 1234;
- exp_v[3] = 12345;
- /*
- * Emulator value is with gain 64, while expected value is
- * with gain 16
- */
- emul_v[0] = exp_v[0] * 64 / 16;
- emul_v[1] = exp_v[1] * 64 / 16;
- emul_v[2] = exp_v[2] * 64 / 16;
- emul_v[3] = exp_v[3] * 64 / 16;
- tcs_emul_set_val(emul, TCS_EMUL_C, emul_v[0]);
- tcs_emul_set_val(emul, TCS_EMUL_R, emul_v[1]);
- tcs_emul_set_val(emul, TCS_EMUL_G, emul_v[2]);
- tcs_emul_set_val(emul, TCS_EMUL_B, emul_v[3]);
- /* Set status to show valid data */
- tcs_emul_set_reg(emul, TCS_I2C_STATUS, TCS_I2C_STATUS_RGBC_VALID);
-
- zassert_equal(EC_SUCCESS, ms->drv->irq_handler(ms, &event), NULL);
- /* In calibration mode check for exact match */
- check_fifo(ms, ms_rgb, exp_v, 1);
-
- /* Test data that are outside of calibration range */
- exp_v[0] = 0;
- exp_v[1] = UINT16_MAX;
- exp_v[2] = UINT16_MAX;
- exp_v[3] = 213;
- /*
- * Emulator value is with gain 64, while expected value is
- * with gain 16
- */
- emul_v[0] = 0;
- emul_v[1] = exp_v[1] * 64 / 16;
- emul_v[2] = (UINT16_MAX + 23) * 64 / 16;
- emul_v[3] = exp_v[3] * 64 / 16;
- tcs_emul_set_val(emul, TCS_EMUL_C, emul_v[0]);
- tcs_emul_set_val(emul, TCS_EMUL_R, emul_v[1]);
- tcs_emul_set_val(emul, TCS_EMUL_G, emul_v[2]);
- tcs_emul_set_val(emul, TCS_EMUL_B, emul_v[3]);
- /* Set status to show valid data */
- tcs_emul_set_reg(emul, TCS_I2C_STATUS, TCS_I2C_STATUS_RGBC_VALID);
-
- zassert_equal(EC_SUCCESS, ms->drv->irq_handler(ms, &event), NULL);
- /* In calibration mode check for exact match */
- check_fifo(ms, ms_rgb, exp_v, 1);
-}
-
-/**
- * Set emulator internal value using expected output value returned by
- * the driver. First element of expected vector is IR value used in
- * calculations. Based on that clear light value is calculated.
- * First element of expected vector is updated by this function.
- */
-static void set_emul_val_from_exp(int *exp_v, uint16_t *scale,
- struct i2c_emul *emul)
-{
- int emul_v[4];
- int ir;
-
- /* We use exp_v[0] as IR value */
- ir = exp_v[0];
- /* Driver will return lux value as calculated blue light value */
- exp_v[0] = exp_v[2];
-
- /*
- * Driver takes care of different ATIME and AGAIN value, so expected
- * value is always normalized to ATIME 256 and AGAIN 16. Convert it
- * to internal emulator value (ATIME 256, AGAIN 64) and add expected IR
- * value. Clear light is the sum of rgb light and IR component.
- */
- emul_v[1] = (exp_v[1] + ir) * 64 / 16;
- emul_v[2] = (exp_v[2] + ir) * 64 / 16;
- emul_v[3] = (exp_v[3] + ir) * 64 / 16;
- emul_v[0] = (exp_v[1] + exp_v[2] + exp_v[3] + ir) * 64 / 16;
-
- /* Apply scale, driver should divide by this value */
- emul_v[0] = SENSOR_APPLY_SCALE(emul_v[0], scale[0]);
- emul_v[1] = SENSOR_APPLY_SCALE(emul_v[1], scale[1]);
- emul_v[2] = SENSOR_APPLY_SCALE(emul_v[2], scale[2]);
- emul_v[3] = SENSOR_APPLY_SCALE(emul_v[3], scale[3]);
-
- /* Set emulator values */
- tcs_emul_set_val(emul, TCS_EMUL_C, emul_v[0]);
- tcs_emul_set_val(emul, TCS_EMUL_R, emul_v[1]);
- tcs_emul_set_val(emul, TCS_EMUL_G, emul_v[2]);
- tcs_emul_set_val(emul, TCS_EMUL_B, emul_v[3]);
-}
-
-/** Test normal mode reading of light sensor values */
-static void test_tcs_read_xyz(void)
-{
- struct motion_sensor_t *ms, *ms_rgb;
- struct i2c_emul *emul;
- uint32_t event = TCS_INT_EVENT;
- /* Expected data to test: IR, R, G, B */
- int exp_v[][4] = {
- {200, 1110, 870, 850},
- {300, 1110, 10000, 8500},
- {600, 50000, 40000, 30000},
- {1000, 3000, 40000, 2000},
- {1000, 65000, 65000, 65000},
- {100, 214, 541, 516},
- {143, 2141, 5414, 5163},
- {100, 50000, 40000, 30000},
- {1430, 2141, 5414, 5163},
- {10000, 50000, 40000, 30000},
- {10000, 214, 541, 516},
- {15000, 50000, 40000, 30000},
- };
- uint16_t scale[4] = {
- MOTION_SENSE_DEFAULT_SCALE, MOTION_SENSE_DEFAULT_SCALE,
- MOTION_SENSE_DEFAULT_SCALE, MOTION_SENSE_DEFAULT_SCALE
- };
- int i, test;
- intv3_t v;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
- ms_rgb = &motion_sensors[TCS_RGB_SENSOR_ID];
-
- /* Need to be set to collect all data in FIFO */
- ms->oversampling_ratio = 1;
- ms_rgb->oversampling_ratio = 1;
- /* Disable calibration mode */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 0), NULL);
- /* Setup AGAIN and ATIME for normal mode */
- zassert_equal(EC_RES_IN_PROGRESS, ms->drv->read(ms, v), NULL);
-
- /* Test different data in supported range */
- for (test = 0; test < ARRAY_SIZE(exp_v); test++) {
- set_emul_val_from_exp(exp_v[test], scale, emul);
-
- /* Run few times to allow driver change gain */
- for (i = 0; i < 5; i++) {
- tcs_emul_set_reg(emul, TCS_I2C_STATUS,
- TCS_I2C_STATUS_RGBC_VALID);
- zassert_equal(EC_SUCCESS,
- ms->drv->irq_handler(ms, &event), NULL);
- }
- check_fifo(ms, ms_rgb, exp_v[test], V_EPS);
- }
-
- /* Test data that are outside of supported range */
- exp_v[0][0] = 3000;
- exp_v[0][1] = UINT16_MAX;
- exp_v[0][2] = UINT16_MAX * 32;
- exp_v[0][3] = 200;
- set_emul_val_from_exp(exp_v[0], scale, emul);
-
- /* Run few times to allow driver change gain */
- for (i = 0; i < 10; i++) {
- tcs_emul_set_reg(emul, TCS_I2C_STATUS,
- TCS_I2C_STATUS_RGBC_VALID);
- zassert_equal(EC_SUCCESS, ms->drv->irq_handler(ms, &event),
- NULL);
- }
- /*
- * If saturation value is exceeded on any rgb sensor, than data
- * shouldn't be committed to FIFO.
- */
- check_fifo_empty(ms, ms_rgb);
-}
-
-/**
- * Test getting and setting scale of light sensor. Checks if collected values
- * are scaled properly.
- */
-static void test_tcs_scale(void)
-{
- struct motion_sensor_t *ms, *ms_rgb;
- struct i2c_emul *emul;
- uint32_t event = TCS_INT_EVENT;
- /* Expected data to test: IR, R, G, B */
- int exp_v[][4] = {
- {200, 1110, 870, 850},
- {300, 1110, 10000, 8500},
- {600, 5000, 4000, 3000},
- {100, 3000, 4000, 2000},
- {100, 1000, 1000, 1000},
- };
- /* Scale for each test */
- uint16_t exp_scale[][4] = {
- {MOTION_SENSE_DEFAULT_SCALE, MOTION_SENSE_DEFAULT_SCALE,
- MOTION_SENSE_DEFAULT_SCALE, MOTION_SENSE_DEFAULT_SCALE},
- {MOTION_SENSE_DEFAULT_SCALE + 300,
- MOTION_SENSE_DEFAULT_SCALE + 300,
- MOTION_SENSE_DEFAULT_SCALE + 300,
- MOTION_SENSE_DEFAULT_SCALE + 300},
- {MOTION_SENSE_DEFAULT_SCALE - 300,
- MOTION_SENSE_DEFAULT_SCALE - 300,
- MOTION_SENSE_DEFAULT_SCALE - 300,
- MOTION_SENSE_DEFAULT_SCALE - 300},
- {MOTION_SENSE_DEFAULT_SCALE + 345,
- MOTION_SENSE_DEFAULT_SCALE - 5423,
- MOTION_SENSE_DEFAULT_SCALE - 30,
- MOTION_SENSE_DEFAULT_SCALE + 400},
- {MOTION_SENSE_DEFAULT_SCALE - 345,
- MOTION_SENSE_DEFAULT_SCALE + 5423,
- MOTION_SENSE_DEFAULT_SCALE + 30,
- MOTION_SENSE_DEFAULT_SCALE - 400},
- {MOTION_SENSE_DEFAULT_SCALE, MOTION_SENSE_DEFAULT_SCALE,
- MOTION_SENSE_DEFAULT_SCALE, MOTION_SENSE_DEFAULT_SCALE}
- };
- uint16_t scale[3];
- int16_t temp;
- int i, test;
- intv3_t v;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
- ms_rgb = &motion_sensors[TCS_RGB_SENSOR_ID];
-
- /* Need to be set to collect all data in FIFO */
- ms->oversampling_ratio = 1;
- ms_rgb->oversampling_ratio = 1;
- /* Disable calibration mode */
- zassert_equal(EC_SUCCESS, ms->drv->perform_calib(ms, 0), NULL);
- /* Setup AGAIN and ATIME for normal mode */
- zassert_equal(EC_RES_IN_PROGRESS, ms->drv->read(ms, v), NULL);
-
- /* Test different data in supported range */
- for (test = 0; test < ARRAY_SIZE(exp_v); test++) {
- /* Set and test clear sensor scale */
- zassert_equal(EC_SUCCESS,
- ms->drv->set_scale(ms, exp_scale[test], 0),
- "test %d", test);
- zassert_equal(EC_SUCCESS,
- ms->drv->get_scale(ms, scale, &temp),
- "test %d", test);
- zassert_equal((int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, temp,
- "test %d, %d", test, temp);
- zassert_equal(exp_scale[test][0], scale[0], "test %d", test);
-
- /* Set and test RGB sensor scale */
- zassert_equal(EC_SUCCESS, ms_rgb->drv->set_scale(ms_rgb,
- &(exp_scale[test][1]), 0),
- "test %d", test);
- zassert_equal(EC_SUCCESS,
- ms_rgb->drv->get_scale(ms_rgb, scale, &temp),
- "test %d", test);
- zassert_equal((int16_t)EC_MOTION_SENSE_INVALID_CALIB_TEMP, temp,
- "test %d", test);
- zassert_equal(exp_scale[test][1], scale[0], "test %d", test);
- zassert_equal(exp_scale[test][2], scale[1], "test %d", test);
- zassert_equal(exp_scale[test][3], scale[2], "test %d", test);
-
- set_emul_val_from_exp(exp_v[test], exp_scale[test], emul);
-
- /* Run few times to allow driver change gain */
- for (i = 0; i < 5; i++) {
- tcs_emul_set_reg(emul, TCS_I2C_STATUS,
- TCS_I2C_STATUS_RGBC_VALID);
- zassert_equal(EC_SUCCESS,
- ms->drv->irq_handler(ms, &event), NULL);
- }
- check_fifo(ms, ms_rgb, exp_v[test], V_EPS);
- }
-
- /* Test fail if scale equals 0 */
- scale[0] = 0;
- scale[1] = MOTION_SENSE_DEFAULT_SCALE;
- scale[2] = MOTION_SENSE_DEFAULT_SCALE;
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_scale(ms, scale, 0), NULL);
-
- zassert_equal(EC_ERROR_INVAL, ms_rgb->drv->set_scale(ms_rgb, scale, 0),
- NULL);
- scale[0] = MOTION_SENSE_DEFAULT_SCALE;
- scale[1] = 0;
- scale[2] = MOTION_SENSE_DEFAULT_SCALE;
- zassert_equal(EC_ERROR_INVAL, ms_rgb->drv->set_scale(ms_rgb, scale, 0),
- NULL);
- scale[0] = MOTION_SENSE_DEFAULT_SCALE;
- scale[1] = MOTION_SENSE_DEFAULT_SCALE;
- scale[2] = 0;
- zassert_equal(EC_ERROR_INVAL, ms_rgb->drv->set_scale(ms_rgb, scale, 0),
- NULL);
-}
-
-/** Test setting and getting data rate of light sensor */
-static void test_tcs_data_rate(void)
-{
- struct motion_sensor_t *ms, *ms_rgb;
- struct i2c_emul *emul;
- uint8_t enable;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
- /* RGB sensor doesn't set rate, but return rate of clear sesnor */
- ms_rgb = &motion_sensors[TCS_RGB_SENSOR_ID];
-
- /* Test fail on reading device power state */
- i2c_common_emul_set_read_fail_reg(emul, TCS_I2C_ENABLE);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 0, 0), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 0, 1), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 100, 0), NULL);
- zassert_equal(EC_ERROR_INVAL, ms->drv->set_data_rate(ms, 100, 1), NULL);
- i2c_common_emul_set_read_fail_reg(emul, I2C_COMMON_EMUL_NO_FAIL_REG);
-
- /* Test setting 0 rate disables device */
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 0, 0), NULL);
- zassert_equal(0, tcs_emul_get_reg(emul, TCS_I2C_ENABLE), NULL);
- zassert_equal(0, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(0, ms_rgb->drv->get_data_rate(ms_rgb), NULL);
-
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 0, 1), NULL);
- zassert_equal(0, tcs_emul_get_reg(emul, TCS_I2C_ENABLE), NULL);
- zassert_equal(0, tcs_emul_get_reg(emul, TCS_I2C_ENABLE), NULL);
- zassert_equal(0, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(0, ms_rgb->drv->get_data_rate(ms_rgb), NULL);
-
-
- /* Test setting non-zero rate enables device */
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 100, 0), NULL);
- enable = tcs_emul_get_reg(emul, TCS_I2C_ENABLE);
- zassert_true(enable & TCS_I2C_ENABLE_POWER_ON, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_ADC_ENABLE, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_INT_ENABLE, NULL);
- zassert_equal(100, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(100, ms_rgb->drv->get_data_rate(ms_rgb), NULL);
-
- zassert_equal(EC_SUCCESS, ms->drv->set_data_rate(ms, 100, 1), NULL);
- enable = tcs_emul_get_reg(emul, TCS_I2C_ENABLE);
- zassert_true(enable & TCS_I2C_ENABLE_POWER_ON, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_ADC_ENABLE, NULL);
- zassert_true(enable & TCS_I2C_ENABLE_INT_ENABLE, NULL);
- zassert_equal(100, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(100, ms_rgb->drv->get_data_rate(ms_rgb), NULL);
-
- /* Test RGB sensor doesn't change data rate */
- zassert_equal(EC_SUCCESS, ms_rgb->drv->set_data_rate(ms_rgb, 300, 0),
- NULL);
- zassert_equal(100, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(100, ms_rgb->drv->get_data_rate(ms_rgb), NULL);
-
- zassert_equal(EC_SUCCESS, ms_rgb->drv->set_data_rate(ms_rgb, 300, 1),
- NULL);
- zassert_equal(100, ms->drv->get_data_rate(ms), NULL);
- zassert_equal(100, ms_rgb->drv->get_data_rate(ms_rgb), NULL);
-}
-
-/** Test set range function of clear and RGB sensors */
-static void test_tcs_set_range(void)
-{
- struct motion_sensor_t *ms, *ms_rgb;
- struct i2c_emul *emul;
-
- emul = tcs_emul_get(TCS_ORD);
- ms = &motion_sensors[TCS_CLR_SENSOR_ID];
- ms_rgb = &motion_sensors[TCS_RGB_SENSOR_ID];
-
- /* RGB sensor doesn't set anything */
- zassert_equal(EC_SUCCESS, ms_rgb->drv->set_range(ms_rgb, 1, 0), NULL);
-
- /* Clear sensor doesn't change anything on device to set range */
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 0x12300, 1), NULL);
- zassert_equal(0x12300, ms->current_range, NULL);
-
- zassert_equal(EC_SUCCESS, ms->drv->set_range(ms, 0x10000, 0), NULL);
- zassert_equal(0x10000, ms->current_range, NULL);
-}
-
-void test_suite_tcs3400(void)
-{
- ztest_test_suite(tcs3400,
- ztest_user_unit_test(test_tcs_init),
- ztest_user_unit_test(test_tcs_read),
- ztest_user_unit_test(test_tcs_irq_handler_fail),
- ztest_user_unit_test(test_tcs_read_calibration),
- ztest_user_unit_test(test_tcs_read_xyz),
- ztest_user_unit_test(test_tcs_scale),
- ztest_user_unit_test(test_tcs_data_rate),
- ztest_user_unit_test(test_tcs_set_range));
- ztest_run_test_suite(tcs3400);
-}