summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Michalec <tm@semihalf.com>2021-04-23 13:39:24 +0200
committerCommit Bot <commit-bot@chromium.org>2021-05-27 10:55:09 +0000
commit83e0789cfa7801aa8ebe10fcde7d63e28f83f024 (patch)
treec2764aa74a8e26915b256005c0225c57ea3688fe
parent00d63619edf7b6c1f62d7cfce7a2bd520635dbd3 (diff)
downloadchrome-ec-83e0789cfa7801aa8ebe10fcde7d63e28f83f024.tar.gz
zephyr: drivers: add temp_sensor test suite
Temperature sensors are accessed through temp_sensor_read() for which this test suite is created. Tested functionalities are: - Error code from underlying driver is returned. - Unknown temperature sensor id is rejected. - Temperature from underlying driver is returned. Value is not extensively tested, because it is done in thermistor test suite. BUG=b:184857072 BRANCH=none TEST=run zmake drivers test Signed-off-by: Tomasz Michalec <tm@semihalf.com> Change-Id: I6c2df39a70e8ac57325aa9e1f49e7a9bd2340fae Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2886889 Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--zephyr/test/drivers/src/main.c2
-rw-r--r--zephyr/test/drivers/src/temp_sensor.c132
2 files changed, 134 insertions, 0 deletions
diff --git a/zephyr/test/drivers/src/main.c b/zephyr/test/drivers/src/main.c
index b047038153..f1a080435f 100644
--- a/zephyr/test/drivers/src/main.c
+++ b/zephyr/test/drivers/src/main.c
@@ -11,6 +11,7 @@ extern void test_suite_battery(void);
extern void test_suite_cbi(void);
extern void test_suite_smart_battery(void);
extern void test_suite_thermistor(void);
+extern void test_suite_temp_sensor(void);
void test_main(void)
{
@@ -23,4 +24,5 @@ void test_main(void)
test_suite_cbi();
test_suite_smart_battery();
test_suite_thermistor();
+ test_suite_temp_sensor();
}
diff --git a/zephyr/test/drivers/src/temp_sensor.c b/zephyr/test/drivers/src/temp_sensor.c
new file mode 100644
index 0000000000..2e25bab67a
--- /dev/null
+++ b/zephyr/test/drivers/src/temp_sensor.c
@@ -0,0 +1,132 @@
+/* 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 <drivers/adc.h>
+#include <drivers/adc/adc_emul.h>
+#include <drivers/gpio.h>
+#include <drivers/gpio/gpio_emul.h>
+
+#include <math.h>
+
+#include "common.h"
+#include "temp_sensor.h"
+#include "temp_sensor/temp_sensor.h"
+
+#define GPIO_PG_EC_DSW_PWROK_PATH DT_PATH(named_gpios, pg_ec_dsw_pwrok)
+#define GPIO_PG_EC_DSW_PWROK_PORT DT_GPIO_PIN(GPIO_PG_EC_DSW_PWROK_PATH, gpios)
+
+#define ADC_DEVICE_NAME DT_LABEL(DT_NODELABEL(adc0))
+#define ADC_CHANNELS_NUM DT_PROP(DT_NODELABEL(adc0), nchannels)
+
+/** Test error code when invalid sensor is passed to temp_sensor_read() */
+static void test_temp_sensor_wrong_id(void)
+{
+ int temp;
+
+ zassert_equal(EC_ERROR_INVAL, temp_sensor_read(TEMP_SENSOR_COUNT,
+ &temp),
+ NULL);
+}
+
+/** Test error code when temp_sensor_read() is called with powered off ADC */
+static void test_temp_sensor_adc_error(void)
+{
+ const struct device *gpio_dev =
+ DEVICE_DT_GET(DT_GPIO_CTLR(GPIO_PG_EC_DSW_PWROK_PATH, gpios));
+ int temp;
+
+ zassert_not_null(gpio_dev, "Cannot get GPIO device");
+
+ /*
+ * pg_ec_dsw_pwrok = 0 means ADC is not powered.
+ * adc_read will return error
+ */
+ zassert_ok(gpio_emul_input_set(gpio_dev, GPIO_PG_EC_DSW_PWROK_PORT, 0),
+ NULL);
+
+ zassert_equal(EC_ERROR_NOT_POWERED,
+ temp_sensor_read(TEMP_SENSOR_CHARGER, &temp), NULL);
+ zassert_equal(EC_ERROR_NOT_POWERED,
+ temp_sensor_read(TEMP_SENSOR_DDR_SOC, &temp), NULL);
+ zassert_equal(EC_ERROR_NOT_POWERED,
+ temp_sensor_read(TEMP_SENSOR_FAN, &temp), NULL);
+ zassert_equal(EC_ERROR_NOT_POWERED,
+ temp_sensor_read(TEMP_SENSOR_PP3300_REGULATOR, &temp),
+ NULL);
+
+ /* power ADC */
+ zassert_ok(gpio_emul_input_set(gpio_dev, GPIO_PG_EC_DSW_PWROK_PORT, 1),
+ NULL);
+}
+
+/** Simple ADC emulator custom function which always return error */
+static int adc_error_func(const struct device *dev, unsigned int channel,
+ void *param, uint32_t *result)
+{
+ return -EINVAL;
+}
+
+/**
+ * Set valid response only for ADC channel connected with tested sensor.
+ * Check if temp_sensor_read() from tested sensor returns EC_SUCCESS and
+ * valid temperature. Set invalid response on ADC channel for next test.
+ */
+static void check_valid_temperature(const struct device *adc_dev, int sensor)
+{
+ int temp;
+
+ /* ADC channel of tested sensor return valid value */
+ zassert_ok(adc_emul_const_value_set(adc_dev, temp_sensors[sensor].idx,
+ 1000),
+ "adc_emul_const_value_set() failed (sensor %d)", sensor);
+ zassert_equal(EC_SUCCESS, temp_sensor_read(sensor, &temp), NULL);
+ zassert_within(temp, 273 + 50, 51,
+ "Expected temperature in 0*C-100*C, got %d*C (sensor %d)",
+ temp - 273, sensor);
+ /* Return error on ADC channel of tested sensor */
+ zassert_ok(adc_emul_value_func_set(adc_dev, temp_sensors[sensor].idx,
+ adc_error_func, NULL),
+ "adc_emul_value_func_set() failed (sensor %d)", sensor);
+}
+
+/** Test if temp_sensor_read() returns temperature on success */
+static void test_temp_sensor_read(void)
+{
+ const struct device *adc_dev = device_get_binding(ADC_DEVICE_NAME);
+ int chan;
+
+ zassert_not_null(adc_dev, "Cannot get ADC device");
+
+ /* Return error on all ADC channels */
+ for (chan = 0; chan < ADC_CHANNELS_NUM; chan++) {
+ zassert_ok(adc_emul_value_func_set(adc_dev, chan,
+ adc_error_func, NULL),
+ "channel %d adc_emul_value_func_set() failed", chan);
+ }
+
+ check_valid_temperature(adc_dev, TEMP_SENSOR_CHARGER);
+ check_valid_temperature(adc_dev, TEMP_SENSOR_DDR_SOC);
+ check_valid_temperature(adc_dev, TEMP_SENSOR_FAN);
+ check_valid_temperature(adc_dev, TEMP_SENSOR_PP3300_REGULATOR);
+}
+
+void test_suite_temp_sensor(void)
+{
+ const struct device *dev =
+ DEVICE_DT_GET(DT_GPIO_CTLR(GPIO_PG_EC_DSW_PWROK_PATH, gpios));
+
+ zassert_not_null(dev, NULL);
+ /* Before tests make sure that power pin is set. */
+ zassert_ok(gpio_emul_input_set(dev, GPIO_PG_EC_DSW_PWROK_PORT, 1),
+ NULL);
+
+ ztest_test_suite(temp_sensor,
+ ztest_user_unit_test(test_temp_sensor_wrong_id),
+ ztest_user_unit_test(test_temp_sensor_adc_error),
+ ztest_user_unit_test(test_temp_sensor_read));
+ ztest_run_test_suite(temp_sensor);
+}