// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md #include "chip.hpp" #include #include #include namespace { const std::map bootReasonDef = { {SRC_SRSR_IPP_RESET_B_SHIFT, "ipp_reset_b pin (Power-up sequence)"}, {SRC_SRSR_LOCKUP_SYSRESETREQ_SHIFT, "CPU lockup or software setting of SYSRESETREQ"}, {SRC_SRSR_CSU_RESET_B_SHIFT, "csu_reset_b input"}, {SRC_SRSR_IPP_USER_RESET_B_SHIFT, "ipp_user_reset_b qualified reset"}, {SRC_SRSR_WDOG_RST_B_SHIFT, "IC Watchdog Time-out reset"}, {SRC_SRSR_JTAG_RST_B_SHIFT, "HIGH - Z JTAG reset"}, {SRC_SRSR_JTAG_SW_RST_SHIFT, "JTAG software reset"}, {SRC_SRSR_WDOG3_RST_B_SHIFT, "IC Watchdog3 Time-out reset"}, {SRC_SRSR_TEMPSENSE_RST_B_SHIFT, "Tamper Sensor software reset"}}; } // namespace void clearAndPrintBootReason() { // get boot reason std::uint32_t SRSR_val = SRC_GetResetStatusFlags(SRC); LOG_INFO("Boot reason: %" PRIu32, SRSR_val); if (SRSR_val & (1UL << SRC_SRSR_IPP_RESET_B_SHIFT)) LOG_INFO("\t*%s", bootReasonDef.at(SRC_SRSR_IPP_RESET_B_SHIFT).c_str()); if (SRSR_val & (1UL << SRC_SRSR_LOCKUP_SYSRESETREQ_SHIFT)) { LOG_WARN("\t*%s", bootReasonDef.at(SRC_SRSR_LOCKUP_SYSRESETREQ_SHIFT).c_str()); LOG_INFO("\tGPR_5 %" PRIu32, SRC_GetGeneralPurposeRegister(SRC, 5)); } if (SRSR_val & (1UL << SRC_SRSR_CSU_RESET_B_SHIFT)) LOG_INFO("\t*%s", bootReasonDef.at(SRC_SRSR_CSU_RESET_B_SHIFT).c_str()); if (SRSR_val & (1UL << SRC_SRSR_IPP_USER_RESET_B_SHIFT)) LOG_INFO("\t*%s", bootReasonDef.at(SRC_SRSR_IPP_USER_RESET_B_SHIFT).c_str()); if (SRSR_val & (1UL << SRC_SRSR_WDOG_RST_B_SHIFT)) LOG_WARN("\t*%s", bootReasonDef.at(SRC_SRSR_WDOG_RST_B_SHIFT).c_str()); if (SRSR_val & (1UL << SRC_SRSR_JTAG_RST_B_SHIFT)) LOG_INFO("\t*%s", bootReasonDef.at(SRC_SRSR_JTAG_RST_B_SHIFT).c_str()); if (SRSR_val & (1UL << SRC_SRSR_JTAG_SW_RST_SHIFT)) LOG_INFO("\t*%s", bootReasonDef.at(SRC_SRSR_JTAG_SW_RST_SHIFT).c_str()); if (SRSR_val & (1UL << SRC_SRSR_WDOG3_RST_B_SHIFT)) LOG_INFO("\t*%s", bootReasonDef.at(SRC_SRSR_WDOG3_RST_B_SHIFT).c_str()); if (SRSR_val & (1UL << SRC_SRSR_TEMPSENSE_RST_B_SHIFT)) LOG_WARN("\t*%s", bootReasonDef.at(SRC_SRSR_TEMPSENSE_RST_B_SHIFT).c_str()); // clear all set bits SRC_ClearResetStatusFlags(SRC, SRSR_val); }