1 /*
2 * Copyright (C) 2010 NXP Semiconductors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /*!
18 * \file phFriNfc_MapTools.c
19 * \brief NFC Ndef Internal Mapping File.
20 *
21 * Project: NFC-FRI
22 *
23 * $Date: Fri Oct 15 13:50:54 2010 $
24 * $Author: ing02260 $
25 * $Revision: 1.6 $
26 * $Aliases: $
27 *
28 */
29
30 #include <phFriNfc_NdefMap.h>
31 #include <phFriNfc_MapTools.h>
32
33 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
34 #include <phFriNfc_MifareULMap.h>
35 #endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
36
37 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
38 #include <phFriNfc_MifareStdMap.h>
39 #endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
40
41 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
42 #include <phFriNfc_DesfireMap.h>
43 #endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
44
45 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
46 #include <phFriNfc_FelicaMap.h>
47 #endif /* PH_FRINFC_MAP_FELICA_DISABLED */
48
49 #include <phFriNfc_OvrHal.h>
50
51 /*! \ingroup grp_file_attributes
52 * \name NDEF Mapping
53 *
54 * File: \ref phFriNfc_MapTools.c
55 * This file has functions which are used common across all the
56 * typ1/type2/type3/type4 tags.
57 *
58 */
59 /*@{*/
60 #define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.6 $"
61 #define PHFRINFCNDEFMAP_FILEALIASES "$Aliases: $"
62 /*@}*/
63
phFriNfc_MapTool_SetCardState(phFriNfc_NdefMap_t * NdefMap,uint32_t Length)64 NFCSTATUS phFriNfc_MapTool_SetCardState(phFriNfc_NdefMap_t *NdefMap,
65 uint32_t Length)
66 {
67 NFCSTATUS Result = NFCSTATUS_SUCCESS;
68 if(Length == PH_FRINFC_NDEFMAP_MFUL_VAL0)
69 {
70 /* As the NDEF LEN / TLV Len is Zero, irrespective of any state the card
71 shall be set to INITIALIZED STATE*/
72 NdefMap->CardState =(uint8_t) (((NdefMap->CardState ==
73 PH_NDEFMAP_CARD_STATE_READ_ONLY) ||
74 (NdefMap->CardState ==
75 PH_NDEFMAP_CARD_STATE_INVALID))?
76 PH_NDEFMAP_CARD_STATE_INVALID:
77 PH_NDEFMAP_CARD_STATE_INITIALIZED);
78 }
79 else
80 {
81 switch(NdefMap->CardState)
82 {
83 case PH_NDEFMAP_CARD_STATE_INITIALIZED:
84 NdefMap->CardState =(uint8_t) ((NdefMap->CardState ==
85 PH_NDEFMAP_CARD_STATE_INVALID)?
86 NdefMap->CardState:
87 PH_NDEFMAP_CARD_STATE_READ_WRITE);
88 break;
89
90 case PH_NDEFMAP_CARD_STATE_READ_ONLY:
91 NdefMap->CardState = (uint8_t)((NdefMap->CardState ==
92 PH_NDEFMAP_CARD_STATE_INVALID)?
93 NdefMap->CardState:
94 PH_NDEFMAP_CARD_STATE_READ_ONLY);
95 break;
96
97 case PH_NDEFMAP_CARD_STATE_READ_WRITE:
98 NdefMap->CardState = (uint8_t)((NdefMap->CardState ==
99 PH_NDEFMAP_CARD_STATE_INVALID)?
100 NdefMap->CardState:
101 PH_NDEFMAP_CARD_STATE_READ_WRITE);
102 break;
103
104 default:
105 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
106 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
107 NFCSTATUS_NO_NDEF_SUPPORT);
108 break;
109 }
110 }
111 Result = ((NdefMap->CardState ==
112 PH_NDEFMAP_CARD_STATE_INVALID)?
113 PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
114 NFCSTATUS_NO_NDEF_SUPPORT):
115 Result);
116 return Result;
117 }
118
119 /* To check mapping spec version */
120
phFriNfc_MapTool_ChkSpcVer(const phFriNfc_NdefMap_t * NdefMap,uint8_t VersionIndex)121 NFCSTATUS phFriNfc_MapTool_ChkSpcVer( const phFriNfc_NdefMap_t *NdefMap,
122 uint8_t VersionIndex)
123 {
124 NFCSTATUS status = NFCSTATUS_SUCCESS;
125
126 uint8_t TagVerNo = NdefMap->SendRecvBuf[VersionIndex];
127
128 if ( TagVerNo == 0 )
129 {
130 /*Return Status Error � Invalid Format�*/
131 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
132 }
133 else
134 {
135 switch (NdefMap->CardType)
136 {
137 case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD:
138 case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD:
139 {
140 /* calculate the major and minor version number of Mifare std version number */
141 status = (( (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
142 PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
143 ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM ==
144 PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
145 (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
146 PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
147 ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM <
148 PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))?
149 NFCSTATUS_SUCCESS:
150 PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
151 NFCSTATUS_INVALID_FORMAT));
152 break;
153 }
154
155 #ifdef DESFIRE_EV1
156 case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1:
157 {
158 /* calculate the major and minor version number of T3VerNo */
159 if( (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 ==
160 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
161 ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM ==
162 PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
163 (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 ==
164 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
165 ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM <
166 PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))
167 {
168 status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
169 }
170 else
171 {
172 if (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 <
173 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo) ) ||
174 ( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 >
175 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)))
176 {
177 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
178 }
179 }
180 break;
181 }
182 #endif /* #ifdef DESFIRE_EV1 */
183
184 default:
185 {
186 /* calculate the major and minor version number of T3VerNo */
187 if( (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
188 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
189 ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM ==
190 PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
191 (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
192 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
193 ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM <
194 PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))
195 {
196 status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
197 }
198 else
199 {
200 if (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM <
201 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo) ) ||
202 ( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM >
203 PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)))
204 {
205 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
206 }
207 }
208 break;
209 }
210
211
212 }
213 }
214
215 return (status);
216 }
217