1 /**
2   ******************************************************************************
3   * @file    lib_iso7816.c
4   * @author  Application Team
5   * @version V1.1.0
6   * @date    2019-10-28
7   * @brief   ISO7816 library.
8   ******************************************************************************
9   * @attention
10   *
11   ******************************************************************************
12   */
13 #include "lib_iso7816.h"
14 #include "lib_clk.h"
15 
16 //registers default reset values
17 #define ISO7816_BAUDDIVL_RSTValue  (0UL)
18 #define ISO7816_BAUDDIVH_RSTValue  (0UL)
19 #define ISO7816_CFG_RSTValue       (0x400)
20 #define ISO7816_CLK_RSTValue       (0UL)
21 #define ISO7816_INFO_RC_MASK       (0x3ECUL)
22 
23 
24 /**
25   * @brief  Initializes the ISO7816 peripheral registers to their default reset values.
26   * @param  ISO7816x: ISO78160~ISO78161
27   * @retval None
28   */
ISO7816_DeInit(ISO7816_Type * ISO7816x)29 void ISO7816_DeInit(ISO7816_Type *ISO7816x)
30 {
31   /* Check parameters */
32   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
33 
34   ISO7816x->CFG &= ~ISO7816_CFG_EN;
35 
36   ISO7816x->INFO = ISO7816_INFO_RC_MASK;  /* clear interrupt flag */
37   ISO7816x->BAUDDIVH = ISO7816_BAUDDIVH_RSTValue;
38   ISO7816x->BAUDDIVL = ISO7816_BAUDDIVL_RSTValue;
39   ISO7816x->CFG = ISO7816_CFG_RSTValue;
40   ISO7816x->CLK = ISO7816_CLK_RSTValue;
41 }
42 
43 
44 /**
45   * @brief  Fills each InitStruct member with its default value.
46   * @param  InitStruct: pointer to an ISO7816_InitType structure which will be initialized.
47   * @retval None
48   */
ISO7816_StructInit(ISO7816_InitType * InitStruct)49 void ISO7816_StructInit(ISO7816_InitType *InitStruct)
50 {
51   /*--------------- Reset ISO7816 init structure parameters values ---------------*/
52   /* Initialize the FirstBit member */
53   InitStruct->FirstBit = ISO7816_FIRSTBIT_MSB;
54   /* Initialize the Parity member */
55   InitStruct->Parity = ISO7816_PARITY_EVEN;
56   /* Initialize the Baudrate member */
57   InitStruct->Baudrate = 9600;
58   /* Initialize the TXRetry member */
59   InitStruct->TXRetry = ISO7816_TXRTY_0;
60   /* Initialize the RXACKLength member */
61   InitStruct->RXACKLength = ISO7816_RXACKLEN_2;
62   /* Initialize the TXNACKLength member */
63   InitStruct->TXNACKLength = ISO7816_TXNACKLEN_0;
64 }
65 
66 /**
67   * @brief  Initializes ISO7816.
68   * @param  ISO7816x: ISO78160~ISO78161
69             Init_Struct:iso7816 configuration.
70                FirstBit:
71                    ISO7816_FIRSTBIT_MSB
72                    ISO7816_FIRSTBIT_LSB
73                Parity:
74                    ISO7816_PARITY_EVEN
75                    ISO7816_PARITY_ODD
76                Baudrate: baudrate value to configure, 200UL ~ 2625000UL
77                TXRetry:
78                    ISO7816_TXRTY_0 ~ ISO7816_TXRTY_15
79                RXACKLength:
80                    ISO7816_RXACKLEN_2
81                    ISO7816_RXACKLEN_1
82                TXNACKLength:
83                    ISO7816_TXNACKLEN_0
84                    ISO7816_TXNACKLEN_1
85                    ISO7816_TXNACKLEN_2
86   * @retval None
87   */
ISO7816_Init(ISO7816_Type * ISO7816x,ISO7816_InitType * Init_Struct)88 void ISO7816_Init(ISO7816_Type *ISO7816x, ISO7816_InitType *Init_Struct)
89 {
90   uint32_t tmp;
91   uint16_t div;
92   uint32_t pclk;
93 
94   /* Check parameters */
95   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
96   assert_parameters(IS_ISO7816_FIRSTBIT(Init_Struct->FirstBit));
97   assert_parameters(IS_ISO7816_PARITY(Init_Struct->Parity));
98   assert_parameters(IS_ISO7816_BAUDRATE(Init_Struct->Baudrate));
99   assert_parameters(IS_ISO7816_TXRTY(Init_Struct->TXRetry));
100   assert_parameters(IS_ISO7816_RXACKLEN(Init_Struct->RXACKLength));
101   assert_parameters(IS_ISO7816_TXNACKLEN(Init_Struct->TXNACKLength));
102 
103   tmp = ISO7816x->CFG;
104   tmp &= ~(ISO7816_CFG_ACKLEN\
105           |ISO7816_CFG_AUTORXACK\
106           |ISO7816_CFG_LSB\
107           |ISO7816_CFG_CHKP\
108           |ISO7816_CFG_RXACKSET\
109           |ISO7816_CFG_TXRTYCNT);
110   tmp |= (Init_Struct->FirstBit\
111          |Init_Struct->Parity\
112          |Init_Struct->TXRetry\
113          |Init_Struct->RXACKLength\
114          |Init_Struct->TXNACKLength);
115   ISO7816x->CFG = tmp;
116 
117   pclk = CLK_GetPCLKFreq();
118   div = 0x10000 - (pclk/Init_Struct->Baudrate);
119   ISO7816x->BAUDDIVH = (div>>8) & ISO7816_BAUDDIVH_BAUDDIVH;
120   ISO7816x->BAUDDIVL = div & ISO7816_BAUDDIVL_BAUDDIVL;
121 }
122 
123 /**
124   * @brief  Enables or disables ISO7816.
125   * @param  ISO7816x: ISO78160~ISO78161
126             NewState:
127                 ENABLE
128                 DISABLE
129   * @retval None.
130   */
ISO7816_Cmd(ISO7816_Type * ISO7816x,uint32_t NewState)131 void ISO7816_Cmd(ISO7816_Type *ISO7816x, uint32_t NewState)
132 {
133   /* Check parameters */
134   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
135   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
136 
137   if (NewState == ENABLE)
138   {
139     ISO7816x->CFG |= ISO7816_CFG_EN;
140   }
141   else
142   {
143     ISO7816x->CFG &= ~ISO7816_CFG_EN;
144   }
145 }
146 
147 /**
148   * @brief  Configures ISO7816 baudrate.
149   * @param  ISO7816x: ISO78160~ISO78161
150             BaudRate:Baud rate value
151   * @retval None
152   */
ISO7816_BaudrateConfig(ISO7816_Type * ISO7816x,uint32_t BaudRate)153 void ISO7816_BaudrateConfig(ISO7816_Type *ISO7816x, uint32_t BaudRate)
154 {
155   uint32_t pclk;
156   uint16_t div;
157 
158   /* Check parameters */
159   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
160   assert_parameters(IS_ISO7816_BAUDRATE(BaudRate));
161 
162   pclk = CLK_GetPCLKFreq();
163   div = 0x10000 - (pclk/BaudRate);
164   ISO7816x->BAUDDIVH = (div>>8) & ISO7816_BAUDDIVH_BAUDDIVH;
165   ISO7816x->BAUDDIVL = div & ISO7816_BAUDDIVL_BAUDDIVL;
166 }
167 
168 /**
169   * @brief  Configures ISO7816 clock divider.
170   * @param  ISO7816x: ISO78160~ISO78161
171             Prescaler:1~128
172   * @retval None
173   */
ISO7816_CLKDIVConfig(ISO7816_Type * ISO7816x,uint32_t Prescaler)174 void ISO7816_CLKDIVConfig(ISO7816_Type *ISO7816x, uint32_t Prescaler)
175 {
176   uint32_t tmp;
177 
178   /* Check parameters */
179   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
180   assert_parameters(IS_ISO7816_PRESCALER(Prescaler));
181 
182   tmp = ISO7816x->CLK;
183   tmp &= ~ISO7816_CLK_CLKDIV;
184   tmp |= (Prescaler - 1);
185   ISO7816x->CLK = tmp;
186 }
187 
188 /**
189   * @brief  Enables or disables ISO7816 clock output function.
190   * @param  ISO7816x: ISO78160~ISO78161
191             NewState:
192                 ENABLE
193                 DISABLE
194   * @retval None
195   */
ISO7816_CLKOutputCmd(ISO7816_Type * ISO7816x,uint32_t NewState)196 void ISO7816_CLKOutputCmd(ISO7816_Type *ISO7816x, uint32_t NewState)
197 {
198   /* Check parameters */
199   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
200   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
201 
202   if (NewState != DISABLE)
203   {
204     ISO7816x->CLK |= ISO7816_CLK_CLKEN;
205   }
206   else
207   {
208     ISO7816x->CLK &= ~ISO7816_CLK_CLKEN;
209   }
210 }
211 
212 /**
213   * @brief  Reads ISO7816 data.
214   * @param  ISO7816: ISO78160~ISO78161
215   * @retval The received data.
216   */
ISO7816_ReceiveData(ISO7816_Type * ISO7816x)217 uint8_t ISO7816_ReceiveData(ISO7816_Type *ISO7816x)
218 {
219   /* Check parameters */
220   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
221 
222   return ISO7816x->DATA;
223 }
224 
225 /**
226   * @brief  Writes ISO7816 data.
227   * @param  ISO7816x: ISO78160~ISO78161
228   *         ch: data to send
229   * @retval None
230   */
ISO7816_SendData(ISO7816_Type * ISO7816x,uint8_t ch)231 void ISO7816_SendData(ISO7816_Type *ISO7816x, uint8_t ch)
232 {
233   /* Check parameters */
234   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
235 
236   ISO7816x->DATA = ch;
237 }
238 
239 /**
240   * @brief  ENables or disables ISO7816 interrupt.
241   * @param  ISO7816x: ISO78160~ISO78161
242             INTMask:
243                 This parameter can be any combination of the following values
244                 ISO7816_INT_TXRTYERR
245                 ISO7816_INT_RXOV
246                 ISO7816_INT_RX
247                 ISO7816_INT_TXDONE
248                 ISO7816_INT_RXERR
249             NewState:
250                 ENABLE
251                 DISABLE
252   * @retval None
253   */
ISO7816_INTConfig(ISO7816_Type * ISO7816x,uint32_t INTMask,uint8_t NewState)254 void ISO7816_INTConfig(ISO7816_Type *ISO7816x, uint32_t INTMask, uint8_t NewState)
255 {
256   /* Check parameters */
257   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
258   assert_parameters(IS_ISO7816_INT(INTMask));
259   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
260 
261   if (NewState == ENABLE)
262   {
263     ISO7816x->CFG |= INTMask;
264   }
265   else
266   {
267     ISO7816x->CFG &= ~INTMask;
268   }
269 }
270 
271 /**
272   * @brief  Gets ISO7816 interrupt state.
273   * @param  ISO7816x: ISO78160~ISO78161
274             INTMask:
275                 ISO7816_INTSTS_TXRTYERR
276                 ISO7816_INTSTS_TXDONE
277                 ISO7816_INTSTS_RXOV
278                 ISO7816_INTSTS_RX
279                 ISO7816_INTSTS_RXERR
280   * @retval 1: state set
281             0: state reset
282   */
ISO7816_GetINTStatus(ISO7816_Type * ISO7816x,uint32_t INTMask)283 uint8_t ISO7816_GetINTStatus(ISO7816_Type *ISO7816x, uint32_t INTMask)
284 {
285   /* Check parameters */
286   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
287   assert_parameters(IS_ISO7816_INTFLAGR(INTMask));
288 
289   if (ISO7816x->INFO & INTMask)
290   {
291     return 1;
292   }
293   else
294   {
295     return 0;
296   }
297 }
298 
299 /**
300   * @brief  Clears ISO7816 interrupt state.
301   * @param  ISO7816x: ISO78160~ISO78161
302             INTMask:
303                 This parameter can be any combination of the following values
304                 ISO7816_INTSTS_TXRTYERR
305                 ISO7816_INTSTS_TXDONE
306                 ISO7816_INTSTS_RXOV
307                 ISO7816_INTSTS_RX
308                 ISO7816_INTSTS_RXERR
309   * @retval None
310   */
ISO7816_ClearINTStatus(ISO7816_Type * ISO7816x,uint32_t INTMask)311 void ISO7816_ClearINTStatus(ISO7816_Type *ISO7816x, uint32_t INTMask)
312 {
313     uint32_t tmp;
314 
315   /* Check parameters */
316   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
317   assert_parameters(IS_ISO7816_INTFLAGC(INTMask));
318 
319   tmp = ISO7816x->INFO;
320   tmp &= ~ISO7816_INFO_RC_MASK;
321   tmp |= INTMask;
322   ISO7816x->INFO = tmp;
323 }
324 
325 /**
326   * @brief  Gets ISO7816 peripheral flag.
327   * @param  ISO7816x: ISO78160~ISO78161
328             FlagMask:
329                 ISO7816_FLAG_DMATXDONE
330   * @retval 1: state set
331             0: state reset
332   */
ISO7816_GetFlag(ISO7816_Type * ISO7816x,uint32_t FlagMask)333 uint8_t ISO7816_GetFlag(ISO7816_Type *ISO7816x, uint32_t FlagMask)
334 {
335   /* Check parameters */
336   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
337   assert_parameters(IS_ISO7816_FLAGR(FlagMask));
338 
339   if (ISO7816x->INFO & FlagMask)
340   {
341     return 1;
342   }
343   else
344   {
345     return 0;
346   }
347 }
348 
349 /**
350   * @brief  Clears ISO7816 peripheral flag.
351   * @param  ISO7816x: ISO78160~ISO78161
352             FlagMask:
353                 ISO7816_FLAG_DMATXDONE
354   * @retval None
355   */
ISO7816_ClearFlag(ISO7816_Type * ISO7816x,uint32_t FlagMask)356 void ISO7816_ClearFlag(ISO7816_Type *ISO7816x, uint32_t FlagMask)
357 {
358   /* Check parameters */
359   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
360   assert_parameters(IS_ISO7816_FLAGC(FlagMask));
361 
362   ISO7816x->INFO |= FlagMask;
363 }
364 
365 /**
366   * @brief  Gets last transmited ACK.
367   * @param  ISO7816: ISO78160~ISO78161
368   * @retval ACK value
369   */
ISO7816_GetLastTransmitACK(ISO7816_Type * ISO7816x)370 uint8_t ISO7816_GetLastTransmitACK(ISO7816_Type *ISO7816x)
371 {
372   /* Check parameters */
373   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
374 
375   if (ISO7816x->INFO&ISO7816_INFO_RXACK)
376   {
377     return 1;
378   }
379   else
380   {
381     return 0;
382   }
383 }
384 
385 /**
386   * @brief  Gets last received check sum bit.
387   * @param  ISO7816: ISO78160~ISO78161
388   * @retval CHKSUM bit value
389   */
ISO7816_GetLastReceiveCHKSUM(ISO7816_Type * ISO7816x)390 uint8_t ISO7816_GetLastReceiveCHKSUM(ISO7816_Type *ISO7816x)
391 {
392   /* Check parameters */
393   assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
394 
395   if (ISO7816x->INFO&ISO7816_INFO_CHKSUM)
396   {
397     return 1;
398   }
399   else
400   {
401     return 0;
402   }
403 }
404 
405 /*********************************** END OF FILE ******************************/
406