summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zephyr/test/drivers/boards/native_posix.overlay10
-rw-r--r--zephyr/test/drivers/testcase.yaml2
-rw-r--r--zephyr/test/drivers/usbc_alt_mode/prj.conf5
-rw-r--r--zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c107
-rw-r--r--zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c29
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