diff options
Diffstat (limited to 'zephyr/test/drivers/default/src/integration/usbc/usb.c')
-rw-r--r-- | zephyr/test/drivers/default/src/integration/usbc/usb.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/zephyr/test/drivers/default/src/integration/usbc/usb.c b/zephyr/test/drivers/default/src/integration/usbc/usb.c new file mode 100644 index 0000000000..0436f55e93 --- /dev/null +++ b/zephyr/test/drivers/default/src/integration/usbc/usb.c @@ -0,0 +1,133 @@ +/* Copyright 2021 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <zephyr/kernel.h> +#include <zephyr/ztest.h> +#include <zephyr/drivers/gpio/gpio_emul.h> + +#include "battery_smart.h" +#include "ec_commands.h" +#include "ec_tasks.h" +#include "driver/tcpm/ps8xxx_public.h" +#include "emul/emul_isl923x.h" +#include "emul/emul_smart_battery.h" +#include "emul/tcpc/emul_ps8xxx.h" +#include "emul/tcpc/emul_tcpci.h" +#include "emul/tcpc/emul_tcpci_partner_drp.h" +#include "emul/tcpc/emul_tcpci_partner_snk.h" +#include "emul/tcpc/emul_tcpci_partner_src.h" +#include "host_command.h" +#include "test/drivers/stubs.h" +#include "tcpm/tcpci.h" +#include "test/usb_pe.h" +#include "test/drivers/utils.h" +#include "test/drivers/test_state.h" + +#define BATTERY_NODE DT_NODELABEL(battery) + +#define GPIO_AC_OK_PATH DT_PATH(named_gpios, acok_od) +#define GPIO_AC_OK_PIN DT_GPIO_PIN(GPIO_AC_OK_PATH, gpios) + +#define GPIO_BATT_PRES_ODL_PATH DT_PATH(named_gpios, ec_batt_pres_odl) +#define GPIO_BATT_PRES_ODL_PORT DT_GPIO_PIN(GPIO_BATT_PRES_ODL_PATH, gpios) + +static void integration_usb_before(void *state) +{ + const struct emul *tcpci_emul = EMUL_GET_USBC_BINDING(0, tcpc); + const struct emul *tcpci_emul2 = EMUL_GET_USBC_BINDING(1, tcpc); + const struct emul *charger_emul = EMUL_GET_USBC_BINDING(0, chg); + /* Reset vbus to 0mV */ + /* TODO(b/217610871): Remove redundant test state cleanup */ + isl923x_emul_set_adc_vbus(charger_emul, 0); + const struct emul *battery_emul = EMUL_DT_GET(BATTERY_NODE); + struct sbat_emul_bat_data *bat; + const struct device *gpio_dev = + DEVICE_DT_GET(DT_GPIO_CTLR(GPIO_AC_OK_PATH, gpios)); + + ARG_UNUSED(state); + /* + * TODO(b/217755888): Refactor to using assume API + */ + zassert_ok(tcpc_config[0].drv->init(0), NULL); + zassert_ok(tcpc_config[1].drv->init(1), NULL); + tcpc_config[USBC_PORT_C0].flags &= ~TCPC_FLAGS_TCPCI_REV2_0; + tcpci_emul_set_rev(tcpci_emul, TCPCI_EMUL_REV1_0_VER1_0); + pd_set_suspend(0, 0); + pd_set_suspend(1, 0); + /* Reset to disconnected state. */ + /* + * TODO(b/217755888): Refactor to using assume API + */ + zassert_ok(tcpci_emul_disconnect_partner(tcpci_emul), NULL); + zassert_ok(tcpci_emul_disconnect_partner(tcpci_emul2), NULL); + + /* Battery defaults to charging, so reset to not charging. */ + bat = sbat_emul_get_bat_data(battery_emul); + bat->cur = -5; + + /* + * TODO(b/217755888): Refactor to using assume API + */ + zassert_ok(gpio_emul_input_set(gpio_dev, GPIO_AC_OK_PIN, 0), NULL); +} + +static void integration_usb_after(void *state) +{ + const struct emul *tcpci_emul = EMUL_GET_USBC_BINDING(0, tcpc); + const struct emul *tcpci_emul2 = EMUL_GET_USBC_BINDING(1, tcpc); + const struct emul *charger_emul = EMUL_GET_USBC_BINDING(0, chg); + ARG_UNUSED(state); + + /* TODO: This function should trigger gpios to signal there is nothing + * attached to the port. + */ + /* + * TODO(b/217755888): Refactor to using assume API + */ + zassert_ok(tcpci_emul_disconnect_partner(tcpci_emul), NULL); + zassert_ok(tcpci_emul_disconnect_partner(tcpci_emul2), NULL); + /* Give time to actually disconnect */ + k_sleep(K_SECONDS(1)); + + /* Reset vbus to 0mV */ + isl923x_emul_set_adc_vbus(charger_emul, 0); +} + +ZTEST(integration_usb, test_attach_drp) +{ + const struct emul *tcpci_emul = EMUL_GET_USBC_BINDING(0, tcpc); + struct tcpci_partner_data my_drp; + struct tcpci_drp_emul_data drp_ext; + struct tcpci_src_emul_data src_ext; + struct tcpci_snk_emul_data snk_ext; + + /* Set chipset to ON, this will set TCPM to DRP */ + test_set_chipset_to_s0(); + + /* TODO(b/214401892): Check why need to give time TCPM to spin */ + k_sleep(K_SECONDS(1)); + + /* Attach emulated sink */ + tcpci_partner_init(&my_drp, PD_REV20); + my_drp.extensions = tcpci_drp_emul_init( + &drp_ext, &my_drp, PD_ROLE_SINK, + tcpci_src_emul_init(&src_ext, &my_drp, NULL), + tcpci_snk_emul_init(&snk_ext, &my_drp, NULL)); + + zassert_ok(tcpci_partner_connect_to_tcpci(&my_drp, tcpci_emul), NULL); + + /* Wait for PD negotiation */ + k_sleep(K_SECONDS(10)); + + /* + * Test that SRC ready is achieved + * TODO: Change it to examining EC_CMD_TYPEC_STATUS + */ + zassert_equal(PE_SNK_READY, get_state_pe(USBC_PORT_C0), NULL); + zassert_ok(tcpci_emul_disconnect_partner(tcpci_emul), NULL); +} + +ZTEST_SUITE(integration_usb, drivers_predicate_post_main, NULL, + integration_usb_before, integration_usb_after, NULL); |