mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-27 18:25:05 +00:00
Add power button test
This tests power button notification and debouncing. BUG=chrome-os-partner:19236 TEST=Pass all tests BRANCH=None Change-Id: Ief8bc24a8725e01734d84e76ab4b6ae0506b811f Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/50524 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
This commit is contained in:
@@ -10,4 +10,5 @@
|
||||
const struct gpio_info gpio_list[GPIO_COUNT] = {
|
||||
{"EC_INT", 0, 0, 0, 0},
|
||||
{"LID_OPEN", 0, 0, 0, 0},
|
||||
{"POWER_BUTTON_L", 0, 0, 0, 0},
|
||||
};
|
||||
|
||||
@@ -8,14 +8,16 @@
|
||||
#ifndef __BOARD_H
|
||||
#define __BOARD_H
|
||||
|
||||
#define CONFIG_HOST_EMU
|
||||
#define CONFIG_HOSTCMD
|
||||
#define CONFIG_HOST_EMU
|
||||
#define CONFIG_KEYBOARD_PROTOCOL_MKBP
|
||||
#define CONFIG_LID_SWITCH
|
||||
#define CONFIG_POWER_BUTTON
|
||||
|
||||
enum gpio_signal {
|
||||
GPIO_EC_INT,
|
||||
GPIO_LID_OPEN,
|
||||
GPIO_POWER_BUTTON_L,
|
||||
|
||||
GPIO_COUNT
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ test-list-y=pingpong timer_calib timer_dos timer_jump mutex utils
|
||||
#disable: powerdemo
|
||||
|
||||
# TODO(victoryang): Fix these tests:
|
||||
# thermal power_button scancode typematic charging
|
||||
# thermal scancode typematic charging
|
||||
|
||||
test-list-$(BOARD_bds)+=
|
||||
test-list-$(BOARD_daisy)+=kb_scan flash stress
|
||||
@@ -25,7 +25,7 @@ test-list-$(BOARD_link)=
|
||||
test-list-$(BOARD_slippy)=
|
||||
|
||||
# Emulator tests
|
||||
test-list-host=mutex pingpong utils kb_scan kb_mkbp lid_sw
|
||||
test-list-host=mutex pingpong utils kb_scan kb_mkbp lid_sw power_button
|
||||
|
||||
flash-y=flash.o
|
||||
kb_mkbp-y=kb_mkbp.o
|
||||
@@ -33,6 +33,7 @@ kb_scan-y=kb_scan.o
|
||||
lid_sw-y=lid_sw.o
|
||||
mutex-y=mutex.o
|
||||
pingpong-y=pingpong.o
|
||||
power_button-y=power_button.o
|
||||
powerdemo-y=powerdemo.o
|
||||
stress-y=stress.o
|
||||
timer_calib-y=timer_calib.o
|
||||
|
||||
104
test/power_button.c
Normal file
104
test/power_button.c
Normal file
@@ -0,0 +1,104 @@
|
||||
/* 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.
|
||||
*
|
||||
* Test lid switch.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "console.h"
|
||||
#include "hooks.h"
|
||||
#include "host_command.h"
|
||||
#include "power_button.h"
|
||||
#include "test_util.h"
|
||||
#include "timer.h"
|
||||
#include "util.h"
|
||||
|
||||
static int mock_power_button = 1;
|
||||
static int mock_lid = 1;
|
||||
static int pb_hook_count;
|
||||
|
||||
int gpio_get_level(enum gpio_signal signal)
|
||||
{
|
||||
if (signal == GPIO_POWER_BUTTON_L)
|
||||
return mock_power_button;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lid_is_open(void)
|
||||
{
|
||||
return mock_lid;
|
||||
}
|
||||
|
||||
static void pb_change_hook(void)
|
||||
{
|
||||
pb_hook_count++;
|
||||
}
|
||||
DECLARE_HOOK(HOOK_POWER_BUTTON_CHANGE, pb_change_hook, HOOK_PRIO_DEFAULT);
|
||||
|
||||
static int test_hook(void)
|
||||
{
|
||||
/* Release power button for testing */
|
||||
mock_power_button = 1;
|
||||
power_button_interrupt(GPIO_POWER_BUTTON_L);
|
||||
msleep(100);
|
||||
pb_hook_count = 0;
|
||||
host_clear_events(0xffffffff);
|
||||
|
||||
mock_power_button = 0;
|
||||
power_button_interrupt(GPIO_POWER_BUTTON_L);
|
||||
msleep(50);
|
||||
TEST_ASSERT(pb_hook_count == 1);
|
||||
TEST_ASSERT(power_button_is_pressed());
|
||||
TEST_ASSERT(host_get_events() &
|
||||
EC_HOST_EVENT_MASK(EC_HOST_EVENT_POWER_BUTTON));
|
||||
host_clear_events(0xffffffff);
|
||||
|
||||
mock_power_button = 1;
|
||||
power_button_interrupt(GPIO_POWER_BUTTON_L);
|
||||
msleep(50);
|
||||
TEST_ASSERT(pb_hook_count == 2);
|
||||
TEST_ASSERT(!power_button_is_pressed());
|
||||
TEST_ASSERT(!(host_get_events() &
|
||||
EC_HOST_EVENT_MASK(EC_HOST_EVENT_POWER_BUTTON)));
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
static int test_debounce(void)
|
||||
{
|
||||
/* Release power button for testing */
|
||||
mock_power_button = 1;
|
||||
power_button_interrupt(GPIO_POWER_BUTTON_L);
|
||||
msleep(100);
|
||||
pb_hook_count = 0;
|
||||
host_clear_events(0xffffffff);
|
||||
|
||||
mock_power_button = 0;
|
||||
power_button_interrupt(GPIO_POWER_BUTTON_L);
|
||||
msleep(20);
|
||||
TEST_ASSERT(pb_hook_count == 0);
|
||||
TEST_ASSERT(!power_button_is_pressed());
|
||||
TEST_ASSERT(!(host_get_events() &
|
||||
EC_HOST_EVENT_MASK(EC_HOST_EVENT_POWER_BUTTON)));
|
||||
|
||||
mock_power_button = 1;
|
||||
power_button_interrupt(GPIO_POWER_BUTTON_L);
|
||||
msleep(50);
|
||||
TEST_ASSERT(pb_hook_count == 0);
|
||||
TEST_ASSERT(!power_button_is_pressed());
|
||||
TEST_ASSERT(!(host_get_events() &
|
||||
EC_HOST_EVENT_MASK(EC_HOST_EVENT_POWER_BUTTON)));
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
void run_test(void)
|
||||
{
|
||||
test_reset();
|
||||
|
||||
RUN_TEST(test_hook);
|
||||
RUN_TEST(test_debounce);
|
||||
|
||||
test_print_result();
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
# Copyright (c) 2011 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.
|
||||
#
|
||||
# Power button debounce test
|
||||
#
|
||||
# Refer to section 1.3 Power Button of
|
||||
# https://sites.google.com/a/google.com/chromeos-partners/pages/
|
||||
# tech-docs/firmware/ec-specification-v119
|
||||
#
|
||||
|
||||
import time
|
||||
|
||||
SHORTER_THAN_T0 = 0.01
|
||||
LONGER_THAN_T0 = 0.05
|
||||
LONGER_THAN_T1 = 5
|
||||
|
||||
def consume_output(helper, reg_ex):
|
||||
done = False
|
||||
while not done:
|
||||
try:
|
||||
helper.wait_output(reg_ex, use_re=True, timeout=1)
|
||||
except:
|
||||
done = True
|
||||
|
||||
def test(helper):
|
||||
helper.wait_output("--- UART initialized")
|
||||
# Release power button, set to soft off, and enable keyboard
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
helper.ec_command("powermock off")
|
||||
helper.ec_command("kbd enable")
|
||||
consume_output(helper, "PB released")
|
||||
|
||||
helper.trace("Press power button for shorter than T0 and check this\n" +
|
||||
"event is ignored\n")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(SHORTER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
if not helper.check_no_output("PB released"):
|
||||
return False
|
||||
|
||||
helper.trace("Press power button for longer than T0 and check this\n" +
|
||||
"event is treated as a single press.")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(LONGER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
helper.wait_output("PB released", timeout=1)
|
||||
# Expect shown only once
|
||||
if not helper.check_no_output("PB released"):
|
||||
return False
|
||||
|
||||
helper.trace("Press power button for two consecutive SHORTER_THAN_T0\n" +
|
||||
"period and check this event is ignored\n")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(SHORTER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
time.sleep(SHORTER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(SHORTER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
if not helper.check_no_output("PB released"):
|
||||
return False
|
||||
|
||||
helper.trace("Hold down power button for LONGER_THAN_T0 and check a\n" +
|
||||
"single press is sent out\n")
|
||||
consume_output(helper, "pwrbtn=")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(LONGER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
helper.wait_output("pwrbtn=LOW", timeout=1)
|
||||
helper.wait_output("pwrbtn=HIGH", timeout=1)
|
||||
if not helper.check_no_output("pwrbtn=LOW"):
|
||||
return False
|
||||
|
||||
helper.trace("Press power button for SHORTER_THAN_T0, release for\n" +
|
||||
"SHORTER_THAN_T0, and then press for LONGER_THAN_T0.\n" +
|
||||
"Check this is treated as a single press\n")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(SHORTER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
time.sleep(SHORTER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(LONGER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
helper.wait_output("pwrbtn=LOW", timeout=1)
|
||||
helper.wait_output("pwrbtn=HIGH", timeout=1)
|
||||
if not helper.check_no_output("pwrbtn=LOW"):
|
||||
return False
|
||||
|
||||
helper.trace("Hold down power button, wait for power button press\n" +
|
||||
"sent out. Then relase for SHORTER_THAN_T0, check power\n" +
|
||||
"button release is not sent out. Expect power button is\n" +
|
||||
"treated as hold (ignoring the relase bounce)\n")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
helper.wait_output("pwrbtn=LOW", timeout=1)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
time.sleep(SHORTER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
if not helper.check_no_output("PB released"):
|
||||
return False
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
helper.wait_output("PB released", timeout=1)
|
||||
|
||||
helper.trace("When system is off, hold down power button for\n" +
|
||||
"LONGER_THAN_T0. Check the initial is stretched\n")
|
||||
consume_output(helper, "pwrbtn=")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(LONGER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
t_low = helper.wait_output("\[(?P<t>[\d\.]+) PB PCH pwrbtn=LOW\]",
|
||||
use_re=True)["t"]
|
||||
t_high = helper.wait_output("\[(?P<t>[\d\.]+) PB PCH pwrbtn=HIGH\]",
|
||||
use_re=True)["t"]
|
||||
if not helper.check_no_output("pwrbtn=LOW"):
|
||||
return False
|
||||
if float(t_high) - float(t_low) <= LONGER_THAN_T0 - 0.1:
|
||||
return False
|
||||
|
||||
helper.trace("When system is off, hold down power button for\n" +
|
||||
"LONGER_THAN_T0. Check no scan code is send\n")
|
||||
consume_output(helper, "i8042 SEND")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(LONGER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
if not helper.check_no_output("i8042 SEND"):
|
||||
return False
|
||||
|
||||
helper.trace("While powered on, hold down power button for\n" +
|
||||
"LONGER_THAN_T0. A single short pulse should be sent\n")
|
||||
consume_output(helper, "pwrbtn=")
|
||||
helper.ec_command("powermock on")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(LONGER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
t_low = helper.wait_output("\[(?P<t>[\d\.]+) PB PCH pwrbtn=LOW\]",
|
||||
use_re=True)["t"]
|
||||
t_high = helper.wait_output("\[(?P<t>[\d\.]+) PB PCH pwrbtn=HIGH\]",
|
||||
use_re=True)["t"]
|
||||
if not helper.check_no_output("pwrbtn=LOW"):
|
||||
return False
|
||||
if float(t_high) - float(t_low) >= 0.1:
|
||||
return False
|
||||
|
||||
helper.trace("While powered on, hold down power button for\n" +
|
||||
"LONGER_THAN_T0. Scan code should be sent\n")
|
||||
consume_output(helper, "i8042 SEND")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
helper.wait_output("i8042 SEND", timeout=1) # Expect make code
|
||||
time.sleep(LONGER_THAN_T0)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
helper.wait_output("i8042 SEND", timeout=1) # Expect release code
|
||||
|
||||
helper.trace("While powered on, hold down power button for\n" +
|
||||
"LONGER_THAN_T1 and check two presses are sent out\n")
|
||||
consume_output(helper, "pwrbtn=")
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 0")
|
||||
time.sleep(LONGER_THAN_T1)
|
||||
helper.ec_command("gpiomock POWER_BUTTONn 1")
|
||||
helper.wait_output("pwrbtn=LOW", timeout=1)
|
||||
helper.wait_output("pwrbtn=HIGH", timeout=1)
|
||||
helper.wait_output("pwrbtn=LOW", timeout=1)
|
||||
helper.wait_output("pwrbtn=HIGH", timeout=1)
|
||||
if not helper.check_no_output("pwrbtn=LOW"):
|
||||
return False
|
||||
|
||||
return True # PASS !
|
||||
Reference in New Issue
Block a user