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
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    {
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
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    }
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