1 /*!
2 \file gd32a50x_mfcom.c
3 \brief MFCOM driver
4
5 \version 2022-01-30, V1.0.0, firmware for GD32A50X
6 */
7
8 /*
9 Copyright (c) 2022, GigaDevice Semiconductor Inc.
10
11 Redistribution and use in source and binary forms, with or without modification,
12 are permitted provided that the following conditions are met:
13
14 1. Redistributions of source code must retain the above copyright notice, this
15 list of conditions and the following disclaimer.
16 2. Redistributions in binary form must reproduce the above copyright notice,
17 this list of conditions and the following disclaimer in the documentation
18 and/or other materials provided with the distribution.
19 3. Neither the name of the copyright holder nor the names of its contributors
20 may be used to endorse or promote products derived from this software without
21 specific prior written permission.
22
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
32 OF SUCH DAMAGE.
33 */
34
35 #include "gd32a50x_mfcom.h"
36
37 /*!
38 \brief reset MFCOM
39 \param[in] none
40 \param[out] none
41 \retval none
42 */
mfcom_deinit(void)43 void mfcom_deinit(void)
44 {
45 /* reset MFCOM */
46 rcu_periph_reset_enable(RCU_MFCOMRST);
47 rcu_periph_reset_disable(RCU_MFCOMRST);
48 }
49
50 /*!
51 \brief software reset
52 \param[in] none
53 \param[out] none
54 \retval none
55 */
mfcom_software_reset(void)56 void mfcom_software_reset(void)
57 {
58 MFCOM_CTL |= MFCOM_CTL_SWRSTEN;
59 MFCOM_CTL &= ~MFCOM_CTL_SWRSTEN;
60 }
61
62
63 /*!
64 \brief enable MFCOM function
65 \param[in] none
66 \param[out] none
67 \retval none
68 */
mfcom_enable(void)69 void mfcom_enable(void)
70 {
71 MFCOM_CTL |= MFCOM_CTL_MFCOMEN;
72 }
73
74 /*!
75 \brief disable MFCOM function
76 \param[in] none
77 \param[out] none
78 \retval none
79 */
mfcom_disable(void)80 void mfcom_disable(void)
81 {
82 MFCOM_CTL &= ~MFCOM_CTL_MFCOMEN;
83 }
84
85 /*!
86 \brief initialize mfcom_timer_parameter_struct with the default values
87 \param[in] init_struct: the initialization timer parameter need
88 \param[out] none
89 \retval none
90 */
mfcom_timer_struct_para_init(mfcom_timer_parameter_struct * init_struct)91 void mfcom_timer_struct_para_init(mfcom_timer_parameter_struct* init_struct)
92 {
93 /* set the mfcom_timer_parameter_struct with the default values */
94 init_struct->trigger_select = MFCOM_TIMER_TRGSEL_PIN0;
95 init_struct->trigger_polarity = MFCOM_TIMER_TRGPOL_ACTIVE_HIGH;
96 init_struct->pin_config = MFCOM_TIMER_PINCFG_INPUT;
97 init_struct->pin_select = MFCOM_TIMER_PINSEL_PIN0;
98 init_struct->pin_polarity = MFCOM_TIMER_PINPOL_ACTIVE_HIGH;
99 init_struct->mode = MFCOM_TIMER_DISABLE;
100 init_struct->output = MFCOM_TIMER_OUT_HIGH_EN;
101 init_struct->decrement = MFCOM_TIMER_DEC_CLK_SHIFT_OUT;
102 init_struct->reset = MFCOM_TIMER_RESET_NEVER;
103 init_struct->disable = MFCOM_TIMER_DISMODE_NEVER;
104 init_struct->enable = MFCOM_TIMER_ENMODE_ALWAYS;
105 init_struct->stopbit = MFCOM_TIMER_STOPBIT_DISABLE;
106 init_struct->startbit = MFCOM_TIMER_STARTBIT_DISABLE;
107 init_struct->compare = 0U;
108 }
109
110 /*!
111 \brief initialize mfcom_shifter_parameter_struct with the default values
112 \param[in] init_struct: the initialization shifter parameter need
113 \param[out] none
114 \retval none
115 */
mfcom_shifter_struct_para_init(mfcom_shifter_parameter_struct * init_struct)116 void mfcom_shifter_struct_para_init(mfcom_shifter_parameter_struct* init_struct)
117 {
118 /* set the mfcom_shifter_parameter_struct with the default values */
119 init_struct->timer_select = MFCOM_SHIFTER_TIMER0;
120 init_struct->timer_polarity = MFCOM_SHIFTER_TIMPOL_ACTIVE_HIGH;
121 init_struct->pin_config = MFCOM_SHIFTER_PINCFG_INPUT;
122 init_struct->pin_select = MFCOM_SHIFTER_PINSEL_PIN0;
123 init_struct->pin_polarity = MFCOM_SHIFTER_PINPOL_ACTIVE_HIGH;
124 init_struct->mode = MFCOM_SHIFTER_DISABLE;
125 init_struct->input_source = MFCOM_SHIFTER_INSRC_PIN;
126 init_struct->stopbit = MFCOM_SHIFTER_STOPBIT_DISABLE;
127 init_struct->startbit = MFCOM_SHIFTER_STARTBIT_DISABLE;
128 }
129
130 /*!
131 \brief initialize MFCOM timer parameter
132 \param[in] timer: MFCOM timer number
133 \arg MFCOM_TIMER_x(x=0..3)
134 \param[in] init_struct: the initialization timer parameter need
135 \arg trigger_select: MFCOM_TIMER_TRGSEL_PIN0 MFCOM_TIMER_TRGSEL_SHIFTER0
136 MFCOM_TIMER_TRGSEL_PIN1 MFCOM_TIMER_TRGSEL_TIMER0
137 MFCOM_TIMER_TRGSEL_PIN2 MFCOM_TIMER_TRGSEL_SHIFTER1
138 MFCOM_TIMER_TRGSEL_PIN3 MFCOM_TIMER_TRGSEL_TIMER1
139 MFCOM_TIMER_TRGSEL_PIN4 MFCOM_TIMER_TRGSEL_SHIFTER2
140 MFCOM_TIMER_TRGSEL_PIN5 MFCOM_TIMER_TRGSEL_TIMER2
141 MFCOM_TIMER_TRGSEL_PIN6 MFCOM_TIMER_TRGSEL_SHIFTER3
142 MFCOM_TIMER_TRGSEL_PIN7 MFCOM_TIMER_TRGSEL_TIMER3
143 MFCOM_TIMER_TRGSEL_EXTERNAL0 MFCOM_TIMER_TRGSEL_EXTERNAL1
144 MFCOM_TIMER_TRGSEL_EXTERNAL2 MFCOM_TIMER_TRGSEL_EXTERNAL3
145
146 trigger_polarity: MFCOM_TIMER_TRGPOL_ACTIVE_HIGH
147 MFCOM_TIMER_TRGPOL_ACTIVE_LOW
148
149 pin_config: MFCOM_TIMER_PINCFG_INPUT MFCOM_TIMER_PINCFG_OPENDRAIN
150 MFCOM_TIMER_PINCFG_BIDI MFCOM_TIMER_PINCFG_OUTPUT
151
152 pin_select: MFCOM_TIMER_PINSEL_PIN0 MFCOM_TIMER_PINSEL_PIN1
153 MFCOM_TIMER_PINSEL_PIN2 MFCOM_TIMER_PINSEL_PIN3
154 MFCOM_TIMER_PINSEL_PIN4 MFCOM_TIMER_PINSEL_PIN5
155 MFCOM_TIMER_PINSEL_PIN6 MFCOM_TIMER_PINSEL_PIN7
156
157 pin_polarity: MFCOM_TIMER_PINPOL_ACTIVE_HIGH
158 MFCOM_TIMER_PINPOL_ACTIVE_LOW
159
160 mode: MFCOM_TIMER_DISABLE MFCOM_TIMER_BAUDMODE
161 MFCOM_TIMER_PWMMODE MFCOM_TIMER_16BITCOUNTER
162
163 output: MFCOM_TIMER_OUT_HIGH_EN MFCOM_TIMER_OUT_LOW_EN
164 MFCOM_TIMER_OUT_HIGH_EN_RESET MFCOM_TIMER_OUT_LOW_EN_RESET
165
166 decrement: MFCOM_TIMER_DEC_CLK_SHIFT_OUT MFCOM_TIMER_DEC_TRIG_SHIFT_OUT
167 MFCOM_TIMER_DEC_PIN_SHIFT_PIN MFCOM_TIMER_DEC_TRIG_SHIFT_TRIG
168
169 reset: MFCOM_TIMER_RESET_NEVER MFCOM_TIMER_RESET_PIN_TIMOUT
170 MFCOM_TIMER_RESET_TRIG_TIMOUT MFCOM_TIMER_RESET_PIN_RISING
171 MFCOM_TIMER_RESET_TRIG_RISING MFCOM_TIMER_RESET_TRIG_BOTH
172
173 disable: MFCOM_TIMER_DISMODE_NEVER MFCOM_TIMER_DISMODE_PRE_TIMDIS
174 MFCOM_TIMER_DISMODE_COMPARE MFCOM_TIMER_DISMODE_COMPARE_TRIGLOW
175 MFCOM_TIMER_DISMODE_PINBOTH MFCOM_TIMER_DISMODE_PINBOTH_TRIGHIGH
176 MFCOM_TIMER_DISMODE_TRIGFALLING
177
178 enable: MFCOM_TIMER_ENMODE_ALWAYS MFCOM_TIMER_ENMODE_PRE_TIMEN
179 MFCOM_TIMER_ENMODE_TRIGHIGH MFCOM_TIMER_ENMODE_TRIGHIGH_PINHIGH
180 MFCOM_TIMER_ENMODE_PINRISING MFCOM_TIMER_ENMODE_PINRISING_TRIGHIGH
181 MFCOM_TIMER_ENMODE_TRIGRISING MFCOM_TIMER_ENMODE_TRIGBOTH
182
183 stopbit: MFCOM_TIMER_STOPBIT_DISABLE MFCOM_TIMER_STOPBIT_TIMCMP
184 MFCOM_TIMER_STOPBIT_TIMDIS MFCOM_TIMER_STOPBIT_TIMCMP_TIMDIS
185
186 startbit: MFCOM_TIMER_STARTBIT_DISABLE
187 MFCOM_TIMER_STARTBIT_ENABLE
188
189 compare: compare value
190 \param[out] none
191 \retval none
192 */
mfcom_timer_init(uint32_t timer,mfcom_timer_parameter_struct * init_struct)193 void mfcom_timer_init(uint32_t timer, mfcom_timer_parameter_struct* init_struct)
194 {
195 /* configure compare value */
196 MFCOM_TMCMP(timer) = (uint32_t)init_struct->compare;
197 /* configure timer output/decrement/reset/disable/enable/stopbit/startbit */
198 MFCOM_TMCFG(timer) = init_struct->output | init_struct->decrement | init_struct->reset | init_struct->disable | init_struct->enable | init_struct->stopbit | init_struct->startbit;
199
200 /* configure pin trigger_select/trigger_polarity/pin_config/pin_select/pin_polarity/mode */
201 MFCOM_TMCTL(timer) = init_struct->trigger_select | init_struct->trigger_polarity | init_struct->pin_config | init_struct->pin_select | init_struct->pin_polarity | init_struct->mode;
202 }
203
204 /*!
205 \brief initialize MFCOM shifter parameter
206 \param[in] shifter: MFCOM shifter number
207 \arg MFCOM_SHIFTER_x(x=0..3)
208 \param[in] init_struct: the initialization shifter parameter need
209 \arg timer_select: MFCOM_SHIFTER_TIMER0 MFCOM_SHIFTER_TIMER1
210 MFCOM_SHIFTER_TIMER2 MFCOM_SHIFTER_TIMER3
211
212 timer_polarity: MFCOM_SHIFTER_TIMPOL_ACTIVE_HIGH
213 MFCOM_SHIFTER_TIMPOL_ACTIVE_LOW
214
215 pin_config: MFCOM_SHIFTER_PINCFG_INPUT MFCOM_SHIFTER_PINCFG_OPENDRAIN
216 MFCOM_SHIFTER_PINCFG_BIDI MFCOM_SHIFTER_PINCFG_OUTPUT
217
218 pin_select: MFCOM_SHIFTER_PINSEL_PIN0 MFCOM_SHIFTER_PINSEL_PIN1
219 MFCOM_SHIFTER_PINSEL_PIN2 MFCOM_SHIFTER_PINSEL_PIN3
220 MFCOM_SHIFTER_PINSEL_PIN4 MFCOM_SHIFTER_PINSEL_PIN5
221 MFCOM_SHIFTER_PINSEL_PIN6 MFCOM_SHIFTER_PINSEL_PIN7
222
223 pin_polarity: MFCOM_SHIFTER_PINPOL_ACTIVE_HIGH
224 MFCOM_SHIFTER_PINPOL_ACTIVE_LOW
225
226 mode: MFCOM_SHIFTER_DISABLE MFCOM_SHIFTER_RECEIVE
227 MFCOM_SHIFTER_TRANSMIT MFCOM_SHIFTER_MATCH_STORE
228 MFCOM_SHIFTER_MATCH_CONTINUOUS
229
230 input_source: MFCOM_SHIFTER_INSRC_PIN
231 MFCOM_SHIFTER_INSRC_NEXTSHIFTER
232
233 stopbit: MFCOM_SHIFTER_STOPBIT_DISABLE MFCOM_SHIFTER_STOPBIT_LOW
234 MFCOM_SHIFTER_STOPBIT_HIGH
235
236 startbit: MFCOM_SHIFTER_STARTBIT_DISABLE MFCOM_SHIFTER_STARTBIT_DISABLE_TXEN
237 MFCOM_SHIFTER_STARTBIT_LOW MFCOM_SHIFTER_STARTBIT_HIGH
238 \param[out] none
239 \retval none
240 */
mfcom_shifter_init(uint32_t shifter,mfcom_shifter_parameter_struct * init_struct)241 void mfcom_shifter_init(uint32_t shifter, mfcom_shifter_parameter_struct* init_struct)
242 {
243 /* configure shifter input_source/stopbit/startbit */
244 MFCOM_SCFG(shifter) = init_struct->input_source | init_struct->stopbit | init_struct->startbit;
245
246 /* configure shifter timer_select/timer_polarity/pin_config/pin_select/pin_polarity/mode */
247 MFCOM_SCTL(shifter) = init_struct->timer_select | init_struct->timer_polarity | init_struct->pin_config | init_struct->pin_select | init_struct->pin_polarity | init_struct->mode;
248 }
249
250 /*!
251 \brief configure timer pin mode
252 \param[in] timer: MFCOM timer number
253 \arg MFCOM_TIMER_x(x=0..3)
254 \param[in] outputmode:
255 \arg MFCOM_TIMER_PINCFG_INPUT: pin input
256 \arg MFCOM_TIMER_PINCFG_OPENDRAIN: pin open drain or bidirectional output enable
257 \arg MFCOM_TIMER_PINCFG_BIDI: pin bidirectional output data
258 \arg MFCOM_TIMER_PINCFG_OUTPUT: pin output
259 \param[out] none
260 \retval none
261 */
mfcom_timer_pin_config(uint32_t timer,uint32_t mode)262 void mfcom_timer_pin_config(uint32_t timer, uint32_t mode)
263 {
264 uint32_t temp;
265 temp = MFCOM_TMCTL(timer);
266
267 /* clear timer pin configuration bits */
268 temp &= ~MFCOM_TMCTL_TMPCFG;
269
270 /* set timer pin outputmode */
271 temp |= mode;
272 MFCOM_TMCTL(timer) = temp;
273 }
274
275 /*!
276 \brief configure shifter pin mode
277 \param[in] shifter: MFCOM shifter number
278 \arg MFCOM_SHIFTER_x(x=0..3)
279 \param[in] outputmode:
280 \arg MFCOM_SHIFTER_PINCFG_INPUT: pin input
281 \arg MFCOM_SHIFTER_PINCFG_OPENDRAIN: pin open drain or bidirectional output enable
282 \arg MFCOM_SHIFTER_PINCFG_BIDI: pin bidirectional output data
283 \arg MFCOM_SHIFTER_PINCFG_OUTPUT: pin output
284 \param[out] none
285 \retval none
286 */
mfcom_shifter_pin_config(uint32_t shifter,uint32_t mode)287 void mfcom_shifter_pin_config(uint32_t shifter, uint32_t mode)
288 {
289 uint32_t temp;
290 temp = MFCOM_SCTL(shifter);
291
292 /* clear shifter pin configuration bits */
293 temp &= ~MFCOM_SCTL_SPCFG;
294
295 /* set shifter pin outputmode */
296 temp |= mode;
297 MFCOM_SCTL(shifter) = temp;
298 }
299
300 /*!
301 \brief enable MFCOM timer in specific mode
302 \param[in] timer: MFCOM timer number
303 \arg MFCOM_TIMER_x(x=0..3)
304 \param[in] timermode:
305 \arg MFCOM_TIMER_DISABLE: timer disabled
306 \arg MFCOM_TIMER_BAUDMODE: dual 8-bit counters baud/bit mode
307 \arg MFCOM_TIMER_PWMMODE: dual 8-bit counters PWM mode
308 \arg MFCOM_TIMER_16BITCOUNTER: single 16-bit counter mode
309 \param[out] none
310 \retval none
311 */
mfcom_timer_enable(uint32_t timer,uint32_t timermode)312 void mfcom_timer_enable(uint32_t timer, uint32_t timermode)
313 {
314 uint32_t temp;
315 temp = MFCOM_TMCTL(timer);
316
317 /* clear timer mode bits */
318 temp &= ~MFCOM_TMCTL_TMMOD;
319
320 /* set timer mode */
321 temp |= timermode;
322 MFCOM_TMCTL(timer) = temp;
323 }
324
325 /*!
326 \brief enable MFCOM shifter in specific mode
327 \param[in] shifter: MFCOM shifter number
328 \arg MFCOM_SHIFTER_x(x=0..3)
329 \param[in] shiftermode:
330 \arg MFCOM_SHIFTER_DISABLE: shifter is disabled
331 \arg MFCOM_SHIFTER_RECEIVE: receive mode
332 \arg MFCOM_SHIFTER_TRANSMIT: transmit mode
333 \arg MFCOM_SHIFTER_MATCH_STORE: match store mode
334 \arg MFCOM_SHIFTER_MATCH_CONTINUOUS: match continuous mode
335 \param[out] none
336 \retval none
337 */
mfcom_shifter_enable(uint32_t shifter,uint32_t shiftermode)338 void mfcom_shifter_enable(uint32_t shifter, uint32_t shiftermode)
339 {
340 uint32_t temp;
341 temp = MFCOM_SCTL(shifter);
342
343 /* clear shifter mode bits */
344 temp &= ~MFCOM_SCTL_SMOD;
345
346 /* set shifter mode */
347 temp |= shiftermode;
348 MFCOM_SCTL(shifter) = temp;
349 }
350
351 /*!
352 \brief disable MFCOM timer
353 \param[in] timer: MFCOM timer number
354 \arg MFCOM_TIMER_x(x=0..3)
355 \param[out] none
356 \retval none
357 */
mfcom_timer_disable(uint32_t timer)358 void mfcom_timer_disable(uint32_t timer)
359 {
360 MFCOM_TMCTL(timer) &= ~MFCOM_TMCTL_TMMOD;
361 }
362
363 /*!
364 \brief disable MFCOM shifter
365 \param[in] shifter: MFCOM shifter number
366 \arg MFCOM_SHIFTER_x(x=0..3)
367 \param[out] none
368 \retval none
369 */
mfcom_shifter_disable(uint32_t shifter)370 void mfcom_shifter_disable(uint32_t shifter)
371 {
372 MFCOM_SCTL(shifter) &= ~MFCOM_SCTL_SMOD;
373 }
374
375 /*!
376 \brief set MFCOM timer compare value
377 \param[in] timer: MFCOM timer number
378 \arg MFCOM_TIMER_x(x=0..3)
379 \param[in] compare: timer compare value
380 \param[out] none
381 \retval none
382 */
mfcom_timer_cmpvalue_set(uint32_t timer,uint32_t compare)383 void mfcom_timer_cmpvalue_set(uint32_t timer, uint32_t compare)
384 {
385 MFCOM_TMCMP(timer) = compare;
386 }
387
388 /*!
389 \brief get MFCOM timer compare value
390 \param[in] timer: MFCOM timer number
391 \arg MFCOM_TIMER_x(x=0..3)
392 \param[out] timer compare value
393 \retval none
394 */
mfcom_timer_cmpvalue_get(uint32_t timer)395 uint32_t mfcom_timer_cmpvalue_get(uint32_t timer)
396 {
397 return MFCOM_TMCMP(timer);
398 }
399
400 /*!
401 \brief set MFCOM timer disable mode
402 \param[in] timer: MFCOM timer number
403 \arg MFCOM_TIMER_x(x=0..3)
404 \param[in] dismode: configure conditions that can disable timers and stop decrement.
405 \arg MFCOM_TIMER_DISMODE_NEVER: timer never disabled
406 \arg MFCOM_TIMER_DISMODE_PRE_TIMDIS: timer disabled on timer x-1 disable
407 \arg MFCOM_TIMER_DISMODE_COMPARE: timer disabled on timer compare
408 \arg MFCOM_TIMER_DISMODE_COMPARE_TRIGLOW: timer disabled on timer compare and trigger Low
409 \arg MFCOM_TIMER_DISMODE_PINBOTH: timer disabled on pin rising or falling edge
410 \arg MFCOM_TIMER_DISMODE_PINBOTH_TRIGHIGH timer disabled on pin rising or falling edge provided trigger is high
411 \arg MFCOM_TIMER_DISMODE_TRIGFALLING timer disabled on trigger falling edge
412 \param[out] none
413 \retval none
414 */
mfcom_timer_dismode_set(uint32_t timer,uint32_t dismode)415 void mfcom_timer_dismode_set(uint32_t timer, uint32_t dismode)
416 {
417 uint32_t temp;
418 temp = MFCOM_TMCFG(timer);
419
420 /* clear timer disable bits */
421 temp &= ~MFCOM_TMCFG_TMDIS;
422
423 /* set timer disable mode */
424 temp |= dismode;
425 MFCOM_TMCFG(timer) = temp;
426 }
427
428 /*!
429 \brief set MFCOM shifter stopbit
430 \param[in] shifter: MFCOM shifter number
431 \arg MFCOM_SHIFTER_x(x=0..3)
432 \param[in] stopbit: shifter stop bit
433 \arg MFCOM_SHIFTER_STOPBIT_DISABLE: disable shifter stop bit
434 \arg MFCOM_SHIFTER_STOPBIT_LOW: set shifter stop bit to logic low level
435 \arg MFCOM_SHIFTER_STOPBIT_HIGH: set shifter stop bit to logic high level
436 \param[out] none
437 \retval none
438 */
mfcom_shifter_stopbit_set(uint32_t shifter,uint32_t stopbit)439 void mfcom_shifter_stopbit_set(uint32_t shifter, uint32_t stopbit)
440 {
441 uint32_t temp;
442 temp = MFCOM_SCFG(shifter);
443
444 /* clear shifter stop bit */
445 temp &= ~MFCOM_SCFG_SSTOP;
446
447 /* set shifter stop bit */
448 temp |= stopbit;
449 MFCOM_SCFG(shifter) = temp;
450 }
451
452 /*!
453 \brief write MFCOM shifter buffer
454 \param[in] shifter: MFCOM shifter number
455 \arg MFCOM_SHIFTER_x(x=0..3)
456 \param[in] data: 32-bit data
457 \param[in] rwmode: MFCOM read write mode
458 \arg MFCOM_RWMODE_NORMAL: read and write in normal mode
459 \arg MFCOM_RWMODE_BITSWAP: read and write in bit swapped mode
460 \arg MFCOM_RWMODE_BYTESWAP: read and write in byte swapped mode
461 \arg MFCOM_RWMODE_BITBYTESWAP: read and write in bit byte swapped mode
462 \param[out] none
463 \retval none
464 */
mfcom_buffer_write(uint32_t shifter,uint32_t data,uint32_t rwmode)465 void mfcom_buffer_write(uint32_t shifter, uint32_t data, uint32_t rwmode)
466 {
467 switch (rwmode){
468 case MFCOM_RWMODE_NORMAL:
469 /* write MFCOM shift buffer in MFCOM_RWMODE_NORMAL mode */
470 MFCOM_SBUF(shifter) = data;
471 break;
472 case MFCOM_RWMODE_BITSWAP:
473 /* write MFCOM shift buffer in MFCOM_RWMODE_BITSWAP mode */
474 MFCOM_SBUFBIS(shifter) = data;
475 break;
476 case MFCOM_RWMODE_BYTESWAP:
477 /* write MFCOM shift buffer in MFCOM_RWMODE_BYTESWAP mode */
478 MFCOM_SBUFBYS(shifter) = data;
479 break;
480 case MFCOM_RWMODE_BITBYTESWAP:
481 /* write MFCOM shift buffer in MFCOM_RWMODE_BITBYTESWAP mode */
482 MFCOM_SBUFBBS(shifter) = data;
483 break;
484 default:
485 break;
486 }
487 }
488
489 /*!
490 \brief read MFCOM shifter buffer
491 \param[in] shifter: MFCOM shifter number
492 \arg MFCOM_SHIFTER_x(x=0..3)
493 \param[in] rwmode: MFCOM read write mode
494 \arg MFCOM_RWMODE_NORMAL: read and write in normal mode
495 \arg MFCOM_RWMODE_BITSWAP: read and write in bit swapped mode
496 \arg MFCOM_RWMODE_BYTESWAP: read and write in byte swapped mode
497 \arg MFCOM_RWMODE_BITBYTESWAP: read and write in bit byte swapped mode
498 \param[out] none
499 \retval data: 32-bit data
500 */
mfcom_buffer_read(uint32_t shifter,uint32_t rwmode)501 uint32_t mfcom_buffer_read(uint32_t shifter, uint32_t rwmode)
502 {
503 uint32_t data;
504 switch (rwmode){
505 case MFCOM_RWMODE_NORMAL:
506 /* read MFCOM shift buffer in MFCOM_RWMODE_NORMAL mode */
507 data = MFCOM_SBUF(shifter);
508 break;
509 case MFCOM_RWMODE_BITSWAP:
510 /* read MFCOM shift buffer in MFCOM_RWMODE_BITSWAP mode */
511 data = MFCOM_SBUFBIS(shifter);
512 break;
513 case MFCOM_RWMODE_BYTESWAP:
514 /* read MFCOM shift buffer in MFCOM_RWMODE_BYTESWAP mode */
515 data = MFCOM_SBUFBYS(shifter);
516 break;
517 case MFCOM_RWMODE_BITBYTESWAP:
518 /* read MFCOM shift buffer in MFCOM_RWMODE_BITBYTESWAP mode */
519 data = MFCOM_SBUFBBS(shifter);
520 break;
521 default:
522 data = 0U;
523 break;
524 }
525 return data;
526 }
527
528 /*!
529 \brief get MFCOM shifter flag
530 \param[in] shifter: MFCOM shifter number
531 \arg MFCOM_SHIFTER_x(x=0..3)
532 \param[out] none
533 \retval FlagStatus: SET or RESET
534 */
mfcom_shifter_flag_get(uint32_t shifter)535 FlagStatus mfcom_shifter_flag_get(uint32_t shifter)
536 {
537 if(0U != (MFCOM_SSTAT & ((uint32_t)1U << shifter))){
538 return SET;
539 }else{
540 return RESET;
541 }
542 }
543
544 /*!
545 \brief get MFCOM shifter error flag
546 \param[in] shifter: MFCOM shifter number
547 \arg MFCOM_SHIFTER_x(x=0..3)
548 \param[out] none
549 \retval FlagStatus: SET or RESET
550 */
mfcom_shifter_error_flag_get(uint32_t shifter)551 FlagStatus mfcom_shifter_error_flag_get(uint32_t shifter)
552 {
553 if(0U != (MFCOM_SERR & ((uint32_t)1U << shifter))){
554 return SET;
555 }else{
556 return RESET;
557 }
558 }
559
560 /*!
561 \brief get MFCOM timer flag
562 \param[in] timer: MFCOM timer number
563 \arg MFCOM_TIMER_x(x=0..3)
564 \param[out] none
565 \retval FlagStatus: SET or RESET
566 */
mfcom_timer_flag_get(uint32_t timer)567 FlagStatus mfcom_timer_flag_get(uint32_t timer)
568 {
569 if(0U != (MFCOM_TMSTAT & ((uint32_t)1U << timer))){
570 return SET;
571 }else{
572 return RESET;
573 }
574 }
575
576 /*!
577 \brief get MFCOM shifter interrupt flag
578 \param[in] shifter: MFCOM shifter number
579 \arg MFCOM_SHIFTER_x(x=0..3)
580 \param[out] none
581 \retval FlagStatus: SET or RESET
582 */
mfcom_shifter_interrupt_flag_get(uint32_t shifter)583 FlagStatus mfcom_shifter_interrupt_flag_get(uint32_t shifter)
584 {
585 uint32_t interrupt_flag, interrupt_enable;
586
587 interrupt_flag = MFCOM_SSTAT & ((uint32_t)1U << shifter);
588 interrupt_enable = MFCOM_SSIEN & ((uint32_t)1U << shifter);
589
590 /* judge shifter interrupt flag state */
591 if(interrupt_flag & interrupt_enable){
592 return SET;
593 }else{
594 return RESET;
595 }
596 }
597
598 /*!
599 \brief get MFCOM shifter error interrupt flag
600 \param[in] shifter: MFCOM shifter number
601 \arg MFCOM_SHIFTER_x(x=0..3)
602 \param[out] none
603 \retval FlagStatus: SET or RESET
604 */
mfcom_shifter_error_interrupt_flag_get(uint32_t shifter)605 FlagStatus mfcom_shifter_error_interrupt_flag_get(uint32_t shifter)
606 {
607 uint32_t interrupt_flag, interrupt_enable;
608
609 interrupt_flag = MFCOM_SERR & ((uint32_t)1U << shifter);
610 interrupt_enable = MFCOM_SEIEN & ((uint32_t)1U << shifter);
611
612 /* judge shifter error interrupt flag state */
613 if(interrupt_flag & interrupt_enable){
614 return SET;
615 }else{
616 return RESET;
617 }
618 }
619
620 /*!
621 \brief get MFCOM timer interrupt flag
622 \param[in] timer: MFCOM timer number
623 \arg MFCOM_TIMER_x(x=0..3)
624 \param[out] none
625 \retval FlagStatus: SET or RESET
626 */
mfcom_timer_interrupt_flag_get(uint32_t timer)627 FlagStatus mfcom_timer_interrupt_flag_get(uint32_t timer)
628 {
629 uint32_t interrupt_flag, interrupt_enable;
630
631 interrupt_flag = MFCOM_TMSTAT & ((uint32_t)1U << timer);
632 interrupt_enable = MFCOM_TMSIEN & ((uint32_t)1U << timer);
633
634 /* judge timer interrupt flag state */
635 if(interrupt_flag & interrupt_enable){
636 return SET;
637 }else{
638 return RESET;
639 }
640 }
641
642 /*!
643 \brief clear MFCOM shifter flag
644 \param[in] shifter: MFCOM shifter number
645 \arg MFCOM_SHIFTER_x(x=0..3)
646 \param[out] none
647 \retval none
648 */
mfcom_shifter_flag_clear(uint32_t shifter)649 void mfcom_shifter_flag_clear(uint32_t shifter)
650 {
651 MFCOM_SSTAT = ((uint32_t)1U << shifter);
652 }
653
654 /*!
655 \brief clear MFCOM shifter error flag
656 \param[in] shifter: MFCOM shifter number
657 \arg MFCOM_SHIFTER_x(x=0..3)
658 \param[out] none
659 \retval none
660 */
mfcom_shifter_error_flag_clear(uint32_t shifter)661 void mfcom_shifter_error_flag_clear(uint32_t shifter)
662 {
663 MFCOM_SERR = ((uint32_t)1U << shifter);
664 }
665
666 /*!
667 \brief clear MFCOM timer flag
668 \param[in] timer: MFCOM timer number
669 \arg MFCOM_TIMER_x(x=0..3)
670 \param[out] none
671 \retval none
672 */
mfcom_timer_flag_clear(uint32_t timer)673 void mfcom_timer_flag_clear(uint32_t timer)
674 {
675 MFCOM_TMSTAT = ((uint32_t)1U << timer);
676 }
677
678 /*!
679 \brief enable MFCOM shifter interrupt
680 \param[in] shifter: MFCOM shifter number
681 \arg MFCOM_SHIFTER_x(x=0..3)
682 \param[out] none
683 \retval none
684 */
mfcom_shifter_interrupt_enable(uint32_t shifter)685 void mfcom_shifter_interrupt_enable(uint32_t shifter)
686 {
687 MFCOM_SSIEN |= ((uint32_t)1U << shifter);
688 }
689
690 /*!
691 \brief enable MFCOM shifter error interrupt
692 \param[in] shifter: MFCOM shifter number
693 \arg MFCOM_SHIFTER_x(x=0..3)
694 \param[out] none
695 \retval none
696 */
mfcom_shifter_error_interrupt_enable(uint32_t shifter)697 void mfcom_shifter_error_interrupt_enable(uint32_t shifter)
698 {
699 MFCOM_SEIEN |= ((uint32_t)1U << shifter);
700 }
701
702 /*!
703 \brief enable MFCOM timer interrupt
704 \param[in] timer: MFCOM timer number
705 \arg MFCOM_TIMER_x(x=0..3)
706 \param[out] none
707 \retval none
708 */
mfcom_timer_interrupt_enable(uint32_t timer)709 void mfcom_timer_interrupt_enable(uint32_t timer)
710 {
711 MFCOM_TMSIEN |= ((uint32_t)1U << timer);
712 }
713
714 /*!
715 \brief enable MFCOM shifter dma
716 \param[in] shifter: MFCOM shifter number
717 \arg MFCOM_SHIFTER_x(x=0..3)
718 \param[out] none
719 \retval none
720 */
mfcom_shifter_dma_enable(uint32_t shifter)721 void mfcom_shifter_dma_enable(uint32_t shifter)
722 {
723 MFCOM_SSDMAEN |= ((uint32_t)1U << shifter);
724 }
725
726 /*!
727 \brief disable MFCOM shifter interrupt
728 \param[in] shifter: MFCOM shifter number
729 \arg MFCOM_SHIFTER_x(x=0..3)
730 \param[out] none
731 \retval none
732 */
mfcom_shifter_interrupt_disable(uint32_t shifter)733 void mfcom_shifter_interrupt_disable(uint32_t shifter)
734 {
735 MFCOM_SSIEN &= ~((uint32_t)1U << shifter);
736 }
737
738 /*!
739 \brief disable MFCOM shifter error interrupt
740 \param[in] shifter: MFCOM shifter number
741 \arg MFCOM_SHIFTER_x(x=0..3)
742 \param[out] none
743 \retval none
744 */
mfcom_shifter_error_interrupt_disable(uint32_t shifter)745 void mfcom_shifter_error_interrupt_disable(uint32_t shifter)
746 {
747 MFCOM_SEIEN &= ~((uint32_t)1U << shifter);
748 }
749
750 /*!
751 \brief disable MFCOM timer interrupt
752 \param[in] timer: MFCOM timer number
753 \arg MFCOM_TIMER_x(x=0..3)
754 \param[out] none
755 \retval none
756 */
mfcom_timer_interrupt_disable(uint32_t timer)757 void mfcom_timer_interrupt_disable(uint32_t timer)
758 {
759 MFCOM_TMSIEN &= ~((uint32_t)1U << timer);
760 }
761
762 /*!
763 \brief disable MFCOM shifter dma
764 \param[in] shifter: MFCOM shifter number
765 \arg MFCOM_SHIFTER_x(x=0..3)
766 \param[out] none
767 \retval none
768 */
mfcom_shifter_dma_disable(uint32_t shifter)769 void mfcom_shifter_dma_disable(uint32_t shifter)
770 {
771 MFCOM_SSDMAEN &= ~((uint32_t)1U << shifter);
772 }
773