1 /**
2   ******************************************************************************
3   * @file    lib_iso7816.h
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 #ifndef __LIB_ISO7816_H
14 #define __LIB_ISO7816_H
15 
16 #ifdef __cplusplus
17  extern "C" {
18 #endif
19 
20 #include "target.h"
21 
22 typedef struct
23 {
24   uint32_t FirstBit;
25   uint32_t Parity;
26   uint32_t Baudrate;
27   uint32_t TXRetry;
28   uint32_t RXACKLength;
29   uint32_t TXNACKLength;
30 } ISO7816_InitType;
31 //FirstBit
32 #define ISO7816_FIRSTBIT_MSB   (0UL)
33 #define ISO7816_FIRSTBIT_LSB    ISO7816_CFG_LSB
34 #define IS_ISO7816_FIRSTBIT(__FIRSTBIT__)  (((__FIRSTBIT__) == ISO7816_FIRSTBIT_MSB) ||\
35                                             ((__FIRSTBIT__) == ISO7816_FIRSTBIT_LSB))
36 //Parity
37 #define ISO7816_PARITY_EVEN    (0UL)
38 #define ISO7816_PARITY_ODD      ISO7816_CFG_CHKP
39 #define IS_ISO7816_PARITY(__PARITY__)  (((__PARITY__) == ISO7816_PARITY_EVEN) ||\
40                                         ((__PARITY__) == ISO7816_PARITY_ODD))
41 //Baudrate
42 #define IS_ISO7816_BAUDRATE(__BAUDRATE__) ((200UL <= (__BAUDRATE__)) &&\
43                                           ((__BAUDRATE__) <= 2625000UL))
44 //TXRetry
45 #define ISO7816_TXRTY_0            ((0x00U << ISO7816_CFG_TXRTYCNT_Pos) \
46                                    | (1U << 10))
47 #define ISO7816_TXRTY_1            ((0x01U << ISO7816_CFG_TXRTYCNT_Pos) \
48                                    | (1U << 10))
49 #define ISO7816_TXRTY_2            ((0x02U << ISO7816_CFG_TXRTYCNT_Pos) \
50                                    | (1U << 10))
51 #define ISO7816_TXRTY_3            ((0x03U << ISO7816_CFG_TXRTYCNT_Pos) \
52                                    | (1U << 10))
53 #define ISO7816_TXRTY_4            ((0x04U << ISO7816_CFG_TXRTYCNT_Pos) \
54                                    | (1U << 10))
55 #define ISO7816_TXRTY_5            ((0x05U << ISO7816_CFG_TXRTYCNT_Pos) \
56                                    | (1U << 10))
57 #define ISO7816_TXRTY_6            ((0x06U << ISO7816_CFG_TXRTYCNT_Pos) \
58                                    | (1U << 10))
59 #define ISO7816_TXRTY_7            ((0x07U << ISO7816_CFG_TXRTYCNT_Pos) \
60                                    | (1U << 10))
61 #define ISO7816_TXRTY_8            ((0x08U << ISO7816_CFG_TXRTYCNT_Pos) \
62                                    | (1U << 10))
63 #define ISO7816_TXRTY_9            ((0x09U << ISO7816_CFG_TXRTYCNT_Pos) \
64                                    | (1U << 10))
65 #define ISO7816_TXRTY_10           ((0x0AU << ISO7816_CFG_TXRTYCNT_Pos) \
66                                    | (1U << 10))
67 #define ISO7816_TXRTY_11           ((0x0BU << ISO7816_CFG_TXRTYCNT_Pos) \
68                                    | (1U << 10))
69 #define ISO7816_TXRTY_12           ((0x0CU << ISO7816_CFG_TXRTYCNT_Pos) \
70                                    | (1U << 10))
71 #define ISO7816_TXRTY_13           ((0x0DU << ISO7816_CFG_TXRTYCNT_Pos) \
72                                    | (1U << 10))
73 #define ISO7816_TXRTY_14           ((0x0EU << ISO7816_CFG_TXRTYCNT_Pos) \
74                                    | (1U << 10))
75 #define ISO7816_TXRTY_15           ((0x0FU << ISO7816_CFG_TXRTYCNT_Pos) \
76                                    | (1U << 10))
77 #define IS_ISO7816_TXRTY(__TXRTY__)          (((__TXRTY__) == ISO7816_TXRTY_0)     || \
78                                               ((__TXRTY__) == ISO7816_TXRTY_1)     || \
79                                               ((__TXRTY__) == ISO7816_TXRTY_2)     || \
80                                               ((__TXRTY__) == ISO7816_TXRTY_3)     || \
81                                               ((__TXRTY__) == ISO7816_TXRTY_4)     || \
82                                               ((__TXRTY__) == ISO7816_TXRTY_5)     || \
83                                               ((__TXRTY__) == ISO7816_TXRTY_6)     || \
84                                               ((__TXRTY__) == ISO7816_TXRTY_7)     || \
85                                               ((__TXRTY__) == ISO7816_TXRTY_8)     || \
86                                               ((__TXRTY__) == ISO7816_TXRTY_9)     || \
87                                               ((__TXRTY__) == ISO7816_TXRTY_10)    || \
88                                               ((__TXRTY__) == ISO7816_TXRTY_11)    || \
89                                               ((__TXRTY__) == ISO7816_TXRTY_12)    || \
90                                               ((__TXRTY__) == ISO7816_TXRTY_13)    || \
91                                               ((__TXRTY__) == ISO7816_TXRTY_14)    || \
92                                               ((__TXRTY__) == ISO7816_TXRTY_15))
93 //RXACKLength
94 #define ISO7816_RXACKLEN_2    (0UL)
95 #define ISO7816_RXACKLEN_1    (ISO7816_CFG_RXACKSET)
96 #define IS_ISO7816_RXACKLEN(__RXACKLEN__)  (((__RXACKLEN__) == ISO7816_RXACKLEN_2) ||\
97                                             ((__RXACKLEN__) == ISO7816_RXACKLEN_1))
98 //TXNACKLength
99 #define ISO7816_TXNACKLEN_0  (0UL)
100 #define ISO7816_TXNACKLEN_1  (ISO7816_CFG_AUTORXACK)
101 #define ISO7816_TXNACKLEN_2  (ISO7816_CFG_AUTORXACK | ISO7816_CFG_ACKLEN)
102 #define IS_ISO7816_TXNACKLEN(__TXNACKLEN__)  (((__TXNACKLEN__) == ISO7816_TXNACKLEN_0) ||\
103                                               ((__TXNACKLEN__) == ISO7816_TXNACKLEN_1) ||\
104                                               ((__TXNACKLEN__) == ISO7816_TXNACKLEN_2))
105 
106 #define IS_ISO7816_PRESCALER(__PRESCALER__)  ((__PRESCALER__) <= 0x80)
107 
108 //interrupt
109 #define ISO7816_INT_TXRTYERR    ISO7816_CFG_TXRTYERRIE
110 #define ISO7816_INT_RXOV        ISO7816_CFG_RXOVIE
111 #define ISO7816_INT_TXDONE      ISO7816_CFG_TXDONEIE
112 #define ISO7816_INT_RX          ISO7816_CFG_RXIE
113 #define ISO7816_INT_RXERR       ISO7816_CFG_RXERRIE
114 #define ISO7816_INT_Msk         (ISO7816_INT_TXRTYERR  \
115                                 |ISO7816_INT_RXOV      \
116                                 |ISO7816_INT_TXDONE    \
117                                 |ISO7816_INT_RX        \
118                                 |ISO7816_INT_RXERR)
119 #define IS_ISO7816_INT(__INT__)  ((((__INT__) & ISO7816_INT_Msk) != 0U) &&\
120                                   (((__INT__) & ~ISO7816_INT_Msk) == 0U))
121 
122 //INTStatus
123 #define ISO7816_INTSTS_TXRTYERR ISO7816_INFO_TXRTYERRIF
124 #define ISO7816_INTSTS_RXOV     ISO7816_INFO_RXOVIF
125 #define ISO7816_INTSTS_TXDONE   ISO7816_INFO_TXDONEIF
126 #define ISO7816_INTSTS_RX       ISO7816_INFO_RXIF
127 #define ISO7816_INTSTS_RXERR    ISO7816_INFO_RXERRIF
128 #define ISO7816_INTSTS_Msk     (ISO7816_INTSTS_TXRTYERR \
129                                |ISO7816_INTSTS_RXOV     \
130                                |ISO7816_INTSTS_TXDONE   \
131                                |ISO7816_INTSTS_RX       \
132                                |ISO7816_INTSTS_RXERR)
133 #define IS_ISO7816_INTFLAGR(__INTFLAG__)  (((__INTFLAG__) == ISO7816_INTSTS_TXRTYERR) ||\
134                                            ((__INTFLAG__) == ISO7816_INTSTS_RXOV)     ||\
135                                            ((__INTFLAG__) == ISO7816_INTSTS_TXDONE)   ||\
136                                            ((__INTFLAG__) == ISO7816_INTSTS_RX)       ||\
137                                            ((__INTFLAG__) == ISO7816_INTSTS_RXERR))
138 
139 #define IS_ISO7816_INTFLAGC(__INTFLAG__)  ((((__INTFLAG__)&ISO7816_INTSTS_Msk) != 0U) &&\
140                                            (((__INTFLAG__)&(~ISO7816_INTSTS_Msk)) == 0U))
141 //status
142 #define ISO7816_FLAG_DMATXDONE      ISO7816_INFO_DMATXDONE
143 #define IS_ISO7816_FLAGR(__FLAG__)  ((__FLAG__) == ISO7816_FLAG_DMATXDONE)
144 #define IS_ISO7816_FLAGC(__FLAG__)  ((__FLAG__) == ISO7816_FLAG_DMATXDONE)
145 
146 /****************************** ISO7816 Instances *****************************/
147 #define IS_ISO7816_ALL_INSTANCE(INSTANCE) (((INSTANCE) == ISO78160) || \
148                                            ((INSTANCE) == ISO78161))
149 
150 /* Exported Functions ------------------------------------------------------- */
151 void ISO7816_DeInit(ISO7816_Type *ISO7816x);
152 void ISO7816_StructInit(ISO7816_InitType *InitStruct);
153 void ISO7816_Init(ISO7816_Type *ISO7816x, ISO7816_InitType *Init_Struct);
154 void ISO7816_Cmd(ISO7816_Type *ISO7816x, uint32_t NewState);
155 void ISO7816_BaudrateConfig(ISO7816_Type *ISO7816x, uint32_t BaudRate);
156 void ISO7816_CLKDIVConfig(ISO7816_Type *ISO7816x, uint32_t Prescaler);
157 void ISO7816_CLKOutputCmd(ISO7816_Type *ISO7816x, uint32_t NewState);
158 void ISO7816_SendData(ISO7816_Type *ISO7816x, uint8_t ch);
159 uint8_t ISO7816_ReceiveData(ISO7816_Type *ISO7816x);
160 void ISO7816_INTConfig(ISO7816_Type *ISO7816x, uint32_t INTMask, uint8_t NewState);
161 uint8_t ISO7816_GetINTStatus(ISO7816_Type *ISO7816x, uint32_t INTMask);
162 void ISO7816_ClearINTStatus(ISO7816_Type *ISO7816x, uint32_t INTMask);
163 uint8_t ISO7816_GetFlag(ISO7816_Type *ISO7816x, uint32_t FlagMask);
164 void ISO7816_ClearFlag(ISO7816_Type *ISO7816x, uint32_t FlagMask);
165 uint8_t ISO7816_GetLastTransmitACK(ISO7816_Type *ISO7816x);
166 uint8_t ISO7816_GetLastReceiveCHKSUM(ISO7816_Type *ISO7816x);
167 
168 #ifdef __cplusplus
169 }
170 #endif
171 
172 #endif /* __LIB_ISO7816_H */
173 
174 /*********************************** END OF FILE ******************************/
175