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