Get the Egis ETU906Axx-E fingerprint reader (1c7a:05a5) working under Linux
(tested on Ubuntu 26.04 / KDE Plasma 6 / SDDM, kernel 7.0.9).
The sensor is an Egis Match-on-Chip (MoC) device that requires the SDCP
(Secure Device Connection Protocol) handshake. Mainline libfprint 1.95.1 ships
the egismoc driver but (a) doesn't list USB id 1c7a:05a5, and (b) its egismoc
driver doesn't perform the SDCP handshake this variant needs. The fix is to build
and install the SDCP-capable egismoc fork (which already lists 05a5).
⚠️ Same marketing name ≠ same sensor. "Galaxy Book5" covers several models, and even one model number may ship different fingerprint hardware across revisions/regions. This guide is verified specifically for USB id1c7a:05a5(Egis ETU906Axx-E). Check yourlsusboutput first (Step 0). If your id differs, this recipe may not apply unchanged.
| Item | Value |
|---|---|
| Laptop | Samsung Galaxy Book5 — Product Name 960XHA, System Version P09AMA, board NP964XHA-KG2DE |
| CPU | Intel Core Ultra 7 258V (Lunar Lake, 8 cores) |
| RAM | 32 GiB |
| GPU | Intel Graphics (integrated) |
| Sensor | Egis Technology (LighTuning) ETU906Axx-E, USB 1c7a:05a5 |
| OS | Kubuntu 26.04 LTS (resolute) |
| Desktop | KDE Plasma 6.6.4 (Frameworks 6.24.0, Qt 6.10.2), Wayland |
| Display manager | SDDM |
| Kernel | 7.0.9-070009-generic (x86_64) |
| Distro libfprint | 1:1.95.1+tod1-0ubuntu1 |
| Working driver | TenSeventy7/libfprint-egismoc-sdcp (base 1.94.9, HEAD 4d128d4) |
Confirm you have the same machine + sensor before following this guide:
cat /sys/class/dmi/id/product_name # expect: 960XHA
cat /sys/class/dmi/id/product_version # expect: P09AMA
lsusb | grep -i 1c7a # expect: 1c7a:05a5 ... ETU906Axx-EIf product_name matches but the USB id differs, you have a different
fingerprint module — open an issue with your lsusb line so the device list can
grow.
- USB id not listed.
egismoc_id_tablein stock 1.95.1 lists0582–0588, 05a1, 05aebut not05a5, so libfprint never claims the device (fprintd-list→ "No devices available"). - SDCP required. Even after adding
05a5, the stockegismocdriver derives fromFP_TYPE_DEVICE(no SDCP). The ETU906 returns SDCP-framed responses, so identify/enroll fails with "Unrecognized response from device" /enroll-disconnected. The fork derives fromFPI_TYPE_SDCP_DEVICEand performs the ConnectResponse handshake, and flags05a5withEGISMOC_DRIVER_CHECK_PREFIX_TYPE2 | EGISMOC_DRIVER_MAX_ENROLL_STAGES_15.
lsusb | grep -i 1c7a
# Bus ... ID 1c7a:05a5 LighTuning Technology Inc. ETU906Axx-EIf your id is not 1c7a:05a5, this exact recipe may not apply — check the
fork's egismoc_id_table for your id first.
sudo apt-get install -y --no-install-recommends \
meson ninja-build build-essential pkg-config \
libglib2.0-dev libgusb-dev libgudev-1.0-dev \
libpixman-1-dev libcairo2-dev libssl-dev libnss3-dev systemd-devClone this repo, then clone + build the SDCP fork inside the repo root
(the scripts expect it at ./libfprint-egismoc-sdcp):
git clone https://github.com/gkrost/galaxybook5-fingerprint-linux.git
cd galaxybook5-fingerprint-linux
git clone --depth 1 https://github.com/TenSeventy7/libfprint-egismoc-sdcp.git
cd libfprint-egismoc-sdcp
meson setup builddir \
--prefix=/usr --libdir=lib/x86_64-linux-gnu --buildtype=plain \
-Ddoc=false -Dgtk-examples=false -Dintrospection=false -Ddrivers=all
ninja -C builddir
cd ..Verify the build contains the device id:
objdump -s builddir/libfprint/libfprint-2.so.2.0.0 | grep -i "a5050000 7a1c0000" \
&& echo "OK: 05a5 present"The fork's .so exports all symbols fprintd needs and uses SONAME
libfprint-2.so.2, so it's a drop-in replacement. Use the provided script
(it verifies the 05a5 marker, backs up the original outside the library
dir, and sets the symlinks explicitly):
sudo ./scripts/install-sdcp.shWhy the backup goes outside
/usr/lib/.../: if a*.bakfile sits in the library dir,ldconfigmay repoint the.so.2symlink to the backup instead of your build. (This bit us during development — the script avoids it.)
Manual equivalent (if you prefer not to use the script)
sudo install -d /root/libfprint-backups
sudo cp -av /usr/lib/x86_64-linux-gnu/libfprint-2.so.2.0.0 \
/root/libfprint-backups/libfprint-2.so.2.0.0.orig
sudo install -m0644 libfprint-egismoc-sdcp/builddir/libfprint/libfprint-2.so.2.0.0 \
/usr/lib/x86_64-linux-gnu/libfprint-2.so.2.0.0
sudo ln -sf libfprint-2.so.2.0.0 /usr/lib/x86_64-linux-gnu/libfprint-2.so.2
sudo ln -sf libfprint-2.so.2 /usr/lib/x86_64-linux-gnu/libfprint-2.so
sudo ldconfig
sudo systemctl restart fprintdfprintd-list "$USER" # -> "found 1 devices ... Egis ... Match-on-Chip"
# If the chip has a leftover print (e.g. from Windows), wipe it first:
sudo systemctl stop fprintd
sudo ./libfprint-egismoc-sdcp/builddir/examples/clear-storage
sudo systemctl start fprintd
fprintd-enroll # touch the sensor through all 15 stages -> enroll-completed
fprintd-verify # touch once -> verify-matchsudo pam-auth-update # enable "Fingerprint authentication"This edits /etc/pam.d/common-auth, which is @included by SDDM
(graphical login) and sudo. Test:
sudo -k && sudo -v # prompts "Place your finger on the fingerprint reader"Graphical login (SDDM): works automatically via common-auth. At the login
screen, start typing nothing and touch the sensor — or it prompts after a moment.
KDE Plasma lock screen: Plasma's locker uses the kde PAM service, which may
not exist by default. If fingerprint doesn't work on the lock screen, create
/etc/pam.d/kde:
auth include common-auth
account include common-account
password include common-password
session include common-session
then log out/in. (Login via SDDM and sudo already work without this.)
The custom library is overwritten whenever libfprint-2-2 is updated by apt.
This repo includes an APT hook that auto-restores it — no pinning, no manual
reruns, and you keep getting distro security updates.
sudo ./scripts/setup-persistence.shThis:
- caches your built SDCP
.soin/opt/libfprint-sdcp/(with the upstream version it shadows), - installs
/usr/local/sbin/libfprint-sdcp-reinstall(restores the lib only if the active one lost05a5support — otherwise a no-op), - installs an APT
Post-Invokehook (apt/99-libfprint-sdcp).
After this, apt upgrade works normally. If an update replaces libfprint, the
hook restores the SDCP build and restarts fprintd automatically. If a newer
upstream libfprint ships, it still restores your sensor and prints a one-time
hint to rebuild the fork.
Verify it works:
sudo apt-get install --reinstall -y libfprint-2-2 # clobbers the lib
fprintd-list "$USER" # hook restored it; device still listed- Pin (blocks libfprint security updates):
sudo apt-mark hold libfprint-2-2 libfprint-2-tod1 - Manual rebuild after each update: re-run
scripts/install-sdcp.sh.
To remove the persistence hook:
sudo rm -f /etc/apt/apt.conf.d/99-libfprint-sdcp /usr/local/sbin/libfprint-sdcp-reinstall
sudo rm -rf /opt/libfprint-sdcpTo restore the distro library at any time:
sudo cp /root/libfprint-backups/libfprint-2.so.2.0.0.orig \
/usr/lib/x86_64-linux-gnu/libfprint-2.so.2.0.0
sudo ln -sf libfprint-2.so.2.0.0 /usr/lib/x86_64-linux-gnu/libfprint-2.so.2
sudo ldconfig && sudo systemctl restart fprintd| Symptom | Cause / fix |
|---|---|
No devices available |
.so.2 symlink points at the wrong file. readlink -f /usr/lib/x86_64-linux-gnu/libfprint-2.so.2 — it must resolve to the fork .so.2.0.0 containing 05a5. Re-run ln -sf + ldconfig. |
Access denied (insufficient permissions) running examples/enroll |
You ran it non-root; libusb needs write access to the USB node. Use fprintd-* (daemon is root) or sudo. |
enroll-duplicate |
A print is already stored on-chip. Run examples/clear-storage (stop fprintd first). |
enroll-disconnected / Unrecognized response |
You're still on the stock (non-SDCP) driver. Confirm the active lib is the fork build. |
| Driver debug | sudo systemctl stop fprintd; sudo G_MESSAGES_DEBUG=all /usr/libexec/fprintd (driver logs live in the daemon, not the fprintd-* clients). |
test/container-testdrive.sh runs the full hardware-independent flow (build →
install → persistence → APT self-heal) in a throwaway Ubuntu container. CI runs it
on every push against Ubuntu 26.04 and 24.04. The physical sensor (enroll/verify)
can only be tested on real hardware and is out of scope for CI.
test/container-testdrive.sh # needs Docker
IMAGE=ubuntu:24.04 test/container-testdrive.shegismocdriver: Joshua Grisham (upstream libfprint).- SDCP fork with
05a5/ETU906 support: TenSeventy7/libfprint-egismoc-sdcp.
Licensed under LGPL-2.1-or-later, matching upstream libfprint.
patches/0001-egismoc-add-ETU906-1c7a-05a5-Galaxy-Book5.patchderives from libfprint'segismoc.c(LGPL-2.1-or-later) and is therefore LGPL-2.1-or-later.- The scripts and APT hook in this repo are original work, also released under LGPL-2.1-or-later for consistency.
See LICENSE for the full text. This repository does not vendor
libfprint or the SDCP fork; those are cloned from upstream at build time and
remain under their own (LGPL-2.1-or-later) license.
This replaces a system library with a locally built one. It worked on the exact configuration above; your mileage may vary. Back up your data and understand the restore procedure before running. Provided as-is, without warranty.