19
19
20
20
DEFAULT_SYNC_DELAY = 4.0
21
21
22
- MSG_VALUE_WATCHDOG_PRESENT = 'wdg_present'
22
+ MSG_VALUE_WATCHDOG_PRESENT = 1
23
23
MSG_VALUE_DUMMY = '0'
24
24
MSG_VALUE_RESET_REASON_GET = 'get'
25
25
MSG_VALUE_RESET_REASON_CLEAR = 'clear'
@@ -66,6 +66,7 @@ class ResetReasonTest(BaseHostTest):
66
66
67
67
def __init__ (self ):
68
68
super (ResetReasonTest , self ).__init__ ()
69
+ self .device_reasons = None
69
70
self .device_has_watchdog = None
70
71
self .raw_reset_reasons = set ()
71
72
self .sync_delay = DEFAULT_SYNC_DELAY
@@ -85,10 +86,13 @@ def setup(self):
85
86
def cb_device_ready (self , key , value , timestamp ):
86
87
"""Request a raw value of the reset_reason register.
87
88
88
- Additionally, save the device's watchdog status on the first call.
89
+ Additionally, save the device's reset_reason capabilities
90
+ and the watchdog status on the first call.
89
91
"""
90
- if self .device_has_watchdog is None :
91
- self .device_has_watchdog = (value == MSG_VALUE_WATCHDOG_PRESENT )
92
+ if self .device_reasons is None :
93
+ reasons , wdg_status = (int (i , base = 16 ) for i in value .split (',' ))
94
+ self .device_has_watchdog = (wdg_status == MSG_VALUE_WATCHDOG_PRESENT )
95
+ self .device_reasons = [k for k , v in RESET_REASONS .items () if (reasons & 1 << int (v ))]
92
96
self .send_kv (MSG_KEY_RESET_REASON_RAW , MSG_VALUE_RESET_REASON_GET )
93
97
94
98
def cb_reset_reason_raw (self , key , value , timestamp ):
@@ -133,35 +137,45 @@ def test_steps(self):
133
137
__ignored_clear_ack = yield
134
138
135
139
# Request a NVIC_SystemReset() call.
136
- self .send_kv (MSG_KEY_DEVICE_RESET , MSG_VALUE_DEVICE_RESET_NVIC )
137
- __ignored_reset_ack = yield
138
- time .sleep (self .sync_delay )
139
- self .send_kv (MSG_KEY_SYNC , MSG_VALUE_DUMMY )
140
- reset_reason = yield
141
- raise_if_different (RESET_REASONS ['SOFTWARE' ], reset_reason , 'Wrong reset reason. ' )
142
- self .send_kv (MSG_KEY_RESET_REASON , MSG_VALUE_RESET_REASON_CLEAR )
143
- __ignored_clear_ack = yield
140
+ expected_reason = 'SOFTWARE'
141
+ if expected_reason not in self .device_reasons :
142
+ self .log ('Skipping the {} reset reason -- not supported.' .format (expected_reason ))
143
+ else :
144
+ # Request a NVIC_SystemReset() call.
145
+ self .send_kv (MSG_KEY_DEVICE_RESET , MSG_VALUE_DEVICE_RESET_NVIC )
146
+ __ignored_reset_ack = yield
147
+ time .sleep (self .sync_delay )
148
+ self .send_kv (MSG_KEY_SYNC , MSG_VALUE_DUMMY )
149
+ reset_reason = yield
150
+ raise_if_different (RESET_REASONS [expected_reason ], reset_reason , 'Wrong reset reason. ' )
151
+ self .send_kv (MSG_KEY_RESET_REASON , MSG_VALUE_RESET_REASON_CLEAR )
152
+ __ignored_clear_ack = yield
144
153
145
154
# Reset the device using DAP.
146
- self .reset ()
147
- __ignored_reset_ack = yield # 'reset_complete'
148
- time .sleep (self .sync_delay )
149
- self .send_kv (MSG_KEY_SYNC , MSG_VALUE_DUMMY )
150
- reset_reason = yield
151
- raise_if_different (RESET_REASONS ['PIN_RESET' ], reset_reason , 'Wrong reset reason. ' )
152
- self .send_kv (MSG_KEY_RESET_REASON , MSG_VALUE_RESET_REASON_CLEAR )
153
- __ignored_clear_ack = yield
155
+ expected_reason = 'PIN_RESET'
156
+ if expected_reason not in self .device_reasons :
157
+ self .log ('Skipping the {} reset reason -- not supported.' .format (expected_reason ))
158
+ else :
159
+ self .reset ()
160
+ __ignored_reset_ack = yield # 'reset_complete'
161
+ time .sleep (self .sync_delay )
162
+ self .send_kv (MSG_KEY_SYNC , MSG_VALUE_DUMMY )
163
+ reset_reason = yield
164
+ raise_if_different (RESET_REASONS [expected_reason ], reset_reason , 'Wrong reset reason. ' )
165
+ self .send_kv (MSG_KEY_RESET_REASON , MSG_VALUE_RESET_REASON_CLEAR )
166
+ __ignored_clear_ack = yield
154
167
155
168
# Start a watchdog timer and wait for it to reset the device.
156
- if not self .device_has_watchdog :
157
- self .log ('DUT does not have a watchdog. Skipping this reset reason.' )
169
+ expected_reason = 'WATCHDOG'
170
+ if expected_reason not in self .device_reasons or not self .device_has_watchdog :
171
+ self .log ('Skipping the {} reset reason -- not supported.' .format (expected_reason ))
158
172
else :
159
173
self .send_kv (MSG_KEY_DEVICE_RESET , MSG_VALUE_DEVICE_RESET_WATCHDOG )
160
174
__ignored_reset_ack = yield
161
175
time .sleep (self .sync_delay )
162
176
self .send_kv (MSG_KEY_SYNC , MSG_VALUE_DUMMY )
163
177
reset_reason = yield
164
- raise_if_different (RESET_REASONS ['WATCHDOG' ], reset_reason , 'Wrong reset reason. ' )
178
+ raise_if_different (RESET_REASONS [expected_reason ], reset_reason , 'Wrong reset reason. ' )
165
179
166
180
# The sequence is correct -- test passed.
167
181
yield True
0 commit comments