1919
2020DEFAULT_SYNC_DELAY = 4.0
2121
22- MSG_VALUE_WATCHDOG_PRESENT = 'wdg_present'
22+ MSG_VALUE_WATCHDOG_PRESENT = 1
2323MSG_VALUE_DUMMY = '0'
2424MSG_VALUE_RESET_REASON_GET = 'get'
2525MSG_VALUE_RESET_REASON_CLEAR = 'clear'
@@ -66,6 +66,7 @@ class ResetReasonTest(BaseHostTest):
6666
6767 def __init__ (self ):
6868 super (ResetReasonTest , self ).__init__ ()
69+ self .device_reasons = None
6970 self .device_has_watchdog = None
7071 self .raw_reset_reasons = set ()
7172 self .sync_delay = DEFAULT_SYNC_DELAY
@@ -85,10 +86,13 @@ def setup(self):
8586 def cb_device_ready (self , key , value , timestamp ):
8687 """Request a raw value of the reset_reason register.
8788
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.
8991 """
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 ))]
9296 self .send_kv (MSG_KEY_RESET_REASON_RAW , MSG_VALUE_RESET_REASON_GET )
9397
9498 def cb_reset_reason_raw (self , key , value , timestamp ):
@@ -133,35 +137,45 @@ def test_steps(self):
133137 __ignored_clear_ack = yield
134138
135139 # 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
144153
145154 # 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
154167
155168 # 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 ))
158172 else :
159173 self .send_kv (MSG_KEY_DEVICE_RESET , MSG_VALUE_DEVICE_RESET_WATCHDOG )
160174 __ignored_reset_ack = yield
161175 time .sleep (self .sync_delay )
162176 self .send_kv (MSG_KEY_SYNC , MSG_VALUE_DUMMY )
163177 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. ' )
165179
166180 # The sequence is correct -- test passed.
167181 yield True
0 commit comments