summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/drivers/ssarc/fsl_ssarc.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bsps/arm/imxrt/mcux-sdk/drivers/ssarc/fsl_ssarc.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/ssarc/fsl_ssarc.c b/bsps/arm/imxrt/mcux-sdk/drivers/ssarc/fsl_ssarc.c
new file mode 100644
index 0000000000..fce7c4d458
--- /dev/null
+++ b/bsps/arm/imxrt/mcux-sdk/drivers/ssarc/fsl_ssarc.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2020-2021 NXP
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "fsl_ssarc.h"
+
+/* Component ID definition, used by tools. */
+#ifndef FSL_COMPONENT_ID
+#define FSL_COMPONENT_ID "platform.drivers.ssarc"
+#endif
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Prototypes
+ ******************************************************************************/
+static void SSARC_MapDescriptorsToGroup(SSARC_LP_Type *base, uint8_t groupID, uint32_t startIndex, uint32_t endIndex);
+static void SSARC_SetGroupRestoreOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order);
+static void SSARC_SetGroupSaveOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order);
+/*******************************************************************************
+ * Variables
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Code
+ ******************************************************************************/
+
+/*!
+ * @brief Maps the descriptors to the selected group.
+ *
+ * @note One descriptor can be mapped to different group, but please make sure
+ * one descriptor can only be mapped to one power domain.
+ *
+ * @param base SSARC_LP peripheral base address.
+ * @param groupID The index of the group. Range from 0 to 15.
+ * @param startIndex The index of the first descriptor of the group.
+ * @param endIndex The index of the last descriptor of the group.
+ */
+static void SSARC_MapDescriptorsToGroup(SSARC_LP_Type *base, uint8_t groupID, uint32_t startIndex, uint32_t endIndex)
+{
+ assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
+ assert((startIndex < endIndex) || (startIndex == endIndex));
+
+ base->GROUPS[groupID].DESC_CTRL0 = SSARC_LP_DESC_CTRL0_START(startIndex) | SSARC_LP_DESC_CTRL0_END(endIndex);
+}
+
+/*!
+ * @brief Set the order of descriptors within the group are processed when restoring register values.
+ *
+ * @param base SSARC_LP peripheral base address.
+ * @param groupID The index of the group. Range from 0 to 15.
+ * @param order The restore order.
+ */
+static void SSARC_SetGroupRestoreOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order)
+{
+ assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
+
+ if (order == kSSARC_ProcessFromStartToEnd)
+ {
+ base->GROUPS[groupID].DESC_CTRL0 &= ~SSARC_LP_DESC_CTRL0_RT_ORDER_MASK;
+ }
+ else
+ {
+ base->GROUPS[groupID].DESC_CTRL0 |= SSARC_LP_DESC_CTRL0_RT_ORDER_MASK;
+ }
+}
+
+/*!
+ * @brief Set the order of descriptors within the group are processed when saving register values.
+ *
+ * @param base SSARC_LP peripheral base address.
+ * @param groupID The index of the group. Range from 0 to 15.
+ * @param order The save order.
+ */
+static void SSARC_SetGroupSaveOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order)
+{
+ assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
+
+ if (order == kSSARC_ProcessFromStartToEnd)
+ {
+ base->GROUPS[groupID].DESC_CTRL0 &= ~SSARC_LP_DESC_CTRL0_SV_ORDER_MASK;
+ }
+ else
+ {
+ base->GROUPS[groupID].DESC_CTRL0 |= SSARC_LP_DESC_CTRL0_SV_ORDER_MASK;
+ }
+}
+
+/*!
+ * brief Sets the configuration of the descriptor.
+ *
+ * param base SSARC_HP peripheral base address.
+ * param index The index of descriptor. Range from 0 to 1023.
+ * param config Pointer to the structure ssarc_descriptor_config_t. Please refer to @ref ssarc_descriptor_config_t for
+ * details.
+ */
+void SSARC_SetDescriptorConfig(SSARC_HP_Type *base, uint32_t index, const ssarc_descriptor_config_t *config)
+{
+ assert(config != NULL);
+
+ uint32_t temp32 = 0UL;
+
+ /* Set the address of the register to be saved/restored. */
+ base->DESC[index].SRAM0 = config->address;
+
+ temp32 = SSARC_HP_SRAM2_TYPE(config->type) | SSARC_HP_SRAM2_SIZE(config->size);
+ temp32 |= (uint32_t)(config->operation);
+
+ base->DESC[index].SRAM2 = temp32;
+
+ /* Set the value of the register to be saved/restored. */
+ /* If the type is set as kSSARC_ReadValueWriteBack, the SRAM1 register will be
+ loaded with the value on save operation, and the data in SRAM1 register will be over-written, so
+ it is no need to set SRAM1 register in that type. */
+ if (config->type != kSSARC_ReadValueWriteBack)
+ {
+ base->DESC[index].SRAM1 = config->data;
+ }
+}
+
+/*!
+ * brief Init the selected group.
+ *
+ * note For the groups with the same save priority or restore priority,
+ * the save/restore operation runs in the group order.
+ *
+ * param base SSARC_LP peripheral base address.
+ * param groupID The index of the group. Range from 0 to 15.
+ * param config Pointer to the structure ssarc_group_config_t. Please refer to @ref ssarc_group_config_t for details.
+ */
+void SSARC_GroupInit(SSARC_LP_Type *base, uint8_t groupID, const ssarc_group_config_t *config)
+{
+ assert(config != NULL);
+ assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
+
+ uint32_t temp32;
+
+ temp32 = SSARC_LP_DESC_CTRL1_POWER_DOMAIN(config->powerDomain) |
+ SSARC_LP_DESC_CTRL1_SV_PRIORITY(config->savePriority) |
+ SSARC_LP_DESC_CTRL1_RT_PRIORITY(config->restorePriority) | SSARC_LP_DESC_CTRL1_CPUD(config->cpuDomain);
+ base->GROUPS[groupID].DESC_CTRL1 = temp32;
+
+ SSARC_MapDescriptorsToGroup(base, groupID, config->startIndex, config->endIndex);
+ SSARC_SetGroupRestoreOrder(base, groupID, config->restoreOrder);
+ SSARC_SetGroupSaveOrder(base, groupID, config->saveOrder);
+
+ /* Config the highest address and the lowest address. */
+ base->GROUPS[groupID].DESC_ADDR_UP = config->highestAddress;
+ base->GROUPS[groupID].DESC_ADDR_DOWN = config->lowestAddress;
+
+ /* Enable the group. */
+ base->GROUPS[groupID].DESC_CTRL1 |= SSARC_LP_DESC_CTRL1_GP_EN_MASK;
+}
+
+/*!
+ * brief Triggers software request.
+ *
+ * note Each group allows software to trigger the save/restore operation without getting the request
+ * from basic power controller.
+ *
+ * param base SSARC_LP peripheral base address.
+ * param groupID The index of the group. Range from 0 to 15.
+ * param mode. Software trigger mode. Please refer to @ref ssarc_software_trigger_mode_t for details.
+ */
+void SSARC_TriggerSoftwareRequest(SSARC_LP_Type *base, uint8_t groupID, ssarc_software_trigger_mode_t mode)
+{
+ assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
+
+ base->GROUPS[groupID].DESC_CTRL1 |= (uint32_t)mode;
+
+ while (((base->GROUPS[groupID].DESC_CTRL1) & (uint32_t)mode) != 0UL)
+ {
+ }
+}