/* * Copyright (c) 2021 Sun Amar * Copyright (c) 2021 Yonatan Schachter * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #if defined(RMU_RSTCAUSE_BODUNREGRST) || defined(RMU_RSTCAUSE_BODREGRST) || \ defined(RMU_RSTCAUSE_AVDDBOD) || defined(RMU_RSTCAUSE_DVDDBOD) || \ defined(RMU_RSTCAUSE_DECBOD) || defined(RMU_RSTCAUSE_BODAVDD0) || \ defined(RMU_RSTCAUSE_BODAVDD1) || \ (defined(BU_PRESENT) && defined(_SILICON_LABS_32B_SERIES_0)) #define HAS_BROWNOUT 1 #endif ssize_t z_impl_hwinfo_get_device_id(uint8_t *buffer, size_t length) { uint64_t unique_id = sys_cpu_to_be64(SYSTEM_GetUnique()); if (length > sizeof(unique_id)) { length = sizeof(unique_id); } memcpy(buffer, &unique_id, length); return length; } int z_impl_hwinfo_get_reset_cause(uint32_t *cause) { uint32_t flags = 0; uint32_t rmu_flags = RMU_ResetCauseGet(); if (rmu_flags & RMU_RSTCAUSE_PORST) { flags |= RESET_POR; } if (rmu_flags & RMU_RSTCAUSE_EXTRST) { flags |= RESET_PIN; } if (rmu_flags & RMU_RSTCAUSE_SYSREQRST) { flags |= RESET_SOFTWARE; } if (rmu_flags & RMU_RSTCAUSE_LOCKUPRST) { flags |= RESET_CPU_LOCKUP; } if (rmu_flags & RMU_RSTCAUSE_WDOGRST) { flags |= RESET_WATCHDOG; } #ifdef RMU_RSTCAUSE_EM4WURST if (rmu_flags & RMU_RSTCAUSE_EM4WURST) { flags |= RESET_LOW_POWER_WAKE; } #endif /* RMU_RSTCAUSE_EM4WURST */ #ifdef RMU_RSTCAUSE_EM4RST if (rmu_flags & RMU_RSTCAUSE_EM4RST) { flags |= RESET_LOW_POWER_WAKE; } #endif /* RMU_RSTCAUSE_EM4RST */ #ifdef RMU_RSTCAUSE_BODUNREGRST if (rmu_flags & RMU_RSTCAUSE_BODUNREGRST) { flags |= RESET_BROWNOUT; } #endif /* RMU_RSTCAUSE_BODUNREGRST */ #ifdef RMU_RSTCAUSE_BODREGRST if (rmu_flags & RMU_RSTCAUSE_BODREGRST) { flags |= RESET_BROWNOUT; } #endif /* RMU_RSTCAUSE_BODREGRST */ #ifdef RMU_RSTCAUSE_AVDDBOD if (rmu_flags & RMU_RSTCAUSE_AVDDBOD) { flags |= RESET_BROWNOUT; } #endif /* RMU_RSTCAUSE_AVDDBOD */ #ifdef RMU_RSTCAUSE_DVDDBOD if (rmu_flags & RMU_RSTCAUSE_DVDDBOD) { flags |= RESET_BROWNOUT; } #endif /* RMU_RSTCAUSE_DVDDBOD */ #ifdef RMU_RSTCAUSE_DECBOD if (rmu_flags & RMU_RSTCAUSE_DECBOD) { flags |= RESET_BROWNOUT; } #endif /* RMU_RSTCAUSE_DECBOD */ #ifdef RMU_RSTCAUSE_BODAVDD0 if (rmu_flags & RMU_RSTCAUSE_BODAVDD0) { flags |= RESET_BROWNOUT; } #endif /* RMU_RSTCAUSE_BODAVDD0 */ #ifdef RMU_RSTCAUSE_BODAVDD1 if (rmu_flags & RMU_RSTCAUSE_BODAVDD1) { flags |= RESET_BROWNOUT; } #endif /* RMU_RSTCAUSE_BODAVDD1 */ #if defined(BU_PRESENT) && defined(_SILICON_LABS_32B_SERIES_0) if (rmu_flags & RMU_RSTCAUSE_BUBODVDDDREG) { flags |= RESET_BROWNOUT; } if (rmu_flags & RMU_RSTCAUSE_BUBODBUVIN) { flags |= RESET_BROWNOUT; } if (rmu_flags & RMU_RSTCAUSE_BUBODUNREG) { flags |= RESET_BROWNOUT; } if (rmu_flags & RMU_RSTCAUSE_BUBODREG) { flags |= RESET_BROWNOUT; } if (rmu_flags & RMU_RSTCAUSE_BUMODERST) { flags |= RESET_BROWNOUT; } #elif defined(RMU_RSTCAUSE_BUMODERST) if (rmu_flags & RMU_RSTCAUSE_BUMODERST) { flags |= RESET_BROWNOUT; } #endif /* defined(BU_PRESENT) && defined(_SILICON_LABS_32B_SERIES_0) */ *cause = flags; return 0; } int z_impl_hwinfo_clear_reset_cause(void) { RMU_ResetCauseClear(); return 0; } int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported) { *supported = RESET_PIN | RESET_SOFTWARE | RESET_POR | RESET_WATCHDOG | RESET_CPU_LOCKUP #if defined(RMU_RSTCAUSE_EM4WURST) || defined(RMU_RSTCAUSE_EM4RST) | RESET_LOW_POWER_WAKE #endif /* defined(RMU_RSTCAUSE_EM4WURST) || defined(RMU_RSTCAUSE_EM4RST) */ #if HAS_BROWNOUT | RESET_BROWNOUT #endif /* HAS_BROWNOUT */ ; return 0; }