NFC
Near-field communication devices have become pretty easy to operate and read out under Linux. This page explains how to quickly set up the most common NFC scanners.
Installation
Install ccid, libnfc, acsccid, pcsclite and pcsc-tools.
The pcsclite package ships a pcscd.socket which will cause the pcscd server to start when a program requests it. Alternatively, you can manually start/enable the pcscd.service.
After installing libnfc, it is important that you re-plug your card reader as it ships with a few udev rules and kernel module blacklist that need to load before loading the actual driver.
Scanning an NFC card
Now everything should already be in place for a test scan. Plug in your NFC reader and run pcsc_scan. This tool will try to communicate with your scanner and also poll for any NFC cards placed on your scanner. If you try to scan a card after the tool has found your scanner, you should see events printed on your terminal.
$ pcsc_scan
Using reader plug'n play mechanism Scanning present readers... 0: ACS ACR122U 00 00 Sun Sep 5 05:15:10 2021 Reader 0: ACS ACR122U 00 00 Event number: 0 Card state: Card removed,
Supported devices
See https://ccid.apdu.fr/#readers for a list of scanners supported by ccid and https://nfc-tools.github.io/resources/ by libnfc.
Troubleshooting
In case things do not seem to work, investigate the log of pcscd.service
NXP NCI 2.0 controllers (PN7150/PN7160) — tags not detected
Some laptops (notably ASUS ROG models with a Keystone slot) have a built-in NXP NFC controller connected via I2C. The kernel driver nxp-nci_i2c may load successfully and RF polling appears active in dmesg, but no tags are ever discovered.
This is caused by three bugs in the upstream nci and nxp-nci kernel modules affecting NCI 2.0 protocol handling. As of kernel 6.18, these are not yet fixed upstream.
Check if you are affected:
$ dmesg | grep -i nxp-nci $ cat /sys/class/nfc/nfc*/name
If RF polling starts but RF_INTF_ACTIVATED_NTF never appears, see linux-nxp-nfc-fix for patched DKMS modules.
Known ACPI IDs: NXP1001, NXP1002, NXP3001, NXP7471.