summaryrefslogtreecommitdiff
path: root/zephyr/test
diff options
context:
space:
mode:
authorTristan Honscheid <honscheid@google.com>2022-06-21 19:36:39 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-06-30 01:01:57 +0000
commite00695c0d4d6864147dd6f21f45fa410a24462fd (patch)
tree68ea8bc34892d2f522d39a4662682647fb1a1ea7 /zephyr/test
parenta11e8ae9dcdd295122e36105f5a4ab14abb2348d (diff)
downloadchrome-ec-e00695c0d4d6864147dd6f21f45fa410a24462fd.tar.gz
zephyr: tests: Add test for USB-PD Rev 3 Get_Battery_Capabilities
Add a new test suite to verify the functionality of USB-PD rev 3 support and the Get_Battery_Capabilities request and its response handler. The new tests validate that a response from the TCPC is received and contains correct battery data BUG=b:223452169 BRANCH=None TEST=zmake test test-drivers Signed-off-by: Tristan Honscheid <honscheid@google.com> Change-Id: I85403fdfa220a4edb2ee2f1673a2dcaaffca1620 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3715699 Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
Diffstat (limited to 'zephyr/test')
-rw-r--r--zephyr/test/drivers/CMakeLists.txt1
-rw-r--r--zephyr/test/drivers/src/integration/usbc/usb_pd_rev3.c162
2 files changed, 163 insertions, 0 deletions
diff --git a/zephyr/test/drivers/CMakeLists.txt b/zephyr/test/drivers/CMakeLists.txt
index 14608a659e..4cfecb9224 100644
--- a/zephyr/test/drivers/CMakeLists.txt
+++ b/zephyr/test/drivers/CMakeLists.txt
@@ -56,6 +56,7 @@ if(subproject_path STREQUAL "")
src/integration/usbc/usb_alt_mode.c
src/integration/usbc/usb_attach_src_snk.c
src/integration/usbc/usb_pd_ctrl_msg.c
+ src/integration/usbc/usb_pd_rev3.c
src/integration/usbc/usb_malfunction_sink.c
src/i2c_passthru.c
src/isl923x.c
diff --git a/zephyr/test/drivers/src/integration/usbc/usb_pd_rev3.c b/zephyr/test/drivers/src/integration/usbc/usb_pd_rev3.c
new file mode 100644
index 0000000000..f4022a026d
--- /dev/null
+++ b/zephyr/test/drivers/src/integration/usbc/usb_pd_rev3.c
@@ -0,0 +1,162 @@
+/* Copyright 2022 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.
+ */
+
+#include <ztest.h>
+
+#include "battery.h"
+#include "battery_smart.h"
+#include "emul/emul_isl923x.h"
+#include "emul/emul_smart_battery.h"
+#include "emul/tcpc/emul_tcpci_partner_src.h"
+#include "hooks.h"
+#include "test/drivers/stubs.h"
+#include "test/drivers/test_state.h"
+#include "test/drivers/utils.h"
+#include "usb_pd.h"
+#include "usb_prl_sm.h"
+#include "util.h"
+
+#define BATTERY_ORD DT_DEP_ORD(DT_NODELABEL(battery))
+
+#define TEST_USB_PORT USBC_PORT_C0
+
+struct usb_attach_5v_3a_pd_source_rev3_fixture {
+ struct tcpci_partner_data source_5v_3a;
+ struct tcpci_src_emul_data src_ext;
+ const struct emul *tcpci_emul;
+ const struct emul *charger_emul;
+};
+
+static void *usb_attach_5v_3a_pd_source_setup(void)
+{
+ static struct usb_attach_5v_3a_pd_source_rev3_fixture test_fixture;
+
+ /* Get references for the emulators */
+ test_fixture.tcpci_emul =
+ emul_get_binding(DT_LABEL(DT_NODELABEL(tcpci_emul)));
+ test_fixture.charger_emul =
+ emul_get_binding(DT_LABEL(DT_NODELABEL(isl923x_emul)));
+
+ /* Configure TCPCI revision in board config and emulator */
+ tcpc_config[TEST_USB_PORT].flags |= TCPC_FLAGS_TCPCI_REV2_0;
+ tcpci_emul_set_rev(test_fixture.tcpci_emul, TCPCI_EMUL_REV2_0_VER1_1);
+
+ /* Initialized the charger to supply 5V and 3A */
+ tcpci_partner_init(&test_fixture.source_5v_3a, PD_REV30);
+ test_fixture.source_5v_3a.extensions = tcpci_src_emul_init(
+ &test_fixture.src_ext, &test_fixture.source_5v_3a, NULL);
+ test_fixture.src_ext.pdo[1] =
+ PDO_FIXED(5000, 3000, PDO_FIXED_UNCONSTRAINED);
+
+ return &test_fixture;
+}
+
+static void usb_attach_5v_3a_pd_source_before(void *data)
+{
+ struct usb_attach_5v_3a_pd_source_rev3_fixture *fixture = data;
+
+ connect_source_to_port(&fixture->source_5v_3a, &fixture->src_ext, 1,
+ fixture->tcpci_emul, fixture->charger_emul);
+}
+
+static void usb_attach_5v_3a_pd_source_after(void *data)
+{
+ struct usb_attach_5v_3a_pd_source_rev3_fixture *fixture = data;
+
+ disconnect_source_from_port(fixture->tcpci_emul, fixture->charger_emul);
+}
+
+ZTEST_SUITE(usb_attach_5v_3a_pd_source_rev3, drivers_predicate_post_main,
+ usb_attach_5v_3a_pd_source_setup, usb_attach_5v_3a_pd_source_before,
+ usb_attach_5v_3a_pd_source_after, NULL);
+
+ZTEST_F(usb_attach_5v_3a_pd_source_rev3, test_batt_cap)
+{
+ int battery_index = 0;
+
+ tcpci_partner_common_send_get_battery_capabilities(
+ &fixture->source_5v_3a, battery_index);
+
+ /* Allow some time for TCPC to process and respond */
+ k_sleep(K_SECONDS(1));
+
+ zassert_true(fixture->source_5v_3a.battery_capabilities
+ .have_response[battery_index],
+ "No battery capabilities response stored.");
+
+ /* The response */
+ struct pd_bcdb *bcdb =
+ &fixture->source_5v_3a.battery_capabilities.bcdb[battery_index];
+
+ zassert_equal(USB_VID_GOOGLE, bcdb->vid, "Incorrect battery VID");
+ zassert_equal(CONFIG_USB_PID, bcdb->pid, "Incorrect battery PID");
+ zassert_false((bcdb->battery_type) & BIT(0),
+ "Invalid battery ref bit should not be set");
+
+ /* Verify the battery capacity and last full charge capacity. These
+ * fields require that the battery is present and that we can
+ * access information about the nominal voltage and capacity.
+ *
+ * TODO(b/237427945): Add test for case when battery is not present
+ */
+
+ /* See pe_give_battery_cap_entry() in common/usbc/usb_pe_drp_sm.c */
+
+ zassume_true(battery_is_present(), "Battery must be present");
+ zassume_true(IS_ENABLED(HAS_TASK_HOSTCMD) &&
+ *host_get_memmap(EC_MEMMAP_BATTERY_VERSION) != 0,
+ "Cannot access battery data");
+
+ /* Millivolts */
+ int design_volt = *(int *)host_get_memmap(EC_MEMMAP_BATT_DVLT);
+
+ /* Milliamphours */
+ int design_cap = *(int *)host_get_memmap(EC_MEMMAP_BATT_DCAP);
+ int full_cap = *(int *)host_get_memmap(EC_MEMMAP_BATT_LFCC);
+
+ /* Multiply millivolts by milliamphours and scale to deciwatthours
+ * (0.1 Wh), the unit of energy used in the PD messages.
+ */
+
+ int expected_design_cap =
+ DIV_ROUND_NEAREST((design_cap * design_volt), 1000 * 1000 / 10);
+
+ int expected_last_charge_cap =
+ DIV_ROUND_NEAREST((design_cap * full_cap), 1000 * 1000 / 10);
+
+ zassert_equal(expected_design_cap, bcdb->design_cap,
+ "Design capacity not correct. Expected %d but got %d",
+ expected_design_cap, bcdb->design_cap);
+ zassert_equal(
+ expected_last_charge_cap, bcdb->last_full_charge_cap,
+ "Last full charge capacity not correct. Expected %d but got %d",
+ expected_last_charge_cap, bcdb->last_full_charge_cap);
+}
+
+ZTEST_F(usb_attach_5v_3a_pd_source_rev3, test_batt_cap_invalid)
+{
+ /* Request data on a battery that does not exist. The PD stack only
+ * supports battery 0.
+ */
+
+ int battery_index = 5;
+
+ tcpci_partner_common_send_get_battery_capabilities(
+ &fixture->source_5v_3a, battery_index);
+
+ /* Allow some time for TCPC to process and respond */
+ k_sleep(K_SECONDS(1));
+
+ /* Ensure we get a response that says our battery index was invalid */
+
+ zassert_true(fixture->source_5v_3a.battery_capabilities
+ .have_response[battery_index],
+ "No battery capabilities response stored.");
+ zassert_true(
+ (fixture->source_5v_3a.battery_capabilities.bcdb[battery_index]
+ .battery_type) &
+ BIT(0),
+ "Invalid battery ref bit should be set");
+}