133 lines
3.5 KiB
C
133 lines
3.5 KiB
C
/*
|
|
* Copyright (c) 2021 Vestas Wind Systems A/S
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <drivers/hwinfo.h>
|
|
#include <logging/log.h>
|
|
#include <fsl_rcm.h>
|
|
|
|
LOG_MODULE_REGISTER(hwinfo_rcm, CONFIG_HWINFO_LOG_LEVEL);
|
|
|
|
/**
|
|
* @brief Translate from RCM reset source mask to Zephyr hwinfo sources mask.
|
|
*
|
|
* Translate bitmask from MCUX RCM reset source bitmask to Zephyr
|
|
* hwinfo reset source bitmask.
|
|
*
|
|
* @param NXP MCUX RCM reset source mask.
|
|
* @retval Zephyr hwinfo reset source mask.
|
|
*/
|
|
static uint32_t hwinfo_mcux_rcm_xlate_reset_sources(uint32_t sources)
|
|
{
|
|
uint32_t mask = 0;
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_WAKEUP) && FSL_FEATURE_RCM_HAS_WAKEUP)
|
|
if (sources & kRCM_SourceWakeup) {
|
|
mask |= RESET_LOW_POWER_WAKE;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_WAKEUP) && FSL_FEATURE_RCM_HAS_WAKEUP) */
|
|
|
|
if (sources & kRCM_SourceLvd) {
|
|
mask |= RESET_BROWNOUT;
|
|
}
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_LOC) && FSL_FEATURE_RCM_HAS_LOC)
|
|
if (sources & kRCM_SourceLoc) {
|
|
mask |= RESET_CLOCK;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_LOC) && FSL_FEATURE_RCM_HAS_LOC) */
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_LOL) && FSL_FEATURE_RCM_HAS_LOL)
|
|
if (sources & kRCM_SourceLol) {
|
|
mask |= RESET_PLL;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_LOL) && FSL_FEATURE_RCM_HAS_LOL) */
|
|
|
|
if (sources & kRCM_SourceWdog) {
|
|
mask |= RESET_WATCHDOG;
|
|
}
|
|
|
|
if (sources & kRCM_SourcePin) {
|
|
mask |= RESET_PIN;
|
|
}
|
|
|
|
if (sources & kRCM_SourcePor) {
|
|
mask |= RESET_POR;
|
|
}
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_JTAG) && FSL_FEATURE_RCM_HAS_JTAG)
|
|
if (sources & kRCM_SourceJtag) {
|
|
mask |= RESET_DEBUG;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_JTAG) && FSL_FEATURE_RCM_HAS_JTAG) */
|
|
|
|
if (sources & kRCM_SourceLockup) {
|
|
mask |= RESET_CPU_LOCKUP;
|
|
}
|
|
|
|
if (sources & kRCM_SourceSw) {
|
|
mask |= RESET_SOFTWARE;
|
|
}
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_MDM_AP) && FSL_FEATURE_RCM_HAS_MDM_AP)
|
|
if (sources & kRCM_SourceMdmap) {
|
|
mask |= RESET_DEBUG;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_MDM_AP) && FSL_FEATURE_RCM_HAS_MDM_AP) */
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_EZPORT) && FSL_FEATURE_RCM_HAS_EZPORT)
|
|
if (sources & kRCM_SourceEzpt) {
|
|
mask |= RESET_DEBUG;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_EZPORT) && FSL_FEATURE_RCM_HAS_EZPORT) */
|
|
|
|
return mask;
|
|
}
|
|
|
|
int z_impl_hwinfo_get_reset_cause(uint32_t *cause)
|
|
{
|
|
uint32_t sources;
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_SSRS) && FSL_FEATURE_RCM_HAS_SSRS)
|
|
sources = RCM_GetStickyResetSources(RCM) & kRCM_SourceAll;
|
|
#else /* (defined(FSL_FEATURE_RCM_HAS_SSRS) && FSL_FEATURE_RCM_HAS_SSRS) */
|
|
sources = RCM_GetPreviousResetSources(RCM) & kRCM_SourceAll;
|
|
#endif /* !(defined(FSL_FEATURE_RCM_HAS_PARAM) && FSL_FEATURE_RCM_HAS_PARAM) */
|
|
|
|
*cause = hwinfo_mcux_rcm_xlate_reset_sources(sources);
|
|
|
|
LOG_DBG("sources = 0x%08x, cause = 0x%08x", sources, *cause);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_SSRS) && FSL_FEATURE_RCM_HAS_SSRS)
|
|
int z_impl_hwinfo_clear_reset_cause(void)
|
|
{
|
|
uint32_t sources;
|
|
|
|
sources = RCM_GetStickyResetSources(RCM) & kRCM_SourceAll;
|
|
RCM_ClearStickyResetSources(RCM, sources);
|
|
|
|
LOG_DBG("sources = 0x%08x", sources);
|
|
|
|
return 0;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_SSRS) && FSL_FEATURE_RCM_HAS_SSRS) */
|
|
|
|
#if (defined(FSL_FEATURE_RCM_HAS_PARAM) && FSL_FEATURE_RCM_HAS_PARAM)
|
|
int z_impl_hwinfo_get_supported_reset_cause(uint32_t *supported)
|
|
{
|
|
uint32_t sources;
|
|
|
|
sources = RCM_GetResetSourceImplementedStatus(RCM);
|
|
*supported = hwinfo_mcux_rcm_xlate_reset_sources(sources);
|
|
|
|
LOG_DBG("sources = 0x%08x, supported = 0x%08x", sources, *supported);
|
|
|
|
return 0;
|
|
}
|
|
#endif /* (defined(FSL_FEATURE_RCM_HAS_PARAM) && FSL_FEATURE_RCM_HAS_PARAM) */
|