NFC PN7120 on the i.MX6Q

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

NFC PN7120 on the i.MX6Q

NFC PN7120 on the i.MX6Q

  1. INTRODUCTION
  2. REQUIREMENTS
  3. KERNEL DRIVER
  4. DEVICE NODE
  5. NFC LIBRARY
  6. TESTING NFC READER
  7. REFERENCES

1. INTRODUCTION

This document is a step by step guide of the AN11697 PN7120 Linux Software Stack Integration Guidelines application note that can be downloaded from http://www.nxp.com/documents/application_note/AN11697.pdf . It explains how to add the PN7120 driver and NFC libraries to a Linux OS running in the i.MX6Q.

2. REQUIREMENTS

3. KERNEL DRIVER

According to the AN11697.pdf we must follow the below steps:

  1. From the Linux source directory:

    $ cd drivers/misc
    $ git clone https://github.com/NXPNFCLinux/nxp-pn5xx.git
  2. Add the below line in the Makefile of the current directory

    obj-y += nxp-pn5xx/
  3. Include the driver config in the drivers/misc/Kconfig file

    source "drivers/misc/nxp-pn5xx/Kconfig"
  4. Export the environment variables

    $ source source /opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
    $ export ARCH=arm
    $ export CROSS_COMPILE=$TARGET_PREFIX
    $ make imx_v7_defconfig
  5. Using menuconfig include the driver as module (<M>). 

    pastedImage_7.png

  6. Compile the modules and install the .ko files into the target rootfs.

    $ make  modules
  7. You can send the .ko files with scp
    $ make  INSTALL_MOD_PATH=~/Desktop/modules modules_install
    $ cd ~/Desktop/modules
    $ sudo scp -r lib/modules/3.14.28+g91cf351/kernel root@<board_ip>:/lib/modules/3.14.28+g91cf351/

4. DEVICE NODE

The PN7120 interfaces with an MCU or MPU via I2C interface, therefore the device must be described into a i2c node. The signals used in the PN7120 are shown below:

pastedImage_7.png

As you can see besides power, ground and I2C lines, an IRQ and Reset pins are needed. These pins must be configured as GPIO and one must generate an interrupt to the iMX6Q.

The chosen connection is shown below:

pastedImage_0.png

To achieve the above configuration, the device tree must be changed. The changes consist on adding a device node in the corresponding I2C bus, describing the PN7120.

&i2c1 {

        clock-frequency = <100000>;

        pinctrl-names = "default";

        pinctrl-0 = <&pinctrl_i2c1>;

        status = "okay";

        pn547: pn547@28 {

                compatible = "nxp,pn547";

                reg = <0x28>;

                clock-frequency = <400000>;

                interrupt-parent = <&gpio6>;

                interrupt-gpios = <&gpio6 2 0>;

                enable-gpios = <&gpio5 22 0>;

        };

};

The pinctrl_i2c1 phandle contains the I2C pins configuration. Make sure that the PADs connected to the PN7120 are not used in other device node.

&iomuxc {

        imx6q-udoo {       

               ...

                pinctrl_i2c1: i2c1grp {

                        fsl,pins = <

                        MX6QDL_PAD_GPIO_5__I2C3_SCL             0x4001b8b1

                        MX6QDL_PAD_GPIO_6__I2C3_SDA             0x4001b8b1

                        >;

                };

        };

};

After this you can generate the dtb file and send it with scp

make dtbs

sudo scp arch/arm/boot/dts/imx6q-udoo.dtb root@<board_ip>:/run/media/mmcblk0p1/imx6q-udoo.dtb

NOTE:

Attached you can find the complete dts and dtsi files used in this document.

5. NFC LIBRARY    

To work with the PN7120 in Linux the libnfc-nci stack is needed. You can find more details in http://www.nxp.com/documents/application_note/AN11697.pdf​ . This sections explains how to cross-compile the libray and install the required files in the target (The below steps must be performed in the host).

  1. Get the library
    $  git clone https://github.com/NXPNFCLinux/linux_libnfc-nci.git
  2. Generate the configuration script
    $ ./bootstrap
  3. Mount the target rootfs to /mnt in the host.
    $ sudo mount /dev/sdX2 /mnt
  4. Generate the Makefile
    $ ./configure --host=arm-none-linux --prefix=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr --sysconfdir=/mnt/etc
  5. Build and install the source code
    $ make
    $ make install
  6. After a succesful bulding the libraries and a application demo are built in .libs directory. Copy the libaries to /usr/lib directory of the target and nfcDemoApp to /usr/sbin
    $ cd linux_libnfc-nci/.libs
    $ sudo cp * /mnt/usr/lib/

6. TESTING NFC READER    

To test the application you have to follow the below steps on the target:

  1. Install the .ko file
    $ insmod /lib/modules/3.14.28+g91cf351/kernel/drivers/misc/nxp-pn5xx/pn5xx_i2c.ko
  2. Run the nfcDemoApp
    $  nfcDemoApp poll
    You should get a console output like the shown below when placing a NFC tag next to the NFC reader.

    pastedImage_0.png

7. REFERENCES    

Integrating NFC Controller library with KSDK

http://www.nxp.com/documents/application_note/AN11697.pdf

http://www.nxp.com/documents/user_manual/UM10878.pdf

Labels (3)
Comments

Hi gusarambula, jamesbone​, CarlosCasillas​, jimmychan​,

Would you be nice enough to skim through the document and provide your feedback?

Best Regards,

Alejandro

Look very good, alejandrolozano​! I just think you didn't attached the device tree files.

Thanks for the good document sharing.

Hi Alex, very good and well structured document.

I just recommend changing the second person sentences like "As you can see besides power" to non-personal like "As shown besides power".

Best regards!

Hi,

I follow the document want try on our IMX6DL platform with PN544 (base 3.14.52_v1.1.0qa )

but I get the below error message!

insmod /lib/modules/3.14.52+g92a293a/kernel/drivers/misc/pn5x

pn54x_dev_init

pn54x_probe

pn54x 0-0028: CLKREQ GPIO <OPTIONAL> error getting from OF node

0-0028 supply nxp,pn54x-pvdd not found, using dummy regulator

0-0028 supply nxp,pn54x-vbat not found, using dummy regulator

0-0028 supply nxp,pn54x-pmuvcc not found, using dummy regulator

0-0028 supply nxp,pn54x-sevdd not found, using dummy regulator

pn54x_probe: request irq_gpio 159

pn54x_probe: request ven_gpio 5

pn54x_probe: request firm_gpio 163

pn54x_probe : requesting IRQ 319

root@imx6dltinto:~# nfcDemoApp poll

#########################################################################################

##                                       NFC demo                                      ##

#########################################################################################

##                                 Poll mode actpn54x_dev_open : 10,56

ivated                           pn54x_dev_ioctl, cmd=1074063617, arg=1

      ##

#######################pn544_enable power on

##################################################################

                              ... press enter to quit ...

pn54x_dev_ioctl, cmd=1074063617, arg=0

pn544_disable power off

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=0

pn544_disable power off

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn54x_dev_read: i2c_master_recv returned -5

Have anyone can help me to fix this issues!

........................

currently our hardware modify to split  VEN and PMUVCC setting

VEN with VBAT/PMUVCC connecttion, will always printing out "pn54x_dev_read: i2c_master_recv returned -5" string

current our PMUVCC/VBAT always keep supply

just control VEN pin

get new result, but still failed, pending on "pn544_enable power on" when run nfcDemoApp poll

#########################################################################################

##                                       NFC demo                                      ##

#########################################################################################

##                                 Poll mode actipn54x_dev_open : 10,56

vated                            pn54x_dev_ioctl, cmd=1074063617, arg=1

     ##

########################pn544_enable power on

#################################################################

                              ... press enter to quit ...

pn54x_dev_ioctl, cmd=1074063617, arg=0

pn544_disable power off

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=0

pn544_disable power off

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=0

pn544_disable power off

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

pn54x_dev_ioctl, cmd=1074063617, arg=0

pn544_disable power off

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_read: i2c_master_recv returned -5

pn54x_dev_ioctl, cmd=1074063617, arg=1

pn544_enable power on

Hi,

That error as you may assume it is related to the i2c communication. Please make sure that the PN7120 is connected as it should.

I recommend you either to check with a scope or a logic analizer if the i2c frame is correct.

Best Regards,

Alejandro

Hi Alejandor,

      First, thank you for your reply!

I need describe something to let you know

In my case are connection to PN544, not PN7120

And  have been testing Linux NFC subsystem , default pn544 with I2C workable still entry initiator mode, can't response tag

So I guess I2C bus should be work well.

please see this https://community.freescale.com/thread/385569 and neard_pn544_dmesg_kunyi - Pastebin.com  to get more detail

BTW l'll double check I2C bus signal  on our hardware platform now

Hi Alejandor,

    Today I debug this, don't like I2C bus issues, Like PN544 chip not response,

this libnfc-nxp want get response, but never have response.

I to modify libnfc-nxp.conf to enable some debug message, I see the program want read  3byte response

when before send "20 00 01 01" to PN544,

I don't know "20 00 01 01" what's mean

but I guess the command not acceptable on PN544

#########################################################################################

##    pn54x_dev_open : 10,56

                                 pn54x_dev_ioctl, cmd=1074063617, arg=1

  NFC demo                       pn544_enable power on

               ##

#########################################################################################

##                                 Poll mode activated                                 ##

#########################################################################################

                              ... press enter to quit ...

NxpHal:     Entering phNxpNciHal_init_monitor

NxpHal:     Returning with SUCCESS

NxpTml:     Opening port=/dev/pn544

NxpTml:     phTmlNfc_i2c_reset(), VEN level 1

NxpTml:     pn54x_dev_ioctl, cmd=1074063617, arg=0

phTmlNfc_i2c_reset(), VEN level 0pn544_disable power off

NxpTml:     pn54x_dev_ioctl, cmd=1074063617, arg=1

phTmlNfc_i2c_reset(), VEN level 1pn544_enable power on

NxpTml:     i2c->:00000000: 20 00 01 01

PN54X - Tml Reader Thread Started................

NxpTml:     PN54X - Tml Writer Thread Started................

NxpTml:     PN54X - Tml Writer Thread Running................

NxpTml:     NxpHal:     PN54X - Write requested.....

NxpTml:     PN54X - Invoking I2C Write.....

thread started

NxpTml:     PN54X - Read requested.....

NxpTml:     PN54X - Invoking I2C Read.....

NxpTml:     PN54X - I2C Write successful.....

NxpTml:     PN54X - Posting Fresh Write message.....

NxpTml:     PN54X - Tml Writer Thread Running................

NxpHal:     write successful status = 0x0

NxpHal:     Response timer started

NxpHal:     Waiting after ext cmd sent

NxpHal:     pn54x_dev_ioctl, cmd=1074063617, arg=1

hal_extns_write_rsp_timeout_cb - pn544_enable power on

write timeout!!!

NxpHal:     Response timer stopped

NxpHal:     Callback Status is failed!! Timer Expired!! Couldn't read it! 0xff

NxpHal:     NCI_CORE_RESET: Failed

NxpHal:     Power Cycle

NxpTml:     phTmlNfc_i2c_reset(), VEN level 1

NxpTml:     pn54x_dev_ioctl, cmd=1074063617, arg=0

phTmlNfc_i2c_reset(), VEN level 0pn544_disable power off

pn54x_dev_read: i2c_master_recv returned -5

NxpTml:     _i2c_read() [hdr] errno : 5

Nxppn54x_dev_read: i2c_master_recv returned -5

Tml:     PN54X - Error in I2C Reapn54x_dev_read: i2c_master_recv returned -5

d.....

NxpTml:     PN54X - Reapn54x_dev_read: i2c_master_recv returned -5

d requested.....

NxpTml:     Ppn54x_dev_read: i2c_master_recv returned -5

N54X - Invoking I2C Read.....

pn54x_dev_read: i2c_master_recv returned -5

NxpTml:     _i2c_read() [hdr] errpn54x_dev_read: i2c_master_recv returned -5

no : 5

NxpTml:     PN54X - Errorpn54x_dev_read: i2c_master_recv returned -5

in I2C Read.....

NxpTml:     pn54x_dev_read: i2c_master_recv returned -5

PN54X - Read requested.....

Nxpn54x_dev_read: i2c_master_recv returned -5

Hi Alejandor,

     Okay, I know why not work on  NXP PN544 now!

     Because PN7120 use NFC Forum/NCI interface base,

     but PN544 to use ETSI/HCI interface,

     either use I2C but command/protocol format totally difference.

For information on using the PN7150 NFC Demoboard you may refer to the following document, which is related to this one.

PN7150 NFC on the i.MX6SX

Thank you for your informations. if possible would you tell me how to get PN544 documents and firmware/FRI-SDK.

because my project will go into MP stage,

from AOSP source code find out some configuration for PN544 and neard & neardal can workable on my project

Hi,

Driver is accessing regulator for NFC from the device tree but here those regulator names are not available in the device tree code . Can anybody help me to add the regulator in dtsi files. I am using SODIMM iMx6Dualite board with Linux 3.10.53 Kernel.

For enabling (pn544_enable) - > (dev->pvdd_reg, dev->vbat_reg,dev->pmuvcc_reg, dev->sevdd_reg). where these regulators are assigned in device tree. Is it really required to enable the NFC.

Regards,

Dooty.

Hi Dooty,

    I guess you should use  AOSP driver code, due to the driver code use your enabled sequence on PN54x

    but just need have an enabled pin, it is dependence hardware design

    and the article just for PN71xx not for PN54x

    if want add others regulators control pin, check "enable-gpio" in driver code then to add others into same place

Hi KunYi Chen,

Thank your for the response. What is AOSP driver. I agree the points that regulator enable required depends on the hardware design.

Here you are saying about this article is for PN71xx and not for PN54x. But when I check out the driver code from git repository, it is downloading the driver of nxp-pn5xx and the application is nfcDemoApp (linux_libnfc-nci). Then why it is been added the driver code name pn544 for the PN71xx module. It is little bit confusing.

Here I am using the exact nfc module part number is nxp PN7120A0EV and it is connected via i2c interface on SODIMM iMx6Dualite processor.

I am following this document :- http://www.nxp.com/documents/application_note/AN11697.pdf

So please suggest me whether I can go ahead and proceed the above git repository for the Kernel device driver and nfcDemoApp application  or do you any other suggestion to support different source code (Kernel and application) for the respective NFC module (PN7120A0EV).

Thank you in Advance.

Regards,

Dooty.

Okay, I see you use NXP PN7120A0EV, so you need check your hardware write first

The article use GPIO5_IO22 to enabled all regulator

you need to check your hardware how to wiring connecting the to  modify you driver and device tree file

AOSP: Android Open Source Project

Hi KunYi Chen,

Thank your for the response. Please can youreply me apart from the Hardware desgin, regualator and GPIO pins.

I need to know which Linux driver and application can be used my nfc module. I am working in Linux.

Thank you in Advance.

Regards,

Dooty.

I compiled the linux_linnfc-nci library following the guide. When I try run nfcDemoApp I received the following error 

nfcDemoApp: error while loading shared libraries: /usr/lib/libnfc_nci_linux-1.so: internal error

No ratings
Version history
Last update:
‎09-10-2020 02:00 AM
Updated by: