summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2014-11-25 11:10:43 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-12-09 02:07:03 +0000
commit6f010b635d48b0f77028e2d6ed11608ae6e8ce82 (patch)
treecf2894f5dc0eef4c4c16cb81fc3d96f8af5d44ba /test
parentc8f98e80fdbe85fc0bc0f892d4b22dad19186aef (diff)
downloadchrome-ec-6f010b635d48b0f77028e2d6ed11608ae6e8ce82.tar.gz
charge_manager: Add delayed port override for role swap
If override charge is selected on a port currently acting as a charge source, but the attached device is also capable of acting as a source, request a charge role swap and initiate a pending delayed port override. If the role swap completes successfully and a charge source is found, the selected port will become the override port. If the role swap fails or no charge source is found within 2 seconds, the delayed port override will be lost. BUG=chrome-os-partner:28343,chrome-os-partner:31195 TEST=Manual on Samus. Connect two Samus units together through charge ports. "pd 1 swap power" - put port on test device into source role "chgoverride 1" - set charge override, verify that role swap takes effect and charge manager selects PD charge source, 900mA @ 5V Disconnect charge cable, verify that charge manager goes back to not charging. BRANCH=Samus Change-Id: Iadcc4dc98631661f254245eeff18973df517f652 Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/231900 Reviewed-by: Alec Berg <alecaberg@chromium.org>
Diffstat (limited to 'test')
-rw-r--r--test/charge_manager.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/test/charge_manager.c b/test/charge_manager.c
index 78fbd7bfae..ead8a6d9e0 100644
--- a/test/charge_manager.c
+++ b/test/charge_manager.c
@@ -34,6 +34,7 @@ static unsigned int active_charge_limit = CHARGE_SUPPLIER_NONE;
static unsigned int active_charge_port = CHARGE_PORT_NONE;
static int new_power_request[PD_PORT_COUNT];
static int dual_role_capable[PD_PORT_COUNT];
+static int power_role[PD_PORT_COUNT];
enum {
DEDICATED_CHARGER = 0,
@@ -51,6 +52,10 @@ void board_set_active_charge_port(int charge_port)
active_charge_port = charge_port;
}
+void board_charge_manager_override_timeout(void)
+{
+}
+
void pd_set_new_power_request(int port)
{
new_power_request[port] = 1;
@@ -78,9 +83,22 @@ int pd_get_partner_dualrole_capable(int port)
return dual_role_capable[port];
}
+static void pd_set_role(int port, int role)
+{
+ power_role[port] = role;
+}
+
int pd_get_role(int port)
{
- return PD_ROLE_SINK;
+ return power_role[port];
+}
+
+void pd_request_power_swap(int port)
+{
+ if (power_role[port] == PD_ROLE_SINK)
+ power_role[port] = PD_ROLE_SOURCE;
+ else
+ power_role[port] = PD_ROLE_SINK;
}
static void wait_for_charge_manager_refresh(void)
@@ -100,6 +118,7 @@ static void initialize_charge_table(int current, int voltage, int ceil)
for (i = 0; i < PD_PORT_COUNT; ++i) {
charge_manager_set_ceil(i, ceil);
set_charger_role(i, DEDICATED_CHARGER);
+ pd_set_role(i, PD_ROLE_SINK);
for (j = 0; j < CHARGE_SUPPLIER_COUNT; ++j)
charge_manager_update(j, i, &charge);
}
@@ -354,6 +373,23 @@ static int test_override(void)
TEST_ASSERT(active_charge_port == 0);
TEST_ASSERT(active_charge_limit == 100);
+ /*
+ * Verify that an override request on a dual-role source port
+ * causes a role swap, and we charge from the port if the swap
+ * is successful.
+ */
+ charge_manager_set_override(OVERRIDE_DONT_CHARGE);
+ set_charger_role(0, DUAL_ROLE_CHARGER);
+ pd_set_role(0, PD_ROLE_SOURCE);
+ charge_manager_set_override(0);
+ wait_for_charge_manager_refresh();
+ charge.current = 200;
+ charge_manager_update(CHARGE_SUPPLIER_TEST1, 0, &charge);
+ wait_for_charge_manager_refresh();
+ TEST_ASSERT(pd_get_role(0) == PD_ROLE_SINK);
+ TEST_ASSERT(active_charge_port == 0);
+ TEST_ASSERT(active_charge_limit == 200);
+
/* Set override to "don't charge", then verify we're not charging */
charge_manager_set_override(OVERRIDE_DONT_CHARGE);
wait_for_charge_manager_refresh();