15 #include "sw/device/lib/testing/aon_timer_testutils.h"
16 #include "sw/device/lib/testing/pwrmgr_testutils.h"
17 #include "sw/device/lib/testing/rstmgr_testutils.h"
18 #include "sw/device/lib/testing/test_framework/check.h"
21 #include "usbdev_regs.h"
23 static_assert(kDtPwrmgrCount == 1,
"this test expects exactly one pwrmgr");
24 static const dt_pwrmgr_t kPwrmgrDt = 0;
25 static_assert(kDtRstmgrCount == 1,
"this test expects exactly one rstmgr");
26 static const dt_rstmgr_t kRstmgrDt = 0;
27 static_assert(kDtAonTimerCount >= 1,
28 "this test expects at least one aon_timer");
29 static const dt_aon_timer_t kAonTimerDt = 0;
30 static const dt_usbdev_t kUsbdevDt = 0;
31 static_assert(kDtUsbdevCount >= 1,
"this test expects at least one usbdev");
33 OTTF_DEFINE_TEST_CONFIG();
35 static dif_aon_timer_t aon_timer;
36 static dif_usbdev_t usbdev;
38 static const uint32_t kExpectedHungOffset = USBDEV_INTR_ENABLE_REG_OFFSET;
40 static void usbdev_csr_access(
void) {
41 CHECK_DIF_OK(dif_usbdev_irq_set_enabled(&usbdev, kDifUsbdevIrqPowered,
45 dif_usbdev_irq_get_enabled(&usbdev, kDifUsbdevIrqPowered, &state));
53 CHECK_DIF_OK(dif_rstmgr_init_from_dt(kRstmgrDt, &rstmgr));
54 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
55 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
56 CHECK_DIF_OK(dif_usbdev_init_from_dt(kUsbdevDt, &usbdev));
62 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
69 uint32_t bite_cycles = 0;
71 aon_timer_testutils_get_aon_cycles_32_from_us(bite_us, &bite_cycles));
72 LOG_INFO(
"Setting bite reset for %u us (%u cycles)", bite_us, bite_cycles);
75 CHECK_STATUS_OK(aon_timer_testutils_watchdog_config(&aon_timer, UINT32_MAX,
82 kDtAonTimerResetReqAonTimer, &reset_sources));
95 LOG_ERROR(
"This is unreachable since a reset should have been triggered");
97 }
else if (UNWRAP(rstmgr_testutils_is_reset_info(
98 &rstmgr, kDifRstmgrResetInfoWatchdog))) {
99 LOG_INFO(
"Got an expected watchdog reset when accessing USB");
109 CHECK(size_read == actual_size);
110 LOG_INFO(
"EXC_ADDR = 0x%x", cpu_dump[0]);
111 LOG_INFO(
"EXC_PC = 0x%x", cpu_dump[1]);
112 LOG_INFO(
"LAST_DATA ADDR = 0x%x", cpu_dump[2]);
113 LOG_INFO(
"NEXT_PC = 0x%x", cpu_dump[3]);
114 LOG_INFO(
"CURRENT_PC = 0x%x", cpu_dump[4]);
115 LOG_INFO(
"PREV_EXC_ADDR = 0x%x", cpu_dump[5]);
116 LOG_INFO(
"PREV_EXC_PC = 0x%x", cpu_dump[6]);
117 LOG_INFO(
"PREV_VALID = 0x%x", cpu_dump[7]);
119 uint32_t expected_addr =
120 dt_usbdev_primary_reg_block(kUsbdevDt) + kExpectedHungOffset;
121 CHECK(cpu_dump[2] == expected_addr,
"Unexpected hung address");
125 reset_info = rstmgr_testutils_reason_get();
126 LOG_ERROR(
"Unexpected reset_info 0x%x", reset_info);