mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-27 18:25:05 +00:00
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>
This commit is contained in:
@@ -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
|
||||
|
||||
140
test/stress.c
Normal file
140
test/stress.c
Normal file
@@ -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);
|
||||
17
test/stress.tasklist
Normal file
17
test/stress.tasklist
Normal file
@@ -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 */
|
||||
Reference in New Issue
Block a user