| /* |
| * Copyright (c) 2021 Sun Amar |
| * Copyright (c) 2021 Yonatan Schachter |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <em_system.h> |
| #include <em_rmu.h> |
| #include <drivers/hwinfo.h> |
| #include <string.h> |
| #include <sys/byteorder.h> |
| |
| #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; |
| } |