NFC Knowledge Base

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

NFC Knowledge Base

Discussions

Sort by:
This post contains a guide of how to use the NFC Reader Library with LPC55S69. A ready to use package for using the “Basic Discovery Loop” example from the NFC Reader Library with LPC55S69 and CLRC663 plus frontend is attached with this document. This document is structured as follows: Overview of LPC55S69: The LPCXpresso55S69 development board provides the ideal platform for evaluation of and development with the LPC55S6x MCU based on the Arm® Cortex®-M33 architecture. The board includes a high performance onboard debug probe, audio subsystem and accelerometer, with several options for adding off-the-shelf add-on boards for networking, sensors, displays and other interfaces. The LPCXpresso55S69 is fully supported by the MCUXpresso suite of tools, which provides device drivers, middleware and examples to allow rapid development, plus configuration tools and an optional free IDE. MCUXpresso software is compatible with tools from popular tool vendors such as Arm and IAR, and the LPCXpresso55S69 may also be used with the popular debug probes available from SEGGER and P&E Micro. Hardware Requirements: Following hardware is required to run the project: LPC55S69-EVK development board. CLEV6630B board or BLE-NFC-V2 board. BLE-NFC-V2: It is easier to use the BLE-NFC-V2 board since it can be just plugged on top of the arduino interface available on the LPCXpresso55S69 board. The following figure shows the pin mapping between the two boards. CLEV6630B board: The CLEV6630B board consists of CLRC663 plus (NFC frontend) connected by default to an LPC1769 µC via SPI. However, the board is made in such a way that the LPC1769 MCU can be bypassed to connect to an external MCU (in our case the LPC55S69) easily. For doing so: Six resistors from the board need to be removed. These are highlighted in red in the Figure 1: Use the SPI pin connectors available on the left-hand side, on the board edge to connect to external MCU (LPC55S69 in this case) Solder jumper wires onto the following pins of CLEV6630B Board:  GND IRQ CLRC_NRST SSEL MOSI MISO SCK IF0 IF1      The CLEV6630B is shown in Figure 2 after the required changes have been made to it (Removal of resistors and soldering of wires).   Now connect the two boards as follows:   Running Basic Discovery Loop on LPC55S69:   If this is the first time you’re using LPC55S69-EVK board, follow the getting started guide first à  LPC55S69-EVK | NXP . Make sure to install the SDK package for LPC55S69-EVKboard which is required for the project below to run. Download either‘lpcxpresso55s69_BasicDiscoveryLoop_CLEV6630b' or 'lpcxpresso55s69_BasicDiscoveryLoop_BLE-NFC' package which you will find attached to this post. Drag and drop the downloaded package to the “Project Explorer” tab of your MCUXpresso IDE workspace (If you don’t have MCUXpresso, it can be downloaded for free from here: https://www.nxp.com/support/developer-resources/software-development-tools/mcuxpresso-software-and-tools/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE Now that the package has been imported to the MCUXpresso IDE (via drag and drop), click on Debug icon from the Quickstart panel to begin a debug session. Once the debug session has started, click on the run icon to run the code: The project should be running now. The project contains basic discovery loop functionality. Here is how the output looks like in the terminal. Bring any NFC card near the frontend’s antenna and the output console will show the detection and type of the card. For example, in the picture below, we can see that type 4A card was detected:     Running other NFC Reader Library examples on LPC55S69: Once the “lpcxpresso55s69_BasicDiscoveryLoop” project is running on the LPC55S69. Running other examples from is simple. First step is to install the NFC Reader Library : Installing the NFC Reader Library: Go to www.nxp.com/pages/:NFC-READER-LIBRARY Go to the Downloads tab and click on the download button Click download on the NFC Reader Library for Kinetis K82F package. Import the library package in the workspace. The easiest way is to use the Quick Start Panel on the left-hand side: Click on Import project from file system Then, browse the library package in your file system. Click Finish to import it all to your workspace. After completing the import wizard, all projects are listed in the “Project Explorer” window. As can be seen in the screenshot, it contains different folders: API documentation folder Driver Abstraction Layer FreeRTOS support The platform support (in the screenshot, corresponding to the LPC support) The software examples  The Reader Library implementation And the OS abstraction layer   Running "NfcrdlibEx9_NTagI2C" on LPC55S69: Here we use the “NfcrdlibEx9_NTagI2C” example from the reader library to describe the method. The same method can be used to run other examples from the NFC Reader Library.  To run "NfcrdlibEx9_NTagI2C" on LPC55S69, we look at "lpcxpresso55s69_BasicDiscoveryLoop" project (available as a download below) and "NfcrdlibEx9_NTagI2C" project (from the Reader Library). We make changes to the following folders: In “intfs” folder remove everything except the “phaApp_Init.h” file. Then go to the “intfs” folder of the NFC Reader Library example you want to run (“NfcrdlibEx9_NTagI2C” in this case), and copy all the files except “phaApp_Init.h” and paste them in the original “intfs” folder. In line 57 of the “ph_NxpBuild_App.h” file in “intfs” folder, replace #if defined(PHDRIVER_LPC1769RC663_BOARD) \     || defined(PHDRIVER_FRDM_K82FRC663_BOARD)\ #   define NXPBUILD__PHHAL_HW_RC663 #endif with #if defined(PHDRIVER_LPC1769RC663_BOARD) \     || defined(PHDRIVER_FRDM_K82FRC663_BOARD)\     || defined(PHDRIVER_LPC55S69RC663_BOARD) #   define NXPBUILD__PHHAL_HW_RC663 #endif Go to “source” folder and remove every file except “phApp_Init.c“ and “semihost_hardfault.c” files. Then go to “src” folder of the example you want to run (“NfcrdlibEx9_NTagI2C” in this case) and copy all the files except “phaApp_Init.c” and paste them into the “source” folder. Finally, copy the main file of the example you want to run (NfcrdlibEx9_NTagI2C in this case) and paste it into the “source” folder as well. The project is ready to build and run on LPC55S69.       Available Resources: Porting NFC Reader Library to i.MX RT1050. (Detailed Description of porting) https://community.nxp.com/docs/DOC-341843 LPC55S69 https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc5500-cortex-m33/lpcxpresso55s69-development-board:LPC55S69-EVK BLE-NFC-V2 https://www.nxp.com/products/identification-security/rfid/nfc-hf/nfc-readers/clrc663-iplus-i-and-qn902x-nfc-bluetooth-low-energy-solution-for-consumer-applications:BLE-NFC
View full article
This page contains information about the supported NXP MCU/MPU and NXP NFC product combinations which have ready to use packages. These can be used as a reference. The table below contains link to where you can find the projects as well.    MCU ↓   NFC IC →  NTAG I²C  plus NTAG 5 PN7150 CLRC663 plus family* PN5180 i.MX RT1050 i.MX RT1050 + NTAG I²C plus i.MX RT1050 + CLRC663 plus   Video: Using i.MX RT1050 with CLRC663 plus family and the NFC Reader Library | NXP  i.MX RT1060 i.MX RT1060 + NTAG I²C plus  i.MX RT1060 + PN7150 i.MX 8M Mini i.MX 8M Mini + PN7150 (Andriod) i.MX 8M Mini + PN7150 (linux-yocto) i.MX 7 Dual Sabre i.MX7 Dual Sabre + PN5180 LPC1769 LPC1769 + CLRC663 plus LPC1769 + PN5180 LPC55S69 LPC55S69 + NTAG I²C plus LPC55S69 + NTAG 5 LPC55S69 + PN7150 LPC55S69 + CLRC663 plus LPC55S69 + CLRC663 plus + SE050 (smart lock) LPC11u37h LPC11u37 + PN7150 LPC11u37h + CLRC663 plus LPC11u68 LPC11u68 + PN7150 LPC82X LPC82X + PN7150 LPC845 LPC845 + CLRC663 plus Kinetis K82F K82F + CLRC663 plus K82F + PN5180 Kinetis K64F K64F + PN7150 K64F + CLRC663 plus Kinetis K63 K63 + PN7150 Kinetis K24 K24 + PN7150 KW41Z KW41Z + NTAG I²C plus KW41Z + NTAG 5 KW41Z + PN7150 *CLRC663 plus family: CLRC663 plus, MFRC630 plus, MFRC631 plus, SLRC610 plus For more information on the NFC products, please visit https://www.nxp.com/nfc
View full article
Demo for Originality Signature Verification(AN11350)
View full article
Hello NFC enthusiasts, The following topics will be covered in this document: Activation of multiple Tags. For more information, please refer to Activating multiple Tags using NFC Reader Library  Read and Write NDEF messages. Reading values from GPIOs. This document will be segmented into three parts: Description. Software configuration section. Hardware configuration section. Demonstration. Description. The purpose of this project is to copy the information stored from one tag to another by making use of GPIOs to decide which tag to copy from. This way, topics such as read and write NDEF, card activation and GPIOs will be implemented.   Software configuration section: This demonstration is based on NXP NFC Reader Library v05.02.00, NfcrdlibEx3_NFCForum project for PNEV7462B, in which some modifications are going to be made in order to carry this out. These tags are compliant with NFC Forum Type 2 Tag and ISO/IEC14443 Type A specifications.    In phacDiscLoop.h modify the max number of cards supported (two cards for this demonstration):   #define PHAC_DISCLOOP_CFG_MAX_CARDS_SUPPORTED 0x02U      In NfcrdlibEx3_NFCForum.c add the following code in LoadDiscoveryConfiguration():   static phStatus_t LoadDiscoveryConfiguration() { ... /*Passive max typea devices*/ status = phacDiscLoop_SetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_TYPEA_DEVICE_LIMIT, 2); CHECK_STATUS(status); }   A fix to the SW stack has to be made (Fix will be implemented in the next release): open "phacDiscLoop_Sw_Int_A.c", line 511, change if statement as below.     if((pDataParams->sTypeATargetInfo.bTotalTagsFound > 1) && ((bTypeATagIdx) < pDataParams->sTypeATargetInfo.bTotalTagsFound))   In NfcrdlibEx3_NFCForum.c add #include "phhalGpio.h" to local headers section. /* Local headers */ #include <cards.h> #include "phhalGpio.h" #include "NfcrdlibEx3_NFCForum.h"‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ In NfcrdlibEx3_NFCForum.c define uint16_t NDEFlength = 0 and declare void InitGPIOs(void) in Global Defines section. /******************************************************************************* **   Global Defines *******************************************************************************/ phacDiscLoop_Sw_DataParams_t       * pDiscLoop;       /* Discovery loop component */ void * ppalI18092mPI; void * ppalI18092mT; void * palTop; /* Variables and InitGPIOs() needed for this application */ uint8_t bTagState1; uint8_t* value; uint8_t* value1; uint8_t val,val1; uint16_t NDEFlength = 0;‍‍‍‍‍‍‍‍‍‍‍‍‍‍ void InitGPIOs(void);‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ in Main Function, initialize the following: /******************************************************************************* **   Main Function *******************************************************************************/ int main (void) {      /* Initialize section */      value=&val;      value1=&val1;      InitGPIOs();‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ In case of multiple devices (which is of our interest) add the following code and comment the if(wNumberOfTags > 1){...} section as follows: else if((status & PH_ERR_MASK) == PHAC_DISCLOOP_MULTI_DEVICES_RESOLVED)             {                 /*                  * Multiple cards resolved. It enters here if DEVICE LIMIT > 1 and more than one devices are                  * detected and resolved.                  */                 DEBUG_PRINTF (" \n Multiple cards resolved: \n");                 /* Get detected technology type */                 status = phacDiscLoop_GetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_TECH_DETECTED, &wTagsDetected);                 CHECK_STATUS(status);                 /* Get number of tags detected */                 status = phacDiscLoop_GetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_NR_TAGS_FOUND, &wNumberOfTags);                 CHECK_STATUS(status);                 DEBUG_PRINTF ("\tNumber of tags: %d \n",wNumberOfTags);                 /* Tag 1 information */                 DEBUG_PRINTF ("\n Tag 1 NDEF information: \n");                 status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x00);                 /* Check for NDEF presence */                 status = phalTop_CheckNdef(palTop, &bTagState1);                 DEBUG_ERROR_PRINT(status);                 status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);                 DEBUG_ERROR_PRINT(status);                 /* Tag 2 information */                 DEBUG_PRINTF ("\n Tag 2 NDEF information: \n");                 status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x01);                 /* Check for NDEF presence */                 status = phalTop_CheckNdef(palTop, &bTagState1);                 DEBUG_ERROR_PRINT(status);                 status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);                 DEBUG_ERROR_PRINT(status);                 DEBUG_PRINTF (" \n --------------------------------------------------------------------------------------- \n\n");                 DEBUG_PRINTF (" \n Options: \n\n");                 DEBUG_PRINTF (" \n 1.- Left button  -(X)-( )- To copy NDEF message from Tag 1 to Tag 2 \n\n");                 DEBUG_PRINTF (" \n 2.- Right button -( )-(X)- To copy NDEF message from Tag 2 to Tag 1 \n\n");                 DEBUG_PRINTF (" \n --------------------------------------------------------------------------------------- \n\n");                 /* Reading values from GPIOs 2 and 3 */                 do                 {                     phhalPcr_GetGpioVal(2,value);                     phhalPcr_GetGpioVal(3,value1);                 }while(*value==1 && *value1==1);                 /* Copy NDEF content from tag at index 0 to Tag at index 1*/                 if(*value==0 && *value1==1)                 {                      DEBUG_PRINTF (" \n Copy NDEF from Tag 1 to Tag 2 \n");                 status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x00);                 /* Check for NDEF presence */                 status = phalTop_CheckNdef(palTop, &bTagState1);                 DEBUG_ERROR_PRINT(status);                 status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);                 DEBUG_ERROR_PRINT(status);                 status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x01);                 /* Check for NDEF presence */                 status = phalTop_CheckNdef(palTop, &bTagState1);                 DEBUG_ERROR_PRINT(status);                     if(bTagState1 == PHAL_TOP_STATE_READWRITE)                     {                     status = WriteNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);                     DEBUG_ERROR_PRINT(status);                     }                     DEBUG_PRINTF (" \n NDEF from Tag 1 to Tag 2 already copied \n");                 }                 /* Copy NDEF content from tag at index 1 to Tag at index 0*/                 else if(*value==1 && *value1==0)                 {                      DEBUG_PRINTF (" \n Copy NDEF from Tag 2 to Tag 1 \n");                     /* Check for NDEF presence */                     status = phalTop_CheckNdef(palTop, &bTagState1);                     status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);                     DEBUG_ERROR_PRINT(status);                     status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x00);                     /* Check for NDEF presence */                     status = phalTop_CheckNdef(palTop, &bTagState1);                         if(bTagState1 == PHAL_TOP_STATE_READWRITE)                         {                         status = WriteNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);                         DEBUG_ERROR_PRINT(status);                         }                         DEBUG_PRINTF (" \n NDEF from Tag 2 to Tag 1 already copied \n");                 }                 DEBUG_PRINTF (" \n Please remove the tags \n\n");                 DEBUG_PRINTF (" \n Press any button to continue... \n\n");                                 /* Reading values from GPIOs 2 and 3 */                 do                 {                     phhalPcr_GetGpioVal(2,value);                     phhalPcr_GetGpioVal(3,value1);                 }while(*value==1 && *value1==1); /*                if(wNumberOfTags > 1)                 {                      Get 1st detected tag and activate device at index 0                     for(bIndex = 0; bIndex < PHAC_DISCLOOP_PASS_POLL_MAX_TECHS_SUPPORTED; bIndex++)                     {                         if(PHAC_DISCLOOP_CHECK_ANDMASK(wTagsDetected, (1 << bIndex)))                         {                             DEBUG_PRINTF("\t Activating device @ index 0\n");                             status = phacDiscLoop_ActivateCard(pDataParams, bIndex, 0);                             break;                         }                     }                     if( ((status & PH_ERR_MASK) == PHAC_DISCLOOP_DEVICE_ACTIVATED) ||                             ((status & PH_ERR_MASK) == PHAC_DISCLOOP_PASSIVE_TARGET_ACTIVATED))                     {                          Get detected technology type                         status = phacDiscLoop_GetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_TECH_DETECTED, &wTagsDetected);                         CHECK_STATUS(status);                         GetTagInfo(pDataParams, 0x01, wTagsDetected);                         DEBUG_PRINTF("\t\t Activation successful\n");                     }                     else                     {                         DEBUG_PRINTF("\t\tCard activation failed\n");                     }                 }*/                 /* Switch to LISTEN mode if supported after POLL mode */             }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ In NfcrdlibEx3_NFCForum.h declare WriteNdefMessage(). /** * Write NDEF message to a detected tag. * */ phStatus_t WriteNdefMessage(     uint8_t TopTagType);      /* [in] Tag type to which write NDEF */‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ In NfcrdlibEx3_NFCForum.c define the function WriteNdefMessage(). /** * Writes NDEF Message to a tag */ phStatus_t WriteNdefMessage(uint8_t TopTagType) {     phStatus_t status;     uint8_t bTagState;     uint16_t wDataLength = 0;     /* Configure Top layer for specified tag type */     status = phalTop_SetConfig(palTop, PHAL_TOP_CONFIG_TAG_TYPE, TopTagType);     DEBUG_ERROR_PRINT(status);     /* Check for NDEF presence */     status = phalTop_CheckNdef(palTop, &bTagState);     DEBUG_ERROR_PRINT(status);     if(bTagState == PHAL_TOP_STATE_READWRITE)     {         /* Write NDEF message */         status = phalTop_WriteNdef(palTop, baSnepAppBuffer, NDEFlength);         DEBUG_ERROR_PRINT(status);         /* Print NDEF message, if not NULL NDEF */         if(NDEFlength)         {             DEBUG_PRINTF("\tNDEF detected...\n");             DEBUG_PRINTF("\tNDEF length: %d\n", wDataLength);             DEBUG_PRINTF("\tNDEF message:\n");             //DumpBuffer(aData, wDataLength);             DumpBuffer(baSnepAppBuffer, 50);         }         else         {             DEBUG_PRINTF("\tNDEF content is NULL...\n");         }     }     else     {         DEBUG_PRINTF("\tNo NDEF content detected...\n");     }     return status; }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ In NfcrdlibEx3_NFCForum.c define InitGPIOs(). void InitGPIOs(void) {     phhalPcr_ConfigInput(2,true,false,false,false,true,false);     phhalPcr_ConfigInput(3,true,false,false,false,true,false); }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ Hardware configuration section: For the Hardware set up, two push buttons will be connected to GPIO_2 and GPIO_3 of PNEV7462B as follows. Vdd will be connected to 3V3 pin on the board: GND can be connected to any GND on the board. Demonstration: Each tag was previously written with a text NDEF message respectively.   Tag 1: Text: Tag1 Language: en   Tag 2: Text: Tag2 Language: en   Writing to a tag can be done by making use of our TagWriter app available in the play store: NFC TagWriter by NXP - Aplicaciones de Android en Google Play  First both tag's NDEF text messages will be displayed: Once the information is read, you'll be asked to select an option from the following menu: If left button (GPIO_2) is pressed, the content from Tag 1 will be written to Tag 2: Otherwise, If left button (GPIO_3) is pressed, the content from Tag 2 will be written to Tag 1: Please find the modified files attached. I hope this is of great help! Best regards, Ivan.
View full article
Introduction NTAG5 offers a powerful energy harvesting feature (up to 30mW). One useful application can be charging the supercapacitor which then might be used as the supply of customer MCU, Sensor, etc.   See the typical schematic below:  C1 and C1P are used for the impedance tuning. The antenna is typically tuned at 13.56 MHz-14MHz.  R1 is used to limit the charging current of the supercapacitor. Its value depends on the selected VOUT voltage, keep in mind that the maximum output current is 12.5 mA.  E.g. VOUT=2.4V, Icharging=10mA -> R1=240 Ohm Keep in mind, that if the charging current is too high and/or the amount of the received magnetic field is not high enough, the VOUT may drop.  D1 should be a low-drop diode e.g. RB520CS30L Used super cap: CPX3225A752D Antenna size  Generally, it is best to attempt to match the tag and the reader antenna geometries for maximum efficiency. A significant difference between the reader and tag antenna dimensions result in bad communication and energy harvesting performance because of the small coupling factor. As smartphone NFC antennas can have different dimensions. It might be challenging to design one NFC Tag antenna that will deliver the best performance for multiple smartphones.  The phone's NFC Antenna dimensions are typically between approximately 25 mm vs 20 mm (NFC Forum Poller Class 6) & 50 mm vs 30 mm (NFC Forum Poller Class 3). Note: But this might be different e.g., iPhones  So customers can consider the following form factors of NFC antennas for their Energy harvesting NTAG5 Link design:  For bigger designs (NFC Forum Listener Class 3):    For circle NFC Antenna ->Outer diameter is approx. 44 mm    For smaller designs (NFC Forum Listener Class 6):  For circle NFC Antenna ->Outer diameter is approx. 25 mm     Tomas Parizek  Customer Application Support 
View full article
Hello NFC community,  as you may know the The PN7462 family consists of 32-bit Arm® Cortex®-M0-based NFC microcontrollers offering high performance and low power consumption. It has a simple instruction set and memory addressing along with a reduced code size compared to existing architectures. PN7462 family offers an all-in-one-solution, with features such as NFC, supporting all NFC Forum modes, microcontroller, optional contact smart card reader, and software in a single chip. It operates at CPU frequencies of up to 20 MHz. and  MIFARE® Ultralight-based tickets offer an ideal solution for low-cost, high-volume applications such as public transport, loyalty cards and event ticketing. They serve as a perfect contactless replacement for magnetic stripe, barcode, or QR-code systems. The introduction of the contactless MIFARE Ultralight® ICs for limited-use applications can lead to reduced system installation and maintenance costs. As you may know the MIFARE family has the Ultralight C tag which is a contactless IC supporting 3DES cryptography is mostly used in limited use applications such smart ticketing, this tag complies with ISO 14443-3 type A and it is defined as type 2 tag. In this document I am going to show you how to modify an example that is provided in the NXP Reader Library to authenticate to a not personalized Mifare Ultralight C and perform a Read operation. Materials: PN7462 or PNEV7462 ( this is the evaluation board  from NXP) PN7462 Reader library Mifare Ultralight C Mifare Ultralight C Data sheet MCUXpresso First we are going to go to  NfcrdlibEx4_MIFAREClassic.c, I am going to explain as much as I can with comments in the code and add some information here we are going to  add the following include: #define MFULC_READ_DATA_SIZE 16 /* Number of bytes that is read by MIFARE Ultralight Read command */ #define MFULC_USER_MEMORY_BEGIN 0x04 /* Number of bytes that is read by MIFARE Ultralight Read command */ #define MFULC_PAGE_SIZE 0x04 /* Size of page of MIFARE Ultralight card */ #define KEYCOUNT 0x7FU /* number of keys */ #define KEYVERSIONS 0x01U /* number of key versions */ #define RAND_KEY_2K3DES_ADDRESS 0x01U /* Random 2K3DES key address in keystore */ #define RAND_KEY_2K3DES_VERSION 0x00U /* Random 2K3DES key version in keystore */ #define UL_C_KEY_ADDRESS 0x02U /* Ultralight C key address in keystore */ #define UL_C_KEY_VERSION 0x00U /* Ultralight C key version in keystore */ #define KEY_POSITION 0x00U /* Key position */ ‍ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ after this in the Global Variable declaration section we will have to add the following: phCryptoSym_Sw_DataParams_t cryptoEnc; /* CryptoSym parameter structure for ENC */ phCryptoSym_Sw_DataParams_t cryptoSymRng; /* CryptoSym parameter structure for SymRng */ phCryptoRng_Sw_DataParams_t cryptoRng; /* CryptoRng parameter structure for Rng */ phKeyStore_Sw_DataParams_t keyStore; /* KeyStore parameter structure */ static uint8_t gaUlcKey[] = {0x49, 0x45, 0x4D, 0x4B, 0x41, 0x45, 0x52, 0x42, 0x21, 0x4E, 0x41, 0x43, 0x55, 0x4F, 0x59, 0x46}; phacDiscLoop_Sw_DataParams_t * pDiscLoop; /* Discovery loop component */ void *psKeyStore; void *psalMFUL; void *ppalMifare;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ the variable static uint8_t gaUlcKey[] = {0x49, 0x45, 0x4D, 0x4B, 0x41, 0x45, 0x52, 0x42, 0x21, 0x4E, 0x41, 0x43, 0x55, 0x4F, 0x59, 0x46}; this is the key for default in the Mifare Ultralight c as stated in the datasheet section 7.5.6 this is a reference for the key we should be using. Then we are going to change the PAL variables /*PAL variables*/ phKeyStore_Sw_KeyEntry_t aKeyEntry[KEYCOUNT]; phKeyStore_Sw_KeyVersionPair_t aKeyVersion[KEYCOUNT * KEYVERSIONS]; phKeyStore_Sw_KUCEntry_t aKeyUsageCounter[KEYCOUNT]; uint8_t bDataBuffer[DATA_BUFFER_LEN]; /* universal data buffer */ uint8_t bSak; /* SAK card type information */ uint16_t wAtqa; /* ATQA card type information */ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ then we are going to change this in line 131 psalMFC = phNfcLib_GetDataParams(PH_COMP_AL_MFC);‍‍‍ to psalMFUL = phNfcLib_GetDataParams(PH_COMP_AL_MFUL);‍‍‍ so this get the MIFARE Ultralight AL-Components, then after this line we are going to add  ppalMifare = phNfcLib_GetDataParams(PH_COMP_PAL_MIFARE);‍‍‍  then we are going to erase the Mifare classic  functionality to avoid any kind of error due to Mifare classic not being present in the field.and add the following: First we are going to proceed with the Authentication part, we are going tu use the API phalMful_UlcAuthenticate(pDataParams, wKeyNumber, wKeyVersion);  the first  parameter is the structure pointing to the tag that was activated by the discoveryloop, then the key address and last the  version of the key. as you can see we do not send the key we only tell the tag where is the key stored and the version if it was updated. to ensure the confidentiality of the communication. /* Authenticate with the Key even if no memory of Ultralight Card is restricted by Authentication access Authentication with correct key provides access to any part of the memory (beside key storage) . */ /* Send authentication for entire Ultralight C */ status = phalMful_UlcAuthenticate(psalMFUL, UL_C_KEY_ADDRESS, UL_C_KEY_VERSION); /* Check for Status */ if ((status & PH_ERR_MASK) != PH_ERR_SUCCESS) { /* Print Error info */ DEBUG_PRINTF("\nAuthentication Failed!!!"); DEBUG_PRINTF("\nPlease correct the used key"); DEBUG_PRINTF("\nExecution aborted!!!\n"); break; } DEBUG_PRINTF("\nAuthentication Successful"); /* ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ after this the status should be  OK  and no error found, if you have an error in this please check that the card you are using was not tampered before and changed the key or if you distributor delivered a configured key please be sure to use the correct key. then we are going to proceed to the Read operation: phalMful_Read(pDataParams, bAddress, pData) as you can see  the first parameter is the same as authentication because we are still talking to the same tag,  the MFULC_USER_MEMORY_BEGIN its value is 04 this is because as you can see in the datasheet section 7.5 Memory organization the user memory starts in page 4 and ends in page 39 so we just want to read the first page of the tag and the bDataBuffer variable will store the received information. /* *************** READ operation ****************************** */ /* Empty the bDataBuffer */ memset(bDataBuffer, '\0', DATA_BUFFER_LEN); DEBUG_PRINTF("\n\nRead data from page %d, %d, %d, %d", MFULC_USER_MEMORY_BEGIN, MFULC_USER_MEMORY_BEGIN + 1, MFULC_USER_MEMORY_BEGIN + 2, MFULC_USER_MEMORY_BEGIN + 3); /* Read data from custom */ status = phalMful_Read(psalMFUL, MFULC_USER_MEMORY_BEGIN, bDataBuffer); /* Check for Status */ if (status != PH_ERR_SUCCESS) { /* Print Error info */ DEBUG_PRINTF("\nRead operation failed!!!\n"); DEBUG_PRINTF("\nExecution aborted!!!\n\n"); break; /* Break from the loop*/ } DEBUG_PRINTF("\nRead Success"); DEBUG_PRINTF("\nThe content of page %d is:\n", MFULC_USER_MEMORY_BEGIN); phApp_Print_Buff(&bDataBuffer[0], MFULC_READ_DATA_SIZE);‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ and that is all of our project, this is a simple project but can help a lot of people to understand how to work with Mifare Ultralight C using the PN7462 and then help people to start doing more complex examples based on this project. if you want to know how to configure a Mifare Ultralight c product using our PEGODA reader please check the document I posted called "Mifare Ultralight C - Changing default password and protecting page address". if you have any questions please let me know. BR Jonathan
View full article
The demonstration aims at how to protect the NDEF messages in the NTAG, here we use OM5569-NT322ER | NTAG I2C plus Explorer Kit + reader | NXP  as this dev kit contains NTAG as well as the NFC reader. The NTAG I2C plus has the unprotected memory starting from page 04h of sector 0, and NDEF messages are stored there. Referring to 8.3.11 of the data sheet, AUTH0 specifies the starting page to be protected, ACCESS[NFC_PROT] enables read&write password protection from NFC interface, PWD and PACK are for password configuration, but before changing any of above , you have to do a password authentication as below: Then you may select sector 0 and read the contents starting from E3h. Here FFh is the default value for AUTH0.  Now you may change the AUTH0,ACCESS[NFC_PROT] , PWD and PACK as you wish, for example, something like below: read the data from E3h to E6h and change the corresponding bytes in one write. The video shows how to read the NDEF message under password protection.  
View full article
The latest NFC reader library supports lpc1769 which is a cortex M3 controller with LPCopen lib supports, so in theory , it should supports other controllers supported by LPCopen, but we have to test this, so we choose , for example, lpc11u37, a cortex M0 based controller for this porting. Platform for this porting: LPC11u37h-Xpresso Rev A: CLRC663 plus based CLEV663B Blueboard 3.0. Please refer to Prepare CLEV663B board for NFC reader library porting  for details. They are connected via LPCXpresso ports. Now we may start the porting, the IDE we use in this porting is MCUXpresso 10.1.1 1. Download and import the latest NFC reader library for CLEV6630B, as it supports CLRC663 plus. For how to import the project, please refer to https://www.nxp.com/docs/en/application-note/AN11211.pdf . 2. Download LPCopen for LPC11u37h and import it as well. 3. Now we may choose some demo in the NFC reader library, for example, the NfcrdlibEx1_BasicDiscoveryLoop, and create new build configuration for lpc11u37h. 4.Select the correct MCU 5.Modify build settings Here we find LPC1769RC663 is defined, so we have to find what is related with this definition in the code and change it/them. Fortunately they are not too many. you may find they are just related with board header file including or something like that, so it is not difficult to modify them. 6. Add new header file for the new board definition 7. add the new board definition 8. As we now use LPCopen lib for LPC11u37h instead, so we have to change the including path. As LPC11u37h is cortex M3 based, so we have to setup FreeRTOS for M0 support: and add the source code for building: 9.Change the link libraries and including path 10.Set the correct ref projects to use LPCopen for LPC11u37h. 11. Some changes in LPCopen library: 1)enable semihosting debug 2) add startup source code for the demo, this C file can be reused/imported from the some lpcopen project. 12. After the above steps, we still have to change the source code in DAL: You know , due to different version of LPCopen library,  some function definition might be changed, and different LPCXpresso boards has different pin connection to the LPCXpresso ports, so it is recommended checking the board schematics and the examples in lpcopen project , find the proper function calls to implement the source codes in the DAL folder. When you finished , the porting is done. 13. As the final image size is greater than 128K, we have enable optimization for size. 14.Demo test ok. Now , we know lpc11u37 can be supported by the latest NFC reader library, so the porting should also be applied for other Cortex M0 controllers, and it is recommended the controller with large internal flash size, better greater than 128K, but anyway, in this porting, I didn't enable the size optimization for LPCopen library, so there might be possibility to have a smaller size image at last...
View full article
  NXP offers FW update code as part of the SW6705.   All PN7160 FW versions including ".c" files are available on PN7160 Github.    PN7160 is typically delivered with the initial FW 12.50.05. To ensure full reliable functionality, it is highly recommended to update the FW on 12.50.09 (or latest). The FW update might be also helpful if you need to restore the default EEPROM settings.  The FW source data are inside the sFWudpate folder.  phDnldNfc_UpdateSeq.c -> FW Version 12.50.05 phDnldNfc_UpdateSeq_12_50_09.c -> FW Version 12.50.09 The phDnldNfc_UpdateSeq.c is executed, which means what is inside of this "C" file is pushed to the PN7160 EEPROM.  So, if you want to update from 12.50.05 to 12.50.09. You need to copy content from phDnldNfc_UpdateSeq_12_50_09.c to The phDnldNfc_UpdateSeq.c.  Also, make sure that the content in phDnldNfc_UpdateSeq_12_50_09.c is commended.   Once that's done, you can debug the code.  Then you can check the progress in "Terminal"    Tomas Parizek  Customer Application Support 
View full article
AN13189 provides guidelines for the integration of PN7160 NXP NCI-based NFC controller to an Android platform from software perspective. But some developers found some compile issues when integrating PN7160 NFC package into Android 11.   This article describes how to fix the build error when you integrating PN7160 NXP NCI-based NFC controller to Android 11 system.  You need to follow the AN13189 (PN7160 Android porting guide ) first.  After you run the installation script install_NFC.sh, the following modification should be added to the source code. 1) Open package/apps/Nfc/nci/jni/Android.bp Add  "-DNXP_EXTNS=TRUE",   2 )  open system/nfc/src/Android.bp Add   "-DNXP_EXTNS=TRUE",     3 )   open packages/apps/Nfc/src/com/android/nfc/NfcService.java And add this: between isNfcSecureEnabled and setNfcSecure methods:             @Override         public IBinder getNfcAdapterVendorInterface(String vendor) {             if(vendor.equalsIgnoreCase("nxp")){                     return (IBinder) mNfcAdapter;             } else {                    return null;             }         }     Next, follow AN13189, complete the following steps in section 4.2. Then you can build the package successfully.  Thanks  @andraz_skupek .      
View full article
The PN5180 offers a low-power card detection (LPCD) feature, which allows to power down the reader for a certain period of time to safe the energy. After this time the reader must become active again to poll for the cards. If no card has been detected, the reader can go back to the power down state. PN5180 LPCD cycle time includes standby time and VBAT time. In a normal case, standby time is 200ms (user can define it),   standby current is 15uA, VBATON current is 7500uA, FieldON current: 200mA.  Average current is about 200uA, it depends on your settings and application.   This article describes how to configure PN5180 LPCD using NXP Cockpit Tool and using NXP NFC Reader library.   1  PN5190 LPCD Overview PN5180 LPCD operates in two modes: auto calibration mode and self-calibration mode. Auto calibration mode:  everything done automatically Self-calibration mode:   calibration must be done manually before starting the LPCD.   1.1  Auto Calibration Mode ( 00b) The LPCD calibration is done automatically when the LPCD is started, using the gear and threshold as defined in the EEPROM. This mode always uses the same gear for the LPCD, and is the fast and easiest way to start the LPCD.  It is recommended to choose a gear, which always keeps the ITVDD and field strength limits, so normally, the highest gear number. Auto calibration mode is most commonly used, it is a standard use case. Below parameters need to be configured correctly in EEPROM   LPCD_REFERENCE_VALUE       LPCD_REFVAL_GPO_CONTROL      LPCD_THRESHHOLD  ( 0x37) LPCD wakes up, if current AGC during “ping” > AGC Reference + LPCD_THRESHOLD or< AGC Reference -LPCD_THRESHOLD Minimum LPCD_THRESHOLD = 03…08 (very sensitive) Maximum LPCD_THRESHOLD = 40 … 50 (very robust)    LPCD_FIELD_ON_TIME  (0x36) RF on time in 8µs, excluding the fix time .   Fix time = 62µs 01 => RF on = 70µs 02 => RF on = 78µs 03 => RF on = 86µs 10 => RF on = 190µs   1.2  Self Calibration Mode (01b) The LPCD calibration must be manually triggered, with reading or writing into the AGCREF_CONFIG register.   Reading from this register - without prior writing - starts an LPCD calibration. The calibration is executed using the gear which is resulting from the actual DPC setting under the actual antenna detuning condition. AGC_GEAR is used in the LPCD self-calibration.   Reading from this register - without prior writing - delivers in addition to the AGC_GEAR value the AGC_VALUE. The AGC_VALUE is used in the LPCD self-calibration. Writing to this register: Writing data to this register is required before starting the LPCD in Self-calibration mode. Either the previously read AGC_GEAR or a user-defined gear can be chosen. The previously read AGC_VALUE has to be written in any case. Writing data to this register defines the values for AGC_GEAR without taking the actual detuning condition into account. The value of AGC_GEAR to perform an LPCD calibration which derives the AGC_VALUE. This AGC_VALUE and the AGC_GEAR are used in the LPCD self-calibration.   Self-calibration mode always requires a Read AGC_REF_CONFIG, followed by a write AGC_REF_CONFIG, using the previously read AGC_VALUE.   The LPCD calibration can be done in two different options: Option 1:  Read AGC_REF_CONFIG register:  This command executes a standard RF Field on. So depending on the load condition the DPC adjusts the output power. The final gear is take as gear for the LPCD.  This option guarantees that the maximum output power is taken for the LPCD.   Option 2: Write AGC_REF_CONFIG register: This command executes a LPCD calibration ping with the gear number, as defined in the AGC_REF_CONFIG, bit 10:13. This option allows a flexible use of any of the defined gears for the LPCD.   PN5180 LPCD self-calibrate is executed, using Gear -> AGC_REF_CONFIG (Register) Threshold -> LPCD_THRESHOLD (EEPROM) RF on time-> LPCD_FIELD_ON_TIME (EEPROM)   2  How to configure PN5180 LPCD with Cockpit The NFC Cockpit allows the configuration and test of the low power card detection of the PN5180 as shown in below picture. The LPCD parameter, which are stored in the EEPROM, can be changed and the LPCD can be started. The LPCD tab allows to directly define and write the related EEPROM addresses:   LPCD Gear #: Defines the gear number, which is used for the LPCD in auto calibration mode, stored in addr. 0x34, bit 0:3 Threshold Value: Defines the threshold window, As soon as the AGC value during the LPCD ping exceeds the AGC reference value + threshold window, the IRQ will be raised and the PN5180 wakes up. Field On Time:  Defines the ping length Standby time :  This value defines the time between two pings in ms. FieldOn Current: This value is ITVDD under the loading condition, when RF field is on with the used gear. This value does not have any influence on the LPCD execution, but simply is used to estimate the overall  average current consumption. This current estimation is calculated, when the LPCD is started.         3   How to configure PN5180 LPCD with NXP NFC reader library. The LPCD works in two phases: First the standby phase is controlled by the wake-up counter (timing defined in the instruction), which defines the duration of the standby of the PN5180. Second phase is the detection-phase. The RF field is switched on for a defined time (EEPROM configuration) and then the AGC value is compared to a reference value.   Below is the flow chart for PN5180 LPCD          
View full article
this is a step by step guider to port PN7160 to Android 14 on i.MX 8M Nano board
View full article
When the PNEV5180B cannot work with the Cockpit, you can re-program the firmware to the board. Below are the steps show you how to program the firmware to the board again. 1. If you don't have the MCUXpresso, please download the MCUXpresso from the NXP web first. MCUXpresso Software and Tools for ARM® Cortex®-M cores|NXP  2. Install the MCUXpresso IDE v10.0.0 to your PC. 3. Configure PNEV5180 board to use external power supply J101, and then power up the board. There is 10-pin ARM Cortex header on the PNEV5180B , connect  LPC-Link2 debug probe to it (J7) by using flat cable and also connect debug probe to the PC host over USB mini cable - both jumper on debug probe are open (JP1 and JP2). 4. Start MCUXpresso IDE and import any LPC1769 project from filesystem. For example: SW3522.zip. This is important to give programmer right definitions. SW3522 can be downloaded from here : NFC Reader Library v4.040.05.011646 R1 for PNEV5180B including all software examples  5. After import the SW3522, you can try to build the example and run the example on your board. e.g. NfcrdlibEx1_BasicDiscoveryLoop. Click LinkServer GUI Flash programmer icon on the main menu. When started programmer tool will check if LPC-Link2 debug probe is attached. 6. Browse to the C:\nxp\NxpNfcCockpit_v4.0.0.0\firmware\Secondary_PN5180\BootLoader_And_Nfcrdlib_SimplifiedAPI_EMVCo_Secondary.bin. Set the Base address to 0x0. 7. Flash Write Done. 8. After this, reset the board and to start NFCCockpit v4.0.0.0. The board will be recognized. P.S. The board is connected to PC via VCOM. If there is any driver issue, please try to re-install the VCOM driver and restart the PC. The VCOM driver can be found in the C:\nxp\NxpNfcCockpit_v4.0.0.0\VCOM.
View full article
As NFC reader library 5.12 also supports PN5180, switching the NFC frontend from CLRC663 to PN5180 is quite easy based on previous porting. The porting also includes the hardware settings and software modification. Hardware Setup for porting: a) Remove resistors on PNEV5180B to disconnect the onboard lpc1769 from PN5180, following steps on page 16 of https://www.nxp.com/docs/en/application-note/AN11908.pdf  b) Connect LPCXpresso board for LPC11U37 with PNEV5180 as below: Software Modification for porting: 1. Make a copy of Board_Lpc11u37Rc663.h , and change its name to "Board_Lpc11u37Pn5180.h", and import it into the DAL/boards folder. 2.Change the source code in the header file as below: 3. Add two more pins' definition and configuration for BUSY and DWL pins of PN5180, and new configuration for reset pin. and modify the reset logic: 4.Change the IRQ interrupt trigger type to rising edge. 5.Include this header file in BoardSelection.h 6.Add this new configuration in ph_NxpBuild_App.h 7.Add this new configuration in phApp_Init.h 8.Add this new configuration in ph_NxpBuild_Platform.h 9.Add this new configuration in Settings. 10.Building result: Testing result:
View full article
--The document consists of the following: Step 1. Connections And Firmware Version Step 2. Updating FW On PC Windows 10 Step 3. Updating FW On VMplayer16.0 + Ubuntu 20.04 Step 4. Updating FW On i.MX8MN-EVK With Embedded L5.4.70_2.3.0 BSP Step 5. Confirming whether update is successful using cockpit4.8 --About Cockpit There are several different versions of cockpit, and each version can only recognize the same version of firmware. --Reference Materials 1.https://community.nxp.com/t5/NFC/Mounting-the-PN7462AU-in-the-USB-downloader-mode-under-Linux/m-p/800939 2.https://community.nxp.com/t5/NFC/PN7462-updating-EEPROM-on-linux/m-p/739808/highlight/true#M3144       NXP CAS-TIC team Weidong Sun 04-15-2021  
View full article
DISCLAIMER APPLICABLE TO THIS DOCUMENT CONTENTS:   PN5190-NTAG 5 boost High Speed Communication Demo This article describes the unique feature of these two chips when interacting with each other at contactless interface: Passthrough demonstrator at high bit rates for ISO 15693 between PN5190 and NTAG5 Boost. Scope of demonstrator: ▪ Demonstrating a unique feature of NXP Semiconductors. High bit rates for ISO15693 communication (212 kbps) between a PN5190 reader IC and an NTAG5 boost connected to LPC55S69 host MCU, when implementing passthrough mode using the SRAM of the NTAG 5 boost. ▪ Through MCUXpresso console, the user can configure the contactless bit rate (26.4kbps or 212kbps options) as well as the amount of data to exchange using passthrough mode. ▪ Passthrough mode is implemented from NFC reader to LPC side only. ▪ The PN5190 prints on the MCUXpresso console the outcome of the transaction and baud rate achieved. ▪ In order to handle passthrough communication, we are using GPIO interrupt handlers on the NTAG 5 boost + LPC55S69 side and hard coded timeout on the PN5190 + MCU side. Required hardware and software material: Hardware ▪ PNEV5190BP development board ▪ LPCXpresso55S69 Development Board ▪ OM2NTA5332 - NTAG5 boost development kit ▪ 3 x USB micro cables Software ▪ Firmware Source Code for PN5190 is attached to this article, containing keywork pn5190: HIGHSPEED_PN5190_NTAG5boost1.zip ▪ SDK_2.x_FRDM-K82F is already included in bundle mentioned above. ▪ Firmware Source Code for LPCXpresso55S69 is attached to this article, containing keyword lpc55s69: NTAG5boost_LPC55S69.zip ▪ MCUXpresso IDE recent version (v24.12.148 or newer) Demonstrator bring up: Hardware assembly for LPCXpresso55S69: • Connect NTAG5 Boost board to LPCXpresso55S69 • Make sure SW6 is on position 2-3 to enable 5V power on tag side (it will also work at 3.3V but maybe with less readrange). • Connect LPCXpresso55S69 board to your computer (Debug Link Input). • No additional power source is needed. Hardware assembly for PNEV5190BP: • Connect two USB micro cables to PNEV5190B board for power and flashing firmware via UART connection (alternatively, you may change jumper J9 to position 2-3 and connect an external power supply, Vin > 7 Volts) • Red LED indicates power is enabled • Green LED debugging/UART status Software loading on LPC55S69: Import “lpcxpresso55s69_ntag5_passthrough_nolib” project (included in NTAG5boost_LPC55S69.zip) into MCUXpresso IDE. • Install SDK_2_12_0_LPCXpresso55S69. This SDK can be downloaded from • https://www.nxp.com/security/login?service=https%3A%2F%2Fmcuxpresso.nxp.com%2Flogin%2F  • Build project and flash a binary file using GUI Flash Tool. After flashing, reboot your board. Blue LED must be enabled which means tag is waiting for field to be detected. Under MCUXpresso: 1. Import project from file system 2. Select lpcxpresso55s69 project 3. Uncheck copy projects into workspace Software loading on PNEV5190B: • Unzip the “HIGHSPEED_PN5190_NTAG5boost1.zip” in a folder. • Import all projects inside “HIGHSPEED_PN5190_NTAG5boost1” project to MCUXpresso IDE • Install SDK_2.x_FRDM-K82F. Such SDK is included in project file tree: • nxp-connected-tags-pn5190\Platform\SDK_2.x_FRDM-K82F • Build project and flash a binary file using GUI Flash Tool. After flashing, reboot your board. Blue LED must be enabled which means reader is waiting for NTAG5 to be detected. • Start Debug session to see available bitrate options on the console. Under MCUXpresso: 1. Import project from file system 2. Select all the projects 3. Uncheck copy projects into workspace LED User Interface Specifications (same for LPCXpresso55S69 an PNEV5190B) • Steady blue - waiting for Tag - discovery loop, • Blinking green - passthrough transfer ongoing • Steady green - all data transferred successfully. • Steady red - error - tag lost during transfer. Menu options when two boards have NFC antennas facing each other: Two options of bitrate are available for transfer amount of data from host to NTAG5 Boost: ▪  standard 26.4 kbps or ▪  highest bit rate 212 kbps It is possible to configure amount of data to be exchanged between PN5190 and NTAG 5 boost (check option 3, and then choose among following file dimensions): ▪1KByte ▪2KBytes ▪10KBytes ▪512KBytes Demonstration flow: Once one of these options is selected, reader is ready to detect a tag. ▪ When tag is detected, reader configures selected bitrate and starts data exchange. ▪ Blinking green LED indicates transfer ongoing and the console shows a progress. Here are some results of transaction at the different bit rates and data sizes offered by this demonstrator: Data Size (Bytes) Selected bitrate (kbps) Result Bitrate (kbps) Transfer time (ms) 1024 26.4 2.8 357 1024 212 12.35 81 2048 26.4 2.8 714 2048 212 12.42 161 10240 26.4 2.7 3569 10240 212 12.41 806 512000 26.4 2.8 177739 512000 212 12.63 39576   High speed demo user manual can be also find attached to this article: 22-10-11 NXP - Connected Tags demonstrator User Manual.pdf Conclusions: This demonstrator HW & SW can show that high speed interaction can be achieved between PN5190 (NFC Front end) and NTAG 5 boost, making use of available commands described in product support package. Disclaimer: All SW available here is aimed only for evaluation purposes and NXP disclaims any direct or indirect liability damages, since referred SW bundles are not official part of PN5190/NTAG 5 boost standard product support packages available in nxp.com.  
View full article
Please kindly refer to the attachment for details.   Hope that helps,
View full article
Using an alternative clock source to set up PN7462's contact interface clock , so that we have more options of the clock frequency.
View full article
Hardware: 1. i.MX6ULL EVK board   2. OM27160A1HN   Software: 1. Build the Yocto Linux BSP for i.MX6ULL EVK. Here are the steps: $ mkdir L6.6.36_2.1.0 $ cd L6.6.36_2.1.0 $ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-scarthgap -m imx-6.6.36-2.1.0.xml $ repo sync   $ DISTRO=fsl-imx-xwayland MACHINE=imx6ull14x14evk source imx-setup-release.sh -b build-for-6ullevk $ bitbake core-image-full-cmdline   2. Add the nxpnfc driver to kernel After the BSP build succeed, the kernel source code is located here: L6.6.36_2.1.0/build-for-6ullevk/tmp/work/imx6ull14x14evk-poky-linux-gnueabi/linux-imx/6.6.36+git/git/   Clone the nxpnfc repository into the kernel directory, replacing existing implementation: $ cd L6.6.36_2.1.0/build-for-6ullevk/tmp/work/imx6ull14x14evk-poky-linux-gnueabi/linux-imx/6.6.36+git/git/ $ rm -rf drivers/nfc $ git clone https://github.com/NXPNFCLinux/nxpnfc.git drivers/nfc  This will end-up with the folder drivers/nfc containing the following files: • README.md: repository information • Makefile: driver heading makefile • Kconfig: driver configuration file • LICENSE: driver licensing terms • i2c_devicetree.txt: example of I²C device tree definition • spi_devicetree.txt: example of SPI device tree definition • nfc sub folder containing: – Makefile: – common.c: generic driver implementation – common.h: generic driver interface definition – i2c.c: I2C specific driver implementation – i2c.h: I2C specific driver interface definition – spi.c: SPI-specific driver implementation – spi.h: SPI-specific driver interface definition   Through kernel menuconfig procedure include the targeted driver to the build, as built-in (<*>): $ bitbake linux-imx -c menuconfig <*> NFC I2C Slave driver for NXP-NFCC       3. Connection between i.MX6ULL EVK and the PN7160 There are some pins on the Arduino header on the i.MX6ULL EVK board can be used to connect the PN7160 board. Below is the schematic of the Arduino headers on the i.MX6ULL EVK board. The two I2C2 pins can be used for I2C connection. The UART2_RX, UART2_TX and UART2_RTS can be changed to GPIO for connecting IRQ, VEN and DWL_REQ of PN7160, respectively. Below is the J1704 and J1703 on the EVK board.   Below is the schematic of Arduino interface on OM27160A1HN. There is a connector board (OM29110ARD-B). The OM27160A1HN is connecting on top of it. Below is the connectors board schematic. So, on the i.MX6ULL EVK board, we need I2C2 SDA and I2C2 SCL for I2C connections. And 3 GPIO pins for PN7160's IRQ, VEN and DWL_REQ. Here is the connection between i.MX6ULL EVK and OM29110ARD-B. OM29110ARD-B pin i.MX6ULL EVK pin I2C_SCL J2-1 I2C2_SCL J1704-10 I2C_SDA J2-2 I2C2_SDA J1704-9 GPIO_0 J2-10 GPIO1_21 J1703-1 GPIO_1 J4_1 GPIO1_20 J1703-2 GPIO_2 J4_2 GPIO1_25 J1703-3 3.3V J1-4 3.3V J1705-4 5V J1-5 5V J1705-5 GND J1-6 GND J1705-6      4. Modify the device tree file of i.MX6ull evk. The device tree file for i.MX6ULL evk is imx6ul-14x14-evk.dtsi. The location of the device tree file is here: L6.6.36_2.1.0/build-for-6ullevk/tmp/work/imx6ull14x14evk-poky-linux-gnueabi/linux-imx/6.6.36+git/git/arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi   As we don't use the UART2, we disabled it. &uart2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart2>; uart-has-rtscts; /* for DTE mode, add below change */ /* fsl,dte-mode; */ /* pinctrl-0 = <&pinctrl_uart2dte>; */ status = "disabled"; // <--- change the status to "disabled" bluetooth { compatible = "nxp,88w8987-bt"; }; };   Put the below nxpnfc under the &I2C2 node. nxpnfc: nxpnfc@28 { compatible = "nxp,nxpnfc"; reg = <0x28>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_nfcgpio>; nxp,nxpnfc-irq = <&gpio1 21 0>; nxp,nxpnfc-ven = <&gpio1 20 0>; nxp,nxpnfc-fw-dwnld = <&gpio1 25 0>; };   Like this: Add the gpios for nxpnfc. pinctrl_nfcgpio: nfcgpiogrp { fsl,pins = < MX6UL_PAD_UART2_RX_DATA__GPIO1_IO21 0xb0 //irq MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0xb0 //ven MX6UL_PAD_UART3_RX_DATA__GPIO1_IO25 0xb0 //dwld req >; };     5. Re-compile the kernel and the whole image. $ bitbake linux-imx -c compile $ bitbake core-image-full-cmdline     6. Using UUU to program the image to the board. The built image is .wic.zst file. We need to program it to the board. It is located in the deploy folder below. L6.6.36_2.1.0/build-for-6ullevk/tmp/deploy/images/imx6ull14x14evk/core-image-full-cmdline-imx6ull14x14evk.rootfs-20241113103828.wic.zst   Download the UUU.exe from here: https://github.com/nxp-imx/mfgtools/releases   Download the Demo image for i.MX6ULL EVK from the Linux BSP web page.   Unzip the demo image file to a folder. And then copy the UUU.exe to the same demo image folder.   Connect the board to your PC using the USB cable. Switch the boot mode to "Serial Downloader mode"   On the PC side, run the below command to program the image to SD card on the i.MX6ULL EVK. uuu -b sd_all core-image-full-cmdline-imx6ull14x14evk.rootfs-20241112083235.wic.zst   Then switch the boot mode to "Internal Boot (Development)". Restart the board. Now, you can login as "root" and use the board. And you can see the nxpnfc driver is properly loaded.     7. Build the NFC Library and the nfcDemoApp in Yocto In the Yocto's sources directory, download the meta-nxp-nfc layer from https://github.com/NXPNFCLinux/meta-nxp-nfc     $ git clone https://github.com/NXPNFCLinux/meta-nxp-nfc.git  Then, the NFC library recipe is located in L6.6.36_2.1.0/sources/meta-nxp-nfc/recipes-nfc/nxp_nfc. Change the recipe nxp-nfc_git.bb as below: # Copyright (C) 2016 NXP Semiconductors DESCRIPTION = "Linux NFC stack for NCI based NXP NFC Controllers." LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=86d3f3a95c324c9479bd8986968f4327" SRC_URI = " \ git://github.com/NXPNFCLinux/linux_libnfc-nci.git;branch=NCI2.0_PN7160;protocol=https \ " SRCREV = "6bf9f42b94e267f6384043009bda84c11e7ebbaa" SRC_URI[sha256sum] = "47bdc27108fc8d66ce5d6c33f76b419cdef20c24b9e187ada8e689d1bd7f79c7" inherit autotools pkgconfig lib_package S = "${WORKDIR}/git"   Add the meta-nxp-nfc layer to the build definition. Updating file build_dir/conf/bblayers.conf with: BBLAYERS += " ${BSPDIR}/sources/meta-nxp-nfc"   Build meta-nxp-nfc layer:     $ bitbake nxp-nfc After build succeed, the library files and the nfcDemoApp are located in here : L6.6.36_2.1.0/build-for-6ullevk/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/nxp-nfc/git/   Use the "scp" command to copy the files to the EVK board via the Network. If the folder is not exist on the EVK, please use "mkdir" to make the folder on the EVK first. Then use the "scp" command.  Here is the example: (**The IP address below should change to your EVK's IP address.) scp build/.libs/* [email protected]:/.libs/ scp image/etc/libnfc* [email protected]:/etc/   scp image/usr/lib/* [email protected]:/usr/lib     On the EVK board: root@imx6ull14x14evk:/# mkdir /usr/local root@imx6ull14x14evk:/# mkdir /usr/local/etc root@imx6ull14x14evk:/# cp /etc/libnfc-nci.conf /usr/local/etc   Now, you can run the nfcDemoApp on the i.MX6ULL EVK. root@imx6ull14x14evk:/# cd .libs/ root@imx6ull14x14evk:/.libs# ./nfcDemoApp poll       References: 1. i.MX Yocto Project User's guide 2. PN7160 Linux Porting Guide 3. MCIMX6ULL-EVK_DESIGNFILES 4. OM27160A1HN Hardware Design Files 5. OM29110 NFC’s SBC Interface Board Design Files 6. PN7150 NFC Controller on i.MX8M mini evk running Yocto
View full article
Introduction We have an official PN7160/PN7220 Android 15 porting guide (PN7160/PN7220 – Android 15 porting guide). But the patches only for Android 15 AOSP r1 (android-15.0.0_r1). If customer want to porting to the newer release of AOSP, there will have many errors during the source code compiling. This document is for customer reference to solve the error one by one.    NOTE :  All the modifications are just for reference. They are NOT a NXP official patches for the newer release of AOSP porting. So the modifications may not be the best solution. Customer please base on their needs to modify the AOSP source code. This is not for production. Customer still need to perform full testing after the porting.    Hardware boards: i.MX8MN EVK (i.MX 8M Nano Evaluation Kit | NXP Semiconductors)   PN7160 EVK (OM27160| Development Kits for PN7160 Plug'n Play NFC Controller | NXP Semiconductors)     The connection between i.MX8MN EVK and PN7160 OM29110ARD-B i.MX8M Nano EVK pin PN7160 pin 3.3V J1003-1 VDD(3.3v) J1-4 5V J1003-2 VBAT (5v) J1-5  I2C3 SDA J1003-3 SDA J2-2 I2C3 SCL J1003-5 SCL J2-1 GPIO3_22 J1003-37 IRQ J2-10 GPIO3_21 J1003-38 REQ J4-2 GND J1003-39 GND J1-6 GPIO3_20 J1003-40 VEN J4-1     Build the Android for i.MX8MN EVK The i.MX Android BSP that I used is Android 15.0.0_2.0.0 (L6.12.20_2.0.0 BSP). It could be downloaded from here: Android OS for i.MX Applications Processors | NXP Semiconductors 1. Download the "Documentation" and the "Install Source Package".  2. Follow the steps in Android User's Guide to build the Android BSP for i.MX8MN EVK first.    According to the android_build/.repo/manifests/aosp-android-15.0.0_2.0.0.xml, you will see the AOSP version is android-15.0.0_r32.   Reference documents for porting: PN7160/PN7220 – Android 15 porting guide  Porting PN7160 to Android 14 on i.MX8M Nano board   Now, we start the porting:  1. Kernel Driver To establish connection with the PN7220 or PN7160, the Android stack uses the nxpnfc kernel driver.  You could download the driver from github below: nfcandroid_platform_drivers/drivers at br_ar_16_comm_infra_dev · nxp-nfc-infra/nfcandroid_platform_d...   The command is : git clone "https://github.com/nxp-nfc-infra/nfcandroid_platform_drivers.git" -b br_ar_16_comm_infra_dev   There is driver for Kernel 6.6 and 6.12. So, please download the correct one for your porting. For example, the kernel in i.MX Android BSP Android 15.0.0_2.0.0 is 6.12. So I will use the 6.12 driver for my porting.   In your porting, make sure the PATH in Makefile and Kconfig files are setting properly.  For example in my porting: . ├── Kconfig ├── Makefile └── pn7160 ├── common.c ├── common.h ├── i2c_drv.c ├── i2c_drv.h ├── Kbuild ├── Kconfig ├── Makefile ├── spi_drv.c └── spi_drv.h   For simplifying everything, we will only add a support for I2C and not SPI. Replace drivers/nfc/pn7160/Makefile default code with following code (for easier understanding) nxpnfc-i2c-objs = i2c_drv.o common.o obj-$(CONFIG_NXP_NFC_I2C) += nxpnfc_i2c.o   The contents of drivers/nfc/Kconfig. Add the PN7160 like below: source "drivers/nfc/pn7160/Kconfig" source "drivers/nfc/fdp/Kconfig" source "drivers/nfc/pn544/Kconfig" source "drivers/nfc/pn533/Kconfig" source "drivers/nfc/microread/Kconfig" source "drivers/nfc/nfcmrvl/Kconfig" source "drivers/nfc/st21nfca/Kconfig" source "drivers/nfc/st-nci/Kconfig" source "drivers/nfc/nxp-nci/Kconfig" source "drivers/nfc/s3fwrn5/Kconfig" source "drivers/nfc/st95hf/Kconfig" endmenu   The contents of drivers/nfc/Makefile. Add the PN7160 like below: # SPDX-License-Identifier: GPL-2.0 # # Makefile for nfc devices # obj-$(CONFIG_NXP_NFC_I2C) += pn7160/ obj-$(CONFIG_NFC_FDP) += fdp/ obj-$(CONFIG_NFC_PN544) += pn544/ obj-$(CONFIG_NFC_MICROREAD) += microread/ obj-$(CONFIG_NFC_PN533) += pn533/ obj-$(CONFIG_NFC_MEI_PHY) += mei_phy.o obj-$(CONFIG_NFC_SIM) += nfcsim.o obj-$(CONFIG_NFC_PORT100) += port100.o obj-$(CONFIG_NFC_MRVL) += nfcmrvl/ obj-$(CONFIG_NFC_TRF7970A) += trf7970a.o obj-$(CONFIG_NFC_ST21NFCA) += st21nfca/ obj-$(CONFIG_NFC_ST_NCI) += st-nci/ obj-$(CONFIG_NFC_NXP_NCI) += nxp-nci/ obj-$(CONFIG_NFC_S3FWRN5) += s3fwrn5/ obj-$(CONFIG_NFC_ST95HF) += st95hf/ obj-$(CONFIG_NFC_VIRTUAL_NCI) += virtual_ncidev.o   2. Adding the "nxpnfc" to the i.MX8MN EVK device tree file &i2c3 { clock-frequency = <100000>; pinctrl-names = "default", "gpio"; pinctrl-0 = <&pinctrl_i2c3>; pinctrl-1 = <&pinctrl_i2c3_gpio>; scl-gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>; sda-gpios = <&gpio5 19 GPIO_ACTIVE_HIGH>; status = "okay"; nxpnfc@28{ compatible = "nxp,nxpnfc"; reg = <0x28>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_nfc>; nxp,nxpnfc-irq = <&gpio3 22 0>; nxp,nxpnfc-ven = <&gpio3 20 0>; nxp,nxpnfc-fw-dwnld = <&gpio3 21 0>; }; The GPIO settings in the IOMUXC: &iomuxc { pinctrl_nfc: nfcgrp { fsl,pins = < MX8MN_IOMUXC_SAI5_RXC_GPIO3_IO20 0X19 // VEN MX8MN_IOMUXC_SAI5_RXD0_GPIO3_IO21 0X19 // FW-DWNLD MX8MN_IOMUXC_SAI5_RXD1_GPIO3_IO22 0X19 // IRQ >; };   3. Modify the imx8mn_gki.fragment File:  android_build/vendor/nxp-opensource/kernel_imx/arch/arm64/configs/imx8mn_gki.fragment Add the "CONFIG_NXP_NFC_I2C=m" into the imx8mn_gki.fragment   4. Add the settings in your corresponding board configuration files in Android - Go to the android_build/device/nxp/imx8m/evk_8mn/  - Modify the BoardConfig.mk. # selinux permissive + BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive BOARD_SEPOLICY_DIRS := \ $(CONFIG_REPO_PATH)/imx8m/sepolicy \ $(IMX_DEVICE_PATH)/sepolicy \ + vendor/nxp/nfc/sepolicy \ + vendor/nxp/nfc/sepolicy/nfc + include vendor/nxp/nfc/BoardConfigNfc.mk   - Add the "nxpnfc_i2c.ko" to the ShareBoardConfig.mk. Make sure the path and the filename are correct. $(KERNEL_OUT)/drivers/net/phy/realtek.ko \ $(KERNEL_OUT)/drivers/pps/pps_core.ko \ $(KERNEL_OUT)/drivers/ptp/ptp.ko \ $(KERNEL_OUT)/drivers/net/ethernet/freescale/fec.ko + $(KERNEL_OUT)/drivers/nfc/pn7160/nxpnfc_i2c.ko endif $(KERNEL_OUT)/drivers/trusty/trusty-core.ko \ $(KERNEL_OUT)/drivers/trusty/trusty-log.ko \ $(KERNEL_OUT)/drivers/trusty/trusty-ipc.ko \ $(KERNEL_OUT)/drivers/trusty/trusty-virtio.ko \ + $(KERNEL_OUT)/drivers/nfc/pn7160/nxpnfc_i2c.ko else BOARD_VENDOR_RAMDISK_KERNEL_MODULES += \ $(KERNEL_OUT)/drivers/input/touchscreen/goodix_ts.ko \ $(KERNEL_OUT)/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_i2c.ko Endif   - Add the following to the Compatibility_matrix.xml <compatibility-matrix version="1.0" type="device"> <hal format="native" optional="false"> <name>netutils-wrapper</name> <version>1.0</version> </hal> <hal format="aidl" optional="true"> <name>android.hardware.emvco</name> <version>1</version> <interface> <name>IEmvco</name> <instance>default</instance> </interface> </hal> </compatibility-matrix>   - Add the following to the device_framework_matrix.xml <compatibility-matrix version="1.0" type="framework"> <hal format="aidl" optional="true"> <name>nxp.hardware.secureime</name> <version>1</version> <interface> <name>ISecureIME</name> <instance>default</instance> </interface> </hal> <hal format="aidl" optional="true"> <name>nxp.hardware.imx_dek_extractor</name> <version>1</version> <interface> <name>IDek_Extractor</name> <instance>default</instance> </interface> </hal> <hal format="aidl" optional="true"> <name>vendor.nxp.nxpnfc</name> <version>2</version> <interface> <name>INxpNfc</name> <instance>default</instance> </interface> </hal> <hal format="aidl" optional="true"> <name>android.hardware.emvco</name> <version>1</version> <interface> <name>IEmvco</name> <instance>default</instance> </interface> </hal> </compatibility-matrix>   - Add the following to the evk_8mn.mk # ------nfc------- $(call inherit-product, vendor/nxp/nfc/device-nfc.mk) $(call inherit-product, vendor/nxp/emvco/device-emvco.mk) PRODUCT_PACKAGES += \ android.hardware.nfc-service.nxp PRODUCT_PACKAGES += \ com.nxp.emvco \ com.nxp.nfc \ nfc_nci_nxp_pn72xx   - Add the nxpnfc_i2c in init.rc # Grant permission for fetching available_pages info of statsd chown system system /proc/pagetypeinfo chmod 0440 /proc/pagetypeinfo exec u:r:vendor_modprobe:s0 -- /vendor/bin/modprobe -a -d \ /vendor/lib/modules nxpnfc_i2c write /sys/power/wake_lock nosleep on post-fs-data && property:vendor.skip.charger_not_need=0 setprop vold.post_fs_data_done 1   - Add nxpnfc to ueventd.nxp.rc /sys/devices/virtual/thermal/thermal_zone* trip_point_0_hyst 0660 system system /sys/devices/virtual/thermal/thermal_zone* trip_point_1_hyst 0660 system system /dev/dmabuf_imx 0664 system system /sys/class/backlight/* brightness 0660 system system /dev/ttymxc1 0666 nfc nfc /dev/ttymxc2 0666 nfc nfc /dev/nxpnfc 0666 nfc nfc # for libcamera /dev/media* 0660 system camera /dev/v4l-subdev* 0660 system camera   5. Apply the NXP AOSP patches As the official NXP NFC patches is only for AOSP android-15.0.0_r1, and there are big different between android-15.0.0_r1 and android-15.0.0_r32. So, before apply the patches, I copy the nfc folders from android-15.0.0_r1 to replace the nfc folders in android-15.0.0_r32.   First, download the AOSP android-15.0.0_r1 from github. $ mkdir android-15.0.0_r1 $ cd android-15.0.0_r1 $ repo init -u https://android.googlesource.com/platform/manifest -b android-15.0.0_r1 $ repo sync   Then, remove the following folders from android-15.0.0_r32. And then copy the following nfc folders from android-15.0.0_r1 to replace the same folders in android-15.0.0_r32. packages/apps/Nfc frameworks/base/nfc frameworks/base/nfc-extras system/nfc   for example: $ rm -rf android_build/packages/apps/Nfc $ cp -ra android-15.0.0_r1/packages/apps/Nfc android_build/packages/apps/   I write a script to download the patches from the github. Customer could put the following scripts on the same directory with android_build. AOSP_adaptation.sh # nxp_nci_hal_nfc git clone "https://github.com/nxp-nfc-infra/nxp_nci_hal_nfc.git" cd nxp_nci_hal_nfc git checkout br_ar_15_comm_infra_dev cp -rf * ../android_build/packages/apps/Nfc/ cd .. # nxp_nci_hal_libnfc-nci git clone "https://github.com/nxp-nfc-infra/nxp_nci_hal_libnfc-nci.git" cd nxp_nci_hal_libnfc-nci git checkout br_ar_15_comm_infra_dev cp -rf * ../android_build/system/nfc/ cd .. # nfcandroid_nfc_hidlimpl git clone "https://github.com/nxp-nfc-infra/nfcandroid_nfc_hidlimpl.git" cd nfcandroid_nfc_hidlimpl git checkout br_ar_15_comm_infra_dev cp -rf * ../android_build/hardware/nxp/nfc cd .. # nfcandroid_frameworks git clone "https://github.com/nxp-nfc-infra/nfcandroid_frameworks.git" cd nfcandroid_frameworks git checkout br_ar_15_comm_infra_dev mkdir ../android_build/vendor/nxp/frameworks cp -rf * ../android_build/vendor/nxp/frameworks cd .. # nfcandroid_emvco_aidlimpl git clone "https://github.com/nxp-nfc-infra/nfcandroid_emvco_aidlimpl.git" cd nfcandroid_emvco_aidlimpl git checkout br_ar_15_comm_infra_dev mkdir ../android_build/hardware/nxp/emvco cp -rf * ../android_build/hardware/nxp/emvco cd .. # nfcandroid_platform_reference git clone "https://github.com/nxp-nfc-infra/nfcandroid_platform_reference.git" cd nfcandroid_platform_reference git checkout br_ar_15_comm_infra_dev cp -rf vendor/nxp/* ../android_build/vendor/nxp/ cd .. # nfcandroid_infra_test_apps git clone https://github.com/nxp-nfc-infra/nfcandroid_infra_test_apps.git cd nfcandroid_infra_test_apps/ git checkout br_ar_15_comm_infra_dev cd test_apps/ cp -rf SMCU_Switch/ ../../android_build/packages/apps/ cp -rf EMVCoModeSwitchApp/ ../../android_build/packages/apps/Nfc/ cp -rf load_unload/ ../../android_build/hardware/nxp/nfc/ cp -rf SelfTestAidl/ ../../android_build/hardware/nxp/nfc/ cd ../.. # nfcandroid_infra_comm_libs git clone "https://github.com/nxp-nfc-infra/nfcandroid_infra_comm_libs.git" cd nfcandroid_infra_comm_libs git checkout br_ar_15_comm_infra_dev cp -rf nfc_tda/ ../android_build/system/ cp -rf emvco_tda/ emvco_tda_test/ ../android_build/hardware/nxp/emvco/ cp -rf NfcTdaTestApp/ ../android_build/packages/apps/Nfc/ cd ..   Apply_patches.sh cd android_build/build/bazel/ patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_build_bazel.patch cd ../release patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_build_release.patch cd ../../external/libchrome patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_external_libchrome.patch cd ../../frameworks/base patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_frameworks_base.patch cd ../../system/logging patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_system_logging.patch   So, run the AOSP_adaptation.sh first, then run the Apply_patches.sh.   6. Put changes into hardwatre/interfaces/compatibility_matrices Different compatibility matrix for different Android versions. File: android_build/hardware/interfaces/compatibility_matrices/compatibility_matrix.202404.xml <hal format="aidl"> <name>android.hardware.audio.effect</name> <version>1-2</version> <interface> <name>IFactory</name> <instance>default</instance> </interface> </hal> + <hal format="aidl" optional="true"> + <name>nxp.hardware.imx_dek_extractor</name> + <version>1</version> + <interface> + <name>IDek_Extractor</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="true"> + <name>vendor.nxp.nxpnfc</name> + <version>2</version> + <interface> + <name>INxpNfc</name> + <instance>default</instance> + </interface> + </hal> + <hal format="aidl" optional="true"> + <name>vendor.nxp.emvco</name> + <version>1</version> + <interface> + <name>INxpEmvco</name> + <instance>default</instance> + </interface> + </hal> <hal format="aidl"> <name>android.hardware.audio.sounddose</name> <version>1-3</version>   7. Change the device specific .mk For pn7160, NXP_NFC_HW should equal to pn7160. For pn7220, NXP_NFC_HW should equal to pn7220_i2cs.   File : android_build/vendor/nxp/nfc/device-nfc.mk ##### ##### NXP NFC Device Configuration makefile ###### NXP_NFC_HOST := $(TARGET_PRODUCT) ifndef TARGET_NXP_NFC_HW NXP_NFC_HW := pn7160 else NXP_NFC_HW := $(TARGET_NXP_NFC_HW) endif NXP_NFC_PLATFORM := pn54x NXP_VENDOR_DIR := nxp NXP_I2CM_S := $(TARGET_NXP_I2C_M_S)   File: android_build/vendor/nxp/emvco/device-emvco.mk NXP_VENDOR_DIR := nxp NXP_NFC_HW := $(TARGET_NXP_NFC_HW) ifeq ($(strip $(TARGET_NXP_NFC_HW)),) NXP_NFC_HW := pn7160 endif # Nfc service has dependency with EMVCo JAR PRODUCT_PACKAGES += \ com.nxp.emvco   8. Now, you can start to build the Android BSP For i.MX8MN EVK,  $ source build/envsetup.sh $ lunch evk_8mn-nxp_stable-userdebug $ export TARGET_RELEASE=nxp_stable $ build_build_var_cache $ ./imx-make.sh -j4 2>&1 | tee build-log.txt   When building the BSP, there will have many errors during the build. I list some errors and the reference solution below for customer reference.  Error :  Complain about the nfc_aconifg_flags.   Workaround : packages/apps/Nfc/flags/Android.bp aconfig_declarations { // name: "nfc_aconfig_flags", name: "com.android.nfc.flags-aconfig", package: "com.android.nfc.flags", container: "system", srcs: ["nfc_flags.aconfig"], } java_aconfig_library { // name: "nfc_aconfig_flags_lib", // aconfig_declarations: "nfc_aconfig_flags", name: "com.android.nfc.flags-aconfig-java", aconfig_declarations: "com.android.nfc.flags-aconfig", min_sdk_version: "33", apex_available: [ "//apex_available:platform", "com.android.nfcservices", ], } java_library { name: "nfc_flags_lib", sdk_version: "system_current", min_sdk_version: "33", srcs: [ "lib/**/*.java", ], static_libs: [ "com.android.nfc.flags-aconfig-java", ],   Error: platform_testing/build/tasks/tests/native_test_list.mk: error: continuous_native_tests: Unknown installed file for module 'libnfc-nci-jni-tests'   Workaround: remove 'libnfc-nci-jni-tests' in  native_test_list.mk   Error: error: packages/apps/Nfc/tests/instrumentation/Android.bp:6:1: module "NfcNciInstrumentationTests" variant "android_common": cannot depend directly on java_sdk_library "android.test.runner"; try depending on "android.test.runner.stubs", "android.test.runner.stubs.system", "android.test.runner.stubs.test", or "android.test.runner.impl" instead   Workaround:  The hints are gave in the error message.. Change the "android.test.runner" to "android.test.runner.stubs", "android.test.runner.stubs.system", "android.test.runner.stubs.test", or "android.test.runner.impl".   Error: error: vendor/nxp/frameworks/nfc/Android.bp:12:1: module "com.nxp.nfc" variant "android_common": depends on //frameworks/base/nfc:framework-nfc.impl which is not visible to this module You may need to add "//vendor/nxp/frameworks/nfc" to its visibility   Workaround: File : frameworks/base/nfc/Android.bp permitted_packages: [ "android.nfc", "com.android.nfc", ], impl_library_visibility: [ "//frameworks/base:__subpackages__", "//cts/hostsidetests/multidevices/nfc:__subpackages__", "//cts/tests/tests/nfc", "//vendor:__subpackages__", "//packages/apps/Nfc:__subpackages__", ],     Error: packages/apps/Nfc/nci/src/com/android/nfc/dhimpl/NativeT4tNfceeManager.java:20: error: duplicate class: com.android.nfc.dhimpl.NativeT4tNfceeManager   Workaround: Edit the file packages/apps/Nfc/nci/src/com/android/nfc/dhimpl/NativeT4tNfceeManager.java then comment out the duplicated class.   Error: android/R.java:12483: error: could not resolve field FLAG_NFC_ASSOCIATED_ROLE_SERVICES     .annotation.FlaggedApi(android.nfc.Flags.FLAG_NFC_ASSOCIATED_ROLE_SERVICES)   Workaround: Edit the file frameworks/base/nfc/java/android/nfc/flags.aconfig Add the below flag. flag { name: "nfc_associated_role_services" is_exported: true namespace: "nfc" description: "Share wallet role routing priority with associated services" bug: "366243361" }   Error: FAILED: platform_testing/build/tasks/tests/native_test_list.mk: error: continuous_native_tests: Unknown installed file for module 'libnfc-nci-tests'   Workaround: Remove the libnfc-nci-tests in native_test_list.mk.   Error: prebuilts/clang/host/linux-x86/clang-r536225/include/c++/v1/string:780:43: error: implicit instantiation of undefined template 'std::char_traits<unsigned char>'   780 |   static_assert((is_same<_CharT, typename traits_type::char_type>::value),       |                                           ^ packages/apps/Nfc/nci/jni/NativeNfcTda.cpp:32:35: note: in instantiation of template class 'std::basic_string<unsigned char>' requested here    32 | static std::basic_string<uint8_t> sRxTdaDataBuff;       |                                   ^   Workaround: Edit the packages/apps/Nfc/nci/jni/NativeNfcTda.cpp using android::base::StringPrintf; extern bool nfc_debug_enabled; SyncEvent sCtLibSyncEvt; //static std::basic_string<uint8_t> sRxTdaDataBuff; static std::basic_string<char> sRxTdaDataBuff;   Error: packages/apps/Nfc/nci/jni/NativeT4tNfcee.cpp:493:21: error: no matching member function for call to 'append'   493 |       sRxDataBuffer.append(data.p_data, data.len);       |       ~~~~~~~~~~~~~~^~~~~~   Workaround:  Edit the packages/apps/Nfc/nci/jni/NativeT4tNfcee.cpp void NativeT4tNfcee::t4tReadComplete(tNFA_STATUS status, tNFA_RX_DATA data) { mT4tOpStatus = status; if (status == NFA_STATUS_OK) { if (data.len > 0) { sRxDataBuffer.insert(sRxDataBuffer.end(), data.p_data, data.p_data + data.len); LOG(DEBUG) << StringPrintf("%s: Read Data len new: %d ", __func__, data.len); } } SyncEventGuard g(mT4tNfcEeRWCEvent); mT4tNfcEeRWCEvent.notifyOne(); }   Error: frameworks/base/core/java/android/provider/Settings.java:2351: error: could not resolve field FLAG_NFC_ACTION_MANAGE_SERVICES_SETTINGS     @FlaggedApi(android.nfc.Flags.FLAG_NFC_ACTION_MANAGE_SERVICES_SETTINGS)   Workaround:  File: frameworks/base/nfc/java/android/nfc/flags.aconfig Add the following to the flags.aconfig flag { name: "nfc_action_manage_services_settings" is_exported: true namespace: "nfc" description: "Add Settings.ACTION_MANAGE_OTHER_NFC_SERVICES_SETTINGS" bug: "358129872" }   There are some errors are not listed in the table because there will have some hints to correct the error in the error message. Customer could follow the hints and base on the needs to modify the source code. Sometime, customer could compare the source code between r1 and r32. Here is the AOSP source code android-15.0.0_r32  and the android-15.0.0_r1.   9. Download the image to the i.MX8MN EVK board - Switch to download mode on the 8MN EVK board - Download the Android 15 BSP i.MX8MN EVK demo image from the Android BSP web page first. Because there are UUU script and necessary image files already in the demo image package.  - Download the UUU from here : Releases · nxp-imx/mfgtools - Put the UUU executable file into the demo image folder. uuu_imx_android_flash.bat is the script also in the same folder. - After your building is succeed, Copy the images to the demo image folder. The images are located in android_build/out/target/product/evk_8mn/ - Run the UUU script to download the images to the EVK board.     Reference: i.MX6ULL EVK running Yocto Linux + PN7160 Porting PN7160 to Android 14 on i.MX8M Nano board Android OS for i.MX Applications Processors | NXP Semiconductors PN7160/PN7220 – Android 15 porting guide Plug-n-Play NFC Frontend with Integrated Firmware | NXP Semiconductors  
View full article