/* Copyright 2014 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 inductive charging module. */ #include "common.h" #include "console.h" #include "gpio.h" #include "hooks.h" #include "inductive_charging.h" #include "lid_switch.h" #include "test_util.h" #include "timer.h" #include "util.h" #define START_CHARGE_DELAY 5000 /* ms */ #define MONITOR_CHARGE_DONE_DELAY 1000 /* ms */ #define TEST_CHECK_CHARGE_DELAY (START_CHARGE_DELAY + \ MONITOR_CHARGE_DONE_DELAY + 500) /* ms */ static void wait_for_lid_debounce(void) { while (lid_is_open() != gpio_get_level(GPIO_LID_OPEN)) msleep(20); } static void set_lid_open(int lid_open) { gpio_set_level(GPIO_LID_OPEN, lid_open); wait_for_lid_debounce(); } static int test_lid(void) { /* Lid is open initially */ set_lid_open(1); gpio_set_level(GPIO_CHARGE_DONE, 0); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); /* * Close the lid. The EC should wait for 5 second before * enabling transmitter. */ set_lid_open(0); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); msleep(TEST_CHECK_CHARGE_DELAY); /* Transmitter should now be enabled. */ TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); /* Open the lid. Charging should stop. */ set_lid_open(1); msleep(TEST_CHECK_CHARGE_DELAY); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); return EC_SUCCESS; } static int test_charge_done(void) { /* Close the lid to start charging */ set_lid_open(0); msleep(TEST_CHECK_CHARGE_DELAY); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); /* Charging is done. Stop charging, but don't turn off transmitter. */ gpio_set_level(GPIO_CHARGE_DONE, 1); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); /* Oops, CHARGE_DONE changes again. We should ignore it. */ gpio_set_level(GPIO_CHARGE_DONE, 0); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); /* Open the lid. Charger should be turned off. */ set_lid_open(1); msleep(TEST_CHECK_CHARGE_DELAY); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); return EC_SUCCESS; } static int test_lid_open_during_charging(void) { /* Close the lid. Start charging. */ set_lid_open(0); msleep(TEST_CHECK_CHARGE_DELAY); gpio_set_level(GPIO_CHARGE_DONE, 0); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); /* Open the lid. Transmitter should be turned off. */ set_lid_open(1); msleep(TEST_CHECK_CHARGE_DELAY); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); /* Toggle charge done signal. Charging should not start. */ gpio_set_level(GPIO_CHARGE_DONE, 1); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); gpio_set_level(GPIO_CHARGE_DONE, 0); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); return EC_SUCCESS; } static int test_debounce_charge_done(void) { /* Lid is open initially. */ set_lid_open(1); gpio_set_level(GPIO_CHARGE_DONE, 0); msleep(TEST_CHECK_CHARGE_DELAY); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); /* Close the lid. Charging should start. */ set_lid_open(0); msleep(START_CHARGE_DELAY + 100); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); /* Within the first second, changes on CHARGE_DONE should be ignore. */ gpio_set_level(GPIO_CHARGE_DONE, 1); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); msleep(100); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); gpio_set_level(GPIO_CHARGE_DONE, 0); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); msleep(100); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 1); /* Changes on CHARGE_DONE after take effect. */ msleep(MONITOR_CHARGE_DONE_DELAY); gpio_set_level(GPIO_CHARGE_DONE, 1); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 1); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); /* Open the lid. Charger should be turned off. */ set_lid_open(1); msleep(TEST_CHECK_CHARGE_DELAY); TEST_ASSERT(gpio_get_level(GPIO_BASE_CHG_VDD_EN) == 0); TEST_ASSERT(gpio_get_level(GPIO_CHARGE_EN) == 0); return EC_SUCCESS; } void run_test(void) { test_reset(); RUN_TEST(test_lid); RUN_TEST(test_charge_done); RUN_TEST(test_lid_open_during_charging); RUN_TEST(test_debounce_charge_done); test_print_result(); }