From 368dfc43f41090d4b6181f6741d20d37c5e720c1 Mon Sep 17 00:00:00 2001 From: Vic Yang Date: Fri, 19 Apr 2013 15:10:01 +0800 Subject: 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 Reviewed-on: https://gerrit.chromium.org/gerrit/48614 Reviewed-by: Vincent Palatin --- test/stress.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 test/stress.c (limited to 'test/stress.c') 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); -- cgit v1.2.1