71 #include "sw/device/tests/usbdev_suspend.h"
81 #include "sw/device/lib/runtime/irq.h"
84 #include "sw/device/lib/testing/pinmux_testutils.h"
85 #include "sw/device/lib/testing/pwrmgr_testutils.h"
86 #include "sw/device/lib/testing/rstmgr_testutils.h"
87 #include "sw/device/lib/testing/rv_plic_testutils.h"
88 #include "sw/device/lib/testing/sram_ctrl_testutils.h"
89 #include "sw/device/lib/testing/test_framework/check.h"
91 #include "sw/device/lib/testing/usb_testutils.h"
92 #include "sw/device/lib/testing/usb_testutils_controlep.h"
93 #include "sw/device/lib/testing/usb_testutils_streams.h"
94 #include "sw/device/silicon_creator/lib/drivers/retention_sram.h"
96 #define MODULE_ID MAKE_MODULE_ID('u', 'd', 'u')
99 #define USBUTILS_FUNCPT_FILE USBUTILS_FUNCPT_FILE_USBDEV_SUSP_TEST
102 #define USE_ISO_STREAMS 0
104 #define USE_BULK_STREAMS 1
109 #define NUM_STREAMS 4U
111 #define NUM_STREAMS USBUTILS_STREAMS_MAX
117 #ifndef USBDPI_FULL_FRAME
119 #define USBDPI_FULL_FRAME 0
132 TimeoutResumeMissed = 40U * 1000U,
133 TimeoutResetMissed = 60U * 1000U,
134 TimeoutWakeupResume = 30000u,
135 TimeoutFinishMissed = 2000u,
136 TimeoutAonResponse = 5000u,
137 TimeoutSleepFailed = 5000u,
141 TimeoutPhysConfig = 10U * 1000U * 1000U,
148 FramesConfigDelay = 2000u,
149 FramesSuspendMissed = 2000u,
150 FramesInitiateResume = 2u,
156 FramesWaitEnterSleep = 10u,
164 #define MAX_CLIENT_STATE 0x400U
173 kSuspendStatePowerOnReset = 0u,
177 kSuspendStateBusReset,
182 kSuspendStateWaitSuspend,
188 kSuspendStateWaitLongSuspend,
192 kSuspendStateWaitResume,
196 kSuspendStateWaitBusReset,
201 kSuspendStateWaitSuspendTimeout,
207 kSuspendStateActivatedAON,
211 kSuspendStateNormalSleep,
215 kSuspendStateDeepSleep,
219 kSuspendStateNormalWaking,
223 kSuspendStateDeepWaking,
228 kSuspendStateAONWakeup,
232 kSuspendStateWaitResumeTimeout,
236 kSuspendStateWaitFinish,
241 kSuspendStateNextPhase,
245 kSuspendStateWaitDisconnect,
249 kSuspendStateComplete,
254 } usbdev_suspend_state_t;
292 alignas(uint32_t) uint8_t client_state[MAX_CLIENT_STATE];
357 #define CFG_DSCR_TOTAL_LEN \
358 (USB_CFG_DSCR_LEN + \
359 NUM_STREAMS * (USB_INTERFACE_DSCR_LEN + 2 * USB_EP_DSCR_LEN))
364 static uint8_t config_descriptors[CFG_DSCR_TOTAL_LEN] = {
368 USB_CFG_DSCR_LEN + 2 * (USB_INTERFACE_DSCR_LEN + 2 * USB_EP_DSCR_LEN),
370 VEND_INTERFACE_DSCR(0, 2, 0x50, 1),
371 USB_BULK_EP_DSCR(0, 1, 32, 0),
372 USB_BULK_EP_DSCR(1, 1, 32, 4),
373 VEND_INTERFACE_DSCR(1, 2, 0x50, 1),
374 USB_BULK_EP_DSCR(0, 2, 32, 0),
375 USB_BULK_EP_DSCR(1, 2, 32, 4),
382 static uint32_t frame_interval = 1000u;
391 static const dt_pinmux_t kPinmuxDt = 0;
392 static_assert(kDtPinmuxCount == 1,
"this library expects exactly one pinmux");
393 static const dt_pwrmgr_t kPwrmgrDt = 0;
394 static_assert(kDtPwrmgrCount == 1,
"this library expects exactly one pwrmgr");
395 static const dt_rstmgr_t kRstmgrDt = 0;
396 static_assert(kDtRstmgrCount == 1,
"this library expects exactly one rstmgr");
397 static const dt_rv_plic_t kRvPlicDt = 0;
398 static_assert(kDtRvPlicCount == 1,
"this library expects exactly one rv_plic");
407 static dif_pinmux_t pinmux;
411 static dif_rstmgr_t rstmgr;
415 static dif_pwrmgr_t pwrmgr;
419 static dif_rv_plic_t rv_plic;
427 static bool host_suspends =
true;
432 static bool host_resumes =
true;
436 static bool host_resets =
true;
440 static bool host_disconnects =
true;
452 static bool verbose =
true;
459 static bool s_verbose =
false;
463 static const unsigned nstreams = NUM_STREAMS;
465 static const usb_testutils_transfer_type_t xfr_types[] = {
466 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
467 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
468 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
469 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
470 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
471 kUsbTransferTypeIsochronous};
472 #elif USE_BULK_STREAMS
473 static const usb_testutils_transfer_type_t xfr_types[] = {
474 kUsbTransferTypeBulk, kUsbTransferTypeBulk, kUsbTransferTypeBulk,
475 kUsbTransferTypeBulk, kUsbTransferTypeBulk, kUsbTransferTypeBulk,
476 kUsbTransferTypeBulk, kUsbTransferTypeBulk, kUsbTransferTypeBulk,
477 kUsbTransferTypeBulk, kUsbTransferTypeBulk};
479 static const usb_testutils_transfer_type_t xfr_types[] = {
480 kUsbTransferTypeIsochronous, kUsbTransferTypeInterrupt,
481 kUsbTransferTypeBulk, kUsbTransferTypeBulk,
483 kUsbTransferTypeIsochronous, kUsbTransferTypeInterrupt,
484 kUsbTransferTypeBulk, kUsbTransferTypeIsochronous,
486 kUsbTransferTypeInterrupt, kUsbTransferTypeBulk,
487 kUsbTransferTypeBulk,
492 static const usbdev_stream_flags_t test_flags =
493 kUsbdevStreamFlagRetrieve | kUsbdevStreamFlagCheck |
494 kUsbdevStreamFlagRetry | kUsbdevStreamFlagSend;
497 static const uint32_t transfer_bytes = 0x80 << 20;
510 #define report_progress(...) LOG_INFO(__VA_ARGS__)
515 static inline bool physical_timings(
void) {
530 static uint32_t time_frames(
unsigned n) {
532 if (physical_timings()) {
535 return scale * n * frame_interval;
539 static const char *phase_name(usbdev_suspend_phase_t phase) {
541 case kSuspendPhaseSuspend:
543 case kSuspendPhaseSleepResume:
544 return "SleepResume";
545 case kSuspendPhaseSleepReset:
547 case kSuspendPhaseSleepDisconnect:
548 return "SleepDisconnect";
549 case kSuspendPhaseDeepResume:
551 case kSuspendPhaseDeepReset:
553 case kSuspendPhaseDeepDisconnect:
554 return "DeepDisconnect";
555 case kSuspendPhaseShutdown:
563 static const char *state_name(usbdev_suspend_state_t state) {
565 case kSuspendStatePowerOnReset:
566 return "PowerOnReset";
567 case kSuspendStateBusReset:
569 case kSuspendStateWaitSuspend:
570 return "WaitSuspend";
571 case kSuspendStateWaitResume:
573 case kSuspendStateWaitBusReset:
574 return "WaitBusReset";
575 case kSuspendStateWaitLongSuspend:
576 return "WaitLongSuspend";
577 case kSuspendStateWaitSuspendTimeout:
578 return "WaitSuspendTimeout";
579 case kSuspendStateActivatedAON:
580 return "ActivatedAON";
581 case kSuspendStateNormalSleep:
582 return "NormalSleep";
583 case kSuspendStateDeepSleep:
585 case kSuspendStateNormalWaking:
586 return "NormalWaking";
587 case kSuspendStateDeepWaking:
589 case kSuspendStateAONWakeup:
591 case kSuspendStateWaitResumeTimeout:
592 return "WaitResumeTimeout";
593 case kSuspendStateWaitDisconnect:
594 return "WaitDisconnect";
595 case kSuspendStateWaitFinish:
597 case kSuspendStateNextPhase:
599 case kSuspendStateComplete:
601 case kSuspendStateFailed:
612 if (snapshot & (1u << kDifUsbdevIrqPowered)) {
615 if (snapshot & (1u << kDifUsbdevIrqDisconnected)) {
618 if (snapshot & (1u << kDifUsbdevIrqLinkReset)) {
621 if (snapshot & (1u << kDifUsbdevIrqHostLost)) {
627 ((1u << kDifUsbdevIrqLinkSuspend) | (1u << kDifUsbdevIrqLinkResume))) {
628 switch (link_state) {
629 case kDifUsbdevLinkStatePoweredSuspended:
630 case kDifUsbdevLinkStateSuspended:
634 case kDifUsbdevLinkStateResuming:
638 case kDifUsbdevLinkStateActiveNoSof:
642 case kDifUsbdevLinkStateActive:
654 usbdev_suspend_state_t state) {
656 LOG_INFO(
"entering state %s", state_name(state));
663 uint32_t interval_us) {
665 LOG_INFO(
"timeout_set %uus\n", interval_us);
668 uint64_t then = now + interval_us;
669 LOG_INFO(
" setting timeout to 0x%x%x (at 0x%x%x)",
670 (uint32_t)(then >> 32), (uint32_t)then, (uint32_t)(now >> 32),
679 uint32_t interval_frames) {
680 timeout_set(ctx, time_frames(interval_frames));
687 while (niters-- > 0u) {
690 #if USBUTILS_FUNCTION_POINTS
691 uint32_t data = (sense.
rx_dp ? 1U : 0) | (sense.
rx_dn ? 2U : 0) |
694 USBUTILS_FUNCPT(0x515, data);
697 "sense %u : rx_dp %u rx_dn %u rx_d %u : tx_dp %u tx_dn %u tx_d %u "
708 LOG_INFO(
"wake status active %u disconnected %u bus_reset %u",
712 LOG_INFO(
" (host_resumes %u host_resets %u host_disconnects %u)",
713 host_resumes, host_resets, host_disconnects);
723 report_wake_status(ctx);
731 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
733 if (devid != dt_pwrmgr_instance_id(kPwrmgrDt) ||
734 irq_id != dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup)) {
737 CHECK_DIF_OK(dif_pwrmgr_irq_acknowledge(&pwrmgr, kDtPwrmgrIrqWakeup));
740 const bool debug =
false;
743 sense_report(ctx, 2);
744 LOG_INFO(
"Received Wakeup IRQ in sleep");
747 (void)collect_wake_status(ctx);
748 sense_report(ctx, 10u);
751 LOG_INFO(
"Received Wakeup IRQ in sleep");
762 .words = (uint32_t *)state,
763 .len =
sizeof(*state) / 4});
770 memcpy(state, (uint8_t *)kRetSramOwnerAddr,
sizeof(*state));
775 LOG_INFO(
"phase_set %u (%s)", phase, phase_name(phase));
782 uint8_t test_descriptor[] = {
783 USB_TESTUTILS_TEST_DSCR(kUsbTestNumberSuspend,
794 static status_t link_callback(
void *ctx_v,
795 dif_usbdev_irq_state_snapshot_t snapshot,
799 if (snapshot & (1u << kDifUsbdevIrqFrame)) {
813 snapshot &= ~(1u << kDifUsbdevIrqFrame);
823 events_report(ctx, snapshot, link_state);
834 case kSuspendStateWaitSuspend:
835 if (snapshot & (1u << kDifUsbdevIrqLinkSuspend)) {
836 state_enter(ctx, kSuspendStateWaitResume);
837 timeout_set(ctx, TimeoutResumeMissed);
843 case kSuspendStateWaitResume:
844 if (snapshot & (1u << kDifUsbdevIrqLinkResume)) {
845 state_enter(ctx, kSuspendStateNextPhase);
852 case kSuspendStateWaitBusReset:
853 if (snapshot & (1u << kDifUsbdevIrqLinkReset)) {
854 state_enter(ctx, kSuspendStateBusReset);
859 case kSuspendStateWaitLongSuspend:
860 if (snapshot & (1u << kDifUsbdevIrqLinkSuspend)) {
861 state_enter(ctx, kSuspendStateWaitSuspendTimeout);
862 timeout_frames_set(ctx, FramesWaitEnterSleep);
868 case kSuspendStateWaitSuspendTimeout:
870 state_enter(ctx, kSuspendStateFailed);
874 case kSuspendStateWaitDisconnect:
875 if (snapshot & (1u << kDifUsbdevIrqDisconnected)) {
876 state_enter(ctx, kSuspendStateComplete);
880 case kSuspendStateActivatedAON:
883 case kSuspendStateNormalSleep:
884 case kSuspendStateDeepSleep:
886 case kSuspendStateAONWakeup:
889 case kSuspendStateWaitResumeTimeout:
892 case kSuspendStateWaitFinish:
895 if (snapshot & (1u << kDifUsbdevLinkStateDisconnected)) {
896 state_enter(ctx, kSuspendStateComplete);
900 case kSuspendStatePowerOnReset:
901 case kSuspendStateBusReset:
902 case kSuspendStateNextPhase:
905 case kSuspendStateNormalWaking:
906 case kSuspendStateDeepWaking:
910 case kSuspendStateFailed:
911 case kSuspendStateComplete:
917 state_enter(ctx, kSuspendStateFailed);
921 if (verbose && ctx->
test_state == kSuspendStateFailed) {
922 LOG_INFO(
" -> failed handling snapshot 0x%x with link state 0x%x\n",
923 snapshot, link_state);
931 static size_t base_dev_uart(
void *data,
const char *buf,
size_t len) {
933 for (
size_t i = 0; i < len; ++i) {
934 *(uint32_t *)0x411f0084 = ((uint8_t *)buf)[i];
943 .sink = base_dev_uart,
960 case kSuspendStateWaitSuspend:
961 if (!host_suspends) {
963 state_enter(ctx, kSuspendStateWaitResume);
964 timeout_frames_set(ctx, FramesInitiateResume);
969 case kSuspendStateWaitLongSuspend:
970 if (!host_suspends) {
971 LOG_INFO(
"auto-long-suspending (FPGA)");
972 state_enter(ctx, kSuspendStateWaitSuspendTimeout);
973 timeout_frames_set(ctx, FramesWaitEnterSleep);
981 case kSuspendStateWaitSuspendTimeout:
987 state_enter(ctx, kSuspendStateActivatedAON);
988 timeout_frames_set(ctx, TimeoutAonResponse);
992 case kSuspendStateWaitResume:
994 LOG_INFO(
"auto-resuming (host does not support Resume Signaling)");
995 state_enter(ctx, kSuspendStateWaitBusReset);
996 timeout_frames_set(ctx, 10000u);
1002 case kSuspendStateWaitResumeTimeout:
1005 state_enter(ctx, kSuspendStateNextPhase);
1012 case kSuspendStateWaitBusReset:
1014 LOG_INFO(
"auto-resetting (host does not support Bus Resets)");
1017 state_enter(ctx, kSuspendStateNextPhase);
1031 state_enter(ctx, kSuspendStateFailed);
1051 TRY(usb_testutils_init(ctx->
usbdev,
false,
1056 TRY(usb_testutils_link_callback_register(ctx->
usbdev, link_callback, ctx));
1064 TRY(usb_testutils_streams_init(&usbdev_streams, nstreams, xfr_types,
1065 transfer_bytes, test_flags, s_verbose));
1073 TRY(usb_testutils_streams_typed_init(&usbdev_streams, config_descriptors,
1074 sizeof(config_descriptors), nstreams,
1075 xfr_types, transfer_bytes, test_flags,
1076 s_verbose, &dpi_types));
1082 TRY(usb_testutils_controlep_init(
1083 &usbdev_control, ctx->
usbdev, 0, config_descriptors,
1095 uint32_t timeout = FramesSuspendMissed;
1097 TRY_CHECK(ctx->
test_state == kSuspendStateNextPhase ||
1099 ctx->
test_state == kSuspendStatePowerOnReset ||
1104 if (ctx->
test_state != kSuspendStateNextPhase) {
1105 TRY(software_init(ctx));
1109 case kSuspendStatePowerOnReset:
1110 case kSuspendStateBusReset:
1114 if (physical_timings()) {
1115 timeout_set(ctx, TimeoutPhysConfig);
1119 timeout_frames_set(ctx, 8u);
1123 LOG_INFO(
"waiting to be configured");
1126 while (usbdev_control.device_state != kUsbTestutilsDeviceConfigured &&
1128 TRY(usb_testutils_poll(ctx->
usbdev));
1132 TRY_CHECK(usbdev_control.device_state == kUsbTestutilsDeviceConfigured);
1138 timeout += FramesConfigDelay;
1141 case kSuspendStateNextPhase:
1146 TRY_CHECK(ctx->
test_state == kSuspendStateDeepSleep);
1153 TRY(usb_testutils_streams_resume(&usbdev_streams,
1166 #if USBDEV_HAVE_TOGGLE_STATE
1180 usbdev_control.device_state = kUsbTestutilsDeviceConfigured;
1182 usbdev_control.
new_dev = dev_address;
1188 TRY_CHECK(link_state == kDifUsbdevLinkStatePowered ||
1189 link_state == kDifUsbdevLinkStateDisconnected);
1191 if (link_state == kDifUsbdevLinkStatePowered) {
1195 #if USBDEV_HAVE_TOGGLE_STATE
1197 LOG_INFO(
"in_toggles 0x%03x out_toggles 0x%03x", in_toggles,
1202 LOG_INFO(
"Warning: Unable to reinstate Data Toggle bits");
1209 if (ctx->
test_state != kSuspendStateNextPhase) {
1211 if (ctx->
test_state == kSuspendStateDeepSleep) {
1217 LOG_INFO(
"Configured; starting streaming...");
1222 LOG_INFO(
"Configured; not trying to stream...");
1229 case kSuspendPhaseShutdown:
1233 state_enter(ctx, kSuspendStateWaitDisconnect);
1236 case kSuspendPhaseSuspend:
1237 state_enter(ctx, kSuspendStateWaitSuspend);
1241 CHECK(ctx->
test_phase == kSuspendPhaseDeepDisconnect);
1243 case kSuspendPhaseDeepReset:
1244 case kSuspendPhaseDeepResume:
1245 if (ctx->
test_state == kSuspendStateDeepSleep) {
1246 state_enter(ctx, kSuspendStateDeepWaking);
1253 case kSuspendPhaseSleepDisconnect:
1254 case kSuspendPhaseSleepReset:
1255 case kSuspendPhaseSleepResume:
1256 if (host_suspends) {
1260 state_enter(ctx, kSuspendStateWaitLongSuspend);
1264 timeout_frames_set(ctx, timeout);
1279 case kSuspendStateActivatedAON:
1282 TRY(collect_wake_status(ctx));
1291 #
if USBDEV_HAVE_TOGGLE_STATE
1293 uint16_t out_toggles, in_toggles;
1297 ((uint32_t)in_toggles << 16) | out_toggles;
1302 LOG_INFO(
" - retaining address %u config %u phase %u (%s)",
1311 TRY(usb_testutils_streams_suspend(
1324 bool can_awaken =
true;
1326 case kSuspendPhaseSleepReset:
1327 case kSuspendPhaseDeepReset:
1330 LOG_INFO(
"auto-skipping WFI (host does not support Bus Resets");
1336 case kSuspendPhaseSleepDisconnect:
1337 case kSuspendPhaseDeepDisconnect:
1338 if (!host_disconnects) {
1341 "auto-skipping WFI (host does not support Disconnects");
1348 TRY_CHECK(ctx->
test_phase == kSuspendPhaseSleepResume ||
1350 if (!host_resumes) {
1353 "auto-skipping WFI (host does not support Resume "
1362 if (ctx->
test_phase == kSuspendPhaseDeepResume ||
1364 ctx->
test_phase == kSuspendPhaseDeepDisconnect) {
1374 TRY(pwrmgr_testutils_enable_low_power(
1375 &pwrmgr, wakeup_sources,
1377 kDifPwrmgrDomainOptionUsbClockInActivePower));
1381 state_enter(ctx, kSuspendStateDeepSleep);
1382 timeout_frames_set(ctx, TimeoutSleepFailed);
1384 LOG_INFO(
"Requesting Normal sleep");
1387 TRY(pwrmgr_testutils_enable_low_power(
1388 &pwrmgr, wakeup_sources,
1391 kDifPwrmgrDomainOptionUsbClockInActivePower |
1392 kDifPwrmgrDomainOptionMainPowerInLowPower));
1396 state_enter(ctx, kSuspendStateNormalSleep);
1397 timeout_frames_set(ctx, TimeoutSleepFailed);
1401 const char *action =
"";
1402 if (physical_timings()) {
1404 case kSuspendPhaseSleepReset:
1405 case kSuspendPhaseDeepReset:
1406 action =
"; please Reset the device.";
1408 case kSuspendPhaseSleepDisconnect:
1409 case kSuspendPhaseDeepDisconnect:
1410 action =
"; please disconnect and reconnect the USB cable.";
1418 LOG_INFO(
"Issuing WFI to enter sleep%s", action);
1424 TRY_CHECK(ctx->
test_state == kSuspendStateNormalSleep);
1444 (!host_disconnects &&
1449 retention_sram_load(&stored_state);
1451 LOG_INFO(
" - retained address %u config %u phase %u (%s)",
1470 LOG_INFO(
"wakeup types 0x%x sources 0x%x", wakeup_reason.
types,
1474 state_enter(ctx, kSuspendStateNormalWaking);
1476 timeout_frames_set(ctx, TimeoutSleepFailed);
1480 case kSuspendStateNormalWaking:
1481 case kSuspendStateDeepWaking:
1484 TRY(collect_wake_status(ctx));
1497 bool got_signal =
false;
1500 case kSuspendPhaseSleepResume:
1501 case kSuspendPhaseDeepResume:
1505 case kSuspendPhaseSleepReset:
1506 case kSuspendPhaseDeepReset:
1511 TRY_CHECK(ctx->
test_phase == kSuspendPhaseDeepDisconnect);
1513 case kSuspendPhaseSleepDisconnect:
1528 LOG_INFO(
"Handling Disconnection when VBUS %sasserted",
1529 sense ?
"" :
"de-");
1534 static uint8_t buf[4096];
1535 extern void usbutils_gather(dif_usbdev_t * dev, uint8_t * buf,
1542 usbutils_gather(ctx->
usbdev->dev, buf,
sizeof(buf));
1558 state_enter(ctx, kSuspendStateAONWakeup);
1559 timeout_frames_set(ctx, TimeoutAonResponse);
1561 LOG_INFO(
"Unexpected report from USB AON Wake module");
1562 report_wake_status(ctx);
1563 state_enter(ctx, kSuspendStateFailed);
1566 LOG_INFO(
"AON/Wake module not active when expected");
1567 state_enter(ctx, kSuspendStateFailed);
1571 case kSuspendStateAONWakeup:
1575 TRY(collect_wake_status(ctx));
1584 case kSuspendPhaseSleepDisconnect:
1585 case kSuspendPhaseDeepDisconnect:
1586 state_enter(ctx, host_disconnects ? kSuspendStatePowerOnReset
1587 : kSuspendStateNextPhase);
1590 case kSuspendPhaseSleepReset:
1591 case kSuspendPhaseDeepReset:
1594 state_enter(ctx, kSuspendStateBusReset);
1598 TRY_CHECK(ctx->
test_phase == kSuspendPhaseDeepResume);
1600 case kSuspendPhaseSleepResume:
1601 state_enter(ctx, kSuspendStateWaitResumeTimeout);
1602 timeout_set(ctx, TimeoutWakeupResume);
1606 LOG_INFO(
"AON Wake module not active when expected");
1607 state_enter(ctx, kSuspendStateFailed);
1612 case kSuspendStateWaitFinish:
1616 case kSuspendStatePowerOnReset:
1617 case kSuspendStateBusReset:
1618 case kSuspendStateNextPhase:
1619 case kSuspendStateComplete:
1620 case kSuspendStateFailed:
1628 TRY_CHECK(ctx->
test_state == kSuspendStateWaitResumeTimeout);
1630 case kSuspendStateWaitSuspend:
1631 case kSuspendStateWaitResume:
1632 case kSuspendStateWaitBusReset:
1633 case kSuspendStateWaitLongSuspend:
1634 case kSuspendStateWaitSuspendTimeout:
1635 case kSuspendStateWaitDisconnect:
1646 bool send_progress = (ctx->
test_state != kSuspendStateDeepSleep);
1647 bool phase_done =
false;
1651 TRY(phase_start_resume(ctx));
1653 if (send_progress) {
1654 report_progress(
"Phase awaiting stimulus (%s)",
1659 case kSuspendStateBusReset:
1660 case kSuspendStateNextPhase:
1661 case kSuspendStatePowerOnReset:
1662 case kSuspendStateComplete:
1663 case kSuspendStateFailed:
1665 "Phase-initial state %u (%s) should have been handled in "
1668 return FAILED_PRECONDITION();
1677 TRY(timeout_handle(ctx));
1679 TRY(state_service(ctx));
1685 case kSuspendStateBusReset:
1686 case kSuspendStateNextPhase:
1687 case kSuspendStatePowerOnReset:
1688 case kSuspendStateComplete:
1689 case kSuspendStateFailed:
1694 case kSuspendStateActivatedAON:
1695 case kSuspendStateAONWakeup:
1696 case kSuspendStateDeepSleep:
1697 case kSuspendStateNormalSleep:
1701 case kSuspendStateWaitResume:
1704 TRY(usb_testutils_poll(ctx->
usbdev));
1714 TRY(usb_testutils_streams_service(&usbdev_streams));
1718 TRY(usb_testutils_poll(ctx->
usbdev));
1722 }
while (!phase_done);
1727 case kSuspendStatePowerOnReset:
1728 case kSuspendStateBusReset:
1729 case kSuspendStateNextPhase: {
1731 usbdev_suspend_phase_t next_phase =
1732 (usbdev_suspend_phase_t)(ctx->
test_phase + 1u);
1733 bool completed =
false;
1736 LOG_INFO(
"Rewinding to initial phase");
1747 state_enter(ctx, kSuspendStateComplete);
1750 phase_set(ctx, next_phase);
1755 TRY_CHECK(ctx->
test_state == kSuspendStateComplete ||
1763 bool usbdev_suspend_test(usbdev_suspend_phase_t init_phase,
1764 usbdev_suspend_phase_t fin_phase, uint32_t num_iters,
1765 bool with_traffic) {
1774 memset(ctx, 0,
sizeof(*ctx));
1777 irq_global_ctrl(
true);
1778 irq_external_ctrl(
true);
1781 CHECK(fin_phase >= init_phase);
1787 host_suspends =
true;
1788 host_resumes =
true;
1790 host_disconnects =
true;
1802 #if !USBDPI_FULL_FRAME
1803 frame_interval = 500u;
1818 host_suspends =
true;
1819 host_resumes =
true;
1821 host_disconnects =
true;
1833 host_suspends =
true;
1834 host_resumes =
true;
1837 host_disconnects =
false;
1848 CHECK_DIF_OK(dif_pinmux_init_from_dt(kPinmuxDt, &pinmux));
1849 pinmux_testutils_init(&pinmux);
1855 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
1858 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &rv_plic));
1861 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
1865 dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
1866 rv_plic_testutils_irq_range_enable(&rv_plic, kPlicTarget, irq_id, irq_id);
1871 kDtPinmuxWakeupUsbWkupReq, &wakeup_sources));
1878 rstmgr_testutils_reason_clear();
1884 const char *iters =
"eternally";
1885 static char buf[20];
1887 report_progress(
"Running USBDEV_SUSPEND test");
1893 if (num_iters != USBDEV_SUSPEND_ETERNAL) {
1894 base_snprintf(buf,
sizeof(buf),
"%u times", num_iters);
1897 LOG_INFO(
" (seq: %s to %s %s with%s traffic)", phase_name(init_phase),
1901 LOG_INFO(
"Booting for the first time");
1903 phase_set(ctx, init_phase);
1904 state_enter(ctx, kSuspendStatePowerOnReset);
1910 LOG_INFO(
"Resuming from power down!");
1916 LOG_INFO(
" - retained address %u config %u phase %u (%s)",
1939 state_enter(ctx, kSuspendStateDeepSleep);
1944 CHECK_STATUS_OK(phase_run(ctx));
1949 }
while (ctx->
test_state == kSuspendStateNextPhase ||
1951 ctx->
test_state == kSuspendStatePowerOnReset);
1961 CHECK_STATUS_OK(usb_testutils_fin(ctx->
usbdev));
1963 #if USBUTILS_FUNCTION_POINTS && USBUTILS_FUNCPT_USE_BUFFER
1965 usbutils_funcpt_report();
1969 return (ctx->
test_state == kSuspendStateComplete);