diff options
author | Jeremy Bettis <jbettis@google.com> | 2021-04-06 12:51:02 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-12 20:14:02 +0000 |
commit | d7917d3f795e99c9173c36ebe7af7295eb53571d (patch) | |
tree | b5db5a5333830c20534b412d5e4362cd4c5ca0cc /test | |
parent | 8ef4ad9400e9ae4e56e832f8bb9cef232bc9a1fe (diff) | |
download | chrome-ec-d7917d3f795e99c9173c36ebe7af7295eb53571d.tar.gz |
ec: Parse battery and augmented PDOs correctly.
Fixes pd_extract_pdo_power() to output the correct voltage and current
for non-fixed PDOs. Add unit test.
BRANCH=none
BUG=b:178484932
TEST=added
Signed-off-by: Jeremy Bettis <jbettis@google.com>
Change-Id: I6de55be3c753e01ef26424896c6fd41b8df8f94b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2805226
Commit-Queue: Jeremy Bettis <jbettis@chromium.org>
Tested-by: Jeremy Bettis <jbettis@chromium.org>
Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/usb_common_test.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/test/usb_common_test.c b/test/usb_common_test.c index c7cec27640..620e061f74 100644 --- a/test/usb_common_test.c +++ b/test/usb_common_test.c @@ -66,9 +66,138 @@ int test_pd_get_cc_state(void) return EC_SUCCESS; } +/* + * From USB Power Delivery Specification Revision 3.0, Version 2.0 + * Table 6-7 Power Data Object + */ +#define MAKE_FIXED(v, c) (0 << 30 | (v / 50) << 10 | (c / 10)) +#define MAKE_BATT(v_max, v_min, p) \ + (1 << 30 | (v_max / 50) << 20 | (v_min / 50) << 10 | (p / 250)) +#define MAKE_VAR(v_max, v_min, c) \ + (2 << 30 | (v_max / 50) << 20 | (v_min / 50) << 10 | (c / 10)) +#define MAKE_AUG(v_max, v_min, c) \ + (3 << 30 | (v_max / 100) << 17 | (v_min / 100) << 8 | (c / 50)) + +/* + * Tests various cases for pd_extract_pdo_power. It takes a very high voltage to + * exceed PD_MAX_POWER_MW without also exceeding PD_MAX_CURRENT_MA, so those + * tests are not particularly realistic. + */ +int test_pd_extract_pdo_power(void) +{ + uint32_t ma; + uint32_t max_mv; + uint32_t min_mv; + + pd_extract_pdo_power(MAKE_FIXED(/*v=*/5000, /*c=*/3000), &ma, &max_mv, + &min_mv); + TEST_EQ(max_mv, 5000, "%d"); + TEST_EQ(min_mv, 5000, "%d"); + TEST_EQ(ma, 3000, "%d"); + pd_extract_pdo_power(MAKE_FIXED(/*v=*/20000, /*c=*/2600), &ma, &max_mv, + &min_mv); + TEST_EQ(max_mv, 20000, "%d"); + TEST_EQ(min_mv, 20000, "%d"); + TEST_EQ(ma, 2600, "%d"); + pd_extract_pdo_power(MAKE_FIXED(/*v=*/20000, /*c=*/4000), &ma, &max_mv, + &min_mv); + TEST_EQ(max_mv, 20000, "%d"); + TEST_EQ(min_mv, 20000, "%d"); + TEST_EQ(ma, 3000, "%d"); /* Capped at PD_MAX_CURRENT_MA */ + pd_extract_pdo_power(MAKE_FIXED(/*v=*/10000, /*c=*/4000), &ma, &max_mv, + &min_mv); + TEST_EQ(max_mv, 10000, "%d"); + TEST_EQ(min_mv, 10000, "%d"); + TEST_EQ(ma, 3000, "%d"); /* Capped at PD_MAX_CURRENT_MA */ + pd_extract_pdo_power(MAKE_FIXED(/*v=*/21000, /*c=*/4000), &ma, &max_mv, + &min_mv); + TEST_EQ(max_mv, 21000, "%d"); + TEST_EQ(min_mv, 21000, "%d"); + TEST_EQ(ma, 2857, "%d"); /* Capped at PD_MAX_POWER_MW */ + + pd_extract_pdo_power(MAKE_BATT(/*v_max=*/5700, /*v_min=*/3300, + /*p=*/7000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 5700, "%d"); + TEST_EQ(min_mv, 3300, "%d"); + TEST_EQ(ma, 2121, "%d"); /* 3300mV * 2121mA ~= 7000mW */ + pd_extract_pdo_power(MAKE_BATT(/*v_max=*/3300, /*v_min=*/2700, + /*p=*/12000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 3300, "%d"); + TEST_EQ(min_mv, 2700, "%d"); + TEST_EQ(ma, 3000, "%d"); /* Capped at PD_MAX_CURRENT_MA */ + + pd_extract_pdo_power(MAKE_BATT(/*v_max=*/25000, /*v_min=*/21000, + /*p=*/61000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 25000, "%d"); + TEST_EQ(min_mv, 21000, "%d"); + TEST_EQ(ma, 2857, "%d"); /* Capped at PD_MAX_POWER_MW */ + + pd_extract_pdo_power(MAKE_VAR(/*v_max=*/5000, /*v_min=*/3300, + /*c=*/3000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 5000, "%d"); + TEST_EQ(min_mv, 3300, "%d"); + TEST_EQ(ma, 3000, "%d"); + pd_extract_pdo_power(MAKE_VAR(/*v_max=*/20000, /*v_min=*/5000, + /*c=*/2600), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 20000, "%d"); + TEST_EQ(min_mv, 5000, "%d"); + TEST_EQ(ma, 2600, "%d"); + pd_extract_pdo_power(MAKE_VAR(/*v_max=*/20000, /*v_min=*/5000, + /*c=*/4000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 20000, "%d"); + TEST_EQ(min_mv, 5000, "%d"); + TEST_EQ(ma, 3000, "%d"); /* Capped at PD_MAX_CURRENT_MA */ + pd_extract_pdo_power(MAKE_VAR(/*v_max=*/10000, /*v_min=*/3300, + /*c=*/4000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 10000, "%d"); + TEST_EQ(min_mv, 3300, "%d"); + TEST_EQ(ma, 3000, "%d"); /* Capped at PD_MAX_CURRENT_MA */ + pd_extract_pdo_power(MAKE_VAR(/*v_max=*/22000, /*v_min=*/21000, + /*c=*/4000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 22000, "%d"); + TEST_EQ(min_mv, 21000, "%d"); + TEST_EQ(ma, 2857, "%d"); /* Capped at PD_MAX_POWER_MW */ + + pd_extract_pdo_power(MAKE_AUG(/*v_max=*/5000, /*v_min=*/3300, + /*c=*/3000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 5000, "%d"); + TEST_EQ(min_mv, 3300, "%d"); + TEST_EQ(ma, 3000, "%d"); + pd_extract_pdo_power(MAKE_AUG(/*v_max=*/20000, /*v_min=*/3300, + /*c=*/2600), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 20000, "%d"); + TEST_EQ(min_mv, 3300, "%d"); + TEST_EQ(ma, 2600, "%d"); + pd_extract_pdo_power(MAKE_AUG(/*v_max=*/10000, /*v_min=*/3300, + /*c=*/4000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 10000, "%d"); + TEST_EQ(min_mv, 3300, "%d"); + TEST_EQ(ma, 3000, "%d"); /* Capped at PD_MAX_CURRENT_MA */ + pd_extract_pdo_power(MAKE_AUG(/*v_max=*/22000, /*v_min=*/21000, + /*c=*/4000), + &ma, &max_mv, &min_mv); + TEST_EQ(max_mv, 22000, "%d"); + TEST_EQ(min_mv, 21000, "%d"); + TEST_EQ(ma, 2857, "%d"); /* Capped at PD_MAX_POWER_MW */ + + return EC_SUCCESS; +} + void run_test(int argc, char **argv) { RUN_TEST(test_pd_get_cc_state); + RUN_TEST(test_pd_extract_pdo_power); test_print_result(); } |