diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2014-11-25 11:10:43 -0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-12-09 02:07:03 +0000 |
commit | 6f010b635d48b0f77028e2d6ed11608ae6e8ce82 (patch) | |
tree | cf2894f5dc0eef4c4c16cb81fc3d96f8af5d44ba /test | |
parent | c8f98e80fdbe85fc0bc0f892d4b22dad19186aef (diff) | |
download | chrome-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.c | 38 |
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(); |