| /* Copyright 2020 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "mock/tcpci_i2c_mock.h" |
| #include "task.h" |
| #include "tcpm/tcpci.h" |
| #include "test_util.h" |
| #include "timer.h" |
| #include "usb_prl_sm.h" |
| #include "usb_tc_sm.h" |
| #include "usb_tcpmv2_compliance.h" |
| |
| int test_connect_as_nonpd_sink(void) |
| { |
| task_wait_event(10 * SECOND); |
| |
| /* Simulate a non-PD power supply being plugged in. */ |
| mock_set_cc(MOCK_CC_DUT_IS_SNK, MOCK_CC_SNK_OPEN, MOCK_CC_SNK_RP_3_0); |
| mock_set_alert(TCPC_REG_ALERT_CC_STATUS); |
| |
| task_wait_event(50 * MSEC); |
| |
| mock_tcpci_set_reg(TCPC_REG_POWER_STATUS, |
| TCPC_REG_POWER_STATUS_VBUS_PRES); |
| mock_set_alert(TCPC_REG_ALERT_POWER_STATUS); |
| |
| task_wait_event(10 * SECOND); |
| TEST_EQ(tc_is_attached_snk(PORT0), true, "%d"); |
| |
| return EC_SUCCESS; |
| } |
| |
| int test_retry_count_sop(void) |
| { |
| /* DRP auto-toggling with AP in S0, source enabled. */ |
| TEST_EQ(tcpci_startup(), EC_SUCCESS, "%d"); |
| |
| /* |
| * The test starts in a disconnected state. |
| */ |
| mock_tcpci_set_reg(TCPC_REG_EXT_STATUS, TCPC_REG_EXT_STATUS_SAFE0V); |
| mock_set_alert(TCPC_REG_ALERT_EXT_STATUS); |
| task_wait_event(10 * SECOND); |
| |
| /* |
| * The Tester applies Rd and waits for Vbus for tNoResponse max. |
| */ |
| mock_set_cc(MOCK_CC_DUT_IS_SRC, MOCK_CC_SRC_OPEN, MOCK_CC_SRC_RD); |
| mock_set_alert(TCPC_REG_ALERT_CC_STATUS); |
| |
| /* |
| * The Tester waits for Source_Capabilities for tNoResponse max. |
| * |
| * Source Caps is SOP message which should be retried at TCPC layer. |
| * The retry count for PD3 should be 2. |
| */ |
| TEST_EQ(verify_tcpci_tx_retry_count(TCPCI_MSG_SOP, 0, |
| PD_DATA_SOURCE_CAP, 2), |
| EC_SUCCESS, "%d"); |
| return EC_SUCCESS; |
| } |
| |
| int test_retry_count_hard_reset(void) |
| { |
| /* DRP auto-toggling with AP in S0, source enabled. */ |
| TEST_EQ(tcpci_startup(), EC_SUCCESS, "%d"); |
| |
| /* |
| * The test starts in a disconnected state. |
| */ |
| mock_tcpci_set_reg(TCPC_REG_EXT_STATUS, TCPC_REG_EXT_STATUS_SAFE0V); |
| mock_set_alert(TCPC_REG_ALERT_EXT_STATUS); |
| task_wait_event(10 * SECOND); |
| |
| /* |
| * The Tester applies Rd and waits for Vbus for tNoResponse max. |
| */ |
| mock_set_cc(MOCK_CC_DUT_IS_SRC, MOCK_CC_SRC_OPEN, MOCK_CC_SRC_RD); |
| mock_set_alert(TCPC_REG_ALERT_CC_STATUS); |
| |
| /* |
| * The Tester waits for Source_Capabilities for tNoResponse max. |
| */ |
| TEST_EQ(verify_tcpci_transmit(TCPCI_MSG_SOP, 0, PD_DATA_SOURCE_CAP), |
| EC_SUCCESS, "%d"); |
| /* |
| * The Tester replies GoodCrc on reception of the Source_Capabilities. |
| */ |
| mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); |
| task_wait_event(10 * MSEC); |
| |
| /* |
| * Now that PRL is running since we are connected, we can send a hard |
| * reset. |
| */ |
| |
| /* Request that DUT send hard reset */ |
| prl_execute_hard_reset(PORT0); |
| |
| /* The retry count for hard resets should be 0 */ |
| TEST_EQ(verify_tcpci_tx_retry_count(TCPCI_MSG_TX_HARD_RESET, 0, 0, 0), |
| EC_SUCCESS, "%d"); |
| |
| return EC_SUCCESS; |
| } |