blob: 2e05d33b5e0210d0f34686c22cc6f73868f74ec8 [file] [log] [blame]
Nick Pelly5d9927b2010-09-23 12:47:58 -07001/*
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 *
Jan Brands794aa722010-11-30 23:23:23 +010023 * $Date: Fri Oct 15 13:50:54 2010 $
24 * $Author: ing02260 $
25 * $Revision: 1.6 $
26 * $Aliases: $
Nick Pelly5d9927b2010-09-23 12:47:58 -070027 *
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/*@{*/
Jan Brands794aa722010-11-30 23:23:23 +010060#define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.6 $"
61#define PHFRINFCNDEFMAP_FILEALIASES "$Aliases: $"
Nick Pelly5d9927b2010-09-23 12:47:58 -070062/*@}*/
63
64NFCSTATUS 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 {
Jan Brands794aa722010-11-30 23:23:23 +010070 /* As the NDEF LEN / TLV Len is Zero, irrespective of any state the card
Nick Pelly5d9927b2010-09-23 12:47:58 -070071 shall be set to INITIALIZED STATE*/
Jan Brands794aa722010-11-30 23:23:23 +010072 NdefMap->CardState =(uint8_t) (((NdefMap->CardState ==
73 PH_NDEFMAP_CARD_STATE_READ_ONLY) ||
74 (NdefMap->CardState ==
Nick Pelly5d9927b2010-09-23 12:47:58 -070075 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:
Jan Brands794aa722010-11-30 23:23:23 +010084 NdefMap->CardState =(uint8_t) ((NdefMap->CardState ==
Nick Pelly5d9927b2010-09-23 12:47:58 -070085 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:
Jan Brands794aa722010-11-30 23:23:23 +010091 NdefMap->CardState = (uint8_t)((NdefMap->CardState ==
Nick Pelly5d9927b2010-09-23 12:47:58 -070092 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:
Jan Brands794aa722010-11-30 23:23:23 +010098 NdefMap->CardState = (uint8_t)((NdefMap->CardState ==
Nick Pelly5d9927b2010-09-23 12:47:58 -070099 PH_NDEFMAP_CARD_STATE_INVALID)?
100 NdefMap->CardState:
101 PH_NDEFMAP_CARD_STATE_READ_WRITE);
Sunil Jogi40734e72012-01-12 13:47:03 -0800102 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 }
Nick Pelly5d9927b2010-09-23 12:47:58 -0700114 break;
115
116 default:
117 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
Jan Brands794aa722010-11-30 23:23:23 +0100118 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
Nick Pelly5d9927b2010-09-23 12:47:58 -0700119 NFCSTATUS_NO_NDEF_SUPPORT);
120 break;
121 }
122 }
Jan Brands794aa722010-11-30 23:23:23 +0100123 Result = ((NdefMap->CardState ==
Nick Pelly5d9927b2010-09-23 12:47:58 -0700124 PH_NDEFMAP_CARD_STATE_INVALID)?
Jan Brands794aa722010-11-30 23:23:23 +0100125 PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
Nick Pelly5d9927b2010-09-23 12:47:58 -0700126 NFCSTATUS_NO_NDEF_SUPPORT):
127 Result);
128 return Result;
129}
130
131/* To check mapping spec version */
132
133NFCSTATUS 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 }
Nick Pelly5d9927b2010-09-23 12:47:58 -0700145 else
146 {
Jan Brands794aa722010-11-30 23:23:23 +0100147 switch (NdefMap->CardType)
Nick Pelly5d9927b2010-09-23 12:47:58 -0700148 {
Jan Brands794aa722010-11-30 23:23:23 +0100149 case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD:
150 case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD:
Nick Pelly5d9927b2010-09-23 12:47:58 -0700151 {
Jan Brands794aa722010-11-30 23:23:23 +0100152 /* 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;
Nick Pelly5d9927b2010-09-23 12:47:58 -0700165 }
Jan Brands794aa722010-11-30 23:23:23 +0100166
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
Nick Pelly5d9927b2010-09-23 12:47:58 -0700224 }
225 }
Jan Brands794aa722010-11-30 23:23:23 +0100226
Nick Pelly5d9927b2010-09-23 12:47:58 -0700227 return (status);
228}