linux-fingerprint-drivers

A community hub for driver code, patches, and setup notes for fingerprint sensors that are not yet supported in upstream libfprint.

If your sensor shows up in lsusb but fprintd-enroll fails or the device is unknown to libfprint, there may be a working fix here, or you can contribute one.

Browsable as a website, one page per sensor: https://fprint.jedbillyb.com

Check upstream first: if your reader is on libfprint's own supported devices list, use your distro's libfprint. This repo is only for the ones that are not.

Find your device

Know your laptop but not your sensor? Look your machine up in docs/laptops.md, an index of every laptop model named anywhere in this repo or on the libfprint wiki, mapped to its USB ID and the route that works. Adding your own model there is the most useful small contribution you can make.

Otherwise, clone the repo and let the helper script match your hardware against everything catalogued here:

git clone https://github.com/jedbillyb/linux-fingerprint-drivers.git
cd linux-fingerprint-drivers
./tools/detect.sh              # or: ./tools/detect.sh 27c6:55b4

It scans lsusb for likely readers and tells you, per device, whether there is an entry here, whether it is on the known-unsupported list, or whether it is unknown to this repo entirely.

Doing it by hand: run lsusb and find the reader:

$ lsusb
...
Bus 003 Device 002: ID 27c6:55b4 Shenzhen Goodix Technology Co.,Ltd. FingerPrint
...

The 27c6:55b4 part is the USB ID (vendor:product), and it is the key this repo is organised by: see devices/27c6:55b4/. If nothing is obviously a reader, compare against the known sensor vendors: Goodix 27c6, Synaptics/Validity 06cb and 138a, ELAN 04f3, FocalTech 2808, FPC 10a5, Broadcom 0a5c, EgisTec 1c7a. Many newer sensors are on SPI or I2C and never appear in lsusb at all.

Working fixes

Device ID Chip Status Distros tested
27c6:55b4 Goodix GF3268 Working Void Linux
27c6:5385 (5335/5395) Goodix HTK32 Working Arch, Fedora, Ubuntu/Debian
04f3:0c4c (0c00) ELAN match-on-chip Working Debian/Ubuntu
138a:0090 (0097) Validity/Synaptics VFS0090 Working Ubuntu, Arch, Fedora, NixOS
06cb:009a (138a:009d) Synaptics Prometheus Working Ubuntu, Arch, Fedora
04f3:0c6c ELAN Match-on-Chip 2 Working Ubuntu/Debian, Fedora, Arch
10a5:9800 FPC fpcmoh (match-on-host) Working Fedora, Arch
2541:0236 (9711) Chipsailing CS9711 Working Arch (GPD Win Max 2, AYANEO 2)
06cb:00ff (+00c9/00d1/00e7/0124/0169) Synaptics Tudor MiS Working Arch, Fedora, Ubuntu (community routes)
2808:9e65 FocalTech Partial Undocumented (unconfirmed)

Status legend: Working (enroll + verify reliable), Partial (works with caveats), WIP (in progress). Statuses only move when someone reports back, so please open a device report with your distro and hardware either way.

Every entry needs libfprint built from source. The build, install, PAM, package pinning, troubleshooting and revert steps are the same for all of them and live in docs/BUILD.md; each device entry covers only what is specific to that sensor.

Note: 06cb:009a (Synaptics Prometheus) is handled by python-validity, a userspace driver daemon that plugs into fprintd via open-fprintd, rather than a libfprint driver. See its entry for the different stack.

Vendor blob and non-LGPL routes (catalogued, never hosted)

Some very common sensors have no open driver at all: the only thing that works is a proprietary vendor driver loaded through libfprint's TOD (Touch OEM Driver) mechanism, or a project under a license this hub cannot host.

This repo hosts only LGPL-2.1 code. But leaving these devices uncatalogued just means their owners find nothing and conclude Linux cannot use their reader, so they get entries that point at the vendor route and state the trade-offs plainly. Nothing proprietary is mirrored here, and a pointer is not an endorsement: read the caveats in each entry before putting a closed binary in your authentication path.

Device ID Chip Route Entry
27c6:550a Goodix Lenovo TOD blob (libfprint-2-tod1-goodix); ThinkPad E14/E15, ThinkBook entry
27c6:533c Goodix Dell OEM TOD blob; XPS 13 9300, XPS 15 9500 entry
04f3:0c4b ELAN Lenovo TOD blob (libfprint-2-tod1-elan); ThinkPad E14 Gen 4 entry
0a5c:58xx / 586x Broadcom Dell/Canonical TOD blob, alongside the open MR entry
10a5:9201 FPC fingerprint-ocv, standalone AGPL-3.0 daemon entry
06cb:00ff family Synaptics Tudor relinked vendor Windows driver, or a fully open native driver entry

Still genuinely out of scope: sensors where nobody has published any working route at all (those live in the gap-map), and routes we cannot verify (see Contributing on the vetting bar).

In progress (unmerged upstream MRs)

Drivers that have been submitted to the official libfprint project but are not merged yet, so they are not in any released libfprint. Each has an entry under devices/ with the merge-request link and build notes. Status changes to Working here once someone confirms it, and the row moves once the MR lands upstream.

MR states were last verified against GitLab on 2026-07-26; the merge request itself is always the authority.

Device ID Chip / sensor MR Notes
147e:1002 UPEK Touchstrip (upeksonly) !585 Draft
0a5c:xxxx (Dell) Broadcom ControlVault3 (fp + NFC) !620 Dell family; needs vendor firmware; see entry
138a:0097 / 009d Validity/Synaptics VFS0097 (VCSFW) !626, !579, !619 !626 is the active continuation of !579; also covers 0090 + 06cb:009a
138a:00ab Validity VCSFW 0x969/0xd51 !626 hardware-validated; HP ZBook Studio x360 G5
06cb:00cb Validity VCSFW 0x969 !626 hardware-validated; HP Pavilion x360 14-dh
06cb:00b7 Validity VCSFW 0xd51 !626 registered, untested; HP G6 series
2808:c652 FocalTech FT9362 (match-on-host) !588
2808:9338 / 93a9 FocalTech FT9201 !572
10a5:9200 FPC1022 (FPC Disum) !570
10a5:9924 FPC match-on-host (Honor) !611
04e8:7305 Samsung 7305 !586
04e8:730b Samsung 730B (image) !556
1c7a:0576 EgisTec 0576 !571
1c7a:0575 EgisTec EGIS0575 (swipe) !357 Needs work
298d:2033 NextBiometrics NB-2033-U !574
crfpmoc (cros_ec) Chromium OS EC FPMCU !512 not USB
mafp8800 (SPI) Microarray MAFP8800 !580 not USB (SPI)

Recently merged upstream

These were WIP here but their merge requests have since merged into libfprint git master (2026-06/07). They will be in the next libfprint release; build from git to get them now. Entries are kept for people still on an older libfprint.

Device ID Chip / sensor MR Merged
2808:6553 FocalTech FT9365 ESS (not the capture function on dual-function FT9201 modules) !554 2026-06-18
04f3:0c9c ELAN ARM-M4 (0c9c) !568 2026-06-18
3274:8012 Microarray match-on-chip !492 2026-06-18
298d:2020 NextBiometrics NB-2020-U !569 2026-07-02

Stale (merge request closed without merging)

Entries kept as leads for anyone wanting to pick the reverse-engineering back up.

Device ID Chip / sensor MR State
04f3:0c8e ELAN elanmoc2 !560 Closed 2026-06-22; no maintained upstream work
04f3:310d ELAN ELAN7006 !383 Closed; the draft never enrolled or verified

Experimental community forks (not upstream)

Drivers from community forks rather than upstream merge requests. These are not in libfprint and may be unstable; see each device entry for details.

Device ID Chip / sensor Source Notes
27c6:521d (538d) Goodix 521d/538d goodix-fp-linux-dev Works via AUR libfprint-goodix-521d
27c6:5110 + family Goodix (newer) goodix-fp-linux-dev/libfprint Experimental, not for daily use

Claimed upstream, but unreliable

libfprint listing your sensor as supported does not always mean it works. These have in-tree drivers that fail in practice, with open MRs that fix them. If your reader is detected but you cannot finish an enrollment, start here.

Device ID Chip Problem Fix MR Entry
04f3:0c28 (0c0x-0c4x family) ELAN image sensors enroll fails every second capture; thresholds and swipe-mode assumptions wrong for the hardware !217, !530 entry
1c7a:0570 (0571) EgisTec egis0570 calibration not implemented, erratic captures !548 entry
147e:1002 and upektc/upeksonly UPEK swipe sensors 144x384 captures yield too few minutiae to match reliably !576 entry
1c7a:05ae, 1c7a:9201 EgisTec etu905 no firmware template update after verify !610 -

No known fix yet

115 more USB sensors are on the libfprint wiki's unsupported list with no working driver here or upstream. They are catalogued, with any known reverse-engineering leads, in docs/unsupported-devices.md - the contributor gap-map. If you own one of those, a protocol dump or a driver is very welcome.

SPI/I2C sensors (ELAN7001/7002/079C, GXFP5187/51B7, GDIX51C0, fpc1020, ...) are also largely unsupported and never appear in lsusb; see the wiki's SPI Devices section.

Contributing

New device entries, status reports, and corrections are all welcome. See CONTRIBUTING.md for the folder layout, required files, attribution, and license rules, and run python3 tools/check-repo.py before opening a PR.

Two things are worth as much as a driver: a report that an entry works (or stopped working) on your distro, and a protocol dump for anything in the gap-map.

Hosting vs cataloguing. Code and patches in this repo are LGPL-2.1 only. Cataloguing is broader: a device entry may point at a proprietary TOD blob or a differently-licensed project when that is the only thing that works, as long as the entry says so plainly and mirrors none of it.

Vetting bar. There are many small per-device fingerprint repos on GitHub, and a fair number are abandoned, unlicensed, or generated. An entry gets added when the route can be checked: real driver code, a license, and some evidence it worked on hardware. Unverifiable leads belong in an issue, not in devices/.

Where a fix belongs upstream, please also push it there: this hub exists to make unmerged work findable, not to replace libfprint. Entries whose merge requests land upstream get moved to the merged table and eventually dropped.

License

All driver code and patches hosted here are derived from libfprint and are licensed under LGPL-2.1. See LICENSE. Contributed code must be LGPL-2.1-compatible.

Device entries may link to routes under other licenses, including proprietary vendor drivers, where that is the only thing that works for a sensor. Those entries say so explicitly and mirror no code. See Vendor blob and non-LGPL routes.