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_SmtCrdFmt.c 19 * \brief This component encapsulates different smart and simple tag formatting functionalities, 20 * for the mapping layer. 21 * 22 * Project: NFC-FRI 23 * 24 * $Date: Mon Dec 13 14:14:13 2010 $ 25 * $Author: ing02260 $ 26 * $Revision: 1.9 $ 27 * $Aliases: $ 28 * 29 */ 30 31 #ifndef PH_FRINFC_CARD_FORMAT_DISABLED 32 33 #include <phNfcTypes.h> 34 #include <phFriNfc_OvrHal.h> 35 #include <phFriNfc_SmtCrdFmt.h> 36 #ifdef DISABLE_FORMAT 37 #include <phFriNfc_TopazFormat.h> 38 #endif /* #ifdef DISABLE_FORMAT */ 39 #include <phFriNfc_MifULFormat.h> 40 #include <phFriNfc_DesfireFormat.h> 41 #include <phFriNfc_MifStdFormat.h> 42 #ifndef PH_FRINFC_FMT_ISO15693_DISABLED 43 #include <phFriNfc_ISO15693Format.h> 44 #endif /* #ifndef PH_FRINFC_FMT_ISO15693_DISABLED */ 45 46 47 /*! \ingroup grp_file_attributes 48 * \name NDEF Mapping 49 * 50 * File: \ref phFriNfc_CardFormatFunctions.c 51 * 52 */ 53 /*@{*/ 54 // file versions 55 /*@}*/ 56 57 58 59 60 void phFriNfc_SmtCrdFmt_HCrHandler(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, 61 NFCSTATUS Status) 62 { 63 /* set the state back to the Reset_Init state*/ 64 NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; 65 66 /* set the completion routine*/ 67 NdefSmtCrdFmt->CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR_FORMAT]. 68 CompletionRoutine(NdefSmtCrdFmt->CompletionRoutine->Context, Status); 69 } 70 71 /*! 72 * \brief Used to Reset the context variables , before the actual smart card formatting 73 * procedure. 74 * 75 */ 76 NFCSTATUS phFriNfc_NdefSmtCrd_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, 77 void *LowerDevice, 78 phHal_sRemoteDevInformation_t *psRemoteDevInfo, 79 phHal_sDevInputParam_t *psDevInputParam, 80 uint8_t *SendRecvBuffer, 81 uint16_t *SendRecvBuffLen) 82 { 83 NFCSTATUS result = NFCSTATUS_SUCCESS; 84 uint8_t index; 85 86 if ( (SendRecvBuffLen == NULL) || (NdefSmtCrdFmt == NULL) || (psRemoteDevInfo == NULL) || 87 (SendRecvBuffer == NULL) || (LowerDevice == NULL) || 88 (*SendRecvBuffLen == 0) || (psDevInputParam == NULL) || 89 (*SendRecvBuffLen < PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE) ) 90 { 91 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_PARAMETER); 92 } 93 else 94 { 95 /* Initialise the state to Init */ 96 NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; 97 98 for(index = 0;index<PH_FRINFC_SMTCRDFMT_CR;index++) 99 { 100 /* Initialise the NdefMap Completion Routine to Null */ 101 NdefSmtCrdFmt->CompletionRoutine[index].CompletionRoutine = NULL; 102 /* Initialise the NdefMap Completion Routine context to Null */ 103 NdefSmtCrdFmt->CompletionRoutine[index].Context = NULL; 104 } 105 106 /* Lower Device(Always Overlapped HAL Struct initialised in application 107 is registred in NdefMap Lower Device) */ 108 NdefSmtCrdFmt->LowerDevice = LowerDevice; 109 110 /* Remote Device info received from Manual Device Discovery is registered here */ 111 NdefSmtCrdFmt->psRemoteDevInfo = psRemoteDevInfo; 112 113 /* Trx Buffer registered */ 114 NdefSmtCrdFmt->SendRecvBuf = SendRecvBuffer; 115 116 /* Trx Buffer Size */ 117 NdefSmtCrdFmt->SendRecvLength = SendRecvBuffLen; 118 119 /* Register Transfer Buffer Length */ 120 NdefSmtCrdFmt->SendLength = 0; 121 122 /* Initialise the Format status flag*/ 123 NdefSmtCrdFmt->FmtProcStatus = 0; 124 125 /* Reset the Card Type */ 126 NdefSmtCrdFmt->CardType = 0; 127 128 /* Reset MapCompletion Info*/ 129 NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = NULL; 130 NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NULL; 131 132 #ifndef PH_FRINFC_FMT_TOPAZ_DISABLED 133 phFriNfc_Topaz_Reset(NdefSmtCrdFmt); 134 135 #endif /* PH_FRINFC_FMT_TOPAZ_DISABLED */ 136 137 #ifndef PH_FRINFC_FMT_DESFIRE_DISABLED 138 /*Reset Desfire Cap Container elements*/ 139 phFriNfc_Desfire_Reset(NdefSmtCrdFmt); 140 #endif /* PH_FRINFC_FMT_DESFIRE_DISABLED */ 141 142 #ifndef PH_FRINFC_FMT_MIFARESTD_DISABLED 143 /*Reset Mifare Standard Container elements*/ 144 NdefSmtCrdFmt->AddInfo.MfStdInfo.DevInputParam = psDevInputParam; 145 phFriNfc_MfStd_Reset(NdefSmtCrdFmt); 146 #endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */ 147 148 #ifndef PH_FRINFC_FMT_MIFAREUL_DISABLED 149 phFriNfc_MfUL_Reset(NdefSmtCrdFmt); 150 #endif /* #ifndef PH_FRINFC_FMT_MIFAREUL_DISABLED */ 151 152 #ifndef PH_FRINFC_FMT_ISO15693_DISABLED 153 phFriNfc_ISO15693_FmtReset (NdefSmtCrdFmt); 154 #endif /* #ifndef PH_FRINFC_FMT_ISO15693_DISABLED */ 155 156 #ifdef PHFRINFC_OVRHAL_MOCKUP 157 /*Reset Desfire Cap Container elements*/ 158 // phFriNfc_Mockup_H_Reset(NdefSmtCrdFmt); 159 #endif /* PHFRINFC_OVRHAL_MOCKUP */ 160 161 } 162 return (result); 163 164 } 165 166 /*! 167 * \brief Completion Routine initialisation 168 * 169 */ 170 NFCSTATUS phFriNfc_NdefSmtCrd_SetCR(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, 171 uint8_t FunctionID, 172 pphFriNfc_Cr_t CompletionRoutine, 173 void *CompletionRoutineContext) 174 { 175 NFCSTATUS status = NFCSTATUS_SUCCESS; 176 177 if ((NdefSmtCrdFmt == NULL) || (FunctionID >= PH_FRINFC_SMTCRDFMT_CR) || 178 (CompletionRoutine == NULL) || (CompletionRoutineContext == NULL)) 179 { 180 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_PARAMETER); 181 } 182 else 183 { 184 /* Register the application callback with the NdefMap Completion Routine */ 185 NdefSmtCrdFmt->CompletionRoutine[FunctionID].CompletionRoutine = CompletionRoutine; 186 187 /* Register the application context with the NdefMap Completion Routine context */ 188 NdefSmtCrdFmt->CompletionRoutine[FunctionID].Context = CompletionRoutineContext; 189 } 190 191 return status; 192 } 193 194 #ifdef FRINFC_READONLY_NDEF 195 196 NFCSTATUS 197 phFriNfc_NdefSmtCrd_ConvertToReadOnly ( 198 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) 199 { 200 NFCSTATUS result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 201 NFCSTATUS_INVALID_PARAMETER); 202 uint8_t sak = 0; 203 204 if((NdefSmtCrdFmt != NULL) 205 && (NdefSmtCrdFmt->CompletionRoutine->CompletionRoutine != NULL) 206 && (NdefSmtCrdFmt->CompletionRoutine->Context != NULL)) 207 { 208 sak = NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak; 209 switch (NdefSmtCrdFmt->psRemoteDevInfo->RemDevType) 210 { 211 case phHal_eMifare_PICC: 212 { 213 if (0x00 == sak) 214 { 215 result = phFriNfc_MfUL_ConvertToReadOnly (NdefSmtCrdFmt); 216 } 217 else 218 { 219 /* MIFARE classic 1k/4k is not supported */ 220 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 221 NFCSTATUS_INVALID_REMOTE_DEVICE); 222 } 223 break; 224 } 225 226 case phHal_eISO14443_A_PICC: 227 { 228 result = phFriNfc_Desfire_ConvertToReadOnly (NdefSmtCrdFmt); 229 break; 230 } 231 232 default : 233 { 234 /* Remote device is not recognised. 235 Probably not NDEF compliant */ 236 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 237 NFCSTATUS_INVALID_REMOTE_DEVICE); 238 break; 239 } 240 } 241 } 242 return result; 243 } 244 245 #endif /* #ifdef FRINFC_READONLY_NDEF */ 246 247 248 /*! 249 * \brief Used to format the different smart cards. 250 * 251 */ 252 NFCSTATUS phFriNfc_NdefSmtCrd_Format( phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, const uint8_t *ScrtKeyB ) 253 { 254 /* Component ID needs to be changed */ 255 NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 256 NFCSTATUS_INVALID_PARAMETER); 257 uint8_t sak = 0; 258 259 /* Check for the correct context structure */ 260 if((NdefSmtCrdFmt != NULL) && 261 (NdefSmtCrdFmt->CompletionRoutine->CompletionRoutine != NULL) && 262 (NdefSmtCrdFmt->CompletionRoutine->Context != NULL)) 263 { 264 #ifdef PH_HAL4_ENABLE 265 /* SAK (Select response) */ 266 sak = NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak; 267 268 /* Depending on the Opmodes, call the respective card functions */ 269 switch ( NdefSmtCrdFmt->psRemoteDevInfo->RemDevType ) 270 #else 271 /* SAK (Select response) */ 272 sak = NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.CardInfo106. 273 Startup106.SelRes; 274 275 /* Depending on the Opmodes, call the respective card functions */ 276 switch ( NdefSmtCrdFmt->psRemoteDevInfo->OpMode ) 277 #endif /* #ifdef PH_HAL4_ENABLE */ 278 { 279 #ifdef PH_HAL4_ENABLE 280 case phHal_eMifare_PICC : 281 #else 282 case phHal_eOpModesMifare : 283 #endif /* #ifdef PH_HAL4_ENABLE */ 284 /* Remote device is Mifare card . Check for Mifare 285 NDEF compliance */ 286 if(0x00 == sak) 287 { 288 #ifndef PH_FRINFC_FMT_MIFAREUL_DISABLED 289 /* The SAK/Sel_Res says the card is of the type 290 Mifare UL */ 291 NdefSmtCrdFmt->CardType = PH_FRINFC_SMTCRDFMT_MIFARE_UL_CARD; 292 if (NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.UidLength == 7 && 293 NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Uid[0] == 0x04) 294 { 295 296 Result = phFriNfc_MfUL_Format( NdefSmtCrdFmt); 297 } 298 else 299 { 300 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 301 NFCSTATUS_INVALID_REMOTE_DEVICE); 302 } 303 #else 304 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 305 NFCSTATUS_INVALID_REMOTE_DEVICE); 306 #endif /* #ifndef PH_FRINFC_FMT_MIFAREUL_DISABLED */ 307 } 308 else if((0x08 == (sak & 0x18)) || 309 (0x18 == (sak & 0x18))) 310 { 311 #ifndef PH_FRINFC_FMT_MIFARESTD_DISABLED 312 NdefSmtCrdFmt->CardType = (uint8_t) 313 (((sak & 0x18) == 0x08)? 314 PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD: 315 PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD); 316 317 /* The SAK/Sel_Res says the card is of the type 318 Mifare standard */ 319 Result = phFriNfc_MfStd_Format( NdefSmtCrdFmt, ScrtKeyB); 320 #else 321 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 322 NFCSTATUS_INVALID_REMOTE_DEVICE); 323 #endif /* #ifndef PH_FRINFC_FMT_MIFARESTD_DISABLED */ 324 } 325 else 326 { 327 /* Invalid Mifare card, as the remote device 328 info - opmode says its a Mifare card but, 329 The SAK/Sel_Res is wrong */ 330 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 331 NFCSTATUS_INVALID_REMOTE_DEVICE); 332 } 333 break; 334 #ifdef PH_HAL4_ENABLE 335 case phHal_eISO14443_A_PICC : 336 #else 337 case phHal_eOpModesISO14443_4A : 338 #endif /* #ifdef PH_HAL4_ENABLE */ 339 /* Remote device is Desfire card . Check for Desfire 340 NDEF compliancy */ 341 if(0x20 == (sak & 0xFF)) 342 { 343 #ifndef PH_FRINFC_FMT_DESFIRE_DISABLED 344 NdefSmtCrdFmt->CardType = PH_FRINFC_SMTCRDFMT_ISO14443_4A_CARD; 345 /* The SAK/Sel_Res says the card is of the type 346 ISO14443_4A */ 347 348 Result = phFriNfc_Desfire_Format(NdefSmtCrdFmt); 349 #else 350 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 351 NFCSTATUS_INVALID_REMOTE_DEVICE); 352 #endif /* #ifndef PH_FRINFC_FMT_DESFIRE_DISABLED */ 353 } 354 else 355 { 356 /* Invalid Desfire card, as the remote device 357 info - opmode says its a desfire card but, 358 The SAK/Sel_Res is wrong */ 359 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 360 NFCSTATUS_INVALID_REMOTE_DEVICE); 361 } 362 break; 363 #ifdef PH_HAL4_ENABLE 364 case phHal_eJewel_PICC : 365 #else 366 case phHal_eOpModesJewel : 367 #endif /* #ifdef PH_HAL4_ENABLE */ 368 /* Remote device is Topaz card . Check for Topaz 369 NDEF compliancy */ 370 if(0xC2 == sak) 371 { 372 #ifndef PH_FRINFC_FMT_TOPAZ_DISABLED 373 NdefSmtCrdFmt->CardType = PH_FRINFC_SMTCRDFMT_TOPAZ_CARD; 374 /* The SAK/Sel_Res says the card is of the type 375 ISO14443_4A */ 376 Result = phFriNfc_Topaz_Format(NdefSmtCrdFmt); 377 #else 378 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 379 NFCSTATUS_INVALID_REMOTE_DEVICE); 380 #endif /* #ifndef PH_FRINFC_FMT_TOPAZ_DISABLED */ 381 382 } 383 else 384 { 385 /* Invalid Topaz card, as the remote device 386 info - opmode says its a desfire card but, 387 The SAK/Sel_Res is wrong */ 388 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 389 NFCSTATUS_INVALID_REMOTE_DEVICE); 390 } 391 break; 392 393 #ifdef PHFRINFC_OVRHAL_MOCKUP 394 case phHal_eOpModesMockup : 395 /*Set the OpMode Ttype Flag*/ 396 NdefSmtCrdFmt->OpModeType[0] = phHal_eOpModesMockup; 397 NdefSmtCrdFmt->OpModeType[1] = phHal_eOpModesArrayTerminator; 398 //Result = phFriNfc_Mockup_ChkNdef(NdefSmtCrdFmt); 399 break; 400 #endif /* PHFRINFC_OVRHAL_MOCKUP */ 401 402 #ifndef PH_FRINFC_FMT_ISO15693_DISABLED 403 case phHal_eISO15693_PICC: 404 { 405 Result = phFriNfc_ISO15693_Format (NdefSmtCrdFmt); 406 break; 407 } 408 #endif /* #ifndef PH_FRINFC_FMT_ISO15693_DISABLED */ 409 default : 410 /* Remote device is not recognised. 411 Probably not NDEF compliant */ 412 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 413 NFCSTATUS_INVALID_REMOTE_DEVICE); 414 break; 415 } 416 } 417 return Result; 418 } 419 /*! 420 * \brief Handles different request and responses from the integration layer. 421 * 422 */ 423 void phFriNfc_NdefSmtCrd_Process(void *Context, 424 NFCSTATUS Status) 425 { 426 if ( Context != NULL ) 427 { 428 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context; 429 #ifdef PH_HAL4_ENABLE 430 switch ( NdefSmtCrdFmt->psRemoteDevInfo->RemDevType ) 431 #else 432 switch ( NdefSmtCrdFmt->psRemoteDevInfo->OpMode ) 433 #endif /* #ifdef PH_HAL4_ENABLE */ 434 { 435 #ifdef PH_HAL4_ENABLE 436 case phHal_eMifare_PICC : 437 #else 438 case phHal_eOpModesMifare : 439 #endif /* #ifdef PH_HAL4_ENABLE */ 440 if((NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD) || 441 (NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD)) 442 { 443 #ifndef PH_FRINFC_FMT_MIFARESTD_DISABLED 444 /* Remote device is Mifare Standard card */ 445 phFriNfc_MfStd_Process(NdefSmtCrdFmt,Status); 446 447 #else /* PH_FRINFC_FMT_MIFARESTD_DISABLED*/ 448 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 449 NFCSTATUS_INVALID_REMOTE_DEVICE); 450 #endif /* PH_FRINFC_FMT_MIFARESTD_DISABLED*/ 451 } 452 else 453 { 454 #ifndef PH_FRINFC_FMT_MIFAREUL_DISABLED 455 /* Remote device is Mifare UL card */ 456 phFriNfc_MfUL_Process(NdefSmtCrdFmt,Status); 457 #else /* PH_FRINFC_FMT_MIFAREUL_DISABLED*/ 458 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 459 NFCSTATUS_INVALID_REMOTE_DEVICE); 460 #endif /* PH_FRINFC_FMT_MIFAREUL_DISABLED*/ 461 } 462 break; 463 464 #ifdef PH_HAL4_ENABLE 465 case phHal_eISO14443_A_PICC : 466 #else 467 case phHal_eOpModesISO14443_4A : 468 #endif /* #ifdef PH_HAL4_ENABLE */ 469 #ifndef PH_FRINFC_FMT_DESFIRE_DISABLED 470 /* Remote device is Desfire card */ 471 phFriNfc_Desf_Process(NdefSmtCrdFmt, Status); 472 #else /* PH_FRINFC_FMT_DESFIRE_DISABLED*/ 473 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 474 NFCSTATUS_INVALID_REMOTE_DEVICE); 475 #endif /* PH_FRINFC_FMT_DESFIRE_DISABLED*/ 476 break; 477 #ifdef PH_HAL4_ENABLE 478 case phHal_eJewel_PICC : 479 #else 480 case phHal_eOpModesJewel: 481 #endif /* #ifdef PH_HAL4_ENABLE */ 482 #ifndef PH_FRINFC_FMT_TOPAZ_DISABLED 483 /* Remote device is Topaz Smart card */ 484 phFriNfc_Topaz_Process(NdefSmtCrdFmt, Status); 485 #else /* PH_FRINFC_FMT_TOPAZ_DISABLED*/ 486 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 487 NFCSTATUS_INVALID_REMOTE_DEVICE); 488 #endif /* PH_FRINFC_FMT_TOPAZ_DISABLED*/ 489 break; 490 491 #ifndef PH_FRINFC_FMT_ISO15693_DISABLED 492 case phHal_eISO15693_PICC : 493 { 494 phFriNfc_ISO15693_FmtProcess (NdefSmtCrdFmt, Status); 495 break; 496 } 497 #endif /* #ifndef PH_FRINFC_FMT_ISO15693_DISABLED */ 498 499 #ifdef PHFRINFC_OVRHAL_MOCKUP 500 case phHal_eOpModesMockup: 501 /* Remote device is Desfire card */ 502 //phFriNfc_Mockup_Process(NdefSmtCrdFmt, Status); 503 break; 504 #endif /* PHFRINFC_OVRHAL_MOCKUP*/ 505 default : 506 /* Remote device opmode not recognised. 507 Probably not NDEF compliant */ 508 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 509 NFCSTATUS_INVALID_REMOTE_DEVICE); 510 /* set the state back to the Reset_Init state*/ 511 NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; 512 513 /* set the completion routine*/ 514 NdefSmtCrdFmt->CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR_INVALID_OPE]. 515 CompletionRoutine(NdefSmtCrdFmt->CompletionRoutine->Context, Status); 516 break; 517 } 518 } 519 else 520 { 521 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\ 522 NFCSTATUS_INVALID_PARAMETER); 523 /* The control should not come here. As Context itself is NULL , 524 Can't call the CR*/ 525 } 526 } 527 528 #endif /* PH_FRINFC_CARD_FORMAT_DISABLED */ 529 530