File indexing completed on 2025-05-11 08:23:01
0001
0002
0003
0004
0005
0006
0007
0008 #include "fsl_ssarc.h"
0009
0010
0011 #ifndef FSL_COMPONENT_ID
0012 #define FSL_COMPONENT_ID "platform.drivers.ssarc"
0013 #endif
0014
0015
0016
0017
0018
0019
0020
0021
0022 static void SSARC_MapDescriptorsToGroup(SSARC_LP_Type *base, uint8_t groupID, uint32_t startIndex, uint32_t endIndex);
0023 static void SSARC_SetGroupRestoreOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order);
0024 static void SSARC_SetGroupSaveOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order);
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 static void SSARC_MapDescriptorsToGroup(SSARC_LP_Type *base, uint8_t groupID, uint32_t startIndex, uint32_t endIndex)
0045 {
0046 assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
0047 assert((startIndex < endIndex) || (startIndex == endIndex));
0048
0049 base->GROUPS[groupID].DESC_CTRL0 = SSARC_LP_DESC_CTRL0_START(startIndex) | SSARC_LP_DESC_CTRL0_END(endIndex);
0050 }
0051
0052
0053
0054
0055
0056
0057
0058
0059 static void SSARC_SetGroupRestoreOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order)
0060 {
0061 assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
0062
0063 if (order == kSSARC_ProcessFromStartToEnd)
0064 {
0065 base->GROUPS[groupID].DESC_CTRL0 &= ~SSARC_LP_DESC_CTRL0_RT_ORDER_MASK;
0066 }
0067 else
0068 {
0069 base->GROUPS[groupID].DESC_CTRL0 |= SSARC_LP_DESC_CTRL0_RT_ORDER_MASK;
0070 }
0071 }
0072
0073
0074
0075
0076
0077
0078
0079
0080 static void SSARC_SetGroupSaveOrder(SSARC_LP_Type *base, uint8_t groupID, ssarc_save_restore_order_t order)
0081 {
0082 assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
0083
0084 if (order == kSSARC_ProcessFromStartToEnd)
0085 {
0086 base->GROUPS[groupID].DESC_CTRL0 &= ~SSARC_LP_DESC_CTRL0_SV_ORDER_MASK;
0087 }
0088 else
0089 {
0090 base->GROUPS[groupID].DESC_CTRL0 |= SSARC_LP_DESC_CTRL0_SV_ORDER_MASK;
0091 }
0092 }
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102 void SSARC_SetDescriptorConfig(SSARC_HP_Type *base, uint32_t index, const ssarc_descriptor_config_t *config)
0103 {
0104 assert(config != NULL);
0105
0106 uint32_t temp32 = 0UL;
0107
0108
0109 base->DESC[index].SRAM0 = config->address;
0110
0111 temp32 = SSARC_HP_SRAM2_TYPE(config->type) | SSARC_HP_SRAM2_SIZE(config->size);
0112 temp32 |= (uint32_t)(config->operation);
0113
0114 base->DESC[index].SRAM2 = temp32;
0115
0116
0117
0118
0119
0120 if (config->type != kSSARC_ReadValueWriteBack)
0121 {
0122 base->DESC[index].SRAM1 = config->data;
0123 }
0124 }
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 void SSARC_GroupInit(SSARC_LP_Type *base, uint8_t groupID, const ssarc_group_config_t *config)
0137 {
0138 assert(config != NULL);
0139 assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
0140
0141 uint32_t temp32;
0142
0143 temp32 = SSARC_LP_DESC_CTRL1_POWER_DOMAIN(config->powerDomain) |
0144 SSARC_LP_DESC_CTRL1_SV_PRIORITY(config->savePriority) |
0145 SSARC_LP_DESC_CTRL1_RT_PRIORITY(config->restorePriority) | SSARC_LP_DESC_CTRL1_CPUD(config->cpuDomain);
0146 base->GROUPS[groupID].DESC_CTRL1 = temp32;
0147
0148 SSARC_MapDescriptorsToGroup(base, groupID, config->startIndex, config->endIndex);
0149 SSARC_SetGroupRestoreOrder(base, groupID, config->restoreOrder);
0150 SSARC_SetGroupSaveOrder(base, groupID, config->saveOrder);
0151
0152
0153 base->GROUPS[groupID].DESC_ADDR_UP = config->highestAddress;
0154 base->GROUPS[groupID].DESC_ADDR_DOWN = config->lowestAddress;
0155
0156
0157 base->GROUPS[groupID].DESC_CTRL1 |= SSARC_LP_DESC_CTRL1_GP_EN_MASK;
0158 }
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170 void SSARC_TriggerSoftwareRequest(SSARC_LP_Type *base, uint8_t groupID, ssarc_software_trigger_mode_t mode)
0171 {
0172 assert(groupID < SSARC_LP_DESC_CTRL0_COUNT);
0173
0174 base->GROUPS[groupID].DESC_CTRL1 |= (uint32_t)mode;
0175
0176 while (((base->GROUPS[groupID].DESC_CTRL1) & (uint32_t)mode) != 0UL)
0177 {
0178 }
0179 }