18 #include "sw/device/lib/base/status.h"
22 #include "sw/device/lib/testing/pinmux_testutils.h"
23 #include "sw/device/lib/testing/test_framework/check.h"
28 #define USBDEV_BASE_ADDR TOP_EARLGREY_USBDEV_BASE_ADDR
33 static dif_usbdev_t usbdev;
38 static dif_pinmux_t pinmux;
41 static status_t vbus_wait(
bool expected, uint32_t timeout_micros) {
47 if (vbus == expected) {
52 return DEADLINE_EXCEEDED();
57 uint32_t timeout_micros) {
63 if (link_state == expected) {
68 return DEADLINE_EXCEEDED();
72 static void check_toggles(uint16_t exp_out_toggles, uint16_t exp_in_toggles,
74 uint16_t act_out_toggles;
75 uint16_t act_in_toggles;
84 LOG_INFO(
"exp_out_toggles 0x%x act_out_toggles 0x%x", exp_out_toggles,
86 LOG_INFO(
"exp_in_toggles 0x%x act_in_toggles 0x%x", exp_in_toggles,
90 CHECK(act_out_toggles == exp_out_toggles);
91 CHECK(act_in_toggles == exp_in_toggles);
94 OTTF_DEFINE_TEST_CONFIG();
100 uint16_t exp_out_toggles = (uint16_t)(0xAAAAu & all_endpoints);
101 uint16_t exp_in_toggles = (uint16_t)(0x5555u & all_endpoints);
102 uint32_t timeout_micros = 1000u;
104 bool logging =
false;
116 timeout_micros = 1000u;
120 timeout_micros = 30 * 1000 * 1000u;
129 CHECK_DIF_OK(dif_pinmux_init(
131 pinmux_testutils_init(&pinmux);
150 LOG_INFO(
"Connect or power up the USB");
152 CHECK_STATUS_OK(vbus_wait(
true, timeout_micros));
158 link_state_wait(kDifUsbdevLinkStateActiveNoSof, timeout_micros));
160 LOG_INFO(
"Link out of reset; testing...");
175 check_toggles(exp_out_toggles, exp_in_toggles, logging);
178 exp_out_toggles ^= all_endpoints;
179 exp_in_toggles ^= all_endpoints;
186 check_toggles(exp_out_toggles, exp_in_toggles, logging);
191 uint16_t ep_mask = (uint16_t)(1u << ep);
193 exp_out_toggles |= ep_mask;
194 exp_in_toggles |= ep_mask;
198 check_toggles(exp_out_toggles, exp_in_toggles, logging);
200 exp_out_toggles &= ~ep_mask;
201 exp_in_toggles &= ~ep_mask;
205 check_toggles(exp_out_toggles, exp_in_toggles, logging);