Skip to main content

ACR122U — USB NFC Reader Complete Guide

Quick Summary: The ACR122U is a PC-linked contactless smart card reader/writer from ACS. Bridging ISO 14443 Type A/B, MIFARE, FeliCa, and ISO 18092 NFC tags into standard USB interfaces, it is designed for applications such as payment, access control, time and attendance, and mass transit.

The ACR122U is PC/SC- and CCID-compliant. The community libnfc project also ships a direct driver for it (acr122_usb, see Method B below).

Unboxing & Hardware Overview​

  • Dimensions & Weight: 98.0 × 65.0 × 12.8 mm, pearl-white casing, 70 g.
  • Antenna: Integrated 50 × 40 mm antenna (operating range up to 50 mm, depending on tag type).
  • LED: Bi-color LED (Red/Green), software controllable.
  • Buzzer: Monotone buzzer, software controllable.
  • Cable: Integrated USB 2.0 Type-A cable, 1.0 m length.

Specifications Overview​

ItemSpecification
Supported Standards / CardsISO/IEC 18092 NFC, ISO 14443 Type A & B, MIFARE Classic®, FeliCa
Operating Frequency13.56 MHz
Read/Write Speed106 / 212 / 424 kbps
Host InterfaceUSB 2.0 Full Speed (12 Mbps), CCID compliant
Operating DistanceUp to 50 mm (dependent on tag type)
Anti-collisionBuilt-in (one card accessed at a time)
Power SupplyUSB bus-powered, 5V DC (max 200 mA)
Dimensions / Weight98.0 × 65.0 × 12.8 mm / 70 g
API SupportPC/SC, CT-API (via PC/SC wrapper)
CertificationsISO 14443, PC/SC, CCID, CE, FCC, KC, VCCI, RoHS, Microsoft WHQL
USB Vendor/Product ID072F:2200
OS SupportWindows, Linux, macOS, Solaris, Android 3.1+
Official DocumentationACR122U Product Page, API Manual (PDF)

Supported & Unsupported Capabilities​

FeatureStatusNotes
Read/Write MIFARE Classic✅ SupportedCompatible with libfreefare and nfc-mfclassic
Read/Write ISO 14443-4 Cards✅ SupportedStandard PC/SC APDU transmission
Read/Write FeliCa & ISO 18092 Tags✅ SupportedHandled via pseudo-APDU commands
Read Card Serial Number (UID)✅ SupportedStandardized FF CA 00 00 00 APDU call
Card Emulation Mode— Not listedNot listed in the ACS datasheet (ACR1252U and ACR1552U list it)
ISO 15693 (Vicinity Cards)— Not listedNot listed in the ACS datasheet (ACR1552U lists it)
SAM (Secure Access Module) Slot— Not listedNot listed in the ACS datasheet (ACR1252U and ACR1552U list a SAM slot)

Installation & Driver Setup​

The driver architecture operates across two potential paths:

Kernel Module Conflict on Linux

The Linux kernel's default pn533 and pn533_usb drivers automatically claim PN532-based devices, blocking pcscd and libnfc. Blacklisting these kernel modules is required for reliable operation:

sudo modprobe -r pn533_usb pn533
echo "blacklist pn533_usb" | sudo tee -a /etc/modprobe.d/blacklist-nfc.conf
echo "blacklist pn533" | sudo tee -a /etc/modprobe.d/blacklist-nfc.conf

Step 1: Install PC/SC Tools (Debian / Ubuntu / Kali)

sudo apt update
sudo apt install -y pcscd pcsc-tools libpcsclite-dev

Step 2: Start and Enable pcscd Service

sudo systemctl enable --now pcscd

Step 3: Verify Reader Detection

pcsc_scan

Expected output:

Scanning present readers...
0: Advanced Card Systems Ltd. ACR122U 00 00
Waiting for the first reader...

When a contactless card is presented:

Card state: Card inserted,
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A

Method B: Direct libnfc Stack​

Step 1: Install libnfc and Utilities

sudo apt install -y libnfc-bin libnfc-dev libfreefare-bin

Step 2: Configure libnfc (/etc/nfc/libnfc.conf)

device.name = "ACR122U"
device.connstring = "acr122_usb:072f:2200"

Step 3: Run nfc-list

nfc-list

Expected output:

nfc-list uses libnfc 1.8.0
NFC device: ACS / ACR122U PICC Interface opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): a1 b2 c3 d4
SAK (SEL_RES): 08

Quickstart: Reading Card UID with Python (pyscard)​

pip install pyscard
from smartcard.System import readers
from smartcard.util import toHexString

# 1. Connect to reader
r = readers()
if not r:
print("No PC/SC readers detected.")
exit(1)

reader = r[0]
print(f"Connected to: {reader}")

connection = reader.createConnection()
connection.connect()

# 2. Transmit standard Get UID APDU: FF CA 00 00 00
GET_UID = [0xFF, 0xCA, 0x00, 0x00, 0x00]
data, sw1, sw2 = connection.transmit(GET_UID)

if sw1 == 0x90 and sw2 == 0x00:
print(f"Card UID: {toHexString(data)}")
else:
print(f"Command failed with status: {sw1:02X} {sw2:02X}")

Operating System Compatibility​

OS / PlatformCompatibilityDriver / Notes
Windows 10✅ SupportedPlug & Play via Microsoft CCID driver
Ubuntu / Debian / Kali✅ Supportedpcscd + libpcsclite (requires kernel module blacklist)
macOS✅ SupportedBuilt-in Apple CCID / PC/SC framework
Android✅ SupportedVia USB OTG and Android CCID libraries

Troubleshooting​

1. pcsc_scan shows no readers​

  • Cause: Kernel module collision (pn533_usb claiming device) or pcscd daemon inactive.
  • Fix: Verify blacklist in /etc/modprobe.d/blacklist-nfc.conf and restart sudo systemctl restart pcscd.

2. nfc-list returns "Unable to open NFC device"​

  • Cause: pcscd and libnfc competing for exclusive USB claim.
  • Fix: Stop the PC/SC daemon temporarily when executing raw libnfc tools: sudo systemctl stop pcscd.

3. Frequent card read disconnects​

  • Cause: Insufficient USB port power delivery or USB hub dropouts.
  • Fix: Connect reader directly to rear motherboard USB ports.