Home | History | Annotate | Download | only in src
      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 
     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 
    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