A custom fingerprint driver for the FocalTech FT9201 external USB scanner on Linux.
Important: This project targets VID
0x2808only (FT9201 USB dongle). If your laptop has a built-in fingerprint reader, it uses a different chip/driver and is not touched by this tool.
| PID | Role |
|---|---|
2808:93a9 |
Bootloader stage |
2808:a658 |
Runtime bridge (use this for capture) |
Both PIDs may appear simultaneously on different USB buses.
# C tool dependencies
sudo dnf install libusb1-devel gcc make
# Python tool dependencies
pip install --user pyusb
# USB permissions (no sudo needed after this)
sudo cp 50-focaltech.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
# Unplug and replug the FT9201 USB scannerThe same physical dongle exposes two PIDs with different endpoints:
| PID | Role | Bulk OUT | Bulk IN | Packet size |
|---|---|---|---|---|
93a9 |
Bootloader / control API | 0x02 |
0x83 |
16 / 32 B |
a658 |
Runtime image bridge | 0x01 |
0x82 |
512 / 512 B |
- Control init (bootstrap, session, pipeline) runs on
93a9 - Bulk image capture reads from
a658EP0x82 - Do not send
0x02/0x83toa658— it will crash with "Invalid endpoint"
python3 ft9201.py init-dual # recommended: init 93a9, probe a658
python3 ft9201.py init --pid 93a9 # control init only
python3 ft9201.py capture -o test # init 93a9 + bulk read a658make ft9201
./ft9201 list
./ft9201 init --pid a658
./ft9201 capture -o testft9201 / ft9201.py open devices by VID 0x2808 + PID only.
Your built-in laptop reader (Goodix, Synaptics, etc.) will never be selected.
Use python3 ft9201.py list to confirm you're talking to the external USB device:
Bus 003 Dev 015 PID 0xa658 (runtime-bridge) ← target this
Bus 001 Dev 019 PID 0x93a9 (bootloader)
Extended RE notes: https://docs.google.com/document/d/1Xe3jpMAEk6xfgdvdpNng9Ath9bWOPLXa4qZ9WV_r_RQ/edit?usp=sharing
Protocol constants: src/protocol/commands.h