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"
97 #include "sw/device/lib/testing/autogen/isr_testutils.h"
99 #define MODULE_ID MAKE_MODULE_ID('u', 'd', 'u')
102 #define USBUTILS_FUNCPT_FILE USBUTILS_FUNCPT_FILE_USBDEV_SUSP_TEST
105 #define USE_ISO_STREAMS 0
107 #define USE_BULK_STREAMS 1
112 #define NUM_STREAMS 4U
114 #define NUM_STREAMS USBUTILS_STREAMS_MAX
120 #ifndef USBDPI_FULL_FRAME
122 #define USBDPI_FULL_FRAME 0
135 TimeoutResumeMissed = 40U * 1000U,
136 TimeoutResetMissed = 60U * 1000U,
137 TimeoutWakeupResume = 30000u,
138 TimeoutFinishMissed = 2000u,
139 TimeoutAonResponse = 5000u,
140 TimeoutSleepFailed = 5000u,
144 TimeoutPhysConfig = 10U * 1000U * 1000U,
151 FramesConfigDelay = 2000u,
152 FramesSuspendMissed = 2000u,
153 FramesInitiateResume = 2u,
159 FramesWaitEnterSleep = 10u,
167 #define MAX_CLIENT_STATE 0x400U
176 kSuspendStatePowerOnReset = 0u,
180 kSuspendStateBusReset,
185 kSuspendStateWaitSuspend,
191 kSuspendStateWaitLongSuspend,
195 kSuspendStateWaitResume,
199 kSuspendStateWaitBusReset,
204 kSuspendStateWaitSuspendTimeout,
210 kSuspendStateActivatedAON,
214 kSuspendStateNormalSleep,
218 kSuspendStateDeepSleep,
222 kSuspendStateNormalWaking,
226 kSuspendStateDeepWaking,
231 kSuspendStateAONWakeup,
235 kSuspendStateWaitResumeTimeout,
239 kSuspendStateWaitFinish,
244 kSuspendStateNextPhase,
248 kSuspendStateWaitDisconnect,
252 kSuspendStateComplete,
257 } usbdev_suspend_state_t;
295 alignas(uint32_t) uint8_t client_state[MAX_CLIENT_STATE];
360 #define CFG_DSCR_TOTAL_LEN \
361 (USB_CFG_DSCR_LEN + \
362 NUM_STREAMS * (USB_INTERFACE_DSCR_LEN + 2 * USB_EP_DSCR_LEN))
367 static uint8_t config_descriptors[CFG_DSCR_TOTAL_LEN] = {
371 USB_CFG_DSCR_LEN + 2 * (USB_INTERFACE_DSCR_LEN + 2 * USB_EP_DSCR_LEN),
373 VEND_INTERFACE_DSCR(0, 2, 0x50, 1),
374 USB_BULK_EP_DSCR(0, 1, 32, 0),
375 USB_BULK_EP_DSCR(1, 1, 32, 4),
376 VEND_INTERFACE_DSCR(1, 2, 0x50, 1),
377 USB_BULK_EP_DSCR(0, 2, 32, 0),
378 USB_BULK_EP_DSCR(1, 2, 32, 4),
385 static uint32_t frame_interval = 1000u;
397 static dif_pinmux_t pinmux;
401 static dif_rstmgr_t rstmgr;
405 static dif_pwrmgr_t pwrmgr;
409 static dif_rv_plic_t rv_plic;
413 static bool host_suspends =
true;
418 static bool host_resumes =
true;
422 static bool host_resets =
true;
426 static bool host_disconnects =
true;
438 static bool verbose =
true;
445 static bool s_verbose =
false;
447 static plic_isr_ctx_t plic_ctx = {.rv_plic = &rv_plic,
450 static pwrmgr_isr_ctx_t pwrmgr_isr_ctx = {
453 .expected_irq = kDifPwrmgrIrqWakeup,
454 .is_only_irq =
true};
458 static const unsigned nstreams = NUM_STREAMS;
460 static const usb_testutils_transfer_type_t xfr_types[] = {
461 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
462 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
463 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
464 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
465 kUsbTransferTypeIsochronous, kUsbTransferTypeIsochronous,
466 kUsbTransferTypeIsochronous};
467 #elif USE_BULK_STREAMS
468 static const usb_testutils_transfer_type_t xfr_types[] = {
469 kUsbTransferTypeBulk, kUsbTransferTypeBulk, kUsbTransferTypeBulk,
470 kUsbTransferTypeBulk, kUsbTransferTypeBulk, kUsbTransferTypeBulk,
471 kUsbTransferTypeBulk, kUsbTransferTypeBulk, kUsbTransferTypeBulk,
472 kUsbTransferTypeBulk, kUsbTransferTypeBulk};
474 static const usb_testutils_transfer_type_t xfr_types[] = {
475 kUsbTransferTypeIsochronous, kUsbTransferTypeInterrupt,
476 kUsbTransferTypeBulk, kUsbTransferTypeBulk,
478 kUsbTransferTypeIsochronous, kUsbTransferTypeInterrupt,
479 kUsbTransferTypeBulk, kUsbTransferTypeIsochronous,
481 kUsbTransferTypeInterrupt, kUsbTransferTypeBulk,
482 kUsbTransferTypeBulk,
487 static const usbdev_stream_flags_t test_flags =
488 kUsbdevStreamFlagRetrieve | kUsbdevStreamFlagCheck |
489 kUsbdevStreamFlagRetry | kUsbdevStreamFlagSend;
492 static const uint32_t transfer_bytes = 0x80 << 20;
505 #define report_progress(...) LOG_INFO(__VA_ARGS__)
510 static inline bool physical_timings(
void) {
525 static uint32_t time_frames(
unsigned n) {
527 if (physical_timings()) {
530 return scale * n * frame_interval;
534 static const char *phase_name(usbdev_suspend_phase_t phase) {
536 case kSuspendPhaseSuspend:
538 case kSuspendPhaseSleepResume:
539 return "SleepResume";
540 case kSuspendPhaseSleepReset:
542 case kSuspendPhaseSleepDisconnect:
543 return "SleepDisconnect";
544 case kSuspendPhaseDeepResume:
546 case kSuspendPhaseDeepReset:
548 case kSuspendPhaseDeepDisconnect:
549 return "DeepDisconnect";
550 case kSuspendPhaseShutdown:
558 static const char *state_name(usbdev_suspend_state_t state) {
560 case kSuspendStatePowerOnReset:
561 return "PowerOnReset";
562 case kSuspendStateBusReset:
564 case kSuspendStateWaitSuspend:
565 return "WaitSuspend";
566 case kSuspendStateWaitResume:
568 case kSuspendStateWaitBusReset:
569 return "WaitBusReset";
570 case kSuspendStateWaitLongSuspend:
571 return "WaitLongSuspend";
572 case kSuspendStateWaitSuspendTimeout:
573 return "WaitSuspendTimeout";
574 case kSuspendStateActivatedAON:
575 return "ActivatedAON";
576 case kSuspendStateNormalSleep:
577 return "NormalSleep";
578 case kSuspendStateDeepSleep:
580 case kSuspendStateNormalWaking:
581 return "NormalWaking";
582 case kSuspendStateDeepWaking:
584 case kSuspendStateAONWakeup:
586 case kSuspendStateWaitResumeTimeout:
587 return "WaitResumeTimeout";
588 case kSuspendStateWaitDisconnect:
589 return "WaitDisconnect";
590 case kSuspendStateWaitFinish:
592 case kSuspendStateNextPhase:
594 case kSuspendStateComplete:
596 case kSuspendStateFailed:
607 if (snapshot & (1u << kDifUsbdevIrqPowered)) {
610 if (snapshot & (1u << kDifUsbdevIrqDisconnected)) {
613 if (snapshot & (1u << kDifUsbdevIrqLinkReset)) {
616 if (snapshot & (1u << kDifUsbdevIrqHostLost)) {
622 ((1u << kDifUsbdevIrqLinkSuspend) | (1u << kDifUsbdevIrqLinkResume))) {
623 switch (link_state) {
624 case kDifUsbdevLinkStatePoweredSuspended:
625 case kDifUsbdevLinkStateSuspended:
629 case kDifUsbdevLinkStateResuming:
633 case kDifUsbdevLinkStateActiveNoSof:
637 case kDifUsbdevLinkStateActive:
649 usbdev_suspend_state_t state) {
651 LOG_INFO(
"entering state %s", state_name(state));
658 uint32_t interval_us) {
660 LOG_INFO(
"timeout_set %uus\n", interval_us);
663 uint64_t then = now + interval_us;
664 LOG_INFO(
" setting timeout to 0x%x%x (at 0x%x%x)",
665 (uint32_t)(then >> 32), (uint32_t)then, (uint32_t)(now >> 32),
674 uint32_t interval_frames) {
675 timeout_set(ctx, time_frames(interval_frames));
682 while (niters-- > 0u) {
685 #if USBUTILS_FUNCTION_POINTS
686 uint32_t data = (sense.
rx_dp ? 1U : 0) | (sense.
rx_dn ? 2U : 0) |
689 USBUTILS_FUNCPT(0x515, data);
692 "sense %u : rx_dp %u rx_dn %u rx_d %u : tx_dp %u tx_dn %u tx_d %u "
703 LOG_INFO(
"wake status active %u disconnected %u bus_reset %u",
707 LOG_INFO(
" (host_resumes %u host_resets %u host_disconnects %u)",
708 host_resumes, host_resets, host_disconnects);
718 report_wake_status(ctx);
726 void ottf_external_isr(
void) {
727 dif_pwrmgr_irq_t irq_id;
730 isr_testutils_pwrmgr_isr(plic_ctx, pwrmgr_isr_ctx, &peripheral, &irq_id);
733 const bool debug =
false;
736 sense_report(ctx, 2);
737 LOG_INFO(
"Received Wakeup IRQ in sleep");
740 (void)collect_wake_status(ctx);
741 sense_report(ctx, 10u);
744 LOG_INFO(
"Received Wakeup IRQ in sleep");
750 "IRQ peripheral: %d is incorrect", peripheral);
751 CHECK(irq_id == kDifPwrmgrIrqWakeup,
"IRQ ID: %d is incorrect", irq_id);
759 .words = (uint32_t *)state,
760 .len =
sizeof(*state) / 4});
767 memcpy(state, (uint8_t *)kRetSramOwnerAddr,
sizeof(*state));
772 LOG_INFO(
"phase_set %u (%s)", phase, phase_name(phase));
779 uint8_t test_descriptor[] = {
780 USB_TESTUTILS_TEST_DSCR(kUsbTestNumberSuspend,
791 static status_t link_callback(
void *ctx_v,
792 dif_usbdev_irq_state_snapshot_t snapshot,
796 if (snapshot & (1u << kDifUsbdevIrqFrame)) {
810 snapshot &= ~(1u << kDifUsbdevIrqFrame);
820 events_report(ctx, snapshot, link_state);
831 case kSuspendStateWaitSuspend:
832 if (snapshot & (1u << kDifUsbdevIrqLinkSuspend)) {
833 state_enter(ctx, kSuspendStateWaitResume);
834 timeout_set(ctx, TimeoutResumeMissed);
840 case kSuspendStateWaitResume:
841 if (snapshot & (1u << kDifUsbdevIrqLinkResume)) {
842 state_enter(ctx, kSuspendStateNextPhase);
849 case kSuspendStateWaitBusReset:
850 if (snapshot & (1u << kDifUsbdevIrqLinkReset)) {
851 state_enter(ctx, kSuspendStateBusReset);
856 case kSuspendStateWaitLongSuspend:
857 if (snapshot & (1u << kDifUsbdevIrqLinkSuspend)) {
858 state_enter(ctx, kSuspendStateWaitSuspendTimeout);
859 timeout_frames_set(ctx, FramesWaitEnterSleep);
865 case kSuspendStateWaitSuspendTimeout:
867 state_enter(ctx, kSuspendStateFailed);
871 case kSuspendStateWaitDisconnect:
872 if (snapshot & (1u << kDifUsbdevIrqDisconnected)) {
873 state_enter(ctx, kSuspendStateComplete);
877 case kSuspendStateActivatedAON:
880 case kSuspendStateNormalSleep:
881 case kSuspendStateDeepSleep:
883 case kSuspendStateAONWakeup:
886 case kSuspendStateWaitResumeTimeout:
889 case kSuspendStateWaitFinish:
892 if (snapshot & (1u << kDifUsbdevLinkStateDisconnected)) {
893 state_enter(ctx, kSuspendStateComplete);
897 case kSuspendStatePowerOnReset:
898 case kSuspendStateBusReset:
899 case kSuspendStateNextPhase:
902 case kSuspendStateNormalWaking:
903 case kSuspendStateDeepWaking:
907 case kSuspendStateFailed:
908 case kSuspendStateComplete:
914 state_enter(ctx, kSuspendStateFailed);
918 if (verbose && ctx->
test_state == kSuspendStateFailed) {
919 LOG_INFO(
" -> failed handling snapshot 0x%x with link state 0x%x\n",
920 snapshot, link_state);
928 static size_t base_dev_uart(
void *data,
const char *buf,
size_t len) {
930 for (
size_t i = 0; i < len; ++i) {
931 *(uint32_t *)0x411f0084 = ((uint8_t *)buf)[i];
940 .sink = base_dev_uart,
957 case kSuspendStateWaitSuspend:
958 if (!host_suspends) {
960 state_enter(ctx, kSuspendStateWaitResume);
961 timeout_frames_set(ctx, FramesInitiateResume);
966 case kSuspendStateWaitLongSuspend:
967 if (!host_suspends) {
968 LOG_INFO(
"auto-long-suspending (FPGA)");
969 state_enter(ctx, kSuspendStateWaitSuspendTimeout);
970 timeout_frames_set(ctx, FramesWaitEnterSleep);
978 case kSuspendStateWaitSuspendTimeout:
984 state_enter(ctx, kSuspendStateActivatedAON);
985 timeout_frames_set(ctx, TimeoutAonResponse);
989 case kSuspendStateWaitResume:
991 LOG_INFO(
"auto-resuming (host does not support Resume Signaling)");
992 state_enter(ctx, kSuspendStateWaitBusReset);
993 timeout_frames_set(ctx, 10000u);
999 case kSuspendStateWaitResumeTimeout:
1002 state_enter(ctx, kSuspendStateNextPhase);
1009 case kSuspendStateWaitBusReset:
1011 LOG_INFO(
"auto-resetting (host does not support Bus Resets)");
1014 state_enter(ctx, kSuspendStateNextPhase);
1028 state_enter(ctx, kSuspendStateFailed);
1048 TRY(usb_testutils_init(ctx->
usbdev,
false,
1053 TRY(usb_testutils_link_callback_register(ctx->
usbdev, link_callback, ctx));
1061 TRY(usb_testutils_streams_init(&usbdev_streams, nstreams, xfr_types,
1062 transfer_bytes, test_flags, s_verbose));
1070 TRY(usb_testutils_streams_typed_init(&usbdev_streams, config_descriptors,
1071 sizeof(config_descriptors), nstreams,
1072 xfr_types, transfer_bytes, test_flags,
1073 s_verbose, &dpi_types));
1079 TRY(usb_testutils_controlep_init(
1080 &usbdev_control, ctx->
usbdev, 0, config_descriptors,
1092 uint32_t timeout = FramesSuspendMissed;
1094 TRY_CHECK(ctx->
test_state == kSuspendStateNextPhase ||
1096 ctx->
test_state == kSuspendStatePowerOnReset ||
1101 if (ctx->
test_state != kSuspendStateNextPhase) {
1102 TRY(software_init(ctx));
1106 case kSuspendStatePowerOnReset:
1107 case kSuspendStateBusReset:
1111 if (physical_timings()) {
1112 timeout_set(ctx, TimeoutPhysConfig);
1116 timeout_frames_set(ctx, 8u);
1120 LOG_INFO(
"waiting to be configured");
1123 while (usbdev_control.device_state != kUsbTestutilsDeviceConfigured &&
1125 TRY(usb_testutils_poll(ctx->
usbdev));
1129 TRY_CHECK(usbdev_control.device_state == kUsbTestutilsDeviceConfigured);
1135 timeout += FramesConfigDelay;
1138 case kSuspendStateNextPhase:
1143 TRY_CHECK(ctx->
test_state == kSuspendStateDeepSleep);
1150 TRY(usb_testutils_streams_resume(&usbdev_streams,
1163 #if USBDEV_HAVE_TOGGLE_STATE
1177 usbdev_control.device_state = kUsbTestutilsDeviceConfigured;
1179 usbdev_control.
new_dev = dev_address;
1185 TRY_CHECK(link_state == kDifUsbdevLinkStatePowered ||
1186 link_state == kDifUsbdevLinkStateDisconnected);
1188 if (link_state == kDifUsbdevLinkStatePowered) {
1192 #if USBDEV_HAVE_TOGGLE_STATE
1194 LOG_INFO(
"in_toggles 0x%03x out_toggles 0x%03x", in_toggles,
1199 LOG_INFO(
"Warning: Unable to reinstate Data Toggle bits");
1206 if (ctx->
test_state != kSuspendStateNextPhase) {
1208 if (ctx->
test_state == kSuspendStateDeepSleep) {
1214 LOG_INFO(
"Configured; starting streaming...");
1219 LOG_INFO(
"Configured; not trying to stream...");
1226 case kSuspendPhaseShutdown:
1230 state_enter(ctx, kSuspendStateWaitDisconnect);
1233 case kSuspendPhaseSuspend:
1234 state_enter(ctx, kSuspendStateWaitSuspend);
1238 CHECK(ctx->
test_phase == kSuspendPhaseDeepDisconnect);
1240 case kSuspendPhaseDeepReset:
1241 case kSuspendPhaseDeepResume:
1242 if (ctx->
test_state == kSuspendStateDeepSleep) {
1243 state_enter(ctx, kSuspendStateDeepWaking);
1250 case kSuspendPhaseSleepDisconnect:
1251 case kSuspendPhaseSleepReset:
1252 case kSuspendPhaseSleepResume:
1253 if (host_suspends) {
1257 state_enter(ctx, kSuspendStateWaitLongSuspend);
1261 timeout_frames_set(ctx, timeout);
1276 case kSuspendStateActivatedAON:
1279 TRY(collect_wake_status(ctx));
1288 #
if USBDEV_HAVE_TOGGLE_STATE
1290 uint16_t out_toggles, in_toggles;
1294 ((uint32_t)in_toggles << 16) | out_toggles;
1299 LOG_INFO(
" - retaining address %u config %u phase %u (%s)",
1308 TRY(usb_testutils_streams_suspend(
1321 bool can_awaken =
true;
1323 case kSuspendPhaseSleepReset:
1324 case kSuspendPhaseDeepReset:
1327 LOG_INFO(
"auto-skipping WFI (host does not support Bus Resets");
1333 case kSuspendPhaseSleepDisconnect:
1334 case kSuspendPhaseDeepDisconnect:
1335 if (!host_disconnects) {
1338 "auto-skipping WFI (host does not support Disconnects");
1345 TRY_CHECK(ctx->
test_phase == kSuspendPhaseSleepResume ||
1347 if (!host_resumes) {
1350 "auto-skipping WFI (host does not support Resume "
1359 if (ctx->
test_phase == kSuspendPhaseDeepResume ||
1361 ctx->
test_phase == kSuspendPhaseDeepDisconnect) {
1371 TRY(pwrmgr_testutils_enable_low_power(
1372 &pwrmgr, kDifPwrmgrWakeupRequestSourceFour,
1374 kDifPwrmgrDomainOptionUsbClockInActivePower));
1378 state_enter(ctx, kSuspendStateDeepSleep);
1379 timeout_frames_set(ctx, TimeoutSleepFailed);
1381 LOG_INFO(
"Requesting Normal sleep");
1384 TRY(pwrmgr_testutils_enable_low_power(
1385 &pwrmgr, kDifPwrmgrWakeupRequestSourceFour,
1388 kDifPwrmgrDomainOptionUsbClockInActivePower |
1389 kDifPwrmgrDomainOptionMainPowerInLowPower));
1393 state_enter(ctx, kSuspendStateNormalSleep);
1394 timeout_frames_set(ctx, TimeoutSleepFailed);
1398 const char *action =
"";
1399 if (physical_timings()) {
1401 case kSuspendPhaseSleepReset:
1402 case kSuspendPhaseDeepReset:
1403 action =
"; please Reset the device.";
1405 case kSuspendPhaseSleepDisconnect:
1406 case kSuspendPhaseDeepDisconnect:
1407 action =
"; please disconnect and reconnect the USB cable.";
1415 LOG_INFO(
"Issuing WFI to enter sleep%s", action);
1421 TRY_CHECK(ctx->
test_state == kSuspendStateNormalSleep);
1441 (!host_disconnects &&
1446 retention_sram_load(&stored_state);
1448 LOG_INFO(
" - retained address %u config %u phase %u (%s)",
1467 LOG_INFO(
"wakeup types 0x%x sources 0x%x", wakeup_reason.
types,
1471 state_enter(ctx, kSuspendStateNormalWaking);
1473 timeout_frames_set(ctx, TimeoutSleepFailed);
1477 case kSuspendStateNormalWaking:
1478 case kSuspendStateDeepWaking:
1481 TRY(collect_wake_status(ctx));
1494 bool got_signal =
false;
1497 case kSuspendPhaseSleepResume:
1498 case kSuspendPhaseDeepResume:
1502 case kSuspendPhaseSleepReset:
1503 case kSuspendPhaseDeepReset:
1508 TRY_CHECK(ctx->
test_phase == kSuspendPhaseDeepDisconnect);
1510 case kSuspendPhaseSleepDisconnect:
1525 LOG_INFO(
"Handling Disconnection when VBUS %sasserted",
1526 sense ?
"" :
"de-");
1531 static uint8_t buf[4096];
1532 extern void usbutils_gather(dif_usbdev_t * dev, uint8_t * buf,
1539 usbutils_gather(ctx->
usbdev->dev, buf,
sizeof(buf));
1555 state_enter(ctx, kSuspendStateAONWakeup);
1556 timeout_frames_set(ctx, TimeoutAonResponse);
1558 LOG_INFO(
"Unexpected report from USB AON Wake module");
1559 report_wake_status(ctx);
1560 state_enter(ctx, kSuspendStateFailed);
1563 LOG_INFO(
"AON/Wake module not active when expected");
1564 state_enter(ctx, kSuspendStateFailed);
1568 case kSuspendStateAONWakeup:
1572 TRY(collect_wake_status(ctx));
1581 case kSuspendPhaseSleepDisconnect:
1582 case kSuspendPhaseDeepDisconnect:
1583 state_enter(ctx, host_disconnects ? kSuspendStatePowerOnReset
1584 : kSuspendStateNextPhase);
1587 case kSuspendPhaseSleepReset:
1588 case kSuspendPhaseDeepReset:
1591 state_enter(ctx, kSuspendStateBusReset);
1595 TRY_CHECK(ctx->
test_phase == kSuspendPhaseDeepResume);
1597 case kSuspendPhaseSleepResume:
1598 state_enter(ctx, kSuspendStateWaitResumeTimeout);
1599 timeout_set(ctx, TimeoutWakeupResume);
1603 LOG_INFO(
"AON Wake module not active when expected");
1604 state_enter(ctx, kSuspendStateFailed);
1609 case kSuspendStateWaitFinish:
1613 case kSuspendStatePowerOnReset:
1614 case kSuspendStateBusReset:
1615 case kSuspendStateNextPhase:
1616 case kSuspendStateComplete:
1617 case kSuspendStateFailed:
1625 TRY_CHECK(ctx->
test_state == kSuspendStateWaitResumeTimeout);
1627 case kSuspendStateWaitSuspend:
1628 case kSuspendStateWaitResume:
1629 case kSuspendStateWaitBusReset:
1630 case kSuspendStateWaitLongSuspend:
1631 case kSuspendStateWaitSuspendTimeout:
1632 case kSuspendStateWaitDisconnect:
1643 bool send_progress = (ctx->
test_state != kSuspendStateDeepSleep);
1644 bool phase_done =
false;
1648 TRY(phase_start_resume(ctx));
1650 if (send_progress) {
1651 report_progress(
"Phase awaiting stimulus (%s)",
1656 case kSuspendStateBusReset:
1657 case kSuspendStateNextPhase:
1658 case kSuspendStatePowerOnReset:
1659 case kSuspendStateComplete:
1660 case kSuspendStateFailed:
1662 "Phase-initial state %u (%s) should have been handled in "
1665 return FAILED_PRECONDITION();
1674 TRY(timeout_handle(ctx));
1676 TRY(state_service(ctx));
1682 case kSuspendStateBusReset:
1683 case kSuspendStateNextPhase:
1684 case kSuspendStatePowerOnReset:
1685 case kSuspendStateComplete:
1686 case kSuspendStateFailed:
1691 case kSuspendStateActivatedAON:
1692 case kSuspendStateAONWakeup:
1693 case kSuspendStateDeepSleep:
1694 case kSuspendStateNormalSleep:
1698 case kSuspendStateWaitResume:
1701 TRY(usb_testutils_poll(ctx->
usbdev));
1711 TRY(usb_testutils_streams_service(&usbdev_streams));
1715 TRY(usb_testutils_poll(ctx->
usbdev));
1719 }
while (!phase_done);
1724 case kSuspendStatePowerOnReset:
1725 case kSuspendStateBusReset:
1726 case kSuspendStateNextPhase: {
1728 usbdev_suspend_phase_t next_phase =
1729 (usbdev_suspend_phase_t)(ctx->
test_phase + 1u);
1730 bool completed =
false;
1733 LOG_INFO(
"Rewinding to initial phase");
1744 state_enter(ctx, kSuspendStateComplete);
1747 phase_set(ctx, next_phase);
1752 TRY_CHECK(ctx->
test_state == kSuspendStateComplete ||
1760 bool usbdev_suspend_test(usbdev_suspend_phase_t init_phase,
1761 usbdev_suspend_phase_t fin_phase, uint32_t num_iters,
1762 bool with_traffic) {
1771 memset(ctx, 0,
sizeof(*ctx));
1774 irq_global_ctrl(
true);
1775 irq_external_ctrl(
true);
1778 CHECK(fin_phase >= init_phase);
1784 host_suspends =
true;
1785 host_resumes =
true;
1787 host_disconnects =
true;
1799 #if !USBDPI_FULL_FRAME
1800 frame_interval = 500u;
1815 host_suspends =
true;
1816 host_resumes =
true;
1818 host_disconnects =
true;
1830 host_suspends =
true;
1831 host_resumes =
true;
1834 host_disconnects =
false;
1845 CHECK_DIF_OK(dif_pinmux_init(
1847 pinmux_testutils_init(&pinmux);
1853 CHECK_DIF_OK(dif_pwrmgr_init(
1857 CHECK_DIF_OK(dif_rv_plic_init(
1861 CHECK_DIF_OK(dif_rstmgr_init(
1870 kDifPwrmgrWakeupRequestSourceFour,
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);