summaryrefslogtreecommitdiff
path: root/test/stress.c
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 /test/stress.c
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>
Diffstat (limited to 'test/stress.c')
-rw-r--r--test/stress.c140
1 files changed, 140 insertions, 0 deletions
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);