NBIS/bozorth3 cannot reliably detect minutiae at the sensor's
native resolution (64x80 pixels, ~250 DPI vs 500 DPI required).
The Windows driver solves this with a proprietary "mayflower"
matching engine.
Replace FpImageDevice (NBIS-based) with FpDevice implementing
custom pixel-correlation matching:
- Preprocessing: bitwise NOT + local mean subtraction (7x7
high-pass filter) to enhance ridge/valley contrast
- Enrollment: store 5 preprocessed images as GVariant templates
- Verification: Normalized Cross-Correlation (NCC) with
translation search (±3 pixels, 49 positions per template)
- NCC threshold: 0.30 (same finger: 0.31-0.47, different: 0.05-0.29)
Tested with fprintd-enroll, fprintd-verify, and GNOME lock screen.
Use change_state callback (nb1010 pattern) to start capture SSM
when framework transitions to AWAIT_FINGER_ON state. This enables
proper multi-stage enrollment (5 stages).
Add FPI_IMAGE_COLORS_INVERTED flag: the sensor outputs inverted
pixel values, matching the Windows driver behavior (~pixel
bitwise NOT inversion found in decompiled ftWbioUmdfDriverV2.dll).
Add 2x nearest-neighbor upscaling (64x80 -> 128x160) for NBIS
minutiae detection compatibility.
Poll vendor request 0x43 (INT_STATUS) to detect finger presence
before capturing. Byte 0: 0x00 = no finger, 0x01 = finger present.
Retry every 30ms until finger is detected.
Also add warmup skip on subsequent capture cycles to avoid
consuming stale data from the USB pipe.
Reverse-engineered USB protocol for FocalTech FT9201 (FT9338 chip,
VID:PID 2808:9338). Area fingerprint sensor, 64x80 pixels, 8-bit
grayscale, connected via USB SIU (Serial Interface Unit) bridge.
Protocol uses "New SIU" compound register addresses:
- 0x9180: chip status / OTP info
- 0x9080: image capture (5120 bytes)
- 0xFF00: sync / reset
Read sequence: 3 vendor control OUTs + 1 bulk IN.
First bulk read after USB reset returns garbage and must be discarded.
Implements 16-state capture SSM with warmup, finger polling,
sync, status check, and image read phases.
This FPreader was found on Minisforum X1 Pro MiniPC, and it is
listed by lsusb as "Generic Realtek USB2.0 Finger Print Bridge".
Though the VID is not the same as the well-known "0bda", we can
confirm it's from Realtek by analyzing Windows version driver.
Signed-off-by: Ryan Wong <colorfulshark@gmail.com>
If the button shield command cannot be executed due to an underlying
error then resp is NULL. Avoid the crash by adding the appropriate
check.
Closes: #694