File indexing completed on 2025-05-11 08:23:01
0001
0002
0003
0004
0005
0006
0007
0008 #include "fsl_rdc_sema42.h"
0009
0010
0011
0012
0013
0014
0015 #ifndef FSL_COMPONENT_ID
0016 #define FSL_COMPONENT_ID "platform.drivers.rdc_sema42"
0017 #endif
0018
0019
0020 #define RDC_SEMA42_GATE_RESET_PATTERN_1 (0xE2U)
0021
0022 #define RDC_SEMA42_GATE_RESET_PATTERN_2 (0x1DU)
0023
0024 #if !defined(RDC_SEMAPHORE_GATE_COUNT)
0025
0026 #define RDC_SEMAPHORE_GATE_LDOM(x) RDC_SEMAPHORE_GATE0_LDOM(x)
0027 #define RDC_SEMAPHORE_GATE_GTFSM(x) RDC_SEMAPHORE_GATE0_GTFSM(x)
0028 #define RDC_SEMAPHORE_GATE_LDOM_MASK RDC_SEMAPHORE_GATE0_LDOM_MASK
0029 #define RDC_SEMAPHORE_GATE_LDOM_SHIFT RDC_SEMAPHORE_GATE0_LDOM_SHIFT
0030 #endif
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 uint32_t RDC_SEMA42_GetInstance(RDC_SEMAPHORE_Type *base);
0042
0043
0044
0045
0046
0047
0048 static RDC_SEMAPHORE_Type *const s_sema42Bases[] = RDC_SEMAPHORE_BASE_PTRS;
0049
0050 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0051 #if defined(RDC_SEMA42_CLOCKS)
0052
0053 static const clock_ip_name_t s_sema42Clocks[] = RDC_SEMA42_CLOCKS;
0054 #endif
0055 #endif
0056
0057
0058
0059
0060
0061 uint32_t RDC_SEMA42_GetInstance(RDC_SEMAPHORE_Type *base)
0062 {
0063 uint32_t instance;
0064
0065
0066 for (instance = 0; instance < ARRAY_SIZE(s_sema42Bases); instance++)
0067 {
0068 if (s_sema42Bases[instance] == base)
0069 {
0070 break;
0071 }
0072 }
0073
0074 assert(instance < ARRAY_SIZE(s_sema42Bases));
0075
0076 return instance;
0077 }
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089 void RDC_SEMA42_Init(RDC_SEMAPHORE_Type *base)
0090 {
0091 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0092 #if defined(RDC_SEMA42_CLOCKS)
0093 CLOCK_EnableClock(s_sema42Clocks[RDC_SEMA42_GetInstance(base)]);
0094 #endif
0095 #endif
0096 }
0097
0098
0099
0100
0101
0102
0103
0104
0105 void RDC_SEMA42_Deinit(RDC_SEMAPHORE_Type *base)
0106 {
0107 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0108 #if defined(RDC_SEMA42_CLOCKS)
0109 CLOCK_DisableClock(s_sema42Clocks[RDC_SEMA42_GetInstance(base)]);
0110 #endif
0111 #endif
0112 }
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128 status_t RDC_SEMA42_TryLock(RDC_SEMAPHORE_Type *base, uint8_t gateNum, uint8_t masterIndex, uint8_t domainId)
0129 {
0130 assert(gateNum < RDC_SEMA42_GATE_COUNT);
0131
0132 status_t status = kStatus_Success;
0133 uint8_t regGate;
0134
0135 ++masterIndex;
0136
0137 regGate = (uint8_t)(RDC_SEMAPHORE_GATE_LDOM(domainId) | RDC_SEMAPHORE_GATE_GTFSM(masterIndex));
0138
0139
0140 RDC_SEMA42_GATEn(base, gateNum) = masterIndex;
0141
0142
0143 if (regGate != RDC_SEMA42_GATEn(base, gateNum))
0144 {
0145 status = kStatus_Fail;
0146 }
0147
0148 return status;
0149 }
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 void RDC_SEMA42_Lock(RDC_SEMAPHORE_Type *base, uint8_t gateNum, uint8_t masterIndex, uint8_t domainId)
0164 {
0165 while (kStatus_Success != RDC_SEMA42_TryLock(base, gateNum, masterIndex, domainId))
0166 {
0167 }
0168 }
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179 int32_t RDC_SEMA42_GetLockDomainID(RDC_SEMAPHORE_Type *base, uint8_t gateNum)
0180 {
0181 assert(gateNum < RDC_SEMA42_GATE_COUNT);
0182
0183 int32_t ret;
0184 uint8_t regGate = RDC_SEMA42_GATEn(base, gateNum);
0185
0186
0187 if (0U == (regGate & RDC_SEMAPHORE_GATE_GTFSM_MASK))
0188 {
0189 ret = -1;
0190 }
0191 else
0192 {
0193 ret = (int32_t)((uint8_t)((regGate & RDC_SEMAPHORE_GATE_LDOM_MASK) >> RDC_SEMAPHORE_GATE_LDOM_SHIFT));
0194 }
0195
0196 return ret;
0197 }
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210 status_t RDC_SEMA42_ResetGate(RDC_SEMAPHORE_Type *base, uint8_t gateNum)
0211 {
0212 status_t status;
0213
0214
0215
0216
0217
0218
0219
0220 if (0U != (base->RSTGT_R & RDC_SEMAPHORE_RSTGT_R_RSTGSM_MASK))
0221 {
0222 status = kStatus_Fail;
0223 }
0224 else
0225 {
0226
0227 base->RSTGT_W = RDC_SEMAPHORE_RSTGT_W_RSTGDP(RDC_SEMA42_GATE_RESET_PATTERN_1);
0228
0229 base->RSTGT_W =
0230 RDC_SEMAPHORE_RSTGT_W_RSTGDP(RDC_SEMA42_GATE_RESET_PATTERN_2) | RDC_SEMAPHORE_RSTGT_W_RSTGTN(gateNum);
0231
0232 status = kStatus_Success;
0233 }
0234
0235 return status;
0236 }