5 #include "dt/dt_pinmux.h"
6 #include "dt/dt_sysrst_ctrl.h"
12 #include "sw/device/lib/testing/sysrst_ctrl_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
15 #include "sw/device/lib/testing/test_framework/ottf_utils.h"
19 OTTF_DEFINE_TEST_CONFIG(.enable_uart_flow_control =
true);
21 static dif_pinmux_t pinmux;
22 static const dt_pinmux_t kPinmuxDt = kDtPinmuxAon;
23 static const dt_sysrst_ctrl_t kSysrstCtrlDt = kDtSysrstCtrlAon;
24 static dif_sysrst_ctrl_t sysrst_ctrl;
27 kTestPhaseTimeoutUsecDV = 100,
28 kTestPhaseTimeoutUsecReal = 1000000,
33 kTestPhaseLoopback = 1,
34 kTestPhaseOverrideSetup = 2,
35 kTestPhaseOverrideZeros = 3,
36 kTestPhaseOverrideOnes = 4,
37 kTestPhaseOverrideRelease = 5,
38 kTestPhaseOverrideAndLoopback = 6,
45 kLoopbackPartial = 0x5,
51 static const dt_sysrst_ctrl_periph_io_t kPeripheralInputs[] = {
52 kDtSysrstCtrlPeriphIoKey0In,
53 kDtSysrstCtrlPeriphIoKey1In,
54 kDtSysrstCtrlPeriphIoKey2In,
55 kDtSysrstCtrlPeriphIoPwrbIn,
58 static const dt_pad_t kInputPadsDV[] = {
65 static const dt_pad_t kInputPadsReal[] = {
72 static const dt_sysrst_ctrl_periph_io_t kPeripheralOutputs[] = {
73 kDtSysrstCtrlPeriphIoKey0Out, kDtSysrstCtrlPeriphIoKey1Out,
74 kDtSysrstCtrlPeriphIoKey2Out, kDtSysrstCtrlPeriphIoPwrbOut,
75 kDtSysrstCtrlPeriphIoBatDisable, kDtSysrstCtrlPeriphIoZ3Wakeup,
78 static const dt_pad_t kOutputPadsDV[] = {
79 kDtPadIob9, kDtPadIor5, kDtPadIor6, kDtPadIoc7, kDtPadIoc9, kDtPadIob7,
81 static const dt_pad_t kOutputPadsReal[] = {
82 kDtPadIor6, kDtPadIor7, kDtPadIob0, kDtPadIob1, kDtPadIob2, kDtPadIob3,
96 static volatile const uint8_t kTestPhaseDV = 0;
98 static volatile const uint8_t kTestPhaseReal = kTestPhaseSetup;
102 static
void pinmux_setup(
void) {
105 sysrst_ctrl_testutils_setup_dio(&pinmux);
107 sysrst_ctrl_testutils_release_dio(&sysrst_ctrl,
true,
true);
109 sysrst_ctrl_testutils_set_ec_rst_pulse_width(&sysrst_ctrl, 0);
113 for (
int i = 0; i < kNumMioInputs; ++i) {
115 &pinmux, dt_sysrst_ctrl_periph_io(kSysrstCtrlDt, kPeripheralInputs[i]),
120 for (
int i = 0; i < kNumMioOutputs; ++i) {
122 &pinmux, kOutputPads[i],
123 dt_sysrst_ctrl_periph_io(kSysrstCtrlDt, kPeripheralOutputs[i])));
131 static void sync_with_testbench(uint8_t prior_phase) {
134 test_status_set(kTestStatusInWfi);
135 test_status_set(kTestStatusInTest);
137 OTTF_WAIT_FOR(OTTF_BACKDOOR_READ(kTestPhaseDV) != prior_phase,
138 kTestPhaseTimeoutUsecDV);
140 OTTF_WAIT_FOR(prior_phase != kTestPhaseReal, kTestPhaseTimeoutUsecReal);
146 static void override_setup(uint8_t pins_to_override) {
147 for (
int i = 0; i < kOutputNumPads; ++i) {
148 if ((pins_to_override >> i) & 0x1) {
152 &sysrst_ctrl, kSysrstCtrlOutputs[i],
true,
true));
159 static void override_disable(
void) {
160 for (
int i = 0; i < kOutputNumPads; ++i) {
167 static void set_output_overrides(uint8_t override_value) {
168 for (
int i = 0; i < kOutputNumPads; ++i) {
170 &sysrst_ctrl, kSysrstCtrlOutputs[i], (override_value >> i) & 0x1));
175 CHECK_DIF_OK(dif_pinmux_init_from_dt(kPinmuxDt, &pinmux));
176 CHECK_DIF_OK(dif_sysrst_ctrl_init_from_dt(kSysrstCtrlDt, &sysrst_ctrl));
178 const volatile uint8_t *kTestPhase =
180 uint8_t current_test_phase = *kTestPhase;
181 while (current_test_phase < kTestPhaseDone) {
182 LOG_INFO(
"Test phase %d", current_test_phase);
183 switch (current_test_phase) {
184 case kTestPhaseSetup:
187 case kTestPhaseLoopback:
189 case kTestPhaseOverrideSetup:
190 override_setup(kAllOne);
192 case kTestPhaseOverrideZeros:
193 set_output_overrides(kAllZero);
195 case kTestPhaseOverrideOnes:
196 set_output_overrides(kAllOne);
198 case kTestPhaseOverrideRelease:
201 case kTestPhaseOverrideAndLoopback:
202 override_setup(kLoopbackPartial);
203 set_output_overrides(kLoopbackPartial);
206 LOG_ERROR(
"Unexpected test phase : %d", *kTestPhase);
209 sync_with_testbench(current_test_phase);
210 current_test_phase = *kTestPhase;