| /* |
| * Copyright (c) 2019 Alexander Wachter |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #include <zephyr/drivers/hwinfo.h> |
| #include <zephyr/ztest.h> |
| #include <strings.h> |
| #include <errno.h> |
| |
| /* |
| * @addtogroup t_hwinfo_get_device_id_api |
| * @{ |
| * @defgroup t_hwinfo_get_device_id test_hwinfo_get_device_id |
| * @brief TestPurpose: verify device id get works |
| * @details |
| * - Test Steps |
| * -# Read the ID |
| * -# Check if to many bytes are written to the buffer |
| * -# Check if UID is plausible |
| * - Expected Results |
| * -# Device uid with correct length should be written to the buffer. |
| * @} |
| */ |
| |
| #define BUFFER_LENGTH 17 |
| #define BUFFER_CANARY 0xFF |
| |
| ZTEST(hwinfo_device_id_api, test_device_id_get) |
| { |
| uint8_t buffer_1[BUFFER_LENGTH]; |
| uint8_t buffer_2[BUFFER_LENGTH]; |
| ssize_t length_read_1, length_read_2; |
| int i; |
| |
| length_read_1 = hwinfo_get_device_id(buffer_1, 1); |
| if (length_read_1 == -ENOSYS) { |
| ztest_test_skip(); |
| return; |
| } |
| |
| zassert_false((length_read_1 < 0), |
| "Unexpected negative return value: %d", length_read_1); |
| zassert_not_equal(length_read_1, 0, "Zero bytes read"); |
| zassert_equal(length_read_1, 1, "Length not adhered"); |
| |
| memset(buffer_1, BUFFER_CANARY, sizeof(buffer_1)); |
| |
| length_read_1 = hwinfo_get_device_id(buffer_1, BUFFER_LENGTH - 1); |
| zassert_equal(buffer_1[length_read_1], BUFFER_CANARY, |
| "Too many bytes are written"); |
| |
| memcpy(buffer_2, buffer_1, length_read_1); |
| |
| for (i = 0; i < BUFFER_LENGTH; i++) { |
| buffer_1[i] ^= 0xA5; |
| } |
| |
| length_read_2 = hwinfo_get_device_id(buffer_1, BUFFER_LENGTH - 1); |
| zassert_equal(length_read_1, length_read_2, "Length varied"); |
| |
| zassert_equal(buffer_1[length_read_1], (BUFFER_CANARY ^ 0xA5), |
| "Too many bytes are written"); |
| |
| for (i = 0; i < length_read_1; i++) { |
| zassert_equal(buffer_1[i], buffer_2[i], |
| "Two consecutively readings don't match"); |
| } |
| } |
| |
| /* |
| * @addtogroup t_hwinfo_get_reset_cause_api |
| * @{ |
| * @defgroup t_hwinfo_get_reset_cause test_hwinfo_get_reset_cause |
| * @brief TestPurpose: verify get reset cause works. |
| * @details |
| * - Test Steps |
| * -# Set target buffer to a known value |
| * -# Read the reset cause |
| * -# Check if target buffer has been altered |
| * - Expected Results |
| * -# Target buffer contents should be changed after the call. |
| * @} |
| */ |
| |
| ZTEST(hwinfo_device_id_api, test_get_reset_cause) |
| { |
| uint32_t cause; |
| ssize_t ret; |
| |
| /* Set `cause` to a known value prior to call. */ |
| cause = 0xDEADBEEF; |
| |
| ret = hwinfo_get_reset_cause(&cause); |
| if (ret == -ENOSYS) { |
| ztest_test_skip(); |
| return; |
| } |
| |
| zassert_false((ret < 0), |
| "Unexpected negative return value: %d", ret); |
| |
| /* Verify that `cause` has been changed. */ |
| zassert_not_equal(cause, 0xDEADBEEF, "Reset cause not written."); |
| } |
| |
| /* |
| * @addtogroup t_hwinfo_clear_reset_cause_api |
| * @{ |
| * @defgroup t_hwinfo_clear_reset_cause test_hwinfo_clear_reset_cause |
| * @brief TestPurpose: verify clear reset cause works. This may |
| * not work on some platforms, depending on how reset cause register |
| * works on that SoC. |
| * @details |
| * - Test Steps |
| * -# Read the reset cause and store the result |
| * -# Call clear reset cause |
| * -# Read the reset cause again |
| * -# Check if the two readings match |
| * - Expected Results |
| * -# Reset cause value should change after calling clear reset cause. |
| * @} |
| */ |
| ZTEST(hwinfo_device_id_api, test_clear_reset_cause) |
| { |
| uint32_t cause_1, cause_2; |
| ssize_t ret; |
| |
| ret = hwinfo_get_reset_cause(&cause_1); |
| if (ret == -ENOSYS) { |
| ztest_test_skip(); |
| return; |
| } |
| |
| zassert_false((ret < 0), |
| "Unexpected negative return value: %d", ret); |
| |
| ret = hwinfo_clear_reset_cause(); |
| if (ret == -ENOSYS) { |
| ztest_test_skip(); |
| return; |
| } |
| |
| zassert_false((ret < 0), |
| "Unexpected negative return value: %d", ret); |
| |
| ret = hwinfo_get_reset_cause(&cause_2); |
| if (ret == -ENOSYS) { |
| ztest_test_skip(); |
| return; |
| } |
| |
| zassert_false((ret < 0), |
| "Unexpected negative return value: %d", ret); |
| |
| /* Verify that `cause` has been changed. */ |
| zassert_not_equal(cause_1, cause_2, |
| "Reset cause did not change after clearing"); |
| } |
| |
| /* |
| * @addtogroup t_hwinfo_get_reset_cause_api |
| * @{ |
| * @defgroup t_hwinfo_get_reset_cause test_hwinfo_get_supported_reset_cause |
| * @brief TestPurpose: verify get supported reset cause works. |
| * @details |
| * - Test Steps |
| * -# Set target buffer to a known value |
| * -# Read the reset cause |
| * -# Check if target buffer has been altered |
| * - Expected Results |
| * -# Target buffer contents should be changed after the call. |
| * @} |
| */ |
| ZTEST(hwinfo_device_id_api, test_get_supported_reset_cause) |
| { |
| uint32_t supported; |
| ssize_t ret; |
| |
| /* Set `supported` to a known value prior to call. */ |
| supported = 0xDEADBEEF; |
| |
| ret = hwinfo_get_supported_reset_cause(&supported); |
| if (ret == -ENOSYS) { |
| ztest_test_skip(); |
| return; |
| } |
| |
| zassert_false((ret < 0), |
| "Unexpected negative return value: %d", ret); |
| |
| /* Verify that `supported` has been changed. */ |
| zassert_not_equal(supported, 0xDEADBEEF, |
| "Supported reset cause not written."); |
| } |
| |
| |
| ZTEST_SUITE(hwinfo_device_id_api, NULL, NULL, NULL, NULL, NULL); |