blob: 1a9a38a234c69b37075c8c10f32f0267c3b58617 (
plain)
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
|
/**************************************************************************//**
* @file bmc.c
* @version V3.00
* @brief M460 series BMC driver source file
*
* @copyright SPDX-License-Identifier: Apache-2.0
* @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include "NuMicro.h"
/** @addtogroup Standard_Driver Standard Driver
@{
*/
/** @addtogroup BMC_Driver BMC Driver
@{
*/
/** @addtogroup BMC_EXPORTED_FUNCTIONS BMC Exported Functions
@{
*/
/**
* @brief Set the BMC bit clock
* @param[in] u32BitClock The expected frequency of BMC bit clock in Hz
* @return Actual frequency of BMC bit clock
* @details The actual clock rate may be different from the target BMC bit clock rate.
* For example, if the system clock rate is 200 MHz and the target BMC bit clock rate is 3 MHz, the actual BMC bit clock
* rate will be 2 MHz.
* \hideinitializer
*/
uint32_t BMC_SetBitClock(uint32_t u32BitClock)
{
uint32_t u32HCLKFreq, u32Div, u32RetValue;
/* Get system clock frequency */
u32HCLKFreq = CLK_GetHCLKFreq();
u32Div = ((u32HCLKFreq * 10UL) / u32BitClock + 5UL) / 10UL; /* Round to the nearest integer */
BMC->CTL = (BMC->CTL & (~BMC_CTL_BTDIV_Msk)) | (u32Div << BMC_CTL_BTDIV_Pos);
/* Return BMC bit clock rate */
u32RetValue = u32HCLKFreq / u32Div;
return u32RetValue;
}
/**
* @brief Get the actual frequency of BMC bit clock
* @return Actual BMC bit frequency in Hz
* @details This API will calculate the actual BMC bit clock rate according to the HBTDIV setting.
* \hideinitializer
*/
uint32_t BMC_GetBitClock(void)
{
uint32_t u32HCLKFreq, u32Div;
/* Get BTDIV setting */
u32Div = (BMC->CTL & BMC_CTL_BTDIV_Msk) >> BMC_CTL_BTDIV_Pos;
/* Get system clock frequency */
u32HCLKFreq = CLK_GetHCLKFreq();
/* Return BMC bit clock rate */
return (u32HCLKFreq / u32Div);
}
/**
* @brief Set the dummy delay time period of each group
* @param[in] u32ChGroup BMC channel group selection, valid values are:
* - \ref BMC_GROUP_0
* - \ref BMC_GROUP_1
* - \ref BMC_GROUP_2
* - \ref BMC_GROUP_3
* - \ref BMC_GROUP_4
* - \ref BMC_GROUP_5
* - \ref BMC_GROUP_6
* - \ref BMC_GROUP_7
* @param[in] u32DumDelay The expected BMC dummy delay period in microsecond
* @return Actual dummy delay time period in microsecond
* @details This API is used to set each group dummy delay time period.
* \hideinitializer
*/
uint32_t BMC_SetDummyDelayPeriod(uint32_t u32ChGroup, uint32_t u32DumDelay)
{
uint32_t i, u32BitNum;
u32BitNum = ((BMC_GetBitClock() * u32DumDelay) / 1000000UL) / 8UL;
for (i = 0UL; i < (uint32_t)BMC_CHANNEL_NUM; i += 4UL)
{
if ((u32ChGroup == i) && (u32ChGroup <= BMC_GROUP_3))
{
outp8((uint32_t) & (BMC->DNUM0) + (i >> 2UL), u32BitNum);
break;
}
else if ((u32ChGroup == i) && (u32ChGroup > BMC_GROUP_3))
{
outp8((uint32_t) & (BMC->DNUM1) + ((i >> 2UL) - 4UL), u32BitNum);
break;
}
}
/* Return BMC dummy delay time period */
return (8UL * 1000000UL / BMC_GetBitClock() * u32BitNum);
}
/**
* @brief Enable interrupt function
* @param[in] u32Mask The combination of all related interrupt enable bits.
* Each bit corresponds to a interrupt enable bit.
* This parameter decides which interrupts will be enabled. It is combination of:
* - \ref BMC_FTXD_INT_MASK
* - \ref BMC_TXUND_INT_MASK
* @return None
* @details This API is used to enable BMC related interrupts specified by u32Mask parameter.
* \hideinitializer
*/
void BMC_EnableInt(uint32_t u32Mask)
{
/* Enable frame transmit done interrupt flag */
if ((u32Mask & BMC_FTXD_INT_MASK) == BMC_FTXD_INT_MASK)
{
BMC->INTEN |= BMC_INTEN_FTXDIEN_Msk;
}
/* Enable transmit data under run interrupt flag */
if ((u32Mask & BMC_TXUND_INT_MASK) == BMC_TXUND_INT_MASK)
{
BMC->INTEN |= BMC_INTEN_TXUNDIEN_Msk;
}
}
/**
* @brief Disable interrupt function
* @param[in] u32Mask The combination of all related interrupt enable bits.
* Each bit corresponds to a interrupt enable bit.
* This parameter decides which interrupts will be disabled. It is combination of:
* - \ref BMC_FTXD_INT_MASK
* - \ref BMC_TXUND_INT_MASK
* @return None
* @details This API is used to disable BMC related interrupts specified by u32Mask parameter.
* \hideinitializer
*/
void BMC_DisableInt(uint32_t u32Mask)
{
/* Disable frame transmit done interrupt flag */
if ((u32Mask & BMC_FTXD_INT_MASK) == BMC_FTXD_INT_MASK)
{
BMC->INTEN &= ~BMC_INTEN_FTXDIEN_Msk;
}
/* Disable transmit data under run interrupt flag */
if ((u32Mask & BMC_TXUND_INT_MASK) == BMC_TXUND_INT_MASK)
{
BMC->INTEN &= ~BMC_INTEN_TXUNDIEN_Msk;
}
}
/**
* @brief Get interrupt flag
* @param[in] u32Mask The combination of all related interrupt sources.
* Each bit corresponds to a interrupt source.
* This parameter decides which interrupt flags will be read. It is combination of:
* - \ref BMC_FTXD_INT_MASK
* - \ref BMC_TXUND_INT_MASK
* @return Interrupt flags of selected sources
* @details This API is used to get BMC related interrupt flags specified by u32Mask parameter.
* \hideinitializer
*/
uint32_t BMC_GetIntFlag(uint32_t u32Mask)
{
uint32_t u32IntStatus;
uint32_t u32IntFlag = 0UL;
u32IntStatus = BMC->INTSTS;
/* Check frame transmit done interrupt flag */
if ((u32Mask & BMC_FTXD_INT_MASK) && (u32IntStatus & BMC_INTSTS_FTXDIF_Msk))
{
u32IntFlag |= BMC_FTXD_INT_MASK;
}
/* Check transmit data under run interrupt flag */
if ((u32Mask & BMC_TXUND_INT_MASK) && (u32IntStatus & BMC_INTSTS_TXUNDIF_Msk))
{
u32IntFlag |= BMC_TXUND_INT_MASK;
}
return u32IntFlag;
}
/**
* @brief Clear interrupt flag
* @param[in] u32Mask The related interrupt source.
* This parameter decides which interrupt flag will be cleared. Possible option is:
* - \ref BMC_FTXD_INT_MASK
* @return None
* @details This API is used to clear BMC related interrupt flag specified by u32Mask parameter.
* \hideinitializer
*/
void BMC_ClearIntFlag(uint32_t u32Mask)
{
if (u32Mask & BMC_FTXD_INT_MASK)
{
BMC->INTSTS = BMC_INTSTS_FTXDIF_Msk; /* Clear frame transmit done interrupt flag */
}
}
/**
* @brief Get BMC status
* @param[in] u32Mask The combination of all related sources.
* Each bit corresponds to a related source.
* This parameter decides which flags will be read. It is combination of:
* - \ref BMC_G0TXUND_MASK
* - \ref BMC_G1TXUND_MASK
* - \ref BMC_G2TXUND_MASK
* - \ref BMC_G3TXUND_MASK
* - \ref BMC_G4TXUND_MASK
* - \ref BMC_G5TXUND_MASK
* - \ref BMC_G6TXUND_MASK
* - \ref BMC_G7TXUND_MASK
* @return Flags of selected sources
* @details This API is used to get BMC related status specified by u32Mask parameter.
* \hideinitializer
*/
uint32_t BMC_GetStatus(uint32_t u32Mask)
{
uint32_t u32TmpStatus;
uint32_t u32Flag = 0UL;
u32TmpStatus = BMC->INTSTS;
/* Check group 0 transmit data under run status */
if ((u32Mask & BMC_G0TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G0TXUND_Msk))
{
u32Flag |= BMC_G0TXUND_MASK;
}
/* Check group 1 transmit data under run status */
if ((u32Mask & BMC_G1TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G1TXUND_Msk))
{
u32Flag |= BMC_G1TXUND_MASK;
}
/* Check group 2 transmit data under run status */
if ((u32Mask & BMC_G2TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G2TXUND_Msk))
{
u32Flag |= BMC_G2TXUND_MASK;
}
/* Check group 3 transmit data under run status */
if ((u32Mask & BMC_G3TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G3TXUND_Msk))
{
u32Flag |= BMC_G3TXUND_MASK;
}
/* Check group 4 transmit data under run status */
if ((u32Mask & BMC_G4TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G4TXUND_Msk))
{
u32Flag |= BMC_G4TXUND_MASK;
}
/* Check group 5 transmit data under run status */
if ((u32Mask & BMC_G5TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G5TXUND_Msk))
{
u32Flag |= BMC_G5TXUND_MASK;
}
/* Check group 6 transmit data under run status */
if ((u32Mask & BMC_G6TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G6TXUND_Msk))
{
u32Flag |= BMC_G6TXUND_MASK;
}
/* Check group 7 transmit data under run status */
if ((u32Mask & BMC_G7TXUND_MASK) && (u32TmpStatus & BMC_INTSTS_G7TXUND_Msk))
{
u32Flag |= BMC_G7TXUND_MASK;
}
return u32Flag;
}
/**
* @brief Clear BMC status
* @param[in] u32Mask The combination of all related sources.
* Each bit corresponds to a related source.
* This parameter decides which flags will be cleared. It is combination of:
* - \ref BMC_G0TXUND_MASK
* - \ref BMC_G1TXUND_MASK
* - \ref BMC_G2TXUND_MASK
* - \ref BMC_G3TXUND_MASK
* - \ref BMC_G4TXUND_MASK
* - \ref BMC_G5TXUND_MASK
* - \ref BMC_G6TXUND_MASK
* - \ref BMC_G7TXUND_MASK
* @return None
* @details This API is used to clear BMC related status specified by u32Mask parameter.
* \hideinitializer
*/
void BMC_ClearStatus(uint32_t u32Mask)
{
if (u32Mask & BMC_G0TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G0TXUND_Msk; /* Check group 0 transmit data under run status */
}
if (u32Mask & BMC_G1TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G1TXUND_Msk; /* Check group 1 transmit data under run status */
}
if (u32Mask & BMC_G2TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G2TXUND_Msk; /* Check group 2 transmit data under run status */
}
if (u32Mask & BMC_G3TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G3TXUND_Msk; /* Check group 3 transmit data under run status */
}
if (u32Mask & BMC_G4TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G4TXUND_Msk; /* Check group 4 transmit data under run status */
}
if (u32Mask & BMC_G5TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G5TXUND_Msk; /* Check group 5 transmit data under run status */
}
if (u32Mask & BMC_G6TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G6TXUND_Msk; /* Check group 6 transmit data under run status */
}
if (u32Mask & BMC_G7TXUND_MASK)
{
BMC->INTSTS = BMC_INTSTS_G7TXUND_Msk; /* Check group 7 transmit data under run status */
}
}
/*@}*/ /* end of group BMC_EXPORTED_FUNCTIONS */
/*@}*/ /* end of group BMC_Driver */
/*@}*/ /* end of group Standard_Driver */
|