diff --git a/TESTS/host_tests/reset_reason.py b/TESTS/host_tests/reset_reason.py index 819a5f676f..4e33606767 100644 --- a/TESTS/host_tests/reset_reason.py +++ b/TESTS/host_tests/reset_reason.py @@ -19,7 +19,7 @@ from mbed_host_tests import BaseHostTest DEFAULT_SYNC_DELAY = 4.0 -MSG_VALUE_WATCHDOG_PRESENT = 'wdg_present' +MSG_VALUE_WATCHDOG_PRESENT = 1 MSG_VALUE_DUMMY = '0' MSG_VALUE_RESET_REASON_GET = 'get' MSG_VALUE_RESET_REASON_CLEAR = 'clear' @@ -66,6 +66,7 @@ class ResetReasonTest(BaseHostTest): def __init__(self): super(ResetReasonTest, self).__init__() + self.device_reasons = None self.device_has_watchdog = None self.raw_reset_reasons = set() self.sync_delay = DEFAULT_SYNC_DELAY @@ -85,10 +86,13 @@ class ResetReasonTest(BaseHostTest): def cb_device_ready(self, key, value, timestamp): """Request a raw value of the reset_reason register. - Additionally, save the device's watchdog status on the first call. + Additionally, save the device's reset_reason capabilities + and the watchdog status on the first call. """ - if self.device_has_watchdog is None: - self.device_has_watchdog = (value == MSG_VALUE_WATCHDOG_PRESENT) + if self.device_reasons is None: + reasons, wdg_status = (int(i, base=16) for i in value.split(',')) + self.device_has_watchdog = (wdg_status == MSG_VALUE_WATCHDOG_PRESENT) + self.device_reasons = [k for k, v in RESET_REASONS.items() if (reasons & 1 << int(v))] self.send_kv(MSG_KEY_RESET_REASON_RAW, MSG_VALUE_RESET_REASON_GET) def cb_reset_reason_raw(self, key, value, timestamp): @@ -133,35 +137,45 @@ class ResetReasonTest(BaseHostTest): __ignored_clear_ack = yield # Request a NVIC_SystemReset() call. - self.send_kv(MSG_KEY_DEVICE_RESET, MSG_VALUE_DEVICE_RESET_NVIC) - __ignored_reset_ack = yield - time.sleep(self.sync_delay) - self.send_kv(MSG_KEY_SYNC, MSG_VALUE_DUMMY) - reset_reason = yield - raise_if_different(RESET_REASONS['SOFTWARE'], reset_reason, 'Wrong reset reason. ') - self.send_kv(MSG_KEY_RESET_REASON, MSG_VALUE_RESET_REASON_CLEAR) - __ignored_clear_ack = yield + expected_reason = 'SOFTWARE' + if expected_reason not in self.device_reasons: + self.log('Skipping the {} reset reason -- not supported.'.format(expected_reason)) + else: + # Request a NVIC_SystemReset() call. + self.send_kv(MSG_KEY_DEVICE_RESET, MSG_VALUE_DEVICE_RESET_NVIC) + __ignored_reset_ack = yield + time.sleep(self.sync_delay) + self.send_kv(MSG_KEY_SYNC, MSG_VALUE_DUMMY) + reset_reason = yield + raise_if_different(RESET_REASONS[expected_reason], reset_reason, 'Wrong reset reason. ') + self.send_kv(MSG_KEY_RESET_REASON, MSG_VALUE_RESET_REASON_CLEAR) + __ignored_clear_ack = yield # Reset the device using DAP. - self.reset() - __ignored_reset_ack = yield # 'reset_complete' - time.sleep(self.sync_delay) - self.send_kv(MSG_KEY_SYNC, MSG_VALUE_DUMMY) - reset_reason = yield - raise_if_different(RESET_REASONS['PIN_RESET'], reset_reason, 'Wrong reset reason. ') - self.send_kv(MSG_KEY_RESET_REASON, MSG_VALUE_RESET_REASON_CLEAR) - __ignored_clear_ack = yield + expected_reason = 'PIN_RESET' + if expected_reason not in self.device_reasons: + self.log('Skipping the {} reset reason -- not supported.'.format(expected_reason)) + else: + self.reset() + __ignored_reset_ack = yield # 'reset_complete' + time.sleep(self.sync_delay) + self.send_kv(MSG_KEY_SYNC, MSG_VALUE_DUMMY) + reset_reason = yield + raise_if_different(RESET_REASONS[expected_reason], reset_reason, 'Wrong reset reason. ') + self.send_kv(MSG_KEY_RESET_REASON, MSG_VALUE_RESET_REASON_CLEAR) + __ignored_clear_ack = yield # Start a watchdog timer and wait for it to reset the device. - if not self.device_has_watchdog: - self.log('DUT does not have a watchdog. Skipping this reset reason.') + expected_reason = 'WATCHDOG' + if expected_reason not in self.device_reasons or not self.device_has_watchdog: + self.log('Skipping the {} reset reason -- not supported.'.format(expected_reason)) else: self.send_kv(MSG_KEY_DEVICE_RESET, MSG_VALUE_DEVICE_RESET_WATCHDOG) __ignored_reset_ack = yield time.sleep(self.sync_delay) self.send_kv(MSG_KEY_SYNC, MSG_VALUE_DUMMY) reset_reason = yield - raise_if_different(RESET_REASONS['WATCHDOG'], reset_reason, 'Wrong reset reason. ') + raise_if_different(RESET_REASONS[expected_reason], reset_reason, 'Wrong reset reason. ') # The sequence is correct -- test passed. yield True diff --git a/TESTS/mbed_drivers/reset_reason/main.cpp b/TESTS/mbed_drivers/reset_reason/main.cpp index f12a5a50fc..783d23cf36 100644 --- a/TESTS/mbed_drivers/reset_reason/main.cpp +++ b/TESTS/mbed_drivers/reset_reason/main.cpp @@ -25,13 +25,11 @@ #include "mbed.h" #if DEVICE_WATCHDOG -#include "hal/watchdog_api.h" - -#define MSG_VALUE_WATCHDOG_STATUS "wdg_present" -#define WDG_TIMEOUT_MS 50UL - +# include "hal/watchdog_api.h" +# define MSG_VALUE_WATCHDOG_STATUS 1 +# define WDG_TIMEOUT_MS 50UL #else -#define MSG_VALUE_WATCHDOG_STATUS "no_wdg" +# define MSG_VALUE_WATCHDOG_STATUS 0 #endif #define MSG_VALUE_DUMMY "0" @@ -119,8 +117,18 @@ static cmd_status_t handle_command(const char *key, const char *value) void test_reset_reason() { - // Report readiness and watchdog status. - greentea_send_kv(MSG_KEY_DEVICE_READY, MSG_VALUE_WATCHDOG_STATUS); + reset_reason_capabilities_t rrcap = {}; + hal_reset_reason_get_capabilities(&rrcap); + char msg_value[11]; + int str_len = snprintf(msg_value, sizeof msg_value, "%08lx,%01x", rrcap.reasons, MSG_VALUE_WATCHDOG_STATUS); + if (str_len != (sizeof msg_value) - 1) { + printf("Failed to compose a value string to be sent to host."); + GREENTEA_TESTSUITE_RESULT(0); + return; + } + + // Report readiness, capabilities and watchdog status. + greentea_send_kv(MSG_KEY_DEVICE_READY, msg_value); cmd_status_t cmd_status = CMD_STATUS_CONTINUE; static char _key[MSG_KEY_LEN + 1] = { }; diff --git a/TESTS/mbed_hal/reset_reason/main.cpp b/TESTS/mbed_hal/reset_reason/main.cpp index b97b907409..84e10c9254 100644 --- a/TESTS/mbed_hal/reset_reason/main.cpp +++ b/TESTS/mbed_hal/reset_reason/main.cpp @@ -25,13 +25,11 @@ #include "mbed.h" #if DEVICE_WATCHDOG -#include "hal/watchdog_api.h" - -#define MSG_VALUE_WATCHDOG_STATUS "wdg_present" -#define WDG_TIMEOUT_MS 50UL - +# include "hal/watchdog_api.h" +# define MSG_VALUE_WATCHDOG_STATUS 1 +# define WDG_TIMEOUT_MS 50UL #else -#define MSG_VALUE_WATCHDOG_STATUS "no_wdg" +# define MSG_VALUE_WATCHDOG_STATUS 0 #endif #define MSG_VALUE_DUMMY "0" @@ -126,8 +124,18 @@ static cmd_status_t handle_command(const char *key, const char *value) void test_reset_reason() { - // Report readiness and watchdog status. - greentea_send_kv(MSG_KEY_DEVICE_READY, MSG_VALUE_WATCHDOG_STATUS); + reset_reason_capabilities_t rrcap = {}; + hal_reset_reason_get_capabilities(&rrcap); + char msg_value[11]; + int str_len = snprintf(msg_value, sizeof msg_value, "%08lx,%01x", rrcap.reasons, MSG_VALUE_WATCHDOG_STATUS); + if (str_len != (sizeof msg_value) - 1) { + printf("Failed to compose a value string to be sent to host."); + GREENTEA_TESTSUITE_RESULT(0); + return; + } + + // Report readiness, capabilities and watchdog status. + greentea_send_kv(MSG_KEY_DEVICE_READY, msg_value); cmd_status_t cmd_status = CMD_STATUS_CONTINUE; static char _key[MSG_KEY_LEN + 1] = { };