diff options
-rw-r--r-- | zephyr/test/drivers/boards/native_posix.overlay | 10 | ||||
-rw-r--r-- | zephyr/test/drivers/testcase.yaml | 2 | ||||
-rw-r--r-- | zephyr/test/drivers/usbc_alt_mode/prj.conf | 5 | ||||
-rw-r--r-- | zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c | 107 | ||||
-rw-r--r-- | zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c | 29 |
5 files changed, 151 insertions, 2 deletions
diff --git a/zephyr/test/drivers/boards/native_posix.overlay b/zephyr/test/drivers/boards/native_posix.overlay index f2b41b0df0..cfca0475c2 100644 --- a/zephyr/test/drivers/boards/native_posix.overlay +++ b/zephyr/test/drivers/boards/native_posix.overlay @@ -277,6 +277,14 @@ gpio_usb_c1_bc12_int_l: usb_c1_bc12_int_l { gpios = <&gpio1 11 GPIO_INPUT>; }; + gpio_usb_c0_hpd: usb_c0_hpd { + gpios = <&gpio1 12 GPIO_OUTPUT_LOW>; + enum-name = "GPIO_USB_C0_DP_HPD"; + }; + gpio_usb_c1_hpd: usb_c1_hpd { + gpios = <&gpio1 13 GPIO_OUTPUT_LOW>; + enum-name = "GPIO_USB_C1_DP_HPD"; + }; }; gpio1: gpio@101 { @@ -289,7 +297,7 @@ low-level; gpio-controller; #gpio-cells = <2>; - ngpios = <12>; + ngpios = <14>; }; gpio-interrupts { diff --git a/zephyr/test/drivers/testcase.yaml b/zephyr/test/drivers/testcase.yaml index e13692cce7..9bdedb6fc3 100644 --- a/zephyr/test/drivers/testcase.yaml +++ b/zephyr/test/drivers/testcase.yaml @@ -269,10 +269,12 @@ tests: extra_configs: - CONFIG_LINK_TEST_SUITE_USB_RETIMER_FW_UPDATE=y drivers.usbc_alt_mode: + extra_args: CONF_FILE="prj.conf;usbc_alt_mode/prj.conf" extra_configs: - CONFIG_LINK_TEST_SUITE_USBC_ALT_MODE=y timeout: 120 drivers.usbc_alt_mode_ec_entry: + extra_args: CONF_FILE="prj.conf;usbc_alt_mode/prj.conf" timeout: 120 extra_configs: - CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY=n diff --git a/zephyr/test/drivers/usbc_alt_mode/prj.conf b/zephyr/test/drivers/usbc_alt_mode/prj.conf new file mode 100644 index 0000000000..ce0e7f18a6 --- /dev/null +++ b/zephyr/test/drivers/usbc_alt_mode/prj.conf @@ -0,0 +1,5 @@ +# Copyright 2023 The ChromiumOS Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +CONFIG_PLATFORM_EC_USB_PD_DP_HPD_GPIO=y diff --git a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c index f23af9356d..e92c2a33f9 100644 --- a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c +++ b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c @@ -23,6 +23,8 @@ #include <zephyr/kernel.h> #include <zephyr/ztest.h> +#include <gpio.h> + #define TEST_PORT 0 /* Arbitrary */ @@ -251,6 +253,9 @@ ZTEST_F(usbc_alt_mode, verify_discovery_params_too_small) ZTEST_F(usbc_alt_mode, verify_displayport_mode_entry) { + const struct gpio_dt_spec *gpio = + GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); + if (IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) { host_cmd_typec_control_enter_mode(TEST_PORT, TYPEC_MODE_DP); k_sleep(K_SECONDS(1)); @@ -293,7 +298,107 @@ ZTEST_F(usbc_alt_mode, verify_displayport_mode_entry) zassert_equal((status.mux_state & USB_PD_MUX_HPD_LVL), USB_PD_MUX_HPD_LVL, "Failed to set HPD level in mux"); zassert_equal((status.mux_state & USB_PD_MUX_HPD_IRQ), - USB_PD_MUX_HPD_IRQ, "Failed to set HPD IRQin mux"); + USB_PD_MUX_HPD_IRQ, "Failed to set HPD IRQ in mux"); + zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 1); +} + +ZTEST_F(usbc_alt_mode, verify_bad_hpd_irq_reject) +{ + const struct gpio_dt_spec *gpio = + GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); + + if (IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) { + host_cmd_typec_control_enter_mode(TEST_PORT, TYPEC_MODE_DP); + k_sleep(K_SECONDS(1)); + } + + /* + * Compose a bad Attention packet which sets IRQ with HPD low + */ + uint32_t vdm_attention_data[2]; + + vdm_attention_data[0] = + VDO(USB_SID_DISPLAYPORT, 1, + VDO_OPOS(1) | VDO_CMDT(CMDT_INIT) | CMD_ATTENTION); + vdm_attention_data[1] = VDO_DP_STATUS(1, /* IRQ_HPD */ + false, /* HPD_HI|LOW - Changed*/ + 0, /* request exit DP */ + 0, /* request exit USB */ + 0, /* MF pref */ + true, /* DP Enabled */ + 0, /* power low e.g. normal */ + 0x2 /* Connected as Sink */); + tcpci_partner_send_data_msg(&fixture->partner, PD_DATA_VENDOR_DEF, + vdm_attention_data, 2, 0); + k_sleep(K_SECONDS(1)); + + /* Verify that no HPD notification triggered */ + struct ec_response_typec_status status; + + status = host_cmd_typec_status(TEST_PORT); + zassert_not_equal((status.mux_state & USB_PD_MUX_HPD_LVL), + USB_PD_MUX_HPD_LVL); + zassert_not_equal((status.mux_state & USB_PD_MUX_HPD_IRQ), + USB_PD_MUX_HPD_IRQ); + zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 0); +} + +ZTEST_F(usbc_alt_mode, verify_hpd_clear) +{ + const struct gpio_dt_spec *gpio = + GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); + + if (IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) { + host_cmd_typec_control_enter_mode(TEST_PORT, TYPEC_MODE_DP); + k_sleep(K_SECONDS(1)); + } + + /* + * Set our HPD to high and then low, ensuring our HPD indicators + * track this + */ + uint32_t vdm_attention_data[2]; + + vdm_attention_data[0] = + VDO(USB_SID_DISPLAYPORT, 1, + VDO_OPOS(1) | VDO_CMDT(CMDT_INIT) | CMD_ATTENTION); + vdm_attention_data[1] = VDO_DP_STATUS(0, /* IRQ_HPD */ + true, /* HPD_HI|LOW - Changed*/ + 0, /* request exit DP */ + 0, /* request exit USB */ + 0, /* MF pref */ + true, /* DP Enabled */ + 0, /* power low e.g. normal */ + 0x2 /* Connected as Sink */); + tcpci_partner_send_data_msg(&fixture->partner, PD_DATA_VENDOR_DEF, + vdm_attention_data, 2, 0); + k_sleep(K_SECONDS(1)); + + /* Verify that HPD notification triggered */ + struct ec_response_typec_status status; + + status = host_cmd_typec_status(TEST_PORT); + zassert_equal((status.mux_state & USB_PD_MUX_HPD_LVL), + USB_PD_MUX_HPD_LVL); + zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 1); + + vdm_attention_data[1] = VDO_DP_STATUS(0, /* IRQ_HPD */ + false, /* HPD_HI|LOW - Changed*/ + 0, /* request exit DP */ + 0, /* request exit USB */ + 0, /* MF pref */ + true, /* DP Enabled */ + 0, /* power low e.g. normal */ + 0x2 /* Connected as Sink */); + tcpci_partner_send_data_msg(&fixture->partner, PD_DATA_VENDOR_DEF, + vdm_attention_data, 2, 0); + + k_sleep(K_SECONDS(1)); + /* Verify that HPD cleared */ + status = host_cmd_typec_status(TEST_PORT); + zassert_not_equal((status.mux_state & USB_PD_MUX_HPD_LVL), + USB_PD_MUX_HPD_LVL); + zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 0); } ZTEST_F(usbc_alt_mode, verify_discovery_via_pd_host_cmd) diff --git a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c index a4c406a054..a936707809 100644 --- a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c +++ b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c @@ -6,9 +6,12 @@ #include "test/drivers/utils.h" #include "test_usbc_alt_mode.h" +#include <zephyr/drivers/gpio/gpio_emul.h> #include <zephyr/kernel.h> #include <zephyr/ztest.h> +#include <gpio.h> + /* Tests that require CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY enabled */ ZTEST_F(usbc_alt_mode, verify_displayport_mode_reentry) @@ -45,6 +48,9 @@ ZTEST_F(usbc_alt_mode, verify_displayport_mode_reentry) ZTEST_F(usbc_alt_mode, verify_mode_exit_via_pd_host_cmd) { + const struct gpio_dt_spec *gpio = + GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); + if (!IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) { ztest_test_skip(); } @@ -52,9 +58,32 @@ ZTEST_F(usbc_alt_mode, verify_mode_exit_via_pd_host_cmd) host_cmd_typec_control_enter_mode(TEST_PORT, TYPEC_MODE_DP); k_sleep(K_SECONDS(1)); + /* + * Set HPD so we can see it clear on Exit + */ + uint32_t vdm_attention_data[2]; + + vdm_attention_data[0] = + VDO(USB_SID_DISPLAYPORT, 1, + VDO_OPOS(1) | VDO_CMDT(CMDT_INIT) | CMD_ATTENTION); + vdm_attention_data[1] = VDO_DP_STATUS(1, /* IRQ_HPD */ + true, /* HPD_HI|LOW - Changed*/ + 0, /* request exit DP */ + 0, /* request exit USB */ + 0, /* MF pref */ + true, /* DP Enabled */ + 0, /* power low e.g. normal */ + 0x2 /* Connected as Sink */); + tcpci_partner_send_data_msg(&fixture->partner, PD_DATA_VENDOR_DEF, + vdm_attention_data, 2, 0); + + k_sleep(K_SECONDS(1)); + zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 1); + host_cmd_typec_control_exit_modes(TEST_PORT); k_sleep(K_SECONDS(1)); zassert_false(fixture->partner.displayport_configured); + zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 0); /* * Verify that DisplayPort is no longer active by checking our |