cts: Added GPIO test suite

Contains code for all the gpio tests so far. Code in
cts_task for th and dut is for testing purposes and
test result reporting will be updated in the next
patch.

BRANCH=None
BUG=None
TEST=Manual
- Connect handshake and gpio test lines between th and dut
- Build tests
- run 'cat /dev/ttyACM0' in one terminal
- run 'cat /def/ttyACM1' in another
- Flash boards
- All test results should print either passed or unknown

Change-Id: I7142fb87a6ce0a20c571cde608fbbe60e35898ea
Reviewed-on: https://chromium-review.googlesource.com/359935
Commit-Ready: Daisuke Nojiri <dnojiri@chromium.org>
Tested-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
This commit is contained in:
Chris Chen
2016-07-11 14:52:05 -07:00
committed by chrome-bot
parent db1b3b34c2
commit 846741eddb
8 changed files with 225 additions and 8 deletions

View File

@@ -23,4 +23,6 @@ ALTERNATE(PIN_MASK(A, 0x000C), 1, MODULE_UART, 0) /* USART2: PA2/PA3 */
/* CTS Signals */
GPIO(HANDSHAKE_INPUT, PIN(A, 4), GPIO_INPUT | GPIO_PULL_UP)
GPIO(HANDSHAKE_OUTPUT, PIN(B, 0), GPIO_ODR_LOW)
GPIO(INPUT_TEST, PIN(C, 1), GPIO_INPUT | GPIO_PULL_UP)
GPIO(OUTPUT_TEST, PIN(C, 0), GPIO_ODR_LOW)
#endif

View File

@@ -23,4 +23,6 @@ ALTERNATE(PIN_MASK(G, 0x0180), GPIO_ALT_F8, MODULE_UART, 0) /* LPUART: PG7/8 */
/* CTS Signals */
GPIO(HANDSHAKE_OUTPUT, PIN(D, 2), GPIO_ODR_LOW)
GPIO(HANDSHAKE_INPUT, PIN(C, 12), GPIO_INPUT | GPIO_PULL_UP)
GPIO(OUTPUT_TEST, PIN(C, 11), GPIO_ODR_LOW)
GPIO(INPUT_TEST, PIN(C, 10), GPIO_INPUT | GPIO_PULL_UP)
#endif

View File

@@ -7,6 +7,7 @@
#include "timer.h"
#include "watchdog.h"
#include "cts_common.h"
#include "dut_common.h"
/* Returns unknown because TH could potentially still get stuck
* even if the DUT completes the sync

View File

@@ -7,6 +7,7 @@
#include "timer.h"
#include "watchdog.h"
#include "cts_common.h"
#include "th_common.h"
/* Return SUCCESS if and only if we reach end of function
* Returning success here means sync was successful

View File

@@ -106,19 +106,17 @@ def flash_boards(dut_board, th_serial_loc):
'flash write_image erase build/' + th_board + '/ec.bin 0x08000000',
'reset halt']
dut_flash_cmds = ['reset_config connect_assert_srst',
dut_flash_cmds = ['hla_serial ' + dut_hla,
'reset_config connect_assert_srst',
'init',
'reset init',
'flash write_image erase build/' + dut_board + '/ec.bin 0x08000000',
'reset halt']
if dut_hla != None:
dut_flash_cmds.insert(0, 'hla_serial ' + dut_hla)
openocd_cmd(th_flash_cmds, th_cfg)
openocd_cmd(dut_flash_cmds, dut_cfg)
openocd_cmd(['init', 'reset init', 'resume'], th_cfg)
openocd_cmd(['init', 'reset init', 'resume'], dut_cfg)
openocd_cmd(['hla_serial ' + th_hla, 'init', 'reset init', 'resume'], th_cfg)
openocd_cmd(['hla_serial ' + dut_hla, 'init', 'reset init', 'resume'], dut_cfg)
def main():
global ocd_script_dir

View File

@@ -10,12 +10,109 @@
#include "watchdog.h"
#include "dut_common.h"
#include "cts_common.h"
#include "gpio_common.h"
enum cts_error_code sync_test(void)
{
return SUCCESS;
}
enum cts_error_code set_high_test(void)
{
gpio_set_flags(GPIO_OUTPUT_TEST, GPIO_ODR_LOW);
gpio_set_level(GPIO_OUTPUT_TEST, 1);
msleep(READ_WAIT_TIME_MS*2);
return UNKNOWN;
}
enum cts_error_code set_low_test(void)
{
gpio_set_flags(GPIO_OUTPUT_TEST, GPIO_ODR_LOW);
gpio_set_level(GPIO_OUTPUT_TEST, 0);
msleep(READ_WAIT_TIME_MS*2);
return UNKNOWN;
}
enum cts_error_code read_high_test(void)
{
int level;
gpio_set_flags(GPIO_INPUT_TEST, GPIO_INPUT | GPIO_PULL_UP);
msleep(READ_WAIT_TIME_MS);
level = gpio_get_level(GPIO_INPUT_TEST);
if (level)
return SUCCESS;
else
return FAILURE;
}
enum cts_error_code read_low_test(void)
{
int level;
gpio_set_flags(GPIO_INPUT_TEST, GPIO_INPUT | GPIO_PULL_UP);
msleep(READ_WAIT_TIME_MS);
level = gpio_get_level(GPIO_INPUT_TEST);
if (!level)
return SUCCESS;
else
return FAILURE;
}
enum cts_error_code od_read_high_test(void)
{
int level;
gpio_set_flags(GPIO_OUTPUT_TEST, GPIO_ODR_HIGH | GPIO_PULL_UP);
msleep(READ_WAIT_TIME_MS);
level = gpio_get_level(GPIO_OUTPUT_TEST);
if (!level)
return SUCCESS;
else
return FAILURE;
}
void cts_task(void)
{
enum cts_error_code results[GPIO_CTS_TEST_COUNT];
int i;
sync();
CPRINTS("Successful Sync!");
results[0] = sync_test();
sync();
results[1] = set_low_test();
sync();
results[2] = set_high_test();
sync();
results[3] = read_high_test();
sync();
results[4] = read_low_test();
sync();
results[5] = od_read_high_test();
CPRINTS("GPIO test suite finished");
uart_flush_output();
CPRINTS("Results:");
for (i = 0; i < GPIO_CTS_TEST_COUNT; i++) {
switch (results[i]) {
case SUCCESS:
CPRINTS("%d) Passed", i);
break;
case FAILURE:
CPRINTS("%d) Failed", i);
break;
case BAD_SYNC:
CPRINTS("%d) Bad sync", i);
break;
case UNKNOWN:
CPRINTS("%d) Test result unknown", i);
break;
default:
CPRINTS("%d) ErrorCode not recognized", i);
break;
}
}
while (1) {
watchdog_reload();
sleep(1);

21
cts/gpio/gpio_common.h Normal file
View File

@@ -0,0 +1,21 @@
/* Copyright 2016 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.
*/
#ifndef __GPIO_COMMON_H
#define __GPIO_COMMON_H
/* sync_test tests whether sync completes successfully
* set_low_test checks if the dut can set a line low
* set_high test checks if the dut can set a line high
* read_low_test checks if the dut can read a line that is low
* read_high_test checks if the dut can read a line that is high
* od_read_high_test checks if the dut reads its true pin level (success)
* or its register level when configured as a low open drain output pin
*/
#define READ_WAIT_TIME_MS 100
#define GPIO_CTS_TEST_COUNT 6
#endif

View File

@@ -10,12 +10,107 @@
#include "watchdog.h"
#include "dut_common.h"
#include "cts_common.h"
#include "gpio_common.h"
enum cts_error_code sync_test(void)
{
return SUCCESS;
}
enum cts_error_code set_high_test(void)
{
int level;
gpio_set_flags(GPIO_INPUT_TEST, GPIO_INPUT | GPIO_PULL_UP);
msleep(READ_WAIT_TIME_MS);
level = gpio_get_level(GPIO_INPUT_TEST);
if (level)
return SUCCESS;
else
return FAILURE;
}
enum cts_error_code set_low_test(void)
{
int level;
gpio_set_flags(GPIO_INPUT_TEST, GPIO_INPUT | GPIO_PULL_UP);
msleep(READ_WAIT_TIME_MS);
level = gpio_get_level(GPIO_INPUT_TEST);
if (!level)
return SUCCESS;
else
return FAILURE;
}
enum cts_error_code read_high_test(void)
{
gpio_set_flags(GPIO_OUTPUT_TEST, GPIO_ODR_LOW);
gpio_set_level(GPIO_OUTPUT_TEST, 1);
msleep(READ_WAIT_TIME_MS*2);
return UNKNOWN;
}
enum cts_error_code read_low_test(void)
{
gpio_set_flags(GPIO_OUTPUT_TEST, GPIO_ODR_LOW);
gpio_set_level(GPIO_OUTPUT_TEST, 0);
msleep(READ_WAIT_TIME_MS*2);
return UNKNOWN;
}
enum cts_error_code od_read_high_test(void)
{
gpio_set_flags(GPIO_INPUT_TEST, GPIO_OUTPUT | GPIO_ODR_LOW);
msleep(READ_WAIT_TIME_MS*2);
return UNKNOWN;
}
void cts_task(void)
{
enum cts_error_code results[GPIO_CTS_TEST_COUNT];
int i;
/* Don't bother checking sync's return value now because
* host will deal with hanging syncs/tests as well as
* interpreting test results later
*/
sync();
CPRINTS("Successful Sync!");
results[0] = sync_test();
sync();
results[1] = set_low_test();
sync();
results[2] = set_high_test();
sync();
results[3] = read_high_test();
sync();
results[4] = read_low_test();
sync();
results[5] = od_read_high_test();
CPRINTS("GPIO test suite finished");
uart_flush_output();
CPRINTS("Results:");
for (i = 0; i < GPIO_CTS_TEST_COUNT; i++) {
switch (results[i]) {
case SUCCESS:
CPRINTS("%d) Passed", i);
break;
case FAILURE:
CPRINTS("%d) Failed", i);
break;
case BAD_SYNC:
CPRINTS("%d) Bad sync", i);
break;
case UNKNOWN:
CPRINTS("%d) Test result unknown", i);
break;
default:
CPRINTS("%d) ErrorCode not recognized", i);
break;
}
}
while (1) {
watchdog_reload();
sleep(1);