M471M/R1/S BSP V3.01.000
The Board Support Package for M4521
sc.c
Go to the documentation of this file.
1/**************************************************************************/
8#include "NuMicro.h"
9
10// Below are variables used locally by SC driver and does not want to parse by doxygen unless HIDDEN_SYMBOLS is defined
12static uint32_t u32CardStateIgnore[SC_INTERFACE_NUM] = {0};
13
15
37{
38 // put conditions into two variable to remove IAR compilation warning
39 uint32_t cond1 = ((sc->STATUS & SC_STATUS_CDPINSTS_Msk) >> SC_STATUS_CDPINSTS_Pos);
40 uint32_t cond2 = ((sc->CTL & SC_CTL_CDLV_Msk) >> SC_CTL_CDLV_Pos);
41
42 if(sc == SC0 && u32CardStateIgnore[0] == 1)
43 return TRUE;
44 else if(cond1 != cond2)
45 return FALSE;
46 else
47 return TRUE;
48}
49
57{
59}
60
67void SC_Close(SC_T *sc)
68{
69 sc->INTEN = 0;
70 sc->PINCTL = 0;
71 sc->ALTCTL = 0;
72 sc->CTL = 0;
73}
74
88void SC_Open(SC_T *sc, uint32_t u32CD, uint32_t u32PWR)
89{
90 uint32_t u32Reg = 0, u32Intf;
91
92 if(sc == SC0)
93 u32Intf = 0;
94#if 0 /* M4521 has only one SC interface */
95 else if(sc == SC1)
96 u32Intf = 1;
97 else if(sc == SC2)
98 u32Intf = 2;
99 else if(sc == SC3)
100 u32Intf = 3;
101 else if(sc == SC4)
102 u32Intf = 4;
103 else if(sc == SC5)
104 u32Intf = 5;
105#endif
106 else
107 return ;
108
109 if(u32CD != SC_PIN_STATE_IGNORE)
110 {
111 u32Reg = u32CD ? 0: SC_CTL_CDLV_Msk;
112 u32CardStateIgnore[u32Intf] = 0;
113 }
114 else
115 {
116 u32CardStateIgnore[u32Intf] = 1;
117 }
118 while(sc->PINCTL & SC_PINCTL_SYNC_Msk);
119 sc->PINCTL = u32PWR ? 0 : SC_PINCTL_PWRINV_Msk;
120 while(sc->CTL & SC_CTL_SYNC_Msk);
121 sc->CTL = SC_CTL_SCEN_Msk | u32Reg;
122}
123
131{
132 uint32_t u32Intf;
133
134 if(sc == SC0)
135 u32Intf = 0;
136 else
137 return ;
138
139 // Reset FIFO, enable auto de-activation while card removal
141 // Set Rx trigger level to 1 character, longest card detect debounce period, disable error retry (EMV ATR does not use error retry)
142 while(sc->CTL & SC_CTL_SYNC_Msk);
144 // Enable auto convention, and all three smartcard internal timers
146 // Disable Rx timeout
147 sc->RXTOUT = 0;
148 // 372 clocks per ETU by default
149 sc->ETUCTL = 371;
150
151 /* Enable necessary interrupt for smartcard operation */
152 if(u32CardStateIgnore[u32Intf]) // Do not enable card detect interrupt if card present state ignore
160 else
169
170 return;
171}
172
180void SC_SetBlockGuardTime(SC_T *sc, uint32_t u32BGT)
181{
182 sc->CTL = (sc->CTL & ~SC_CTL_BGT_Msk) | ((u32BGT - 1) << SC_CTL_BGT_Pos);
183}
184
193void SC_SetCharGuardTime(SC_T *sc, uint32_t u32CGT)
194{
195 u32CGT -= sc->CTL & SC_CTL_NSB_Msk ? 11 : 12;
196 sc->EGT = u32CGT;
197}
198
207{
209}
210
233void SC_StartTimer(SC_T *sc, uint32_t u32TimerNum, uint32_t u32Mode, uint32_t u32ETUCount)
234{
235 uint32_t reg = u32Mode | (SC_TMRCTL0_CNT_Msk & (u32ETUCount - 1));
236
237 if(u32TimerNum == 0)
238 {
239 sc->TMRCTL0 = reg;
241 }
242 else if(u32TimerNum == 1)
243 {
244 sc->TMRCTL1 = reg;
246 }
247 else // timer 2
248 {
249 sc->TMRCTL2 = reg;
251 }
252}
253
262void SC_StopTimer(SC_T *sc, uint32_t u32TimerNum)
263{
264 if(u32TimerNum == 0)
265 sc->ALTCTL &= ~SC_ALTCTL_CNTEN0_Msk;
266 else if(u32TimerNum == 1)
267 sc->ALTCTL &= ~SC_ALTCTL_CNTEN1_Msk;
268 else // timer 2
269 sc->ALTCTL &= ~SC_ALTCTL_CNTEN2_Msk;
270}
271
272
273 /* end of group SC_EXPORTED_FUNCTIONS */
275 /* end of group SC_Driver */
277 /* end of group Standard_Driver */
279
#define SC_INTEN_TMR2IEN_Msk
Definition: M471M_R1_S.h:8645
#define SC_STATUS_CDPINSTS_Pos
Definition: M471M_R1_S.h:8728
#define SC_INTEN_ACERRIEN_Msk
Definition: M471M_R1_S.h:8660
#define SC_INTEN_CDIEN_Msk
Definition: M471M_R1_S.h:8651
#define SC_PINCTL_PWRINV_Msk
Definition: M471M_R1_S.h:8771
#define SC_STATUS_CDPINSTS_Msk
Definition: M471M_R1_S.h:8729
#define SC_INTEN_TMR1IEN_Msk
Definition: M471M_R1_S.h:8642
#define SC_CTL_NSB_Msk
Definition: M471M_R1_S.h:8546
#define SC_CTL_CDLV_Pos
Definition: M471M_R1_S.h:8563
#define SC_ALTCTL_CNTEN1_Msk
Definition: M471M_R1_S.h:8591
#define SC_INTEN_TMR0IEN_Msk
Definition: M471M_R1_S.h:8639
#define SC_CTL_CDLV_Msk
Definition: M471M_R1_S.h:8564
#define SC_CTL_SYNC_Msk
Definition: M471M_R1_S.h:8567
#define SC_PINCTL_SYNC_Msk
Definition: M471M_R1_S.h:8786
#define SC_CTL_CDDBSEL_Msk
Definition: M471M_R1_S.h:8561
#define SC_ALTCTL_ADACEN_Msk
Definition: M471M_R1_S.h:8600
#define SC_CTL_TMRSEL_Msk
Definition: M471M_R1_S.h:8543
#define SC_ALTCTL_CNTEN2_Msk
Definition: M471M_R1_S.h:8594
#define SC_CTL_BGT_Pos
Definition: M471M_R1_S.h:8539
#define SC_INTEN_BGTIEN_Msk
Definition: M471M_R1_S.h:8648
#define SC_CTL_SCEN_Msk
Definition: M471M_R1_S.h:8522
#define SC_INTEN_RDAIEN_Msk
Definition: M471M_R1_S.h:8630
#define SC_ALTCTL_TXRST_Msk
Definition: M471M_R1_S.h:8573
#define SC_TMRCTL0_CNT_Msk
Definition: M471M_R1_S.h:8792
#define SC_ALTCTL_CNTEN0_Msk
Definition: M471M_R1_S.h:8588
#define SC_ALTCTL_RXRST_Msk
Definition: M471M_R1_S.h:8576
#define SC_CTL_RXTRGLV_Msk
Definition: M471M_R1_S.h:8537
#define SC_CTL_RXRTY_Msk
Definition: M471M_R1_S.h:8549
#define SC_INTEN_TERRIEN_Msk
Definition: M471M_R1_S.h:8636
#define SC_CTL_AUTOCEN_Msk
Definition: M471M_R1_S.h:8531
#define SC_CTL_TXRTY_Msk
Definition: M471M_R1_S.h:8555
NuMicro peripheral access layer header file.
__IO uint32_t TMRCTL2
Definition: M471M_R1_S.h:8504
__IO uint32_t ALTCTL
Definition: M471M_R1_S.h:8494
__IO uint32_t ETUCTL
Definition: M471M_R1_S.h:8497
__IO uint32_t INTEN
Definition: M471M_R1_S.h:8498
__IO uint32_t CTL
Definition: M471M_R1_S.h:8493
__IO uint32_t STATUS
Definition: M471M_R1_S.h:8500
__IO uint32_t PINCTL
Definition: M471M_R1_S.h:8501
__IO uint32_t TMRCTL0
Definition: M471M_R1_S.h:8502
__IO uint32_t TMRCTL1
Definition: M471M_R1_S.h:8503
#define TRUE
Definition: M471M_R1_S.h:13901
#define FALSE
Definition: M471M_R1_S.h:13904
__IO uint32_t RXTOUT
Definition: M471M_R1_S.h:8496
#define SC0
Definition: M471M_R1_S.h:13852
__IO uint32_t EGT
Definition: M471M_R1_S.h:8495
#define SC_INTERFACE_NUM
Definition: sc.h:28
#define SC_PIN_STATE_IGNORE
Definition: sc.h:31
void SC_SetBlockGuardTime(SC_T *sc, uint32_t u32BGT)
Set Block Guard Time.
Definition: sc.c:180
void SC_SetCharGuardTime(SC_T *sc, uint32_t u32CGT)
Set character guard time.
Definition: sc.c:193
void SC_ResetReader(SC_T *sc)
This function reset specified smartcard module to its default state for activate smartcard.
Definition: sc.c:130
void SC_Open(SC_T *sc, uint32_t u32CardDet, uint32_t u32PWR)
This function initialized smartcard module.
Definition: sc.c:88
void SC_StopAllTimer(SC_T *sc)
Stop all Timer counting.
Definition: sc.c:206
uint32_t SC_IsCardInserted(SC_T *sc)
This function indicates specified smartcard slot status.
Definition: sc.c:36
void SC_StopTimer(SC_T *sc, uint32_t u32TimerNum)
Stop Timer counting.
Definition: sc.c:262
void SC_StartTimer(SC_T *sc, uint32_t u32TimerNum, uint32_t u32Mode, uint32_t u32ETUCount)
This function configure and start a smartcard timer of specified smartcard module.
Definition: sc.c:233
void SC_ClearFIFO(SC_T *sc)
Reset the Tx/Rx FIFO.
Definition: sc.c:56
void SC_Close(SC_T *sc)
This function disable specified smartcard module.
Definition: sc.c:67