File indexing completed on 2025-05-11 08:23:01
0001
0002
0003
0004
0005
0006
0007
0008 #include "fsl_sema4.h"
0009
0010
0011
0012
0013
0014
0015 #ifndef FSL_COMPONENT_ID
0016 #define FSL_COMPONENT_ID "platform.drivers.sema4"
0017 #endif
0018
0019
0020 #define SEMA4_GATE_RESET_PATTERN_1 (0xE2U)
0021
0022 #define SEMA4_GATE_RESET_PATTERN_2 (0x1DU)
0023
0024
0025 #define SEMA4_GATE_IRQ_RESET_PATTERN_1 (0x47U)
0026
0027 #define SEMA4_GATE_IRQ_RESET_PATTERN_2 (0xB8U)
0028
0029 #define SEMA4_RSTGT_RSTNSM_MASK (0x30U)
0030
0031 #define SEMA4_RSTNTF_RSTNSM_MASK (0x30U)
0032
0033
0034
0035
0036
0037 #if defined(SEMA4_CLOCKS)
0038
0039
0040
0041
0042
0043 uint32_t SEMA4_GetInstance(SEMA4_Type *base);
0044 #endif
0045
0046
0047
0048
0049
0050 #if defined(SEMA4_CLOCKS)
0051
0052 static SEMA4_Type *const s_sema4Bases[] = SEMA4_BASE_PTRS;
0053 #endif
0054
0055 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0056 #if defined(SEMA4_CLOCKS)
0057
0058 static const clock_ip_name_t s_sema4Clocks[] = SEMA4_CLOCKS;
0059 #endif
0060 #endif
0061
0062
0063
0064
0065
0066 #if defined(SEMA4_CLOCKS)
0067 uint32_t SEMA4_GetInstance(SEMA4_Type *base)
0068 {
0069 uint32_t instance;
0070
0071
0072 for (instance = 0; instance < ARRAY_SIZE(s_sema4Bases); instance++)
0073 {
0074 if (s_sema4Bases[instance] == base)
0075 {
0076 break;
0077 }
0078 }
0079
0080 assert(instance < ARRAY_SIZE(s_sema4Bases));
0081
0082 return instance;
0083 }
0084 #endif
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096 void SEMA4_Init(SEMA4_Type *base)
0097 {
0098 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0099 #if defined(SEMA4_CLOCKS)
0100 CLOCK_EnableClock(s_sema4Clocks[SEMA4_GetInstance(base)]);
0101 #endif
0102 #endif
0103 }
0104
0105
0106
0107
0108
0109
0110
0111
0112 void SEMA4_Deinit(SEMA4_Type *base)
0113 {
0114 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0115 #if defined(SEMA4_CLOCKS)
0116 CLOCK_DisableClock(s_sema4Clocks[SEMA4_GetInstance(base)]);
0117 #endif
0118 #endif
0119 }
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134 status_t SEMA4_TryLock(SEMA4_Type *base, uint8_t gateNum, uint8_t procNum)
0135 {
0136 status_t status;
0137
0138 assert(gateNum < (uint8_t)FSL_FEATURE_SEMA4_GATE_COUNT);
0139
0140 ++procNum;
0141
0142
0143 SEMA4_GATEn(base, gateNum) = procNum;
0144
0145
0146 if (procNum != SEMA4_GATEn(base, gateNum))
0147 {
0148 status = kStatus_Fail;
0149 }
0150 else
0151 {
0152 status = kStatus_Success;
0153 }
0154
0155 return status;
0156 }
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 void SEMA4_Lock(SEMA4_Type *base, uint8_t gateNum, uint8_t procNum)
0170 {
0171 while (kStatus_Success != SEMA4_TryLock(base, gateNum, procNum))
0172 {
0173 }
0174 }
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187 status_t SEMA4_ResetGate(SEMA4_Type *base, uint8_t gateNum)
0188 {
0189 status_t status;
0190
0191
0192
0193
0194
0195 assert(!((gateNum < SEMA4_GATE_NUM_RESET_ALL) && (gateNum >= (uint8_t)FSL_FEATURE_SEMA4_GATE_COUNT)));
0196
0197
0198 if (0U != (base->RSTGT & SEMA4_RSTGT_RSTNSM_MASK))
0199 {
0200 status = kStatus_Fail;
0201 }
0202 else
0203 {
0204
0205 base->RSTGT = SEMA4_RSTGT_RSTGSM_RSTGMS_RSTGDP(SEMA4_GATE_RESET_PATTERN_1);
0206
0207 base->RSTGT = SEMA4_RSTGT_RSTGSM_RSTGMS_RSTGDP(SEMA4_GATE_RESET_PATTERN_2) | SEMA4_RSTGT_RSTGTN(gateNum);
0208
0209 status = kStatus_Success;
0210 }
0211
0212 return status;
0213 }
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226 status_t SEMA4_ResetGateNotify(SEMA4_Type *base, uint8_t gateNum)
0227 {
0228 status_t status;
0229
0230
0231
0232
0233
0234 assert(!((gateNum < (uint8_t)SEMA4_GATE_NUM_RESET_ALL) && (gateNum >= (uint8_t)FSL_FEATURE_SEMA4_GATE_COUNT)));
0235
0236
0237 if (0U != (base->RSTNTF & SEMA4_RSTNTF_RSTNSM_MASK))
0238 {
0239 status = kStatus_Fail;
0240 }
0241 else
0242 {
0243
0244 base->RSTNTF = SEMA4_RSTNTF_RSTNSM_RSTNMS_RSTNDP(SEMA4_GATE_IRQ_RESET_PATTERN_1);
0245
0246 base->RSTNTF = SEMA4_RSTNTF_RSTNSM_RSTNMS_RSTNDP(SEMA4_GATE_IRQ_RESET_PATTERN_2) | SEMA4_RSTNTF_RSTNTN(gateNum);
0247
0248 status = kStatus_Success;
0249 }
0250
0251 return status;
0252 }