Skip to content

Commit 0b8baa5

Browse files
author
Filip Jagodzinski
committed
Tests: ResetReason: Use the get_capabilities()
Make use of the new hal_reset_reason_get_capabilities() function to skip unsupported reset resaons during tests.
1 parent 57420fc commit 0b8baa5

File tree

3 files changed

+69
-39
lines changed

3 files changed

+69
-39
lines changed

TESTS/host_tests/reset_reason.py

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
DEFAULT_SYNC_DELAY = 4.0
2121

22-
MSG_VALUE_WATCHDOG_PRESENT = 'wdg_present'
22+
MSG_VALUE_WATCHDOG_PRESENT = 1
2323
MSG_VALUE_DUMMY = '0'
2424
MSG_VALUE_RESET_REASON_GET = 'get'
2525
MSG_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

TESTS/mbed_drivers/reset_reason/main.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,11 @@
2525
#include "mbed.h"
2626

2727
#if DEVICE_WATCHDOG
28-
#include "hal/watchdog_api.h"
29-
30-
#define MSG_VALUE_WATCHDOG_STATUS "wdg_present"
31-
#define WDG_TIMEOUT_MS 50UL
32-
28+
# include "hal/watchdog_api.h"
29+
# define MSG_VALUE_WATCHDOG_STATUS 1
30+
# define WDG_TIMEOUT_MS 50UL
3331
#else
34-
#define MSG_VALUE_WATCHDOG_STATUS "no_wdg"
32+
# define MSG_VALUE_WATCHDOG_STATUS 0
3533
#endif
3634

3735
#define MSG_VALUE_DUMMY "0"
@@ -119,8 +117,18 @@ static cmd_status_t handle_command(const char *key, const char *value)
119117

120118
void test_reset_reason()
121119
{
122-
// Report readiness and watchdog status.
123-
greentea_send_kv(MSG_KEY_DEVICE_READY, MSG_VALUE_WATCHDOG_STATUS);
120+
reset_reason_capabilities_t rrcap = {};
121+
hal_reset_reason_get_capabilities(&rrcap);
122+
char msg_value[11];
123+
int str_len = snprintf(msg_value, sizeof msg_value, "%08lx,%01x", rrcap.reasons, MSG_VALUE_WATCHDOG_STATUS);
124+
if (str_len != (sizeof msg_value) - 1) {
125+
printf("Failed to compose a value string to be sent to host.");
126+
GREENTEA_TESTSUITE_RESULT(0);
127+
return;
128+
}
129+
130+
// Report readiness, capabilities and watchdog status.
131+
greentea_send_kv(MSG_KEY_DEVICE_READY, msg_value);
124132

125133
cmd_status_t cmd_status = CMD_STATUS_CONTINUE;
126134
static char _key[MSG_KEY_LEN + 1] = { };

TESTS/mbed_hal/reset_reason/main.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,11 @@
2525
#include "mbed.h"
2626

2727
#if DEVICE_WATCHDOG
28-
#include "hal/watchdog_api.h"
29-
30-
#define MSG_VALUE_WATCHDOG_STATUS "wdg_present"
31-
#define WDG_TIMEOUT_MS 50UL
32-
28+
# include "hal/watchdog_api.h"
29+
# define MSG_VALUE_WATCHDOG_STATUS 1
30+
# define WDG_TIMEOUT_MS 50UL
3331
#else
34-
#define MSG_VALUE_WATCHDOG_STATUS "no_wdg"
32+
# define MSG_VALUE_WATCHDOG_STATUS 0
3533
#endif
3634

3735
#define MSG_VALUE_DUMMY "0"
@@ -126,8 +124,18 @@ static cmd_status_t handle_command(const char *key, const char *value)
126124

127125
void test_reset_reason()
128126
{
129-
// Report readiness and watchdog status.
130-
greentea_send_kv(MSG_KEY_DEVICE_READY, MSG_VALUE_WATCHDOG_STATUS);
127+
reset_reason_capabilities_t rrcap = {};
128+
hal_reset_reason_get_capabilities(&rrcap);
129+
char msg_value[11];
130+
int str_len = snprintf(msg_value, sizeof msg_value, "%08lx,%01x", rrcap.reasons, MSG_VALUE_WATCHDOG_STATUS);
131+
if (str_len != (sizeof msg_value) - 1) {
132+
printf("Failed to compose a value string to be sent to host.");
133+
GREENTEA_TESTSUITE_RESULT(0);
134+
return;
135+
}
136+
137+
// Report readiness, capabilities and watchdog status.
138+
greentea_send_kv(MSG_KEY_DEVICE_READY, msg_value);
131139

132140
cmd_status_t cmd_status = CMD_STATUS_CONTINUE;
133141
static char _key[MSG_KEY_LEN + 1] = { };

0 commit comments

Comments
 (0)