diff options
author | Vic Yang <victoryang@chromium.org> | 2013-04-19 15:10:01 +0800 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-04-19 10:41:33 -0700 |
commit | 368dfc43f41090d4b6181f6741d20d37c5e720c1 (patch) | |
tree | 45f37235d48bf2d7a6e27e057a240f9e0ce31461 | |
parent | 74c34bbad4c2914d0d1a3684a95e8dfe9e0116c8 (diff) | |
download | chrome-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.mk | 2 | ||||
-rw-r--r-- | test/stress.c | 140 | ||||
-rw-r--r-- | test/stress.tasklist | 17 |
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 */ |