/*----------------------------------------------------------------------------*/ /* Copyright 2016-2022 NXP */ /* */ /* NXP Confidential. This software is owned or controlled by NXP and may only */ /* be used strictly in accordance with the applicable license terms. */ /* By expressly accepting such terms or by downloading, installing, */ /* activating and/or otherwise using the software, you are agreeing that you */ /* have read, and that you agree to comply with and are bound by, such */ /* license terms. If you do not agree to be bound by the applicable license */ /* terms, then you may not retain, install, activate or otherwise use the */ /* software. */ /*----------------------------------------------------------------------------*/ /** \file * Reference application file for ISO15693 interface of Simplified API * $Author: NXP $ * $Revision: $ (v07.10.00) * $Date: $ * */ #include extern phNfcLib_Transmit_t phNfcLib_TransmitInput; extern phNfcLib_PeerInfo_t PeerInfo; extern uint8_t bMoreDataAvailable; extern uint16_t wNumberofBytes; extern uint8_t bDataBuffer[256]; /* * This application is to demonstrate the usage of simplified API related to ISO15693 * The application reaches to this point only after the activation of a card with ISO 15693 * interface is done. Transmit api is used to perform any command exchange with the card and * receive api is used to get back the out data. * In case the user already knows the UID of the card he wants to talk to he can directly call these api */ uint32_t NfcLib_ISO15693_Reference_app() { uint32_t dwStatus; uint8_t bData[16] = {0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0}; /* * Copying the UID of the card on which the user wish to perform the operation. * For the reference purpose we will be talking to the card at index value 0 */ memcpy(phNfcLib_TransmitInput.phNfcLib_ISO15693.bUid, PeerInfo.uTi.uInitiator.tIso15693.TagIndex[0].pUid, 8); do { /************************************************************************************************************************* ****************************************READ SINGLE BLOCK *************************************************************** *************************************************************************************************************************/ /* The parameters for Read Single Block are the option and the Block number user wants to read */ /* Option is kept #PH_OFF for refer purpose and the block number to Read is Block - 5 */ READ_SINGLEBLOCK(PH_OFF, 5) /* Finally the command has to be sent, the command for 15693 will be send in addressed mode */ dwStatus = phNfcLib_Transmit(&phNfcLib_TransmitInput, 0x0 /* This length paramter is used only when apart from the command, there is some data to be send*/ ); /* The status should be success, if not break from the application */ if(dwStatus != PH_NFCLIB_STATUS_SUCCESS) { DEBUG_PRINTF (" \n Card does not support Read single block... \n"); break; } /* wNumberofBytes has to be reset before every receive */ wNumberofBytes = 256; /*The data received over the above command can be retrieved by calling the receive */ /* wNumberofBytes first as input tells the max supported recieve size and then as out tells the actual number of data bytes received */ /* wNumberofBytes will vary depending upon the card layout*/ dwStatus = phNfcLib_Receive(&bDataBuffer[0], &wNumberofBytes, &bMoreDataAvailable ); /* The status should be success and the number of bytes received should be 4 for Most NXP cards * The expectation of the number of bytes can be modified for different cards */ if((dwStatus != PH_NFCLIB_STATUS_SUCCESS) ||(wNumberofBytes != 4)) { break; } DEBUG_PRINTF("\nRead Data from Block 5 is"); phApp_Print_Buff(&bDataBuffer[0], wNumberofBytes); /************************************************************************************************************************* ****************************************WRITE SINGLE BLOCK ************************************************************** *************************************************************************************************************************/ /* The parameters for Write Single Block are the option, the Block number user wants to write and the data */ /* Option is kept #PH_OFF for refer purpose and the block number to write is Block - 5 */ WRITE_SINGLEBLOCK(PH_OFF, 5, &bData[0]) /* Finally the command has to be sent, the command for 15693 will be send in addressed mode */ dwStatus = phNfcLib_Transmit(&phNfcLib_TransmitInput, 0x04 /* While writing a block we will be writing 4 bytes of data*/ ); /* The status should be success, if not break from the application */ if(dwStatus != PH_NFCLIB_STATUS_SUCCESS) { DEBUG_PRINTF (" \n Card does not support Write single block... \n"); break; } /************************************************************************************************************************* ****************************************READ MULTIPLE BLOCK ************************************************************** *************************************************************************************************************************/ /* The parameters for Read Multiple Block are the option, the starting Block number and the no of blocks to read*/ /* Option is kept #PH_OFF for refer purpose, the starting block number is 5 and the no of blocks is 4*/ READ_MULTIPLEBLOCK(PH_OFF, 5, 4) /* Finally the command has to be sent, the command for 15693 will be send in addressed mode */ dwStatus = phNfcLib_Transmit(&phNfcLib_TransmitInput, 0x0 /* This length paramter is used only when apart from the command, there is some data to be send*/ ); /* The status should be success, if not break from the application */ if(dwStatus != PH_NFCLIB_STATUS_SUCCESS) { DEBUG_PRINTF (" \n Card does not support Read Multiple block... \n"); break; } /* This parameter has to be reset before every receive */ wNumberofBytes = 256; /*The data received over the above command can be retrieved by calling the receive */ /* wNumberofBytes first as input tells the max supported recieve size and then as out tells the actual number of data bytes received */ /* wNumberofBytes will vary depending upon the card layout*/ dwStatus = phNfcLib_Receive(&bDataBuffer[0], &wNumberofBytes, &bMoreDataAvailable ); /* The status should be success and the number of bytes received should be 4 * numofblocks for Most NXP cards * The expectation of the number of bytes can be modified for different cards */ if((dwStatus != PH_NFCLIB_STATUS_SUCCESS) ||(wNumberofBytes != 16)) { break; } DEBUG_PRINTF("\nRead Data from Block 5 to 8 is"); phApp_Print_Buff(&bDataBuffer[0], wNumberofBytes); /************************************************************************************************************************* *****************************************GET SYSTEM INFORMATION ********************************************************* *************************************************************************************************************************/ /* Get System Information takes no parameter and returns back the System Information */ GET_SYSTEMINFORMATION() /* Finally the command has to be sent, the command for 15693 will be send in addressed mode */ dwStatus = phNfcLib_Transmit(&phNfcLib_TransmitInput, 0x0 /* This length parameter is used only when apart from the command, there is some data to be send*/ ); /* The status should be success, if not break from the application */ if(dwStatus != PH_NFCLIB_STATUS_SUCCESS) { DEBUG_PRINTF (" \n Card does not support GET SYSTEM INFORMATION... \n"); break; } /* This parameter has to be reset before every receive */ wNumberofBytes = 256; /*The System Information received over the above command can be retrieved by calling the receive */ /* wNumberofBytes first as input tells the max supported recieve size and then as out tells the actual number of data bytes received */ dwStatus = phNfcLib_Receive(&bDataBuffer[0], &wNumberofBytes, &bMoreDataAvailable ); /* The status should be success */ if(dwStatus != PH_NFCLIB_STATUS_SUCCESS) { break; } DEBUG_PRINTF("\nSystem Information is "); phApp_Print_Buff(&bDataBuffer[0], wNumberofBytes); /************************************************************************************************************************* ************************************GET MULTIPLE BLOCK SECURITY STATUS ************************************************** *************************************************************************************************************************/ /* The parameters for Get Multiple Block security Status are the starting block nad the no of blocks whose status to read*/ /* Starting block is 9 which is already locked and no of blocks is 4 */ GET_MULTIPLEBLOCKSECURITYSTATUS(9, 4) /* Finally the command has to be sent, the command for 15693 will be send in addressed mode */ dwStatus = phNfcLib_Transmit(&phNfcLib_TransmitInput, 0x0 /* This length parameter is used only when apart from the command, there is some data to be send*/ ); /* The status should be success, if not break from the application */ if(dwStatus != PH_NFCLIB_STATUS_SUCCESS) { DEBUG_PRINTF (" \n Card does not support GET MULTIPLE BLOCK SECURITY STATUS... \n"); break; } /* This parameter has to be reset before every receive */ wNumberofBytes = 256; /*The System Information received over the above command can be retrieved by calling the receive */ /* wNumberofBytes first as input tells the max supported recieve size and then as out tells the actual number of data bytes received */ dwStatus = phNfcLib_Receive(&bDataBuffer[0], &wNumberofBytes, &bMoreDataAvailable ); /* The status should be success */ if(dwStatus != PH_NFCLIB_STATUS_SUCCESS) { break; } DEBUG_PRINTF("\nSecurity status for block 9 to 12 is "); phApp_Print_Buff(&bDataBuffer[0], wNumberofBytes); }while(0); return dwStatus; }