• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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                 if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
103                     NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
104                 {
105                     if(NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
106                        NdefMap->StdMifareContainer.SectorTrailerBlockNo == NdefMap->StdMifareContainer.currentBlock )
107                     {
108                         NdefMap->CardState = (uint8_t)((NdefMap->CardState ==
109                                                         PH_NDEFMAP_CARD_STATE_INVALID)?
110                                                         NdefMap->CardState:
111                                                         PH_NDEFMAP_CARD_STATE_READ_ONLY);
112                     }
113                 }
114             break;
115 
116             default:
117                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
118                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
119                             NFCSTATUS_NO_NDEF_SUPPORT);
120             break;
121         }
122     }
123     Result = ((NdefMap->CardState ==
124                 PH_NDEFMAP_CARD_STATE_INVALID)?
125                 PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
126                 NFCSTATUS_NO_NDEF_SUPPORT):
127                 Result);
128     return Result;
129 }
130 
131 /*  To check mapping spec version */
132 
phFriNfc_MapTool_ChkSpcVer(const phFriNfc_NdefMap_t * NdefMap,uint8_t VersionIndex)133 NFCSTATUS   phFriNfc_MapTool_ChkSpcVer( const phFriNfc_NdefMap_t  *NdefMap,
134                                         uint8_t             VersionIndex)
135 {
136     NFCSTATUS status = NFCSTATUS_SUCCESS;
137 
138     uint8_t TagVerNo = NdefMap->SendRecvBuf[VersionIndex];
139 
140     if ( TagVerNo == 0 )
141     {
142         /*Return Status Error � Invalid Format�*/
143         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
144     }
145     else
146     {
147         switch (NdefMap->CardType)
148         {
149             case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD:
150             case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD:
151             {
152                 /* calculate the major and minor version number of Mifare std version number */
153                 status = (( (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
154                                 PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
155                             ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM ==
156                                 PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
157                             (( PH_NFCFRI_MFSTDMAP_NFCDEV_MAJOR_VER_NUM ==
158                                 PH_NFCFRI_MFSTDMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
159                             ( PH_NFCFRI_MFSTDMAP_NFCDEV_MINOR_VER_NUM <
160                                 PH_NFCFRI_MFSTDMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))?
161                         NFCSTATUS_SUCCESS:
162                         PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
163                                     NFCSTATUS_INVALID_FORMAT));
164                 break;
165             }
166 
167 #ifdef DESFIRE_EV1
168             case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1:
169             {
170                 /* calculate the major and minor version number of T3VerNo */
171                 if( (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 ==
172                         PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
173                     ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM ==
174                         PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
175                     (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 ==
176                         PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
177                     ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM <
178                         PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))
179                 {
180                     status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
181                 }
182                 else
183                 {
184                     if (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 <
185                             PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo) ) ||
186                     ( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM_2 >
187                             PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)))
188                     {
189                         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
190                     }
191                 }
192                 break;
193             }
194 #endif /* #ifdef DESFIRE_EV1 */
195 
196             default:
197             {
198                 /* calculate the major and minor version number of T3VerNo */
199                 if( (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
200                         PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
201                     ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM ==
202                         PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo))) ||
203                     (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM ==
204                         PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo ) )&&
205                     ( PH_NFCFRI_NDEFMAP_NFCDEV_MINOR_VER_NUM <
206                         PH_NFCFRI_NDEFMAP_GET_MINOR_TAG_VERNO(TagVerNo) )))
207                 {
208                     status = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS);
209                 }
210                 else
211                 {
212                     if (( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM <
213                             PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo) ) ||
214                     ( PH_NFCFRI_NDEFMAP_NFCDEV_MAJOR_VER_NUM >
215                             PH_NFCFRI_NDEFMAP_GET_MAJOR_TAG_VERNO(TagVerNo)))
216                     {
217                         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_FORMAT);
218                     }
219                 }
220                 break;
221             }
222 
223 
224         }
225     }
226 
227     return (status);
228 }
229