summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/devices/MIMXRT1166/drivers/fsl_soc_src.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/arm/imxrt/mcux-sdk/devices/MIMXRT1166/drivers/fsl_soc_src.c')
-rw-r--r--bsps/arm/imxrt/mcux-sdk/devices/MIMXRT1166/drivers/fsl_soc_src.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/devices/MIMXRT1166/drivers/fsl_soc_src.c b/bsps/arm/imxrt/mcux-sdk/devices/MIMXRT1166/drivers/fsl_soc_src.c
new file mode 100644
index 0000000000..36fe004d3d
--- /dev/null
+++ b/bsps/arm/imxrt/mcux-sdk/devices/MIMXRT1166/drivers/fsl_soc_src.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2019-2021 NXP
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "fsl_soc_src.h"
+
+/* Component ID definition, used by tools. */
+#ifndef FSL_COMPONENT_ID
+#define FSL_COMPONENT_ID "platform.drivers.soc_src"
+#endif
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+#define SRC_GLOBAL_SYSTEM_RESET_BEHAVIOR_MASK (0x3U)
+#define SRC_GLOBAL_SYSTEM_RESET_BEHAVIOR_CONFIG(resetSource, resetMode) \
+ ((uint32_t)(resetMode) << (uint32_t)(resetSource))
+
+#define SRC_SLICE_CTRL_SW_RESET_MASK (0x1U)
+
+/*******************************************************************************
+ * Prototypes
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Variables
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Code
+ ******************************************************************************/
+
+/*!
+ * brief Release related core reset operation.
+ *
+ * The core reset will be held until boot core to release it.
+ *
+ * param base SRC peripheral base address.
+ * param coreName The name of the reset core to be released.
+ */
+void SRC_ReleaseCoreReset(SRC_Type *base, src_core_name_t coreName)
+{
+ uint32_t coreMaskArray[] = {SRC_SCR_BT_RELEASE_M7_MASK, SRC_SCR_BT_RELEASE_M4_MASK};
+ uint32_t regValue;
+
+ regValue = base->SCR;
+
+ if ((regValue & coreMaskArray[((uint32_t)coreName) - 1UL]) == 0UL)
+ {
+ base->SCR |= coreMaskArray[((uint32_t)coreName) - 1UL];
+ }
+}
+
+/*!
+ * brief Sets the reset mode of global system reset source.
+ *
+ * This function sets the selected mode of the input global system reset sources. This function will return as soon as
+ * the reset if finished.
+ *
+ * param base SRC peripheral base address.
+ * param resetSource The global system reset source. See @ref src_global_system_reset_source_t for more details.
+ * param resetMode The reset mode of each reset source. See @ref src_global_system_reset_mode_t for more details.
+ */
+void SRC_SetGlobalSystemResetMode(SRC_Type *base,
+ src_global_system_reset_source_t resetSource,
+ src_global_system_reset_mode_t resetMode)
+{
+ uint32_t regValue;
+
+ regValue = base->SRMR;
+ regValue &= ~SRC_GLOBAL_SYSTEM_RESET_BEHAVIOR_CONFIG(resetSource, SRC_GLOBAL_SYSTEM_RESET_BEHAVIOR_MASK);
+ regValue |= SRC_GLOBAL_SYSTEM_RESET_BEHAVIOR_CONFIG(resetSource, resetMode);
+
+ base->SRMR = regValue;
+}
+
+/*!
+ * brief Asserts software reset for the selected slice.
+ *
+ * param base SRC peripheral base address.
+ * param sliceName The selected reset slice. See @ref src_reset_slice_name_t for more details.
+ */
+void SRC_AssertSliceSoftwareReset(SRC_Type *base, src_reset_slice_name_t sliceName)
+{
+ uint32_t regAddress;
+ uint32_t sliceStatusRegAddress;
+
+ regAddress = SRC_GET_SLICE_REGISTER_ADDRESS(base, sliceName, SRC_SLICE_CONTROL_REGISTER_OFFSET);
+ sliceStatusRegAddress = SRC_GET_SLICE_REGISTER_ADDRESS(base, sliceName, SRC_SLICE_STATUS_REGISTER_OFFSET);
+
+ *(volatile uint32_t *)regAddress |= SRC_SLICE_CTRL_SW_RESET_MASK;
+
+ while (((*(volatile uint32_t *)sliceStatusRegAddress) & SRC_SLICE_STAT_UNDER_RST_MASK) != 0UL)
+ {
+ ;
+ }
+}
+
+/*!
+ * brief Locks the value of SETPOINT_MODE and DOMAIN_MODE for the selected reset slice.
+ *
+ * param base SRC peripheral base address.
+ * param sliceName The selected reset slice. See @ref src_reset_slice_name_t for more details.
+ */
+void SRC_LockSliceMode(SRC_Type *base, src_reset_slice_name_t sliceName)
+{
+ uint32_t authenticationRegAddress;
+
+ authenticationRegAddress =
+ SRC_GET_SLICE_REGISTER_ADDRESS(base, sliceName, SRC_SLICE_AUTHENTICATION_REGISTER_OFFSET);
+
+ *(volatile uint32_t *)authenticationRegAddress |= SRC_SLICE_AUTHEN_LOCK_MODE_MASK;
+}
+
+/*!
+ * brief Sets setpoint configuration for the selected reset slice.
+ *
+ * param base SRC peripheral base address.
+ * param sliceName The selected reset slice. See @ref src_reset_slice_name_t for more details.
+ * param setPointConfig The logic OR'ed value of @ref _src_setpoint_selection. When the system in the selected setpoint
+ * slice reset will be assert.
+ */
+void SRC_SetSliceSetPointConfig(SRC_Type *base, src_reset_slice_name_t sliceName, uint32_t setpointConfig)
+{
+ uint32_t setpointConfigRegAddress;
+
+ setpointConfigRegAddress =
+ SRC_GET_SLICE_REGISTER_ADDRESS(base, sliceName, SRC_SLICE_SETPOINT_CONFIG_REGISTER_OFFSET);
+
+ if (setpointConfig != 0UL)
+ {
+ *(volatile uint32_t *)setpointConfigRegAddress = setpointConfig;
+ }
+}
+
+/*!
+ * brief Sets domain mode configuration for the selected reset slice.
+ *
+ * param base SRC peripheral base address.
+ * param sliceName The selected reset slice. See src_reset_slice_name_t for more details.
+ * param domainConfig The logic OR'ed value of _src_domain_mode_selection.
+ */
+void SRC_SetSliceDomainModeConfig(SRC_Type *base, src_reset_slice_name_t sliceName, uint32_t domainConfig)
+{
+ uint32_t domainConfigRegAddress;
+
+ domainConfigRegAddress = SRC_GET_SLICE_REGISTER_ADDRESS(base, sliceName, SRC_SLICE_DOMAIN_CONFIG_REGISTER_OFFSET);
+
+ if (domainConfig != 0UL)
+ {
+ *(volatile uint32_t *)domainConfigRegAddress = domainConfig;
+ }
+}
+
+/*!
+ * brief Gets the reset state of the selected slice.
+ *
+ * param base SRC peripheral base address.
+ * param sliceName The selected slice. See @ref src_reset_slice_name_t for more details.
+ * retval kSRC_SliceResetInProcess The reset is in process.
+ * retval kSRC_SliceResetFinished The reset is finished.
+ */
+src_slice_reset_state_t SRC_GetSliceResetState(SRC_Type *base, src_reset_slice_name_t sliceName)
+{
+ uint32_t statusRegAddress;
+ src_slice_reset_state_t ret;
+
+ statusRegAddress = SRC_GET_SLICE_REGISTER_ADDRESS(base, sliceName, SRC_SLICE_STATUS_REGISTER_OFFSET);
+
+ if (((*(uint32_t *)statusRegAddress) & SRC_SLICE_STAT_UNDER_RST_MASK) != 0UL)
+ {
+ ret = kSRC_SliceResetInProcess;
+ }
+ else
+ {
+ ret = kSRC_SliceResetFinished;
+ }
+
+ return ret;
+}