summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/drivers/rdc_sema42/fsl_rdc_sema42.h
blob: ddd9e4bbc2275123e5d2ab3cfc9c7f8af6eb0ebd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
 * Copyright 2017-2020, 2022 NXP
 * All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef _FSL_RDC_SEMA42_H_
#define _FSL_RDC_SEMA42_H_

#include "fsl_common.h"

/*!
 * @addtogroup rdc_sema42
 * @{
 */

/******************************************************************************
 * Definitions
 *****************************************************************************/

/*! @name Driver version */
/*@{*/
/*! @brief RDC_SEMA42 driver version */
#define FSL_RDC_SEMA42_DRIVER_VERSION (MAKE_VERSION(2, 0, 4))
/*@}*/

/*! @brief The number to reset all RDC_SEMA42 gates. */
#define RDC_SEMA42_GATE_NUM_RESET_ALL (64U)

#if defined(RDC_SEMAPHORE_GATE_COUNT)

/*! @brief RDC_SEMA42 gate n register address. */
#define RDC_SEMA42_GATEn(base, n) ((base)->GATE[(n)])

/*! @brief RDC_SEMA42 gate count. */
#define RDC_SEMA42_GATE_COUNT (RDC_SEMAPHORE_GATE_COUNT)

#else /* RDC_SEMAPHORE_GATE_COUNT */

/*! @brief RDC_SEMA42 gate n register address. */
#define RDC_SEMA42_GATEn(base, n)     (((volatile uint8_t *)(&((base)->GATE0)))[(n)])

/*! @brief RDC_SEMA42 gate count. */
#define RDC_SEMA42_GATE_COUNT         (64U)

/* Compatible remap. */
#define RDC_SEMAPHORE_GATE_GTFSM_MASK RDC_SEMAPHORE_GATE0_GTFSM_MASK

#endif /* RDC_SEMAPHORE_GATE_COUNT */

/*******************************************************************************
 * API
 ******************************************************************************/

#if defined(__cplusplus)
extern "C" {
#endif

/*!
 * @brief Initializes the RDC_SEMA42 module.
 *
 * This function initializes the RDC_SEMA42 module. It only enables the clock but does
 * not reset the gates because the module might be used by other processors
 * at the same time. To reset the gates, call either RDC_SEMA42_ResetGate or
 * RDC_SEMA42_ResetAllGates function.
 *
 * @param base RDC_SEMA42 peripheral base address.
 */
void RDC_SEMA42_Init(RDC_SEMAPHORE_Type *base);

/*!
 * @brief De-initializes the RDC_SEMA42 module.
 *
 * This function de-initializes the RDC_SEMA42 module. It only disables the clock.
 *
 * @param base RDC_SEMA42 peripheral base address.
 */
void RDC_SEMA42_Deinit(RDC_SEMAPHORE_Type *base);

/*!
 * @brief Tries to lock the RDC_SEMA42 gate.
 *
 * This function tries to lock the specific RDC_SEMA42 gate. If the gate has been
 * locked by another processor, this function returns an error code.
 *
 * @param base RDC_SEMA42 peripheral base address.
 * @param gateNum  Gate number to lock.
 * @param masterIndex  Current processor master index.
 * @param domainId  Current processor domain ID.
 *
 * @retval kStatus_Success   Lock the sema42 gate successfully.
 * @retval kStatus_Failed    Sema42 gate has been locked by another processor.
 */
status_t RDC_SEMA42_TryLock(RDC_SEMAPHORE_Type *base, uint8_t gateNum, uint8_t masterIndex, uint8_t domainId);

/*!
 * @brief Locks the RDC_SEMA42 gate.
 *
 * This function locks the specific RDC_SEMA42 gate. If the gate has been
 * locked by other processors, this function waits until it is unlocked and then
 * lock it.
 *
 * @param base RDC_SEMA42 peripheral base address.
 * @param gateNum  Gate number to lock.
 * @param masterIndex  Current processor master index.
 * @param domainId  Current processor domain ID.
 */
void RDC_SEMA42_Lock(RDC_SEMAPHORE_Type *base, uint8_t gateNum, uint8_t masterIndex, uint8_t domainId);

/*!
 * @brief Unlocks the RDC_SEMA42 gate.
 *
 * This function unlocks the specific RDC_SEMA42 gate. It only writes unlock value
 * to the RDC_SEMA42 gate register. However, it does not check whether the RDC_SEMA42 gate is locked
 * by the current processor or not. As a result, if the RDC_SEMA42 gate is not locked by the current
 * processor, this function has no effect.
 *
 * @param base RDC_SEMA42 peripheral base address.
 * @param gateNum  Gate number to unlock.
 */
static inline void RDC_SEMA42_Unlock(RDC_SEMAPHORE_Type *base, uint8_t gateNum)
{
    assert(gateNum < RDC_SEMA42_GATE_COUNT);

    RDC_SEMA42_GATEn(base, gateNum) = 0U;
}

/*!
 * @brief Gets which master has currently locked the gate.
 *
 * @param base RDC_SEMA42 peripheral base address.
 * @param gateNum  Gate number.
 *
 * @return Return -1 if the gate is not locked by any master, otherwise return the
 * master index.
 */
static inline int32_t RDC_SEMA42_GetLockMasterIndex(RDC_SEMAPHORE_Type *base, uint8_t gateNum)
{
    assert(gateNum < RDC_SEMA42_GATE_COUNT);

    uint8_t regGate = RDC_SEMA42_GATEn(base, gateNum);

    return (int32_t)((uint8_t)(regGate & RDC_SEMAPHORE_GATE_GTFSM_MASK)) - 1;
}

/*!
 * @brief Gets which domain has currently locked the gate.
 *
 * @param base RDC_SEMA42 peripheral base address.
 * @param gateNum  Gate number.
 *
 * @return Return -1 if the gate is not locked by any domain, otherwise return the
 * domain ID.
 */
int32_t RDC_SEMA42_GetLockDomainID(RDC_SEMAPHORE_Type *base, uint8_t gateNum);

/*!
 * @brief Resets the RDC_SEMA42 gate to an unlocked status.
 *
 * This function resets a RDC_SEMA42 gate to an unlocked status.
 *
 * @param base RDC_SEMA42 peripheral base address.
 * @param gateNum  Gate number.
 *
 * @retval kStatus_Success         RDC_SEMA42 gate is reset successfully.
 * @retval kStatus_Failed Some other reset process is ongoing.
 */
status_t RDC_SEMA42_ResetGate(RDC_SEMAPHORE_Type *base, uint8_t gateNum);

/*!
 * @brief Resets all RDC_SEMA42 gates to an unlocked status.
 *
 * This function resets all RDC_SEMA42 gate to an unlocked status.
 *
 * @param base RDC_SEMA42 peripheral base address.
 *
 * @retval kStatus_Success         RDC_SEMA42 is reset successfully.
 * @retval kStatus_RDC_SEMA42_Reseting Some other reset process is ongoing.
 */
static inline status_t RDC_SEMA42_ResetAllGates(RDC_SEMAPHORE_Type *base)
{
    return RDC_SEMA42_ResetGate(base, RDC_SEMA42_GATE_NUM_RESET_ALL);
}

#if defined(__cplusplus)
}
#endif

/*!
 * @}
 */

#endif /* _FSL_RDC_SEMA42_H_ */