summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-04-19 15:10:01 +0800
committerChromeBot <chrome-bot@google.com>2013-04-19 10:41:33 -0700
commit368dfc43f41090d4b6181f6741d20d37c5e720c1 (patch)
tree45f37235d48bf2d7a6e27e057a240f9e0ce31461
parent74c34bbad4c2914d0d1a3684a95e8dfe9e0116c8 (diff)
downloadchrome-ec-368dfc43f41090d4b6181f6741d20d37c5e720c1.tar.gz
Add peripheral stress test
This includes I2C and ADC. PECI test will be added in another CL. BUG=chrome-os-partner:18598 TEST=Run on Spring BRANCH=None Change-Id: I7424dbf5d3cefda67cad9aaad60367d957c47529 Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/48614 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--test/build.mk2
-rw-r--r--test/stress.c140
-rw-r--r--test/stress.tasklist17
3 files changed, 159 insertions, 0 deletions
diff --git a/test/build.mk b/test/build.mk
index 45d1d5b93d..3bbb239b91 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -8,6 +8,7 @@
test-list=pingpong timer_calib timer_dos timer_jump mutex thermal
test-list+=power_button kb_scan scancode typematic charging flash
+test-list+=stress
#disable: powerdemo
flash-y=flash.o
@@ -15,6 +16,7 @@ kb_scan-y=kb_scan.o
mutex-y=mutex.o
pingpong-y=pingpong.o
powerdemo-y=powerdemo.o
+stress-y=stress.o
timer_calib-y=timer_calib.o
timer_dos-y=timer_dos.o
utils-y=utils.o
diff --git a/test/stress.c b/test/stress.c
new file mode 100644
index 0000000000..5cff054347
--- /dev/null
+++ b/test/stress.c
@@ -0,0 +1,140 @@
+/* Copyright (c) 2013 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.
+ */
+
+/* Peripheral stress tests */
+
+#include "adc.h"
+#include "board.h"
+#include "console.h"
+#include "ec_commands.h"
+#include "i2c.h"
+#include "timer.h"
+#include "util.h"
+
+static int error_count;
+
+/*****************************************************************************/
+/* Test parameters */
+
+/* I2C test */
+#define I2C_TEST_ITERATION 2000
+
+struct i2c_test_param_t {
+ int width; /* 8 or 16 bits */
+ int port;
+ int addr;
+ int offset;
+ int data; /* Non-negative represents data to write. -1 to read. */
+} i2c_test_params[] = {
+#ifdef BOARD_spring
+ {8, 0, 0x60, 0x0, -1},
+ {8, 0, 0x60, 0x0, 0x40},
+ {8, 0, 0x4a, 0x1, -1},
+#endif
+ /* TODO(victoryang): Add parameters for other boards */
+};
+
+/* ADC test */
+#define ADC_TEST_ITERATION 2000
+
+/* TODO(victoryang): PECI test */
+
+/*****************************************************************************/
+/* Test utilities */
+
+/* Linear congruential pseudo random number generator*/
+static uint32_t prng(void)
+{
+ static uint32_t x = 1357;
+ x = 22695477 * x + 1;
+ return x;
+}
+
+/* period between 500us and 32ms */
+#define RAND_US() (((prng() % 64) + 1) * 500)
+
+static int stress(const char *name,
+ int (*test_routine)(void),
+ const int iteration)
+{
+ int i;
+
+ for (i = 0; i < iteration; ++i) {
+ if (i % 10 == 0) {
+ ccprintf("\r%s...%d/%d", name, i, iteration);
+ usleep(RAND_US());
+ }
+ if (test_routine() != EC_SUCCESS)
+ return EC_ERROR_UNKNOWN;
+ }
+
+ ccprintf("\r%s...%d/%d\n", name, iteration, iteration);
+ return EC_SUCCESS;
+}
+
+#define RUN_STRESS_TEST(n, r, iter) \
+ do { \
+ if (stress(n, r, iter) != EC_SUCCESS) { \
+ ccputs("Fail\n"); \
+ error_count++; \
+ } \
+ } while (0)
+
+/*****************************************************************************/
+/* Tests */
+#ifdef CONFIG_I2C
+static int test_i2c(void)
+{
+ int res = EC_ERROR_UNKNOWN;
+ int dummy_data;
+ struct i2c_test_param_t *param;
+ param = i2c_test_params + (prng() % (sizeof(i2c_test_params) /
+ sizeof(struct i2c_test_param_t)));
+ if (param->width == 8 && param->data == -1)
+ res = i2c_read8(param->port, param->addr,
+ param->offset, &dummy_data);
+ else if (param->width == 8 && param->data >= 0)
+ res = i2c_write8(param->port, param->addr,
+ param->offset, param->data);
+ else if (param->width == 16 && param->data == -1)
+ res = i2c_read16(param->port, param->addr,
+ param->offset, &dummy_data);
+ else if (param->width == 16 && param->data >= 0)
+ res = i2c_write16(param->port, param->addr,
+ param->offset, param->data);
+
+ return res;
+}
+#endif
+
+#ifdef CONFIG_ADC
+static int test_adc(void)
+{
+ int data[ADC_CH_COUNT];
+ return adc_read_all_channels(data);
+}
+#endif
+
+static int command_run_test(int argc, char **argv)
+{
+ error_count = 0;
+
+#ifdef CONFIG_I2C
+ RUN_STRESS_TEST("I2C Stress Test", test_i2c, I2C_TEST_ITERATION);
+#endif
+#ifdef CONFIG_ADC
+ RUN_STRESS_TEST("ADC Stress Test", test_adc, ADC_TEST_ITERATION);
+#endif
+
+ if (error_count) {
+ ccprintf("Failed %d tests!\n", error_count);
+ return EC_ERROR_UNKNOWN;
+ } else {
+ ccprintf("Pass!\n");
+ return EC_SUCCESS;
+ }
+}
+DECLARE_CONSOLE_COMMAND(runtest, command_run_test,
+ NULL, NULL, NULL);
diff --git a/test/stress.tasklist b/test/stress.tasklist
new file mode 100644
index 0000000000..26cfc53453
--- /dev/null
+++ b/test/stress.tasklist
@@ -0,0 +1,17 @@
+/* Copyright (c) 2013 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.
+ */
+
+/**
+ * List of enabled tasks in the priority order
+ *
+ * The first one has the lowest priority.
+ *
+ * For each task, use the macro TASK_TEST(n, r, d, s) where :
+ * 'n' in the name of the task
+ * 'r' in the main routine of the task
+ * 'd' in an opaque parameter passed to the routine at startup
+ * 's' is the stack size in bytes; must be a multiple of 8
+ */
+#define CONFIG_TEST_TASK_LIST /* No test task */