mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
Compare commits
107 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e57bab2f1e | ||
|
|
a88582761f | ||
|
|
75adfd37d1 | ||
|
|
990bd40cbf | ||
|
|
c7e95bb41f | ||
|
|
4611cc4a1b | ||
|
|
78c78432b9 | ||
|
|
10e1cd76aa | ||
|
|
c84d3774cf | ||
|
|
04a167b09b | ||
|
|
538a18cf17 | ||
|
|
2e766904f0 | ||
|
|
9f55ef690d | ||
|
|
b6061c0af8 | ||
|
|
3f70bde21c | ||
|
|
dd6f020378 | ||
| 2a4c05662a | |||
|
|
eaec2339cc | ||
|
|
83035be830 | ||
|
|
4709efc678 | ||
|
|
37ded921fd | ||
|
|
b7f3544e98 | ||
|
|
093f2fc0a6 | ||
|
|
c5def9a528 | ||
|
|
e71f3de786 | ||
|
|
420fd7416d | ||
|
|
f505158c04 | ||
|
|
fb13722629 | ||
|
|
666cd0c08d | ||
|
|
e055781006 | ||
|
|
48c8c539c7 | ||
|
|
40c7599fb1 | ||
|
|
28c26c7d7e | ||
|
|
dd5a71695f | ||
|
|
977d324970 | ||
|
|
4992110829 | ||
|
|
53f2539b6a | ||
|
|
18e2906d62 | ||
|
|
19806546a2 | ||
|
|
75559415fe | ||
|
|
7dbb21e77a | ||
|
|
4b72f27de6 | ||
|
|
5ada931ede | ||
|
|
bebe8565cd | ||
|
|
5501dc7b47 | ||
|
|
3e5ab6fdad | ||
|
|
5462db9901 | ||
|
|
59dc585ccd | ||
|
|
6768bd0ff4 | ||
|
|
ed1815c3d9 | ||
|
|
057c209beb | ||
|
|
90c4afded4 | ||
|
|
f8f28a066b | ||
|
|
adc66edd8d | ||
|
|
9af211cc89 | ||
|
|
904bddd988 | ||
|
|
8badfa84e9 | ||
|
|
b97efa6fed | ||
|
|
591f9ad3cf | ||
|
|
6767cd1a4f | ||
|
|
226b6abfab | ||
|
|
9e2c14d64e | ||
|
|
92aeb53ee8 | ||
|
|
87f68e3ac1 | ||
|
|
8073a5dc34 | ||
|
|
eb09156244 | ||
|
|
b8cfb95b49 | ||
|
|
a7843add0f | ||
|
|
b0f0322726 | ||
|
|
7476faba68 | ||
|
|
89ab54794e | ||
|
|
85da0e104b | ||
|
|
47fe3668e4 | ||
|
|
7aae2181e2 | ||
|
|
a9269980eb | ||
|
|
0b9a64331f | ||
|
|
54ff730f0c | ||
|
|
e05fbaa8ab | ||
|
|
61f9346aaf | ||
|
|
d878148b5e | ||
|
|
ee509c7ee6 | ||
|
|
2fa0975dec | ||
|
|
f3ab1f996f | ||
|
|
92c5fc4643 | ||
|
|
c64fa9c81b | ||
|
|
85ec9ec5b2 | ||
|
|
b8933d8f81 | ||
|
|
631da4654f | ||
|
|
1701d72ff9 | ||
|
|
d3ec9a80d3 | ||
|
|
5a1253e37c | ||
|
|
2b008b52d7 | ||
|
|
83939abe10 | ||
|
|
16d02b3ed5 | ||
|
|
79be91831c | ||
|
|
427139f347 | ||
|
|
3ebd2c3f97 | ||
|
|
2414dbdbd4 | ||
|
|
0eae0e8cc0 | ||
|
|
efba965b0c | ||
|
|
26d2c77c3d | ||
|
|
eb01d7c97d | ||
|
|
5bff5bfea6 | ||
|
|
206e92218c | ||
|
|
af3dca9003 | ||
|
|
b924d715c9 | ||
|
|
1372d6f081 |
@@ -22,7 +22,6 @@ variables:
|
||||
FDO_DISTRIBUTION_VERSION: rawhide
|
||||
FDO_UPSTREAM_REPO: "libfprint/$CI_PROJECT_NAME"
|
||||
FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
|
||||
BUNDLE: "org.freedesktop.libfprint.Demo.flatpak"
|
||||
LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546"
|
||||
|
||||
workflow:
|
||||
@@ -36,6 +35,7 @@ stages:
|
||||
- build
|
||||
- test
|
||||
- flatpak
|
||||
- deploy
|
||||
|
||||
image: $FEDORA_IMAGE
|
||||
|
||||
@@ -125,17 +125,19 @@ test_installed:
|
||||
script:
|
||||
- meson setup _build --prefix=/usr -Ddrivers=all
|
||||
- meson install -C _build
|
||||
- mv _build _build_dir
|
||||
- rm -rf tests
|
||||
- gnome-desktop-testing-runner --list libfprint-2
|
||||
- gnome-desktop-testing-runner libfprint-2
|
||||
--report-directory=_build/installed-tests-report/failed/
|
||||
--log-directory=_build/installed-tests-report/logs/
|
||||
--report-directory=_installed-tests-report/failed/
|
||||
--log-directory=_installed-tests-report/logs/
|
||||
--parallel=0
|
||||
artifacts:
|
||||
expose_as: 'GNOME Tests Runner logs'
|
||||
when: always
|
||||
paths:
|
||||
- _build/meson-logs
|
||||
- _build/installed-tests-report
|
||||
- _build_dir/meson-logs
|
||||
- _installed-tests-report
|
||||
expire_in: 1 week
|
||||
|
||||
|
||||
@@ -151,6 +153,7 @@ test_scan_build:
|
||||
- SCANBUILD=$CI_PROJECT_DIR/.gitlab-ci/scan-build
|
||||
ninja -C _build scan-build
|
||||
artifacts:
|
||||
when: on_failure
|
||||
paths:
|
||||
- _build/meson-logs
|
||||
expire_in: 1 week
|
||||
@@ -176,27 +179,35 @@ test_unsupported_list:
|
||||
|
||||
flatpak:
|
||||
stage: flatpak
|
||||
extends: .flatpak
|
||||
# From https://gitlab.gnome.org/GNOME/gnome-runtime-images/container_registry
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:42
|
||||
extends: .flatpak@x86_64
|
||||
variables:
|
||||
MANIFEST_PATH: "demo/org.freedesktop.libfprint.Demo.json"
|
||||
FLATPAK_MODULE: "libfprint"
|
||||
APP_ID: "org.freedesktop.libfprint.Demo"
|
||||
BUNDLE: "org.freedesktop.libfprint.Demo.flatpak"
|
||||
RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
|
||||
# Build with any builder
|
||||
tags: []
|
||||
rules:
|
||||
- if: '$CI_PROJECT_PATH != "libfprint/libfprint"'
|
||||
when: never
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
||||
when: never
|
||||
- if: '$CI_COMMIT_BRANCH == "master"'
|
||||
allow_failure: true
|
||||
when: always
|
||||
- if: '$CI_COMMIT_TAG'
|
||||
allow_failure: true
|
||||
when: always
|
||||
# For any other (commit), allow manual run.
|
||||
# This excludes MRs which would create a duplicate pipeline
|
||||
- if: '$CI_COMMIT_BRANCH'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: '$CI_MERGE_REQUEST_ID'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
# CONTAINERS creation stage
|
||||
.container_fedora_build_base:
|
||||
@@ -246,3 +257,18 @@ container_fedora_build_on_deps_changed:
|
||||
- merge_requests
|
||||
changes:
|
||||
- .gitlab-ci/libfprint-image-variables.yaml
|
||||
|
||||
pages:
|
||||
image: alpine:latest
|
||||
stage: deploy
|
||||
needs:
|
||||
- job: test
|
||||
artifacts: true
|
||||
script:
|
||||
- mkdir public
|
||||
- mv _build/meson-logs/coveragereport public/coverage
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
rules:
|
||||
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
|
||||
|
||||
33
NEWS
33
NEWS
@@ -1,6 +1,35 @@
|
||||
This file lists notable changes in each release. For the full history of all
|
||||
changes, see ChangeLog.
|
||||
|
||||
2024-09-03: v1.94.8 release
|
||||
|
||||
Highlights:
|
||||
* build: Support building in non-linux unix environments (tested in FreeBSD)
|
||||
* egismoc: New PIDs 0x0583, 0x0586, 0x0587.
|
||||
* elanmoc: New PID 0x0C9F.
|
||||
* fpcmoc: New PIDs 0x9524, 0x9544.
|
||||
* goodixmoc: New PIDs 0x609A, 0x650A, 0x650C, 0x6512.
|
||||
* realtek: New PID 0x5816.
|
||||
* synaptics: New PIDs 0x00C4, 0x019D, 0x00C6.
|
||||
* fpcmoc: fix incorrect immobile handling during enrollment.
|
||||
* fpcmoc: fixed jumping to wrong state at end of custom enroll.
|
||||
* egismoc: various code cleanups.
|
||||
|
||||
2024-02-20: v1.94.7 release
|
||||
|
||||
Highlights:
|
||||
* synaptics: fix enroll identify problem after user reset database.
|
||||
* synaptics: New PIDs 0x0173, 0x0106, 0x0124.
|
||||
* goodixmoc: New PID 0x6582.
|
||||
* build: Do not require bash to build, only posix sh.
|
||||
* fp-image: Simplify minutiae detection tasks.
|
||||
* GLib 2.68 is now required to build libfprint.
|
||||
|
||||
New drivers:
|
||||
* realtek (PID 0x5813).
|
||||
* focaltech_moc (PIDs 0x9E48, 0xD979, 0xA959).
|
||||
* egismoc (PIDs 0x0582, 0x05a1).
|
||||
|
||||
2023-08-17: v1.94.6 release
|
||||
|
||||
Highlights:
|
||||
@@ -357,7 +386,7 @@ tests of the drivers using umockdev.
|
||||
- Mark fp_dscv_print functions as deprecated
|
||||
|
||||
* Udev rules:
|
||||
- Add some unsupported devices to the whitelist
|
||||
- Add some unsupported devices to the allowlist
|
||||
|
||||
2017-05-14: v0.7.0 release
|
||||
* Drivers:
|
||||
@@ -407,7 +436,7 @@ tests of the drivers using umockdev.
|
||||
- Fix possible race condition, and cancellation in uru4000 driver
|
||||
|
||||
* Udev rules:
|
||||
- Add Microsoft keyboard to the suspend blacklist
|
||||
- Add Microsoft keyboard to the suspend denylist
|
||||
|
||||
* Plenty of build fixes
|
||||
|
||||
|
||||
@@ -46,6 +46,12 @@ We include **Bozorth3** from the **[US Export Controlled]**
|
||||
distribution, which we have determined to be fine
|
||||
being shipped in an open source project.
|
||||
|
||||
## Get in *touch*
|
||||
|
||||
- [IRC] - `#fprint` @ `irc.oftc.net`
|
||||
- [Matrix] - `#fprint:matrix.org` bridged to the IRC channel
|
||||
- [MailingList] - low traffic, not much used these days
|
||||
|
||||
<br/>
|
||||
|
||||
<div align="right">
|
||||
@@ -62,6 +68,9 @@ being shipped in an open source project.
|
||||
[Unsupported]: https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices
|
||||
[Supported]: https://fprint.freedesktop.org/supported-devices.html
|
||||
[Website]: https://fprint.freedesktop.org/
|
||||
[MailingList]: https://lists.freedesktop.org/mailman/listinfo/fprint
|
||||
[IRC]: ircs://irc.oftc.net:6697/#fprint
|
||||
[Matrix]: https://matrix.to/#/#fprint:matrix.org
|
||||
|
||||
[Contribute]: ./HACKING.md
|
||||
[License]: ./COPYING
|
||||
|
||||
@@ -77,6 +77,15 @@ usb:v1C7Ap0571*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver egismoc
|
||||
usb:v1C7Ap0582*
|
||||
usb:v1C7Ap0583*
|
||||
usb:v1C7Ap0586*
|
||||
usb:v1C7Ap0587*
|
||||
usb:v1C7Ap05A1*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver elan
|
||||
usb:v04F3p0903*
|
||||
usb:v04F3p0907*
|
||||
@@ -150,6 +159,7 @@ usb:v04F3p0C88*
|
||||
usb:v04F3p0C8C*
|
||||
usb:v04F3p0C8D*
|
||||
usb:v04F3p0C99*
|
||||
usb:v04F3p0C9F*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -158,12 +168,21 @@ usb:v1C7Ap0603*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver focaltech_moc
|
||||
usb:v2808p9E48*
|
||||
usb:v2808pD979*
|
||||
usb:v2808pA959*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver fpcmoc
|
||||
usb:v10A5pFFE0*
|
||||
usb:v10A5pA305*
|
||||
usb:v10A5pDA04*
|
||||
usb:v10A5pD805*
|
||||
usb:v10A5pD205*
|
||||
usb:v10A5p9524*
|
||||
usb:v10A5p9544*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -172,6 +191,7 @@ usb:v27C6p5840*
|
||||
usb:v27C6p6014*
|
||||
usb:v27C6p6092*
|
||||
usb:v27C6p6094*
|
||||
usb:v27C6p609A*
|
||||
usb:v27C6p609C*
|
||||
usb:v27C6p60A2*
|
||||
usb:v27C6p60A4*
|
||||
@@ -186,6 +206,9 @@ usb:v27C6p63AC*
|
||||
usb:v27C6p63BC*
|
||||
usb:v27C6p63CC*
|
||||
usb:v27C6p6496*
|
||||
usb:v27C6p650A*
|
||||
usb:v27C6p650C*
|
||||
usb:v27C6p6582*
|
||||
usb:v27C6p6584*
|
||||
usb:v27C6p658C*
|
||||
usb:v27C6p6592*
|
||||
@@ -193,6 +216,7 @@ usb:v27C6p6594*
|
||||
usb:v27C6p659A*
|
||||
usb:v27C6p659C*
|
||||
usb:v27C6p6A94*
|
||||
usb:v27C6p6512*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -201,21 +225,33 @@ usb:v298Dp1010*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver realtek
|
||||
usb:v0BDAp5813*
|
||||
usb:v0BDAp5816*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
# Supported by libfprint driver synaptics
|
||||
usb:v06CBp00BD*
|
||||
usb:v06CBp00DF*
|
||||
usb:v06CBp00F9*
|
||||
usb:v06CBp00FC*
|
||||
usb:v06CBp00C2*
|
||||
usb:v06CBp00C4*
|
||||
usb:v06CBp0100*
|
||||
usb:v06CBp00F0*
|
||||
usb:v06CBp0103*
|
||||
usb:v06CBp0123*
|
||||
usb:v06CBp0124*
|
||||
usb:v06CBp0126*
|
||||
usb:v06CBp0129*
|
||||
usb:v06CBp0168*
|
||||
usb:v06CBp015F*
|
||||
usb:v06CBp0104*
|
||||
usb:v06CBp0173*
|
||||
usb:v06CBp0106*
|
||||
usb:v06CBp019D*
|
||||
usb:v06CBp00C6*
|
||||
ID_AUTOSUSPEND=1
|
||||
ID_PERSIST=0
|
||||
|
||||
@@ -284,6 +320,7 @@ usb:v138Ap0091*
|
||||
ID_PERSIST=0
|
||||
|
||||
# Known unsupported devices
|
||||
usb:v047Dp00F2*
|
||||
usb:v04E8p730B*
|
||||
usb:v04F3p036B*
|
||||
usb:v04F3p0C00*
|
||||
@@ -291,12 +328,16 @@ usb:v04F3p0C4C*
|
||||
usb:v04F3p0C57*
|
||||
usb:v04F3p0C5E*
|
||||
usb:v04F3p0C5A*
|
||||
usb:v04F3p0C6C*
|
||||
usb:v04F3p0C70*
|
||||
usb:v04F3p0C72*
|
||||
usb:v04F3p0C77*
|
||||
usb:v04F3p2706*
|
||||
usb:v04F3p3032*
|
||||
usb:v04F3p3057*
|
||||
usb:v04F3p3104*
|
||||
usb:v04F3p310D*
|
||||
usb:v04F3p3128*
|
||||
usb:v06CBp0081*
|
||||
usb:v06CBp0088*
|
||||
usb:v06CBp008A*
|
||||
@@ -307,7 +348,6 @@ usb:v06CBp00A8*
|
||||
usb:v06CBp00B7*
|
||||
usb:v06CBp00BB*
|
||||
usb:v06CBp00BE*
|
||||
usb:v06CBp00C4*
|
||||
usb:v06CBp00CB*
|
||||
usb:v06CBp00C9*
|
||||
usb:v06CBp00D8*
|
||||
@@ -326,10 +366,17 @@ usb:v0A5Cp5842*
|
||||
usb:v0A5Cp5843*
|
||||
usb:v0A5Cp5844*
|
||||
usb:v0A5Cp5845*
|
||||
usb:v0A5Cp5860*
|
||||
usb:v0A5Cp5863*
|
||||
usb:v0A5Cp5864*
|
||||
usb:v0A5Cp5865*
|
||||
usb:v0A5Cp5866*
|
||||
usb:v0A5Cp5867*
|
||||
usb:v0BDAp5812*
|
||||
usb:v10A5p0007*
|
||||
usb:v10A5p9200*
|
||||
usb:v10A5p9800*
|
||||
usb:v10A5pE340*
|
||||
usb:v1188p9545*
|
||||
usb:v138Ap0007*
|
||||
usb:v138Ap003A*
|
||||
@@ -342,12 +389,14 @@ usb:v138Ap0094*
|
||||
usb:v138Ap0097*
|
||||
usb:v138Ap009D*
|
||||
usb:v138Ap00AB*
|
||||
usb:v138Ap00A6*
|
||||
usb:v147Ep1002*
|
||||
usb:v1491p0088*
|
||||
usb:v16D1p1027*
|
||||
usb:v1C7Ap0300*
|
||||
usb:v1C7Ap0575*
|
||||
usb:v1C7Ap0576*
|
||||
usb:v1C7Ap0577*
|
||||
usb:v27C6p5042*
|
||||
usb:v27C6p5110*
|
||||
usb:v27C6p5117*
|
||||
@@ -375,6 +424,8 @@ usb:v27C6p55B4*
|
||||
usb:v27C6p5740*
|
||||
usb:v27C6p5E0A*
|
||||
usb:v27C6p581A*
|
||||
usb:v27C6p589A*
|
||||
usb:v27C6p6382*
|
||||
usb:v2808p9338*
|
||||
usb:v2808p93A9*
|
||||
usb:v298Dp2020*
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"app-id": "org.freedesktop.libfprint.Demo",
|
||||
"runtime": "org.gnome.Platform",
|
||||
"runtime-version": "42",
|
||||
"runtime-version": "master",
|
||||
"sdk": "org.gnome.Sdk",
|
||||
"command": "gtk-libfprint-test",
|
||||
"finish-args": [
|
||||
@@ -38,24 +38,24 @@
|
||||
{
|
||||
"name": "libgusb",
|
||||
"buildsystem": "meson",
|
||||
"config-opts": [ "-Dtests=false", "-Dvapi=false", "-Ddocs=false", "-Dintrospection=false" ],
|
||||
"config-opts": [ "-Dtests=false", "-Dvapi=false", "-Ddocs=false" ],
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://github.com/hughsie/libgusb/archive/0.3.0.tar.gz",
|
||||
"sha256": "b36310f8405d5fd68f6caf4a829f7ab4c627b38fd3d02a139d411fce0f3a49f1"
|
||||
"url": "https://github.com/hughsie/libgusb/releases/download/0.4.6/libgusb-0.4.6.tar.xz",
|
||||
"sha256": "1b0422bdcd72183272ac42eec9398c5a0bc48a02f618fa3242c468cbbd003049"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gudev",
|
||||
"buildsystem": "meson",
|
||||
"config-opts": [ "-Dtests=disabled", "-Dintrospection=disabled" ],
|
||||
"config-opts": [ "-Dtests=disabled", "-Dintrospection=disabled", "-Dvapi=disabled" ],
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://download.gnome.org/sources/libgudev/236/libgudev-236.tar.xz",
|
||||
"sha256": "e50369d06d594bae615eb7aeb787de304ebaad07a26d1043cef8e9c7ab7c9524"
|
||||
"url": "https://download.gnome.org/sources/libgudev/238/libgudev-238.tar.xz",
|
||||
"sha256": "61266ab1afc9d73dbc60a8b2af73e99d2fdff47d99544d085760e4fa667b5dd1"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -19,7 +19,7 @@ content_files = [
|
||||
|
||||
expand_content_files = content_files
|
||||
|
||||
glib_prefix = dependency('glib-2.0').get_pkgconfig_variable('prefix')
|
||||
glib_prefix = dependency('glib-2.0').get_variable(pkgconfig: 'prefix')
|
||||
glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html')
|
||||
docpath = join_paths(get_option('datadir'), 'gtk-doc', 'html')
|
||||
|
||||
|
||||
1629
libfprint/drivers/egismoc/egismoc.c
Normal file
1629
libfprint/drivers/egismoc/egismoc.c
Normal file
File diff suppressed because it is too large
Load Diff
223
libfprint/drivers/egismoc/egismoc.h
Normal file
223
libfprint/drivers/egismoc/egismoc.h
Normal file
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
* Driver for Egis Technology (LighTuning) Match-On-Chip sensors
|
||||
* Originally authored 2023 by Joshua Grisham <josh@joshuagrisham.com>
|
||||
*
|
||||
* Portions of code and logic inspired from the elanmoc libfprint driver
|
||||
* which is copyright (C) 2021 Elan Microelectronics Inc (see elanmoc.c)
|
||||
*
|
||||
* Based on original reverse-engineering work by Joshua Grisham. The protocol has
|
||||
* been reverse-engineered from captures of the official Windows driver, and by
|
||||
* testing commands on the sensor with a multiplatform Python prototype driver:
|
||||
* https://github.com/joshuagrisham/galaxy-book2-pro-linux/tree/main/fingerprint/
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "fpi-device.h"
|
||||
#include "fpi-ssm.h"
|
||||
|
||||
G_DECLARE_FINAL_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FPI, DEVICE_EGISMOC, FpDevice)
|
||||
|
||||
#define EGISMOC_DRIVER_FULLNAME "Egis Technology (LighTuning) Match-on-Chip"
|
||||
|
||||
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 (1 << 0)
|
||||
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE2 (1 << 1)
|
||||
#define EGISMOC_DRIVER_MAX_ENROLL_STAGES_20 (1 << 2)
|
||||
|
||||
#define EGISMOC_EP_CMD_OUT (0x02 | FPI_USB_ENDPOINT_OUT)
|
||||
#define EGISMOC_EP_CMD_IN (0x81 | FPI_USB_ENDPOINT_IN)
|
||||
#define EGISMOC_EP_CMD_INTERRUPT_IN 0x83
|
||||
|
||||
#define EGISMOC_USB_CONTROL_TIMEOUT 5000
|
||||
#define EGISMOC_USB_SEND_TIMEOUT 5000
|
||||
#define EGISMOC_USB_RECV_TIMEOUT 5000
|
||||
#define EGISMOC_USB_INTERRUPT_TIMEOUT 60000
|
||||
|
||||
#define EGISMOC_USB_IN_RECV_LENGTH 4096
|
||||
#define EGISMOC_USB_INTERRUPT_IN_RECV_LENGTH 64
|
||||
|
||||
#define EGISMOC_MAX_ENROLL_STAGES_DEFAULT 10
|
||||
#define EGISMOC_MAX_ENROLL_NUM 10
|
||||
#define EGISMOC_FINGERPRINT_DATA_SIZE 32
|
||||
#define EGISMOC_LIST_RESPONSE_PREFIX_SIZE 14
|
||||
#define EGISMOC_LIST_RESPONSE_SUFFIX_SIZE 2
|
||||
|
||||
/* standard prefixes for all read/writes */
|
||||
|
||||
static guchar egismoc_write_prefix[] = {'E', 'G', 'I', 'S', 0x00, 0x00, 0x00, 0x01};
|
||||
static gsize egismoc_write_prefix_len = sizeof (egismoc_write_prefix) / sizeof (egismoc_write_prefix[0]);
|
||||
|
||||
static guchar egismoc_read_prefix[] = {'S', 'I', 'G', 'E', 0x00, 0x00, 0x00, 0x01};
|
||||
static gsize egismoc_read_prefix_len = sizeof (egismoc_read_prefix) / sizeof (egismoc_read_prefix[0]);
|
||||
|
||||
|
||||
/* hard-coded command payloads */
|
||||
|
||||
static guchar cmd_fw_version[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x0c};
|
||||
static gsize cmd_fw_version_len = sizeof (cmd_fw_version) / sizeof (cmd_fw_version[0]);
|
||||
static guchar rsp_fw_version_suffix[] = {0x90, 0x00};
|
||||
static gsize rsp_fw_version_suffix_len = sizeof (rsp_fw_version_suffix) / sizeof (rsp_fw_version_suffix[0]);
|
||||
|
||||
static guchar cmd_list[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x19, 0x04, 0x00, 0x00, 0x01, 0x40};
|
||||
static gsize cmd_list_len = sizeof (cmd_list) / sizeof (cmd_list[0]);
|
||||
|
||||
static guchar cmd_sensor_reset[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x1a, 0x00, 0x00};
|
||||
static gsize cmd_sensor_reset_len = sizeof (cmd_sensor_reset) / sizeof (cmd_sensor_reset[0]);
|
||||
|
||||
static guchar cmd_sensor_check[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x17, 0x02, 0x00};
|
||||
static gsize cmd_sensor_check_len = sizeof (cmd_sensor_check) / sizeof (cmd_sensor_check[0]);
|
||||
|
||||
static guchar cmd_sensor_identify[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x17, 0x01, 0x01};
|
||||
static gsize cmd_sensor_identify_len = sizeof (cmd_sensor_identify) / sizeof (cmd_sensor_identify[0]);
|
||||
static guchar rsp_identify_match_suffix[] = {0x90, 0x00};
|
||||
static gsize rsp_identify_match_suffix_len = sizeof (rsp_identify_match_suffix) / sizeof (rsp_identify_match_suffix[0]);
|
||||
static guchar rsp_identify_notmatch_suffix[] = {0x90, 0x04};
|
||||
static gsize rsp_identify_notmatch_suffix_len = sizeof (rsp_identify_notmatch_suffix) / sizeof (rsp_identify_notmatch_suffix[0]);
|
||||
|
||||
static guchar cmd_sensor_enroll[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x17, 0x01, 0x00};
|
||||
static gsize cmd_sensor_enroll_len = sizeof (cmd_sensor_enroll) / sizeof (cmd_sensor_enroll[0]);
|
||||
|
||||
static guchar cmd_enroll_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x01, 0x00, 0x00, 0x00, 0x20};
|
||||
static gsize cmd_enroll_starting_len = sizeof (cmd_enroll_starting) / sizeof (cmd_enroll_starting[0]);
|
||||
|
||||
static guchar cmd_sensor_start_capture[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x16, 0x02, 0x01};
|
||||
static gsize cmd_sensor_start_capture_len = sizeof (cmd_sensor_start_capture) / sizeof (cmd_sensor_start_capture[0]);
|
||||
|
||||
static guchar cmd_read_capture[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x02, 0x02, 0x00, 0x00, 0x02};
|
||||
static gsize cmd_read_capture_len = sizeof (cmd_read_capture) / sizeof (cmd_read_capture[0]);
|
||||
static guchar rsp_read_success_prefix[] = {0x00, 0x00, 0x00, 0x04};
|
||||
static gsize rsp_read_success_prefix_len = sizeof (rsp_read_success_prefix) / sizeof (rsp_read_success_prefix[0]);
|
||||
static guchar rsp_read_success_suffix[] = {0x90, 0x00};
|
||||
static gsize rsp_read_success_suffix_len = sizeof (rsp_read_success_suffix) / sizeof (rsp_read_success_suffix[0]);
|
||||
static guchar rsp_read_offcenter_prefix[] = {0x00, 0x00, 0x00, 0x04};
|
||||
static gsize rsp_read_offcenter_prefix_len = sizeof (rsp_read_offcenter_prefix) / sizeof (rsp_read_offcenter_prefix[0]);
|
||||
static guchar rsp_read_offcenter_suffix[] = {0x64, 0x91};
|
||||
static gsize rsp_read_offcenter_suffix_len = sizeof (rsp_read_offcenter_suffix) / sizeof (rsp_read_offcenter_suffix[0]);
|
||||
static guchar rsp_read_dirty_prefix[] = {0x00, 0x00, 0x00, 0x02, 0x64};
|
||||
static gsize rsp_read_dirty_prefix_len = sizeof (rsp_read_dirty_prefix) / sizeof (rsp_read_dirty_prefix[0]);
|
||||
|
||||
static guchar cmd_commit_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x05, 0x00, 0x00, 0x00, 0x20};
|
||||
static gsize cmd_commit_starting_len = sizeof (cmd_commit_starting) / sizeof (cmd_commit_starting[0]);
|
||||
|
||||
|
||||
/* commands which exist on the device but are currently not used */
|
||||
/*
|
||||
static guchar cmd_sensor_cancel[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x16, 0x04, 0x00};
|
||||
static gsize cmd_sensor_cancel_len = sizeof(cmd_sensor_cancel) / sizeof(cmd_sensor_cancel[0]);
|
||||
|
||||
static guchar cmd_sensor_verify[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x04, 0x01, 0x00};
|
||||
static gsize cmd_sensor_verify_len = sizeof(cmd_sensor_verify) / sizeof(cmd_sensor_verify[0]);
|
||||
|
||||
static guchar cmd_read_verify[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x04, 0x02, 0x00};
|
||||
static gsize cmd_read_verify_len = sizeof(cmd_read_verify) / sizeof(cmd_read_verify[0]);
|
||||
*/
|
||||
|
||||
|
||||
/* prefixes/suffixes and other things for dynamically created command payloads */
|
||||
|
||||
#define EGISMOC_CHECK_BYTES_LENGTH 2
|
||||
#define EGISMOC_IDENTIFY_RESPONSE_PRINT_ID_OFFSET 46
|
||||
#define EGISMOC_CMD_CHECK_SEPARATOR_LENGTH 32
|
||||
|
||||
static guchar cmd_new_print_prefix[] = {0x00, 0x00, 0x00, 0x27, 0x50, 0x16, 0x03, 0x00, 0x00, 0x00, 0x20};
|
||||
static gsize cmd_new_print_prefix_len = sizeof (cmd_new_print_prefix) / sizeof (cmd_new_print_prefix[0]);
|
||||
|
||||
static guchar cmd_delete_prefix[] = {0x50, 0x18, 0x04, 0x00, 0x00};
|
||||
static gsize cmd_delete_prefix_len = sizeof (cmd_delete_prefix) / sizeof (cmd_delete_prefix[0]);
|
||||
static guchar rsp_delete_success_prefix[] = {0x00, 0x00, 0x00, 0x02, 0x90, 0x00};
|
||||
static gsize rsp_delete_success_prefix_len = sizeof (rsp_delete_success_prefix) / sizeof (rsp_delete_success_prefix[0]);
|
||||
|
||||
static guchar cmd_check_prefix_type1[] = {0x50, 0x17, 0x03, 0x00, 0x00};
|
||||
static gsize cmd_check_prefix_type1_len = sizeof (cmd_check_prefix_type1) / sizeof (cmd_check_prefix_type1[0]);
|
||||
static guchar cmd_check_prefix_type2[] = {0x50, 0x17, 0x03, 0x80, 0x00};
|
||||
static gsize cmd_check_prefix_type2_len = sizeof (cmd_check_prefix_type2) / sizeof (cmd_check_prefix_type2[0]);
|
||||
static guchar cmd_check_suffix[] = {0x00, 0x40};
|
||||
static gsize cmd_check_suffix_len = sizeof (cmd_check_suffix) / sizeof (cmd_check_suffix[0]);
|
||||
static guchar rsp_check_not_yet_enrolled_suffix[] = {0x90, 0x04};
|
||||
static gsize rsp_check_not_yet_enrolled_suffix_len = sizeof (rsp_check_not_yet_enrolled_suffix) / sizeof (rsp_check_not_yet_enrolled_suffix[0]);
|
||||
|
||||
|
||||
/* SSM task states and various status enums */
|
||||
|
||||
typedef enum {
|
||||
CMD_SEND,
|
||||
CMD_GET,
|
||||
CMD_STATES,
|
||||
} CommandStates;
|
||||
|
||||
typedef enum {
|
||||
DEV_INIT_CONTROL1,
|
||||
DEV_INIT_CONTROL2,
|
||||
DEV_INIT_CONTROL3,
|
||||
DEV_INIT_CONTROL4,
|
||||
DEV_INIT_CONTROL5,
|
||||
DEV_GET_FW_VERSION,
|
||||
DEV_INIT_STATES,
|
||||
} DeviceInitStates;
|
||||
|
||||
typedef enum {
|
||||
IDENTIFY_GET_ENROLLED_IDS,
|
||||
IDENTIFY_CHECK_ENROLLED_NUM,
|
||||
IDENTIFY_SENSOR_RESET,
|
||||
IDENTIFY_SENSOR_IDENTIFY,
|
||||
IDENTIFY_WAIT_FINGER,
|
||||
IDENTIFY_SENSOR_CHECK,
|
||||
IDENTIFY_CHECK,
|
||||
IDENTIFY_COMPLETE_SENSOR_RESET,
|
||||
IDENTIFY_COMPLETE,
|
||||
IDENTIFY_STATES,
|
||||
} IdentifyStates;
|
||||
|
||||
typedef enum {
|
||||
ENROLL_GET_ENROLLED_IDS,
|
||||
ENROLL_CHECK_ENROLLED_NUM,
|
||||
ENROLL_SENSOR_RESET,
|
||||
ENROLL_SENSOR_ENROLL,
|
||||
ENROLL_WAIT_FINGER,
|
||||
ENROLL_SENSOR_CHECK,
|
||||
ENROLL_CHECK,
|
||||
ENROLL_START,
|
||||
ENROLL_CAPTURE_SENSOR_RESET,
|
||||
ENROLL_CAPTURE_SENSOR_START_CAPTURE,
|
||||
ENROLL_CAPTURE_WAIT_FINGER,
|
||||
ENROLL_CAPTURE_READ_RESPONSE,
|
||||
ENROLL_COMMIT_START,
|
||||
ENROLL_COMMIT,
|
||||
ENROLL_COMMIT_SENSOR_RESET,
|
||||
ENROLL_COMPLETE,
|
||||
ENROLL_STATES,
|
||||
} EnrollStates;
|
||||
|
||||
typedef enum {
|
||||
ENROLL_STATUS_DEVICE_FULL,
|
||||
ENROLL_STATUS_DUPLICATE,
|
||||
ENROLL_STATUS_PARTIAL_OK,
|
||||
ENROLL_STATUS_RETRY,
|
||||
ENROLL_STATUS_COMPLETE,
|
||||
} EnrollStatus;
|
||||
|
||||
typedef enum {
|
||||
LIST_GET_ENROLLED_IDS,
|
||||
LIST_RETURN_ENROLLED_PRINTS,
|
||||
LIST_STATES,
|
||||
} ListStates;
|
||||
|
||||
typedef enum {
|
||||
DELETE_GET_ENROLLED_IDS,
|
||||
DELETE_DELETE,
|
||||
DELETE_STATES,
|
||||
} DeleteStates;
|
||||
@@ -32,6 +32,7 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x04f3, .pid = 0x0c8c, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c8d, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c99, },
|
||||
{ .vid = 0x04f3, .pid = 0x0c9f, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
@@ -50,9 +51,9 @@ elanmoc_compose_cmd (
|
||||
const struct elanmoc_cmd *cmd_info
|
||||
)
|
||||
{
|
||||
g_autofree char *cmd_buf = NULL;
|
||||
g_autofree uint8_t *cmd_buf = NULL;
|
||||
|
||||
cmd_buf = g_malloc0 (cmd_info->cmd_len);
|
||||
cmd_buf = g_new0 (uint8_t, cmd_info->cmd_len);
|
||||
if(cmd_info->cmd_len < ELAN_MAX_HDR_LEN)
|
||||
memcpy (cmd_buf, &cmd_info->cmd_header, cmd_info->cmd_len);
|
||||
else
|
||||
|
||||
1875
libfprint/drivers/focaltech_moc/focaltech_moc.c
Normal file
1875
libfprint/drivers/focaltech_moc/focaltech_moc.c
Normal file
File diff suppressed because it is too large
Load Diff
52
libfprint/drivers/focaltech_moc/focaltech_moc.h
Normal file
52
libfprint/drivers/focaltech_moc/focaltech_moc.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (C) 2021 Focaltech Microelectronics
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "fpi-device.h"
|
||||
#include "fpi-ssm.h"
|
||||
#include <libusb.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
G_DECLARE_FINAL_TYPE (FpiDeviceFocaltechMoc, fpi_device_focaltech_moc, FPI, DEVICE_FOCALTECH_MOC, FpDevice)
|
||||
|
||||
#define FOCALTECH_MOC_DRIVER_FULLNAME "Focaltech MOC Sensors"
|
||||
|
||||
#define FOCALTECH_MOC_CMD_TIMEOUT 1000
|
||||
#define FOCALTECH_MOC_MAX_FINGERS 10
|
||||
#define FOCALTECH_MOC_UID_PREFIX_LENGTH 8
|
||||
#define FOCALTECH_MOC_USER_ID_LENGTH 64
|
||||
|
||||
typedef void (*FocaltechCmdMsgCallback) (FpiDeviceFocaltechMoc *self,
|
||||
GError *error);
|
||||
|
||||
struct _FpiDeviceFocaltechMoc
|
||||
{
|
||||
FpDevice parent;
|
||||
FpiSsm *task_ssm;
|
||||
FpiSsm *cmd_ssm;
|
||||
FpiUsbTransfer *cmd_transfer;
|
||||
gboolean cmd_cancelable;
|
||||
gsize cmd_len_in;
|
||||
int num_frames;
|
||||
int delete_slot;
|
||||
guint8 bulk_in_ep;
|
||||
guint8 bulk_out_ep;
|
||||
};
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#define FP_COMPONENT "fpcmoc"
|
||||
#define MAX_ENROLL_SAMPLES (25)
|
||||
#define CTRL_TIMEOUT (1000)
|
||||
#define CTRL_TIMEOUT (2000)
|
||||
#define DATA_TIMEOUT (5000)
|
||||
|
||||
/* Usb port setting */
|
||||
@@ -68,6 +68,8 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x10A5, .pid = 0xDA04, },
|
||||
{ .vid = 0x10A5, .pid = 0xD805, },
|
||||
{ .vid = 0x10A5, .pid = 0xD205, },
|
||||
{ .vid = 0x10A5, .pid = 0x9524, },
|
||||
{ .vid = 0x10A5, .pid = 0x9544, },
|
||||
/* terminating entry */
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 },
|
||||
};
|
||||
@@ -269,6 +271,7 @@ fpc_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
||||
FpiDeviceFpcMoc *self = FPI_DEVICE_FPCMOC (dev);
|
||||
CommandData *data = fpi_ssm_get_data (ssm);
|
||||
|
||||
self->cmd_ssm = NULL;
|
||||
/* Notify about the SSM failure from here instead. */
|
||||
if (error)
|
||||
{
|
||||
@@ -276,8 +279,6 @@ fpc_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
||||
if (data->callback)
|
||||
data->callback (self, NULL, error);
|
||||
}
|
||||
|
||||
self->cmd_ssm = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -388,7 +389,7 @@ fpc_dev_release_interface (FpiDeviceFpcMoc *self,
|
||||
}
|
||||
|
||||
/* Notify close complete */
|
||||
fpi_device_close_complete (FP_DEVICE (self), release_error);
|
||||
fpi_device_close_complete (FP_DEVICE (self), g_steal_pointer (&release_error));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -446,10 +447,16 @@ fpc_evt_cb (FpiDeviceFpcMoc *self,
|
||||
break;
|
||||
|
||||
case FPC_EVT_FINGER_DWN:
|
||||
fp_dbg ("%s Got finger down event", G_STRFUNC);
|
||||
fp_dbg ("%s Got finger down event (%d)", G_STRFUNC, presp->evt_hdr.status);
|
||||
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
||||
FP_FINGER_STATUS_PRESENT,
|
||||
FP_FINGER_STATUS_NONE);
|
||||
if (presp->evt_hdr.status != 0)
|
||||
{
|
||||
/* Redo the current task state if capture failed */
|
||||
fpi_ssm_jump_to_state (self->task_ssm, fpi_ssm_get_cur_state (self->task_ssm));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case FPC_EVT_IMG:
|
||||
@@ -742,15 +749,22 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
|
||||
/* here should tips remove finger and try again */
|
||||
if (self->max_immobile_stage)
|
||||
{
|
||||
if (self->immobile_stage >= self->max_immobile_stage)
|
||||
self->immobile_stage++;
|
||||
if (self->immobile_stage > self->max_immobile_stage)
|
||||
{
|
||||
fp_dbg ("Skip similar handle due to customer enrollment %d(%d)",
|
||||
self->immobile_stage, self->max_immobile_stage);
|
||||
/* Skip too similar handle, treat as normal enroll progress. */
|
||||
fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROL_STATUS_PROGRESS);
|
||||
self->enroll_stage++;
|
||||
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
|
||||
/* Used for customer enrollment scheme */
|
||||
if (self->enroll_stage >= (self->max_enroll_stage - self->max_immobile_stage))
|
||||
{
|
||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_COMPLETE);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
self->immobile_stage++;
|
||||
}
|
||||
fpi_device_enroll_progress (FP_DEVICE (self),
|
||||
self->enroll_stage,
|
||||
@@ -763,7 +777,10 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
|
||||
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
|
||||
/* Used for customer enrollment scheme */
|
||||
if (self->enroll_stage >= (self->max_enroll_stage - self->max_immobile_stage))
|
||||
{
|
||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_COMPLETE);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case FPC_ENROL_STATUS_IMAGE_LOW_COVERAGE:
|
||||
@@ -1623,6 +1640,8 @@ fpc_dev_probe (FpDevice *device)
|
||||
case 0xD805:
|
||||
case 0xDA04:
|
||||
case 0xD205:
|
||||
case 0x9524:
|
||||
case 0x9544:
|
||||
self->max_enroll_stage = MAX_ENROLL_SAMPLES;
|
||||
break;
|
||||
|
||||
|
||||
@@ -1363,6 +1363,7 @@ gx_fp_probe (FpDevice *device)
|
||||
case 0x6014:
|
||||
case 0x6092:
|
||||
case 0x6094:
|
||||
case 0x609A:
|
||||
case 0x609C:
|
||||
case 0x60BC:
|
||||
case 0x6304:
|
||||
@@ -1374,6 +1375,9 @@ gx_fp_probe (FpDevice *device)
|
||||
case 0x63AC:
|
||||
case 0x63BC:
|
||||
case 0x63CC:
|
||||
case 0x650A:
|
||||
case 0x650C:
|
||||
case 0x6582:
|
||||
case 0x6A94:
|
||||
case 0x659A:
|
||||
self->max_enroll_stage = 12;
|
||||
@@ -1609,6 +1613,7 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x27c6, .pid = 0x6014, },
|
||||
{ .vid = 0x27c6, .pid = 0x6092, },
|
||||
{ .vid = 0x27c6, .pid = 0x6094, },
|
||||
{ .vid = 0x27c6, .pid = 0x609A, },
|
||||
{ .vid = 0x27c6, .pid = 0x609C, },
|
||||
{ .vid = 0x27c6, .pid = 0x60A2, },
|
||||
{ .vid = 0x27c6, .pid = 0x60A4, },
|
||||
@@ -1623,6 +1628,9 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x27c6, .pid = 0x63BC, },
|
||||
{ .vid = 0x27c6, .pid = 0x63CC, },
|
||||
{ .vid = 0x27c6, .pid = 0x6496, },
|
||||
{ .vid = 0x27c6, .pid = 0x650A, },
|
||||
{ .vid = 0x27c6, .pid = 0x650C, },
|
||||
{ .vid = 0x27c6, .pid = 0x6582, },
|
||||
{ .vid = 0x27c6, .pid = 0x6584, },
|
||||
{ .vid = 0x27c6, .pid = 0x658C, },
|
||||
{ .vid = 0x27c6, .pid = 0x6592, },
|
||||
@@ -1630,6 +1638,7 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = 0x27c6, .pid = 0x659A, },
|
||||
{ .vid = 0x27c6, .pid = 0x659C, },
|
||||
{ .vid = 0x27c6, .pid = 0x6A94, },
|
||||
{ .vid = 0x27c6, .pid = 0x6512, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
|
||||
1385
libfprint/drivers/realtek/realtek.c
Normal file
1385
libfprint/drivers/realtek/realtek.c
Normal file
File diff suppressed because it is too large
Load Diff
246
libfprint/drivers/realtek/realtek.h
Normal file
246
libfprint/drivers/realtek/realtek.h
Normal file
@@ -0,0 +1,246 @@
|
||||
/*
|
||||
* Copyright (C) 2022-2023 Realtek Corp.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "fpi-device.h"
|
||||
#include "fpi-ssm.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define EP_IN (2 | FPI_USB_ENDPOINT_IN)
|
||||
#define EP_OUT (1 | FPI_USB_ENDPOINT_OUT)
|
||||
|
||||
#define EP_IN_MAX_BUF_SIZE 2048
|
||||
|
||||
#define FP_RTK_CMD_BULK_TOTAL_LEN 12
|
||||
#define FP_RTK_CMD_BULK_LEN 2
|
||||
#define FP_RTK_CMD_BULK_PARAM_LEN 4
|
||||
#define FP_RTK_CMD_BULK_ADDR_LEN 4
|
||||
#define FP_RTK_CMD_BULK_DATA_LEN 2
|
||||
|
||||
#define TEMPLATE_LEN_COMMON 35
|
||||
|
||||
#define SUBFACTOR_OFFSET 2
|
||||
#define UID_OFFSET 3
|
||||
#define UID_PAYLOAD_LEN_DEFAULT 32
|
||||
|
||||
/* Command transfer timeout :ms*/
|
||||
#define CMD_TIMEOUT 1000
|
||||
#define DATA_TIMEOUT 5000
|
||||
#define STATUS_TIMEOUT 2000
|
||||
|
||||
#define MAX_ENROLL_SAMPLES 8
|
||||
#define DEFAULT_UID_LEN 28
|
||||
#define SUB_FINGER_01 0xFF
|
||||
|
||||
#define GET_BULK_CMD_TYPE(val) ((val & 0xC0) >> 6)
|
||||
#define GET_TRANS_DATA_LEN(len_h, len_l) ((len_h << 8) | len_l)
|
||||
#define GET_LEN_L(total_data_len) ((total_data_len) & 0xff)
|
||||
#define GET_LEN_H(total_data_len) ((total_data_len) >> 8)
|
||||
|
||||
G_DECLARE_FINAL_TYPE (FpiDeviceRealtek, fpi_device_realtek, FPI, DEVICE_REALTEK, FpDevice)
|
||||
|
||||
typedef void (*SynCmdMsgCallback) (FpiDeviceRealtek *self,
|
||||
uint8_t *buffer_in,
|
||||
GError *error);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
SynCmdMsgCallback callback;
|
||||
} CommandData;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_CMD_BULK_ONLY = 0,
|
||||
FP_RTK_CMD_BULK_READ,
|
||||
FP_RTK_CMD_BULK_WRITE,
|
||||
} FpRtkCmdType;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_MSG_DEFAULT = 0,
|
||||
FP_RTK_MSG_NO_STATUS,
|
||||
} FpRtkMsgType;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_PURPOSE_VERIFY = 0x01,
|
||||
FP_RTK_PURPOSE_IDENTIFY = 0x02,
|
||||
FP_RTK_PURPOSE_ENROLL = 0x04,
|
||||
} FpRtkPurpose;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_SUCCESS = 0x0,
|
||||
FP_RTK_TOO_HIGH,
|
||||
FP_RTK_TOO_LOW,
|
||||
FP_RTK_TOO_LEFT,
|
||||
FP_RTK_TOO_RIGHT,
|
||||
FP_RTK_TOO_FAST,
|
||||
FP_RTK_TOO_SLOW,
|
||||
FP_RTK_POOR_QUALITY,
|
||||
FP_RTK_TOO_SKEWED,
|
||||
FP_RTK_TOO_SHORT,
|
||||
FP_RTK_MERGE_FAILURE,
|
||||
FP_RTK_MATCH_FAIL,
|
||||
FP_RTK_CMD_ERR,
|
||||
} FpRtkInStatus;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_ENROLL_GET_TEMPLATE = 0,
|
||||
FP_RTK_ENROLL_BEGIN_POS,
|
||||
FP_RTK_ENROLL_CAPTURE,
|
||||
FP_RTK_ENROLL_FINISH_CAPTURE,
|
||||
FP_RTK_ENROLL_ACCEPT_SAMPLE,
|
||||
FP_RTK_ENROLL_CHECK_DUPLICATE,
|
||||
FP_RTK_ENROLL_COMMIT,
|
||||
FP_RTK_ENROLL_CANCEL_CAPTURE,
|
||||
FP_RTK_ENROLL_NUM_STATES,
|
||||
} FpRtkEnrollState;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_VERIFY_GET_TEMPLATE = 0,
|
||||
FP_RTK_VERIFY_CAPTURE,
|
||||
FP_RTK_VERIFY_FINISH_CAPTURE,
|
||||
FP_RTK_VERIFY_ACCEPT_SAMPLE,
|
||||
FP_RTK_VERIFY_INDENTIFY_FEATURE,
|
||||
FP_RTK_VERIFY_UPDATE_TEMPLATE,
|
||||
FP_RTK_VERIFY_CANCEL_CAPTURE,
|
||||
FP_RTK_VERIFY_NUM_STATES,
|
||||
} FpRtkVerifyState;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_DELETE_GET_POS = 0,
|
||||
FP_RTK_DELETE_PRINT,
|
||||
FP_RTK_DELETE_NUM_STATES,
|
||||
} FpRtkDeleteState;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_INIT_GET_DEVICE_INFO = 0,
|
||||
FP_RTK_INIT_SELECT_OS,
|
||||
FP_RTK_INIT_GET_ENROLL_NUM,
|
||||
FP_RTK_INIT_NUM_STATES,
|
||||
} FpRtkInitState;
|
||||
|
||||
typedef enum {
|
||||
FP_RTK_CMD_SEND = 0,
|
||||
FP_RTK_CMD_TRANS_DATA,
|
||||
FP_RTK_CMD_GET_STATUS,
|
||||
FP_RTK_CMD_NUM_STATES,
|
||||
} FpRtkCmdState;
|
||||
|
||||
struct _FpiDeviceRealtek
|
||||
{
|
||||
FpDevice parent;
|
||||
FpiSsm *task_ssm;
|
||||
FpiSsm *cmd_ssm;
|
||||
FpiUsbTransfer *cmd_transfer;
|
||||
FpiUsbTransfer *data_transfer;
|
||||
gint cmd_type;
|
||||
FpRtkMsgType message_type;
|
||||
gboolean cmd_cancellable;
|
||||
gint enroll_stage;
|
||||
gint max_enroll_stage;
|
||||
guchar *read_data;
|
||||
gsize trans_data_len;
|
||||
FpRtkPurpose fp_purpose;
|
||||
gint pos_index;
|
||||
gint template_num;
|
||||
gint template_len;
|
||||
};
|
||||
|
||||
struct rtk_cmd_bulk
|
||||
{
|
||||
uint8_t cmd[FP_RTK_CMD_BULK_LEN];
|
||||
uint8_t param[FP_RTK_CMD_BULK_PARAM_LEN];
|
||||
uint8_t addr[FP_RTK_CMD_BULK_ADDR_LEN];
|
||||
uint8_t data_len[FP_RTK_CMD_BULK_DATA_LEN];
|
||||
};
|
||||
|
||||
struct rtk_cmd_ctrl
|
||||
{
|
||||
int direction;
|
||||
uint8_t request;
|
||||
uint16_t value;
|
||||
uint16_t index;
|
||||
uint16_t len;
|
||||
};
|
||||
|
||||
static struct rtk_cmd_ctrl get_device_info = {
|
||||
.direction = G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST,
|
||||
.request = 0x07,
|
||||
.value = 0x000D,
|
||||
.index = 0x0000,
|
||||
.len = 0x0008,
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_start_capture = {
|
||||
.cmd = {0x05, 0x05},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_finish_capture = {
|
||||
.cmd = {0x45, 0x06},
|
||||
.data_len = {0x05},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_accept_sample = {
|
||||
.cmd = {0x45, 0x08},
|
||||
.data_len = {0x09},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk nor_identify_feature = {
|
||||
.cmd = {0x45, 0x22},
|
||||
.data_len = {0x2A},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_get_enroll_num = {
|
||||
.cmd = {0x45, 0x0d},
|
||||
.data_len = {0x02},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_get_template = {
|
||||
.cmd = {0x45, 0x0E},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk nor_enroll_begin = {
|
||||
.cmd = {0x05, 0x20},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_check_duplicate = {
|
||||
.cmd = {0x45, 0x10},
|
||||
.data_len = {0x22},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk nor_enroll_commit = {
|
||||
.cmd = {0x85, 0x21},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_update_template = {
|
||||
.cmd = {0x05, 0x11},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_delete_record = {
|
||||
.cmd = {0x05, 0x0F},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_select_system = {
|
||||
.cmd = {0x05, 0x13},
|
||||
};
|
||||
|
||||
static struct rtk_cmd_bulk co_cancel_capture = {
|
||||
.cmd = {0x05, 0x07},
|
||||
};
|
||||
@@ -36,15 +36,21 @@ static const FpIdEntry id_table[] = {
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F9, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00FC, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C2, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C4, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x015F, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0104, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019D, },
|
||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C6, },
|
||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||
};
|
||||
|
||||
@@ -106,6 +112,10 @@ cmd_receive_cb (FpiUsbTransfer *transfer,
|
||||
|
||||
if (self->cmd_complete_on_removal)
|
||||
{
|
||||
if (self->delay_error)
|
||||
fpi_ssm_mark_failed (transfer->ssm,
|
||||
g_steal_pointer (&self->delay_error));
|
||||
else
|
||||
fpi_ssm_mark_completed (transfer->ssm);
|
||||
return;
|
||||
}
|
||||
@@ -641,18 +651,21 @@ verify (FpDevice *device)
|
||||
}
|
||||
|
||||
static void
|
||||
identify_complete_after_finger_removal (FpiDeviceSynaptics *self)
|
||||
identify_complete_after_finger_removal (FpiDeviceSynaptics *self, GError *error)
|
||||
{
|
||||
FpDevice *device = FP_DEVICE (self);
|
||||
|
||||
if (self->finger_on_sensor)
|
||||
{
|
||||
fp_dbg ("delaying identify report until after finger removal!");
|
||||
if (error)
|
||||
g_propagate_error (&self->delay_error, error);
|
||||
|
||||
self->cmd_complete_on_removal = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
fpi_device_identify_complete (device, NULL);
|
||||
fpi_device_identify_complete (device, error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -702,19 +715,18 @@ identify_msg_cb (FpiDeviceSynaptics *self,
|
||||
fp_info ("Match error occurred");
|
||||
fpi_device_identify_report (device, NULL, NULL,
|
||||
fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL));
|
||||
identify_complete_after_finger_removal (self);
|
||||
identify_complete_after_finger_removal (self, NULL);
|
||||
}
|
||||
else if (resp->result == BMKT_FP_NO_MATCH)
|
||||
{
|
||||
fp_info ("Print didn't match");
|
||||
fpi_device_identify_report (device, NULL, NULL, NULL);
|
||||
identify_complete_after_finger_removal (self);
|
||||
identify_complete_after_finger_removal (self, NULL);
|
||||
}
|
||||
else if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS)
|
||||
else if (resp->result == BMKT_FP_DATABASE_NO_RECORD_EXISTS || resp->result == BMKT_FP_DATABASE_EMPTY)
|
||||
{
|
||||
fp_info ("Print is not in database");
|
||||
fpi_device_identify_complete (device,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND));
|
||||
identify_complete_after_finger_removal (self, fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -750,7 +762,7 @@ identify_msg_cb (FpiDeviceSynaptics *self,
|
||||
else
|
||||
fpi_device_identify_report (device, NULL, print, NULL);
|
||||
|
||||
identify_complete_after_finger_removal (self);
|
||||
identify_complete_after_finger_removal (self, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,4 +127,5 @@ struct _FpiDeviceSynaptics
|
||||
|
||||
struct syna_enroll_resp_data enroll_resp_data;
|
||||
syna_state_t state;
|
||||
GError *delay_error;
|
||||
};
|
||||
|
||||
@@ -67,32 +67,26 @@ enum {
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static const char *
|
||||
get_drivers_whitelist_env (void)
|
||||
get_drivers_allowlist_env (void)
|
||||
{
|
||||
return g_getenv ("FP_DRIVERS_WHITELIST");
|
||||
return g_getenv ("FP_DRIVERS_ALLOWLIST");
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_driver_allowed (const gchar *driver)
|
||||
{
|
||||
g_auto(GStrv) whitelisted_drivers = NULL;
|
||||
const char *fp_drivers_whitelist_env;
|
||||
int i;
|
||||
g_auto(GStrv) allowlisted_drivers = NULL;
|
||||
const char *fp_drivers_allowlist_env;
|
||||
|
||||
g_return_val_if_fail (driver, TRUE);
|
||||
|
||||
fp_drivers_whitelist_env = get_drivers_whitelist_env ();
|
||||
fp_drivers_allowlist_env = get_drivers_allowlist_env ();
|
||||
|
||||
if (!fp_drivers_whitelist_env)
|
||||
if (!fp_drivers_allowlist_env)
|
||||
return TRUE;
|
||||
|
||||
whitelisted_drivers = g_strsplit (fp_drivers_whitelist_env, ":", -1);
|
||||
|
||||
for (i = 0; whitelisted_drivers[i]; ++i)
|
||||
if (g_strcmp0 (driver, whitelisted_drivers[i]) == 0)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
allowlisted_drivers = g_strsplit (fp_drivers_allowlist_env, ":", -1);
|
||||
return g_strv_contains ((const gchar * const *) allowlisted_drivers, driver);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
@@ -364,7 +358,7 @@ fp_context_init (FpContext *self)
|
||||
|
||||
priv->drivers = fpi_get_driver_types ();
|
||||
|
||||
if (get_drivers_whitelist_env ())
|
||||
if (get_drivers_allowlist_env ())
|
||||
{
|
||||
for (i = 0; i < priv->drivers->len;)
|
||||
{
|
||||
|
||||
@@ -44,7 +44,7 @@ typedef struct
|
||||
FpDeviceType type;
|
||||
|
||||
GUsbDevice *usb_device;
|
||||
const gchar *virtual_env;
|
||||
gchar *virtual_env;
|
||||
struct
|
||||
{
|
||||
gchar *spidev_path;
|
||||
|
||||
@@ -292,14 +292,14 @@ fp_device_get_property (GObject *object,
|
||||
|
||||
case PROP_FPI_UDEV_DATA_SPIDEV:
|
||||
if (cls->type == FP_DEVICE_TYPE_UDEV)
|
||||
g_value_set_string (value, g_strdup (priv->udev_data.spidev_path));
|
||||
g_value_set_string (value, priv->udev_data.spidev_path);
|
||||
else
|
||||
g_value_set_string (value, NULL);
|
||||
break;
|
||||
|
||||
case PROP_FPI_UDEV_DATA_HIDRAW:
|
||||
if (cls->type == FP_DEVICE_TYPE_UDEV)
|
||||
g_value_set_string (value, g_strdup (priv->udev_data.hidraw_path));
|
||||
g_value_set_string (value, priv->udev_data.hidraw_path);
|
||||
else
|
||||
g_value_set_string (value, NULL);
|
||||
break;
|
||||
|
||||
@@ -160,60 +160,65 @@ fp_image_init (FpImage *self)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GAsyncReadyCallback user_cb;
|
||||
struct fp_minutiae *minutiae;
|
||||
gint width, height;
|
||||
gdouble ppmm;
|
||||
FpiImageFlags flags;
|
||||
guchar *image;
|
||||
guchar *binarized;
|
||||
} DetectMinutiaeData;
|
||||
FpiImageFlags flags;
|
||||
unsigned char *image;
|
||||
gboolean image_changed;
|
||||
} DetectMinutiaeNbisData;
|
||||
|
||||
static void
|
||||
fp_image_detect_minutiae_free (DetectMinutiaeData *data)
|
||||
fp_image_detect_minutiae_free (DetectMinutiaeNbisData *data)
|
||||
{
|
||||
g_clear_pointer (&data->image, g_free);
|
||||
g_clear_pointer (&data->minutiae, free_minutiae);
|
||||
g_clear_pointer (&data->binarized, g_free);
|
||||
|
||||
if (data->image_changed)
|
||||
g_clear_pointer (&data->image, g_free);
|
||||
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
static void
|
||||
fp_image_detect_minutiae_cb (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (DetectMinutiaeNbisData, fp_image_detect_minutiae_free)
|
||||
|
||||
|
||||
static gboolean
|
||||
fp_image_detect_minutiae_nbis_finish (FpImage *self,
|
||||
GTask *task,
|
||||
GError **error)
|
||||
{
|
||||
GTask *task = G_TASK (res);
|
||||
FpImage *image;
|
||||
DetectMinutiaeData *data = g_task_get_task_data (task);
|
||||
g_autoptr(DetectMinutiaeNbisData) data = NULL;
|
||||
|
||||
if (!g_task_had_error (task))
|
||||
data = g_task_propagate_pointer (task, error);
|
||||
|
||||
if (data != NULL)
|
||||
{
|
||||
gint i;
|
||||
image = FP_IMAGE (source_object);
|
||||
self->flags = data->flags;
|
||||
|
||||
image->flags = data->flags;
|
||||
|
||||
g_clear_pointer (&image->data, g_free);
|
||||
image->data = g_steal_pointer (&data->image);
|
||||
|
||||
g_clear_pointer (&image->binarized, g_free);
|
||||
image->binarized = g_steal_pointer (&data->binarized);
|
||||
|
||||
g_clear_pointer (&image->minutiae, g_ptr_array_unref);
|
||||
image->minutiae = g_ptr_array_new_full (data->minutiae->num,
|
||||
(GDestroyNotify) free_minutia);
|
||||
|
||||
for (i = 0; i < data->minutiae->num; i++)
|
||||
g_ptr_array_add (image->minutiae,
|
||||
g_steal_pointer (&data->minutiae->list[i]));
|
||||
|
||||
/* Don't let it delete anything. */
|
||||
data->minutiae->num = 0;
|
||||
if (data->image_changed)
|
||||
{
|
||||
g_clear_pointer (&self->data, g_free);
|
||||
self->data = g_steal_pointer (&data->image);
|
||||
}
|
||||
|
||||
if (data->user_cb)
|
||||
data->user_cb (source_object, res, user_data);
|
||||
g_clear_pointer (&self->binarized, g_free);
|
||||
self->binarized = g_steal_pointer (&data->binarized);
|
||||
|
||||
g_clear_pointer (&self->minutiae, g_ptr_array_unref);
|
||||
self->minutiae = g_ptr_array_new_full (data->minutiae->num,
|
||||
(GDestroyNotify) free_minutia);
|
||||
|
||||
for (int i = 0; i < data->minutiae->num; i++)
|
||||
g_ptr_array_add (self->minutiae,
|
||||
g_steal_pointer (&data->minutiae->list[i]));
|
||||
|
||||
/* Don't let free_minutiae delete the minutiae that we now own. */
|
||||
data->minutiae->num = 0;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -266,70 +271,83 @@ invert_colors (guint8 *data, gint width, gint height)
|
||||
}
|
||||
|
||||
static void
|
||||
fp_image_detect_minutiae_thread_func (GTask *task,
|
||||
fp_image_detect_minutiae_nbis_thread_func (GTask *task,
|
||||
gpointer source_object,
|
||||
gpointer task_data,
|
||||
GCancellable *cancellable)
|
||||
{
|
||||
g_autoptr(GTimer) timer = NULL;
|
||||
DetectMinutiaeData *data = task_data;
|
||||
struct fp_minutiae *minutiae = NULL;
|
||||
g_autoptr(DetectMinutiaeNbisData) ret_data = NULL;
|
||||
g_autoptr(GTask) thread_task = g_steal_pointer (&task);
|
||||
g_autofree gint *direction_map = NULL;
|
||||
g_autofree gint *low_contrast_map = NULL;
|
||||
g_autofree gint *low_flow_map = NULL;
|
||||
g_autofree gint *high_curve_map = NULL;
|
||||
g_autofree gint *quality_map = NULL;
|
||||
g_autofree guchar *bdata = NULL;
|
||||
g_autofree LFSPARMS *lfsparms = NULL;
|
||||
FpImage *self = source_object;
|
||||
FpiImageFlags minutiae_flags;
|
||||
unsigned char *image;
|
||||
gint map_w, map_h;
|
||||
gint bw, bh, bd;
|
||||
gint r;
|
||||
g_autofree LFSPARMS *lfsparms = NULL;
|
||||
|
||||
image = self->data;
|
||||
minutiae_flags = self->flags & ~(FPI_IMAGE_H_FLIPPED |
|
||||
FPI_IMAGE_V_FLIPPED |
|
||||
FPI_IMAGE_COLORS_INVERTED);
|
||||
|
||||
if (minutiae_flags != FPI_IMAGE_NONE)
|
||||
image = g_memdup2 (self->data, self->width * self->height);
|
||||
|
||||
ret_data = g_new0 (DetectMinutiaeNbisData, 1);
|
||||
ret_data->flags = minutiae_flags;
|
||||
ret_data->image = image;
|
||||
ret_data->image_changed = image != self->data;
|
||||
|
||||
/* Normalize the image first */
|
||||
if (data->flags & FPI_IMAGE_H_FLIPPED)
|
||||
hflip (data->image, data->width, data->height);
|
||||
if (self->flags & FPI_IMAGE_H_FLIPPED)
|
||||
hflip (image, self->width, self->height);
|
||||
|
||||
if (data->flags & FPI_IMAGE_V_FLIPPED)
|
||||
vflip (data->image, data->width, data->height);
|
||||
if (self->flags & FPI_IMAGE_V_FLIPPED)
|
||||
vflip (image, self->width, self->height);
|
||||
|
||||
if (data->flags & FPI_IMAGE_COLORS_INVERTED)
|
||||
invert_colors (data->image, data->width, data->height);
|
||||
|
||||
data->flags &= ~(FPI_IMAGE_H_FLIPPED | FPI_IMAGE_V_FLIPPED | FPI_IMAGE_COLORS_INVERTED);
|
||||
if (self->flags & FPI_IMAGE_COLORS_INVERTED)
|
||||
invert_colors (image, self->width, self->height);
|
||||
|
||||
lfsparms = g_memdup2 (&g_lfsparms_V2, sizeof (LFSPARMS));
|
||||
lfsparms->remove_perimeter_pts = data->flags & FPI_IMAGE_PARTIAL ? TRUE : FALSE;
|
||||
lfsparms->remove_perimeter_pts = minutiae_flags & FPI_IMAGE_PARTIAL ? TRUE : FALSE;
|
||||
|
||||
timer = g_timer_new ();
|
||||
r = get_minutiae (&minutiae, &quality_map, &direction_map,
|
||||
r = get_minutiae (&ret_data->minutiae, &quality_map, &direction_map,
|
||||
&low_contrast_map, &low_flow_map, &high_curve_map,
|
||||
&map_w, &map_h, &bdata, &bw, &bh, &bd,
|
||||
data->image, data->width, data->height, 8,
|
||||
data->ppmm, lfsparms);
|
||||
&map_w, &map_h, &ret_data->binarized, &bw, &bh, &bd,
|
||||
image, self->width, self->height, 8,
|
||||
self->ppmm, lfsparms);
|
||||
g_timer_stop (timer);
|
||||
fp_dbg ("Minutiae scan completed in %f secs", g_timer_elapsed (timer, NULL));
|
||||
|
||||
data->binarized = g_steal_pointer (&bdata);
|
||||
data->minutiae = minutiae;
|
||||
if (g_task_had_error (thread_task))
|
||||
return;
|
||||
|
||||
if (r)
|
||||
{
|
||||
fp_err ("get minutiae failed, code %d", r);
|
||||
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "Minutiae scan failed with code %d", r);
|
||||
g_object_unref (task);
|
||||
g_task_return_new_error (thread_task, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"Minutiae scan failed with code %d", r);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!data->minutiae || data->minutiae->num == 0)
|
||||
if (!ret_data->minutiae || ret_data->minutiae->num == 0)
|
||||
{
|
||||
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
g_task_return_new_error (thread_task, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"No minutiae found");
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
g_task_return_boolean (task, TRUE);
|
||||
g_object_unref (task);
|
||||
g_task_return_pointer (thread_task, g_steal_pointer (&ret_data),
|
||||
(GDestroyNotify) fp_image_detect_minutiae_free);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -445,21 +463,25 @@ fp_image_detect_minutiae (FpImage *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
GTask *task;
|
||||
DetectMinutiaeData *data = g_new0 (DetectMinutiaeData, 1);
|
||||
g_autoptr(GTask) task = NULL;
|
||||
|
||||
task = g_task_new (self, cancellable, fp_image_detect_minutiae_cb, user_data);
|
||||
g_return_if_fail (FP_IS_IMAGE (self));
|
||||
g_return_if_fail (callback != NULL);
|
||||
|
||||
data->image = g_malloc (self->width * self->height);
|
||||
memcpy (data->image, self->data, self->width * self->height);
|
||||
data->flags = self->flags;
|
||||
data->width = self->width;
|
||||
data->height = self->height;
|
||||
data->ppmm = self->ppmm;
|
||||
data->user_cb = callback;
|
||||
task = g_task_new (self, cancellable, callback, user_data);
|
||||
g_task_set_source_tag (task, fp_image_detect_minutiae);
|
||||
g_task_set_check_cancellable (task, TRUE);
|
||||
|
||||
g_task_set_task_data (task, data, (GDestroyNotify) fp_image_detect_minutiae_free);
|
||||
g_task_run_in_thread (task, fp_image_detect_minutiae_thread_func);
|
||||
if (!g_atomic_int_compare_and_exchange (&self->detection_in_progress,
|
||||
FALSE, TRUE))
|
||||
{
|
||||
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_ADDRESS_IN_USE,
|
||||
"Minutiae detection is already in progress");
|
||||
return;
|
||||
}
|
||||
|
||||
g_task_run_in_thread (g_steal_pointer (&task),
|
||||
fp_image_detect_minutiae_nbis_thread_func);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -477,7 +499,27 @@ fp_image_detect_minutiae_finish (FpImage *self,
|
||||
GAsyncResult *result,
|
||||
GError **error)
|
||||
{
|
||||
return g_task_propagate_boolean (G_TASK (result), error);
|
||||
GTask *task;
|
||||
gboolean changed;
|
||||
|
||||
g_return_val_if_fail (FP_IS_IMAGE (self), FALSE);
|
||||
g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
|
||||
g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
|
||||
fp_image_detect_minutiae, FALSE);
|
||||
|
||||
task = G_TASK (result);
|
||||
changed = g_atomic_int_compare_and_exchange (&self->detection_in_progress,
|
||||
TRUE, FALSE);
|
||||
g_assert (changed);
|
||||
|
||||
if (g_task_had_error (task))
|
||||
{
|
||||
gpointer data = g_task_propagate_pointer (task, error);
|
||||
g_assert (data == NULL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return fp_image_detect_minutiae_nbis_finish (self, task, error);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -721,13 +721,12 @@ fp_print_serialize (FpPrint *print,
|
||||
|
||||
result = g_variant_builder_end (&builder);
|
||||
|
||||
if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
{
|
||||
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
GVariant *tmp;
|
||||
tmp = g_variant_byteswap (result);
|
||||
g_variant_unref (result);
|
||||
result = tmp;
|
||||
}
|
||||
#endif
|
||||
|
||||
len = g_variant_get_size (result);
|
||||
/* Add 3 bytes of header */
|
||||
@@ -800,10 +799,11 @@ fp_print_deserialize (const guchar *data,
|
||||
if (!raw_value)
|
||||
goto invalid_format;
|
||||
|
||||
if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
|
||||
value = g_variant_byteswap (raw_value);
|
||||
else
|
||||
#else
|
||||
value = g_variant_get_normal_form (raw_value);
|
||||
#endif
|
||||
|
||||
g_variant_get (value,
|
||||
"(i&s&sbymsmsi@a{sv}v)",
|
||||
|
||||
@@ -675,4 +675,6 @@ fpi_byte_reader_skip_inline (FpiByteReader * reader, guint nbytes)
|
||||
|
||||
#endif /* FPI_BYTE_READER_DISABLE_INLINES */
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpiByteReader, fpi_byte_reader_free);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -75,7 +75,8 @@ fpi_byte_writer_new_with_size (guint size, gboolean fixed)
|
||||
FpiByteWriter *ret = fpi_byte_writer_new ();
|
||||
|
||||
ret->alloc_size = size;
|
||||
ret->parent.data = g_malloc (ret->alloc_size);
|
||||
ret->parent.data = g_malloc0 (ret->alloc_size);
|
||||
ret->parent.size = size;
|
||||
ret->fixed = fixed;
|
||||
ret->owned = TRUE;
|
||||
|
||||
@@ -142,7 +143,8 @@ fpi_byte_writer_init_with_size (FpiByteWriter * writer, guint size,
|
||||
|
||||
fpi_byte_writer_init (writer);
|
||||
|
||||
writer->parent.data = g_malloc (size);
|
||||
writer->parent.data = g_malloc0 (size);
|
||||
writer->parent.size = size;
|
||||
writer->alloc_size = size;
|
||||
writer->fixed = fixed;
|
||||
writer->owned = TRUE;
|
||||
@@ -209,10 +211,9 @@ fpi_byte_writer_reset_and_get_data (FpiByteWriter * writer)
|
||||
|
||||
g_return_val_if_fail (writer != NULL, NULL);
|
||||
|
||||
data = (guint8 *) writer->parent.data;
|
||||
data = (guint8 *) g_steal_pointer (&writer->parent.data);
|
||||
if (!writer->owned)
|
||||
data = g_memdup2 (data, writer->parent.size);
|
||||
writer->parent.data = NULL;
|
||||
fpi_byte_writer_reset (writer);
|
||||
|
||||
return data;
|
||||
|
||||
@@ -111,6 +111,17 @@ fpi_byte_writer_set_pos (FpiByteWriter *writer, guint pos)
|
||||
return fpi_byte_reader_set_pos (FPI_BYTE_READER (writer), pos);
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
fpi_byte_writer_change_pos (FpiByteWriter *writer, gint pos)
|
||||
{
|
||||
pos = fpi_byte_writer_get_pos (writer) + pos;
|
||||
|
||||
if (pos < 0)
|
||||
return FALSE;
|
||||
|
||||
return fpi_byte_reader_set_pos (FPI_BYTE_READER (writer), pos);
|
||||
}
|
||||
|
||||
static inline guint
|
||||
fpi_byte_writer_get_size (const FpiByteWriter *writer)
|
||||
{
|
||||
@@ -407,4 +418,7 @@ fpi_byte_writer_fill_inline (FpiByteWriter * writer, guint8 value, guint size)
|
||||
|
||||
#endif
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpiByteWriter, fpi_byte_writer_free);
|
||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (FpiByteWriter, fpi_byte_writer_reset);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -20,36 +20,6 @@
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#if !GLIB_CHECK_VERSION (2, 57, 0)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GTypeClass, g_type_class_unref);
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GEnumClass, g_type_class_unref);
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GFlagsClass, g_type_class_unref);
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GParamSpec, g_param_spec_unref);
|
||||
#else
|
||||
/* Re-define G_SOURCE_FUNC as we are technically not allowed to use it with
|
||||
* the version we depend on currently. */
|
||||
#undef G_SOURCE_FUNC
|
||||
#endif
|
||||
|
||||
#define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void))(f))
|
||||
|
||||
#if !GLIB_CHECK_VERSION (2, 63, 3)
|
||||
typedef struct _FpDeviceClass FpDeviceClass;
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpDeviceClass, g_type_class_unref);
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GDate, g_date_free);
|
||||
#endif
|
||||
|
||||
#if !GLIB_CHECK_VERSION (2, 68, 0)
|
||||
#define g_memdup2(data, size) g_memdup ((data), (size))
|
||||
#else
|
||||
#define g_memdup2(data, size) \
|
||||
(G_GNUC_EXTENSION ({ \
|
||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
|
||||
g_memdup2 ((data), (size)); \
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS \
|
||||
}))
|
||||
#endif
|
||||
|
||||
#if __GNUC__ > 10 || (__GNUC__ == 10 && __GNUC_MINOR__ >= 1)
|
||||
#define FP_GNUC_ACCESS(m, p, s) __attribute__((access (m, p, s)))
|
||||
#else
|
||||
|
||||
@@ -1042,8 +1042,6 @@ fp_device_task_return_in_idle_cb (gpointer user_data)
|
||||
static void
|
||||
fpi_device_task_return_data_free (FpDeviceTaskReturnData *data)
|
||||
{
|
||||
if (data->result)
|
||||
{
|
||||
switch (data->type)
|
||||
{
|
||||
case FP_DEVICE_TASK_RETURN_INT:
|
||||
@@ -1065,11 +1063,20 @@ fpi_device_task_return_data_free (FpDeviceTaskReturnData *data)
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
}
|
||||
|
||||
g_object_unref (data->device);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpi_device_return_task_in_idle:
|
||||
* @device: The #FpDevice
|
||||
* @return_type: The #FpDeviceTaskReturnType of @return_data
|
||||
* @return_data: (nullable) (transfer full): The data to return.
|
||||
*
|
||||
* Completes a #FpDevice task in an idle source, stealing the ownership of
|
||||
* the passed @returned_data.
|
||||
*/
|
||||
static void
|
||||
fpi_device_return_task_in_idle (FpDevice *device,
|
||||
FpDeviceTaskReturnType return_type,
|
||||
@@ -1101,7 +1108,7 @@ fpi_device_return_task_in_idle (FpDevice *device,
|
||||
* @device: The #FpDevice
|
||||
* @device_id: Unique ID for the device or %NULL
|
||||
* @device_name: Human readable name or %NULL for driver name
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing probe operation. If error is %NULL success is assumed.
|
||||
*/
|
||||
@@ -1147,7 +1154,7 @@ fpi_device_probe_complete (FpDevice *device,
|
||||
/**
|
||||
* fpi_device_open_complete:
|
||||
* @device: The #FpDevice
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing open operation. If error is %NULL success is assumed.
|
||||
*/
|
||||
@@ -1174,7 +1181,7 @@ fpi_device_open_complete (FpDevice *device, GError *error)
|
||||
/**
|
||||
* fpi_device_close_complete:
|
||||
* @device: The #FpDevice
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing close operation. If error is %NULL success is assumed.
|
||||
*/
|
||||
@@ -1226,7 +1233,7 @@ fpi_device_close_complete (FpDevice *device, GError *error)
|
||||
* fpi_device_enroll_complete:
|
||||
* @device: The #FpDevice
|
||||
* @print: (nullable) (transfer full): The #FpPrint or %NULL on failure
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing enroll operation. The #FpPrint can be stored by the
|
||||
* caller for later verification.
|
||||
@@ -1355,7 +1362,7 @@ fpi_device_verify_complete (FpDevice *device,
|
||||
/**
|
||||
* fpi_device_identify_complete:
|
||||
* @device: The #FpDevice
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing identify operation.
|
||||
*
|
||||
@@ -1421,7 +1428,7 @@ fpi_device_identify_complete (FpDevice *device,
|
||||
* fpi_device_capture_complete:
|
||||
* @device: The #FpDevice
|
||||
* @image: The #FpImage, or %NULL on error
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing capture operation.
|
||||
*/
|
||||
@@ -1468,7 +1475,7 @@ fpi_device_capture_complete (FpDevice *device,
|
||||
/**
|
||||
* fpi_device_delete_complete:
|
||||
* @device: The #FpDevice
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing delete operation.
|
||||
*/
|
||||
@@ -1497,7 +1504,7 @@ fpi_device_delete_complete (FpDevice *device,
|
||||
* fpi_device_list_complete:
|
||||
* @device: The #FpDevice
|
||||
* @prints: (element-type FpPrint) (transfer container): Possibly empty array of prints or %NULL on error
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing list operation.
|
||||
*
|
||||
@@ -1775,7 +1782,7 @@ fpi_device_suspend_completed (FpDevice *device)
|
||||
/**
|
||||
* fpi_device_suspend_complete:
|
||||
* @device: The #FpDevice
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish a suspend request. Only return a %NULL error if suspend has been
|
||||
* correctly configured and the current action as returned by
|
||||
@@ -1826,7 +1833,7 @@ fpi_device_suspend_complete (FpDevice *device,
|
||||
/**
|
||||
* fpi_device_resume_complete:
|
||||
* @device: The #FpDevice
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish a resume request.
|
||||
*/
|
||||
@@ -1854,7 +1861,7 @@ fpi_device_resume_complete (FpDevice *device,
|
||||
/**
|
||||
* fpi_device_clear_storage_complete:
|
||||
* @device: The #FpDevice
|
||||
* @error: The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Finish an ongoing clear_storage operation.
|
||||
*/
|
||||
@@ -1885,7 +1892,7 @@ fpi_device_clear_storage_complete (FpDevice *device,
|
||||
* @device: The #FpDevice
|
||||
* @completed_stages: The number of stages that are completed at this point
|
||||
* @print: (transfer floating): The #FpPrint for the newly completed stage or %NULL on failure
|
||||
* @error: (transfer full): The #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Notify about the progress of the enroll operation. This is important for UI interaction.
|
||||
* The passed error may be used if a scan needs to be retried, use fpi_device_retry_new().
|
||||
|
||||
@@ -565,7 +565,7 @@ fpi_image_device_retry_scan (FpImageDevice *self, FpDeviceRetry retry)
|
||||
/**
|
||||
* fpi_image_device_session_error:
|
||||
* @self: a #FpImageDevice imaging fingerprint device
|
||||
* @error: The #GError to report
|
||||
* @error: (nullable) (transfer full): The #GError to report.
|
||||
*
|
||||
* Report an error while interacting with the device. This effectively
|
||||
* aborts the current ongoing action. Note that doing so will result in
|
||||
@@ -624,7 +624,7 @@ fpi_image_device_session_error (FpImageDevice *self, GError *error)
|
||||
/**
|
||||
* fpi_image_device_activate_complete:
|
||||
* @self: a #FpImageDevice imaging fingerprint device
|
||||
* @error: A #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Reports completion of device activation.
|
||||
*/
|
||||
@@ -663,7 +663,7 @@ fpi_image_device_activate_complete (FpImageDevice *self, GError *error)
|
||||
/**
|
||||
* fpi_image_device_deactivate_complete:
|
||||
* @self: a #FpImageDevice imaging fingerprint device
|
||||
* @error: A #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Reports completion of device deactivation.
|
||||
*/
|
||||
@@ -690,7 +690,7 @@ fpi_image_device_deactivate_complete (FpImageDevice *self, GError *error)
|
||||
/**
|
||||
* fpi_image_device_open_complete:
|
||||
* @self: a #FpImageDevice imaging fingerprint device
|
||||
* @error: A #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Reports completion of open operation.
|
||||
*/
|
||||
@@ -718,7 +718,7 @@ fpi_image_device_open_complete (FpImageDevice *self, GError *error)
|
||||
/**
|
||||
* fpi_image_device_close_complete:
|
||||
* @self: a #FpImageDevice imaging fingerprint device
|
||||
* @error: A #GError or %NULL on success
|
||||
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||
*
|
||||
* Reports completion of close operation.
|
||||
*/
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
* rely on the image to be normalized by libfprint before further processing.
|
||||
*/
|
||||
typedef enum {
|
||||
FPI_IMAGE_NONE = 0,
|
||||
FPI_IMAGE_V_FLIPPED = 1 << 0,
|
||||
FPI_IMAGE_H_FLIPPED = 1 << 1,
|
||||
FPI_IMAGE_COLORS_INVERTED = 1 << 2,
|
||||
@@ -67,7 +68,8 @@ struct _FpImage
|
||||
guint8 *binarized;
|
||||
|
||||
GPtrArray *minutiae;
|
||||
guint ref_count;
|
||||
|
||||
gboolean detection_in_progress;
|
||||
};
|
||||
|
||||
gint fpi_std_sq_dev (const guint8 *buf,
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
struct _FpiSsm
|
||||
{
|
||||
FpDevice *dev;
|
||||
const char *name;
|
||||
char *name;
|
||||
FpiSsm *parentsm;
|
||||
gpointer ssm_data;
|
||||
GDestroyNotify ssm_data_destroy;
|
||||
|
||||
@@ -110,7 +110,7 @@ main (int argc, char **argv)
|
||||
|
||||
printed = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||
|
||||
g_print ("%% lifprint — Supported Devices\n");
|
||||
g_print ("%% libfprint — Supported Devices\n");
|
||||
g_print ("%% Bastien Nocera, Daniel Drake\n");
|
||||
g_print ("%% 2018\n");
|
||||
g_print ("\n");
|
||||
|
||||
@@ -24,11 +24,12 @@
|
||||
#include "fpi-context.h"
|
||||
#include "fpi-device.h"
|
||||
|
||||
static const FpIdEntry whitelist_id_table[] = {
|
||||
static const FpIdEntry allowlist_id_table[] = {
|
||||
/* Currently known and unsupported devices.
|
||||
* You can generate this list from the wiki page using e.g.:
|
||||
* gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p'
|
||||
*/
|
||||
{ .vid = 0x047d, .pid = 0x00f2 },
|
||||
{ .vid = 0x04e8, .pid = 0x730b },
|
||||
{ .vid = 0x04f3, .pid = 0x036b },
|
||||
{ .vid = 0x04f3, .pid = 0x0c00 },
|
||||
@@ -36,12 +37,16 @@ static const FpIdEntry whitelist_id_table[] = {
|
||||
{ .vid = 0x04f3, .pid = 0x0c57 },
|
||||
{ .vid = 0x04f3, .pid = 0x0c5e },
|
||||
{ .vid = 0x04f3, .pid = 0x0c5a },
|
||||
{ .vid = 0x04f3, .pid = 0x0c6c },
|
||||
{ .vid = 0x04f3, .pid = 0x0c70 },
|
||||
{ .vid = 0x04f3, .pid = 0x0c72 },
|
||||
{ .vid = 0x04f3, .pid = 0x0c77 },
|
||||
{ .vid = 0x04f3, .pid = 0x2706 },
|
||||
{ .vid = 0x04f3, .pid = 0x3032 },
|
||||
{ .vid = 0x04f3, .pid = 0x3057 },
|
||||
{ .vid = 0x04f3, .pid = 0x3104 },
|
||||
{ .vid = 0x04f3, .pid = 0x310d },
|
||||
{ .vid = 0x04f3, .pid = 0x3128 },
|
||||
{ .vid = 0x06cb, .pid = 0x0081 },
|
||||
{ .vid = 0x06cb, .pid = 0x0088 },
|
||||
{ .vid = 0x06cb, .pid = 0x008a },
|
||||
@@ -52,7 +57,6 @@ static const FpIdEntry whitelist_id_table[] = {
|
||||
{ .vid = 0x06cb, .pid = 0x00b7 },
|
||||
{ .vid = 0x06cb, .pid = 0x00bb },
|
||||
{ .vid = 0x06cb, .pid = 0x00be },
|
||||
{ .vid = 0x06cb, .pid = 0x00c4 },
|
||||
{ .vid = 0x06cb, .pid = 0x00cb },
|
||||
{ .vid = 0x06cb, .pid = 0x00c9 },
|
||||
{ .vid = 0x06cb, .pid = 0x00d8 },
|
||||
@@ -71,10 +75,17 @@ static const FpIdEntry whitelist_id_table[] = {
|
||||
{ .vid = 0x0a5c, .pid = 0x5843 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5844 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5845 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5860 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5863 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5864 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5865 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5866 },
|
||||
{ .vid = 0x0a5c, .pid = 0x5867 },
|
||||
{ .vid = 0x0bda, .pid = 0x5812 },
|
||||
{ .vid = 0x10a5, .pid = 0x0007 },
|
||||
{ .vid = 0x10a5, .pid = 0x9200 },
|
||||
{ .vid = 0x10a5, .pid = 0x9800 },
|
||||
{ .vid = 0x10a5, .pid = 0xe340 },
|
||||
{ .vid = 0x1188, .pid = 0x9545 },
|
||||
{ .vid = 0x138a, .pid = 0x0007 },
|
||||
{ .vid = 0x138a, .pid = 0x003a },
|
||||
@@ -87,12 +98,14 @@ static const FpIdEntry whitelist_id_table[] = {
|
||||
{ .vid = 0x138a, .pid = 0x0097 },
|
||||
{ .vid = 0x138a, .pid = 0x009d },
|
||||
{ .vid = 0x138a, .pid = 0x00ab },
|
||||
{ .vid = 0x138a, .pid = 0x00a6 },
|
||||
{ .vid = 0x147e, .pid = 0x1002 },
|
||||
{ .vid = 0x1491, .pid = 0x0088 },
|
||||
{ .vid = 0x16d1, .pid = 0x1027 },
|
||||
{ .vid = 0x1c7a, .pid = 0x0300 },
|
||||
{ .vid = 0x1c7a, .pid = 0x0575 },
|
||||
{ .vid = 0x1c7a, .pid = 0x0576 },
|
||||
{ .vid = 0x1c7a, .pid = 0x0577 },
|
||||
{ .vid = 0x27c6, .pid = 0x5042 },
|
||||
{ .vid = 0x27c6, .pid = 0x5110 },
|
||||
{ .vid = 0x27c6, .pid = 0x5117 },
|
||||
@@ -120,6 +133,8 @@ static const FpIdEntry whitelist_id_table[] = {
|
||||
{ .vid = 0x27c6, .pid = 0x5740 },
|
||||
{ .vid = 0x27c6, .pid = 0x5e0a },
|
||||
{ .vid = 0x27c6, .pid = 0x581a },
|
||||
{ .vid = 0x27c6, .pid = 0x589a },
|
||||
{ .vid = 0x27c6, .pid = 0x6382 },
|
||||
{ .vid = 0x2808, .pid = 0x9338 },
|
||||
{ .vid = 0x2808, .pid = 0x93a9 },
|
||||
{ .vid = 0x298d, .pid = 0x2020 },
|
||||
@@ -128,18 +143,18 @@ static const FpIdEntry whitelist_id_table[] = {
|
||||
{ .vid = 0 },
|
||||
};
|
||||
|
||||
static const FpIdEntry blacklist_id_table[] = {
|
||||
static const FpIdEntry denylist_id_table[] = {
|
||||
{ .vid = 0x0483, .pid = 0x2016 },
|
||||
/* https://bugs.freedesktop.org/show_bug.cgi?id=66659 */
|
||||
{ .vid = 0x045e, .pid = 0x00bb },
|
||||
{ .vid = 0 },
|
||||
};
|
||||
|
||||
static const FpDeviceClass whitelist = {
|
||||
static const FpDeviceClass allowlist = {
|
||||
.type = FP_DEVICE_TYPE_USB,
|
||||
.id_table = whitelist_id_table,
|
||||
.id = "whitelist",
|
||||
.full_name = "Hardcoded whitelist"
|
||||
.id_table = allowlist_id_table,
|
||||
.id = "allowlist",
|
||||
.full_name = "Hardcoded allowlist"
|
||||
};
|
||||
|
||||
GHashTable *printed = NULL;
|
||||
@@ -158,7 +173,7 @@ print_driver (const FpDeviceClass *cls)
|
||||
const FpIdEntry *bl_entry;
|
||||
char *key;
|
||||
|
||||
for (bl_entry = blacklist_id_table; bl_entry->vid != 0; bl_entry++)
|
||||
for (bl_entry = denylist_id_table; bl_entry->vid != 0; bl_entry++)
|
||||
if (entry->vid == bl_entry->vid && entry->pid == bl_entry->pid)
|
||||
break;
|
||||
|
||||
@@ -169,7 +184,7 @@ print_driver (const FpDeviceClass *cls)
|
||||
|
||||
if (g_hash_table_lookup (printed, key) != NULL)
|
||||
{
|
||||
if (cls == &whitelist)
|
||||
if (cls == &allowlist)
|
||||
g_warning ("%s implemented by driver %s",
|
||||
key, (const char *) g_hash_table_lookup (printed, key));
|
||||
g_free (key);
|
||||
@@ -180,7 +195,7 @@ print_driver (const FpDeviceClass *cls)
|
||||
|
||||
if (num_printed == 0)
|
||||
{
|
||||
if (cls != &whitelist)
|
||||
if (cls != &allowlist)
|
||||
g_print ("\n# Supported by libfprint driver %s\n", cls->id);
|
||||
else
|
||||
g_print ("\n# Known unsupported devices\n");
|
||||
@@ -234,7 +249,7 @@ main (int argc, char **argv)
|
||||
print_driver (cls);
|
||||
}
|
||||
|
||||
print_driver (&whitelist);
|
||||
print_driver (&allowlist);
|
||||
|
||||
g_hash_table_destroy (printed);
|
||||
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
spi_sources = []
|
||||
spi_headers = []
|
||||
|
||||
if enabled_spi_drivers.length() > 0
|
||||
spi_headers = ['fpi-spi-transfer.h']
|
||||
spi_sources = ['fpi-spi-transfer.c']
|
||||
endif
|
||||
|
||||
libfprint_sources = [
|
||||
'fp-context.c',
|
||||
'fp-device.c',
|
||||
@@ -16,7 +24,7 @@ libfprint_private_sources = [
|
||||
'fpi-print.c',
|
||||
'fpi-ssm.c',
|
||||
'fpi-usb-transfer.c',
|
||||
'fpi-spi-transfer.c',
|
||||
spi_sources,
|
||||
]
|
||||
|
||||
libfprint_public_headers = [
|
||||
@@ -41,7 +49,7 @@ libfprint_private_headers = [
|
||||
'fpi-minutiae.h',
|
||||
'fpi-print.h',
|
||||
'fpi-usb-transfer.h',
|
||||
'fpi-spi-transfer.h',
|
||||
spi_headers,
|
||||
'fpi-ssm.h',
|
||||
]
|
||||
|
||||
@@ -119,6 +127,8 @@ driver_sources = {
|
||||
[ 'drivers/etes603.c' ],
|
||||
'egis0570' :
|
||||
[ 'drivers/egis0570.c' ],
|
||||
'egismoc' :
|
||||
[ 'drivers/egismoc/egismoc.c' ],
|
||||
'vfs0050' :
|
||||
[ 'drivers/vfs0050.c' ],
|
||||
'elan' :
|
||||
@@ -141,6 +151,10 @@ driver_sources = {
|
||||
[ 'drivers/goodixmoc/goodix.c', 'drivers/goodixmoc/goodix_proto.c' ],
|
||||
'fpcmoc' :
|
||||
[ 'drivers/fpcmoc/fpc.c' ],
|
||||
'realtek' :
|
||||
[ 'drivers/realtek/realtek.c' ],
|
||||
'focaltech_moc' :
|
||||
[ 'drivers/focaltech_moc/focaltech_moc.c' ],
|
||||
}
|
||||
|
||||
helper_sources = {
|
||||
|
||||
56
meson.build
56
meson.build
@@ -1,5 +1,5 @@
|
||||
project('libfprint', [ 'c', 'cpp' ],
|
||||
version: '1.94.6',
|
||||
version: '1.94.8',
|
||||
license: 'LGPLv2.1+',
|
||||
default_options: [
|
||||
'buildtype=debugoptimized',
|
||||
@@ -21,7 +21,7 @@ datadir = prefix / get_option('datadir')
|
||||
cc = meson.get_compiler('c')
|
||||
cpp = meson.get_compiler('cpp')
|
||||
host_system = host_machine.system()
|
||||
glib_min_version = '2.56'
|
||||
glib_min_version = '2.68'
|
||||
|
||||
glib_version_def = 'GLIB_VERSION_@0@_@1@'.format(
|
||||
glib_min_version.split('.')[0], glib_min_version.split('.')[1])
|
||||
@@ -91,11 +91,15 @@ gusb_dep = dependency('gusb', version: '>= 0.2.0')
|
||||
mathlib_dep = cc.find_library('m', required: false)
|
||||
|
||||
# The following dependencies are only used for tests
|
||||
sh = find_program('sh', required: true)
|
||||
cairo_dep = dependency('cairo', required: false)
|
||||
|
||||
# introspection scanning and Gio-2.0.gir
|
||||
gobject_introspection = dependency('gobject-introspection-1.0', required: get_option('introspection'))
|
||||
|
||||
# SPI
|
||||
have_spi = host_machine.system() == 'linux'
|
||||
|
||||
# Drivers
|
||||
drivers = get_option('drivers').split(',')
|
||||
virtual_drivers = [
|
||||
@@ -120,6 +124,7 @@ default_drivers = [
|
||||
'vfs0050',
|
||||
'etes603',
|
||||
'egis0570',
|
||||
'egismoc',
|
||||
'vcom5s',
|
||||
'synaptics',
|
||||
'elan',
|
||||
@@ -131,16 +136,42 @@ default_drivers = [
|
||||
'goodixmoc',
|
||||
'nb1010',
|
||||
'fpcmoc',
|
||||
|
||||
# SPI
|
||||
'elanspi',
|
||||
'realtek',
|
||||
'focaltech_moc',
|
||||
]
|
||||
|
||||
spi_drivers = [
|
||||
'elanspi'
|
||||
]
|
||||
|
||||
if have_spi
|
||||
default_drivers += spi_drivers
|
||||
endif
|
||||
|
||||
# FIXME: All the drivers should be fixed by adjusting the byte order.
|
||||
# See https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/236
|
||||
endian_independent_drivers = virtual_drivers + [
|
||||
'aes1610',
|
||||
'aes1660',
|
||||
'aes2550',
|
||||
'aes2660',
|
||||
'aes3500',
|
||||
'aes4000',
|
||||
'egis0570',
|
||||
'egismoc',
|
||||
'elanmoc',
|
||||
'etes603',
|
||||
'focaltech_moc',
|
||||
'nb1010',
|
||||
'realtek',
|
||||
'synaptics',
|
||||
'upeksonly',
|
||||
'upektc',
|
||||
'upektc_img',
|
||||
'upekts',
|
||||
'vcom5s',
|
||||
'vfs101',
|
||||
'vfs7552',
|
||||
]
|
||||
|
||||
all_drivers = default_drivers + virtual_drivers
|
||||
@@ -153,6 +184,17 @@ if drivers == [ 'default' ]
|
||||
drivers = default_drivers
|
||||
endif
|
||||
|
||||
enabled_spi_drivers = []
|
||||
foreach driver : spi_drivers
|
||||
if driver in drivers
|
||||
enabled_spi_drivers += driver
|
||||
endif
|
||||
endforeach
|
||||
|
||||
if enabled_spi_drivers.length() > 0 and not have_spi
|
||||
error('SPI drivers @0@ are not supported'.format(enabled_spi_drivers))
|
||||
endif
|
||||
|
||||
driver_helper_mapping = {
|
||||
'aes1610' : [ 'aeslib' ],
|
||||
'aes1660' : [ 'aeslib', 'aesx660' ],
|
||||
@@ -247,7 +289,7 @@ if install_udev_rules
|
||||
udev_rules_dir = get_option('udev_rules_dir')
|
||||
if udev_rules_dir == 'auto'
|
||||
udev_dep = dependency('udev')
|
||||
udev_rules_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/rules.d'
|
||||
udev_rules_dir = udev_dep.get_variable(pkgconfig: 'udevdir') + '/rules.d'
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -284,7 +326,7 @@ if not udev_hwdb.disabled()
|
||||
|
||||
if udev_hwdb_dir == 'auto'
|
||||
udev_dep = dependency('udev')
|
||||
udev_hwdb_dir = udev_dep.get_pkgconfig_variable('udevdir') + '/hwdb.d'
|
||||
udev_hwdb_dir = udev_dep.get_variable(pkgconfig: 'udevdir') + '/hwdb.d'
|
||||
endif
|
||||
else
|
||||
udev_hwdb_dir = ''
|
||||
|
||||
@@ -44,7 +44,7 @@ if len(sys.argv) > 3:
|
||||
sys.exit(1)
|
||||
|
||||
driver_name = sys.argv[1]
|
||||
os.environ['FP_DRIVERS_WHITELIST'] = driver_name
|
||||
os.environ['FP_DRIVERS_ALLOWLIST'] = driver_name
|
||||
|
||||
test_variant = None
|
||||
if len(sys.argv) == 3:
|
||||
|
||||
0
tests/egis0570/capture.pcapng
Executable file → Normal file
0
tests/egis0570/capture.pcapng
Executable file → Normal file
@@ -24,7 +24,7 @@ E: ID_USB_INTERFACES=:ff0000:
|
||||
E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
|
||||
E: ID_PATH=pci-0000:00:14.0-usb-0:9
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9
|
||||
E: LIBFPRINT_DRIVER=Hardcoded whitelist
|
||||
E: LIBFPRINT_DRIVER=Hardcoded allowlist
|
||||
A: authorized=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
|
||||
BIN
tests/egismoc-0586/custom.pcapng
Normal file
BIN
tests/egismoc-0586/custom.pcapng
Normal file
Binary file not shown.
156
tests/egismoc-0586/custom.py
Executable file
156
tests/egismoc-0586/custom.py
Executable file
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import time
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
d.open_sync()
|
||||
|
||||
assert d.get_driver() == "egismoc"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
def enroll_progress(*args):
|
||||
print("finger status: ", d.get_finger_status())
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
print('indentification_done: ', identify_match, identify_print)
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
# Beginning with list and clear assumes you begin with >0 prints enrolled before capturing
|
||||
|
||||
print("listing - device should have prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) > 0
|
||||
del stored
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
print("enrolling")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.LEFT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p1 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
|
||||
print("verifying")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(p1)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("verify done")
|
||||
assert verify_res == True
|
||||
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
del stored
|
||||
|
||||
print('async identifying')
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
print("try to enroll duplicate")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
try:
|
||||
d.enroll_sync(template, None, enroll_progress, None)
|
||||
except GLib.Error as error:
|
||||
assert error.matches(FPrint.DeviceError.quark(),
|
||||
FPrint.DeviceError.DATA_DUPLICATE)
|
||||
except Exception as exc:
|
||||
raise
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("duplicate enroll attempt done")
|
||||
|
||||
print("listing - device should still only have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
del stored
|
||||
|
||||
print("enroll new finger")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p2 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll new finger done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 2 prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 2
|
||||
assert (stored[0].equal(p1) and stored[1].equal(p2)) or (stored[0].equal(p2) and stored[1].equal(p1))
|
||||
del stored
|
||||
|
||||
print("deleting first print")
|
||||
d.delete_print_sync(p1)
|
||||
print("delete done")
|
||||
del p1
|
||||
|
||||
print("listing - device should only have second print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p2)
|
||||
del stored
|
||||
del p2
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
255
tests/egismoc-0586/device
Normal file
255
tests/egismoc-0586/device
Normal file
@@ -0,0 +1,255 @@
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-7
|
||||
N: bus/usb/001/021=12010002FF0000407A1C860556620102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
E: BUSNUM=001
|
||||
E: DEVNAME=/dev/bus/usb/001/021
|
||||
E: DEVNUM=021
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_MODEL=ETU905A88-E
|
||||
E: ID_MODEL_ENC=ETU905A88-E
|
||||
E: ID_MODEL_ID=0586
|
||||
E: ID_PATH=pci-0000:00:14.0-usb-0:7
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_7
|
||||
E: ID_PATH_WITH_USB_REVISION=pci-0000:00:14.0-usbv2-0:7
|
||||
E: ID_PERSIST=0
|
||||
E: ID_REVISION=6256
|
||||
E: ID_SERIAL=EGIS_ETU905A88-E_0A5743PCU834
|
||||
E: ID_SERIAL_SHORT=0A5743PCU834
|
||||
E: ID_USB_INTERFACES=:ff0000:
|
||||
E: ID_USB_MODEL=ETU905A88-E
|
||||
E: ID_USB_MODEL_ENC=ETU905A88-E
|
||||
E: ID_USB_MODEL_ID=0586
|
||||
E: ID_USB_REVISION=6256
|
||||
E: ID_USB_SERIAL=EGIS_ETU905A88-E_0A5743PCU834
|
||||
E: ID_USB_SERIAL_SHORT=0A5743PCU834
|
||||
E: ID_USB_VENDOR=EGIS
|
||||
E: ID_USB_VENDOR_ENC=EGIS
|
||||
E: ID_USB_VENDOR_ID=1c7a
|
||||
E: ID_VENDOR=EGIS
|
||||
E: ID_VENDOR_ENC=EGIS
|
||||
E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
|
||||
E: ID_VENDOR_ID=1c7a
|
||||
E: MAJOR=189
|
||||
E: MINOR=20
|
||||
E: PRODUCT=1c7a/586/6256
|
||||
E: SUBSYSTEM=usb
|
||||
E: TYPE=255/0/0
|
||||
A: authorized=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=ff\n
|
||||
A: bDeviceProtocol=00\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=100mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=6256\n
|
||||
A: bmAttributes=a0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002FF0000407A1C860556620102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
A: dev=189:20\n
|
||||
A: devnum=21\n
|
||||
A: devpath=7\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4e/device:4f/device:56
|
||||
A: idProduct=0586\n
|
||||
A: idVendor=1c7a\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=EGIS\n
|
||||
A: maxchild=0\n
|
||||
A: physical_location/dock=no\n
|
||||
A: physical_location/horizontal_position=center\n
|
||||
A: physical_location/lid=no\n
|
||||
A: physical_location/panel=front\n
|
||||
A: physical_location/vertical_position=center\n
|
||||
L: port=../1-0:1.0/usb1-port7
|
||||
A: power/active_duration=12644\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=230907\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/persist=0\n
|
||||
A: power/runtime_active_time=12929\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=217715\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=ETU905A88-E\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=fixed\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0A5743PCU834\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=18\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1
|
||||
N: bus/usb/001/001=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C
|
||||
E: BUSNUM=001
|
||||
E: CURRENT_TAGS=:seat:
|
||||
E: DEVNAME=/dev/bus/usb/001/001
|
||||
E: DEVNUM=001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||
E: ID_MODEL=xHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_REVISION=0608
|
||||
E: ID_SERIAL=Linux_6.8.5-arch1-1_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_USB_MODEL=xHCI_Host_Controller
|
||||
E: ID_USB_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_USB_MODEL_ID=0002
|
||||
E: ID_USB_REVISION=0608
|
||||
E: ID_USB_SERIAL=Linux_6.8.5-arch1-1_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_USB_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_VENDOR=Linux_6.8.5-arch1-1_xhci-hcd
|
||||
E: ID_USB_VENDOR_ENC=Linux\x206.8.5-arch1-1\x20xhci-hcd
|
||||
E: ID_USB_VENDOR_ID=1d6b
|
||||
E: ID_VENDOR=Linux_6.8.5-arch1-1_xhci-hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.8.5-arch1-1\x20xhci-hcd
|
||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: MAJOR=189
|
||||
E: MINOR=0
|
||||
E: PRODUCT=1d6b/2/608
|
||||
E: SUBSYSTEM=usb
|
||||
E: TAGS=:seat:
|
||||
E: TYPE=9/0/1
|
||||
A: authorized=1\n
|
||||
A: authorized_default=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=09\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=0mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0608\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C
|
||||
A: dev=189:0\n
|
||||
A: devnum=1\n
|
||||
A: devpath=0\n
|
||||
L: driver=../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4e/device:4f
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.8.5-arch1-1 xhci-hcd\n
|
||||
A: maxchild=12\n
|
||||
A: power/active_duration=73066477\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=73071614\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_time=73070027\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=xHCI Host Controller\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0000:00:14.0\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=1111\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0
|
||||
E: DRIVER=xhci_hcd
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_MODEL_FROM_DATABASE=Alder Lake PCH USB 3.2 xHCI Host Controller
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||
E: MODALIAS=pci:v00008086d000051EDsv00001043sd0000201Fbc0Csc03i30
|
||||
E: PCI_CLASS=C0330
|
||||
E: PCI_ID=8086:51ED
|
||||
E: PCI_SLOT_NAME=0000:00:14.0
|
||||
E: PCI_SUBSYS_ID=1043:201F
|
||||
E: SUBSYSTEM=pci
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0330\n
|
||||
H: config=8680ED51060490020130030C000080000400220560000000000000000000000000000000000000000000000043101F20000000007000000000000000FF010000FD0134A089C27F8000000000000000003F6DD80F000000000000000000000000316000000000000000000000000000000180C2C10800000000000000000000000590B7001805E0FE000000000000000009B014F01000400100000000C10A080000080E00001800008F50020000010000090000018680C00009001014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B50F110112000000
|
||||
A: consistent_dma_mask_bits=64\n
|
||||
A: d3cold_allowed=1\n
|
||||
A: device=0x51ed\n
|
||||
A: dma_mask_bits=64\n
|
||||
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4e
|
||||
A: irq=143\n
|
||||
A: local_cpulist=0-15\n
|
||||
A: local_cpus=ffff\n
|
||||
A: modalias=pci:v00008086d000051EDsv00001043sd0000201Fbc0Csc03i30\n
|
||||
A: msi_bus=1\n
|
||||
A: msi_irqs/143=msi\n
|
||||
A: msi_irqs/144=msi\n
|
||||
A: msi_irqs/145=msi\n
|
||||
A: msi_irqs/146=msi\n
|
||||
A: msi_irqs/147=msi\n
|
||||
A: msi_irqs/148=msi\n
|
||||
A: msi_irqs/149=msi\n
|
||||
A: msi_irqs/150=msi\n
|
||||
A: numa_node=-1\n
|
||||
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 8 9 2112 9\nxHCI ring segments 43 53 4096 53\nbuffer-2048 0 16 2048 8\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 128 32 1\n
|
||||
A: power/control=auto\n
|
||||
A: power/runtime_active_time=73070690\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/wakeup=enabled\n
|
||||
A: power/wakeup_abort_count=0\n
|
||||
A: power/wakeup_active=0\n
|
||||
A: power/wakeup_active_count=0\n
|
||||
A: power/wakeup_count=0\n
|
||||
A: power/wakeup_expire_count=0\n
|
||||
A: power/wakeup_last_time_ms=0\n
|
||||
A: power/wakeup_max_time_ms=0\n
|
||||
A: power/wakeup_total_time_ms=0\n
|
||||
A: power_state=D0\n
|
||||
A: resource=0x0000006005220000 0x000000600522ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||
A: revision=0x01\n
|
||||
A: subsystem_device=0x201f\n
|
||||
A: subsystem_vendor=0x1043\n
|
||||
A: vendor=0x8086\n
|
||||
BIN
tests/egismoc-0587/custom.pcapng
Normal file
BIN
tests/egismoc-0587/custom.pcapng
Normal file
Binary file not shown.
156
tests/egismoc-0587/custom.py
Executable file
156
tests/egismoc-0587/custom.py
Executable file
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import time
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
d.open_sync()
|
||||
|
||||
assert d.get_driver() == "egismoc"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
def enroll_progress(*args):
|
||||
print("finger status: ", d.get_finger_status())
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
print('indentification_done: ', identify_match, identify_print)
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
# Beginning with list and clear assumes you begin with >0 prints enrolled before capturing
|
||||
|
||||
print("listing - device should have prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) > 0
|
||||
del stored
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
print("enrolling")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.LEFT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p1 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
|
||||
print("verifying")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(p1)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("verify done")
|
||||
assert verify_res == True
|
||||
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
del stored
|
||||
|
||||
print('async identifying')
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
print("try to enroll duplicate")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
try:
|
||||
d.enroll_sync(template, None, enroll_progress, None)
|
||||
except GLib.Error as error:
|
||||
assert error.matches(FPrint.DeviceError.quark(),
|
||||
FPrint.DeviceError.DATA_DUPLICATE)
|
||||
except Exception as exc:
|
||||
raise
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("duplicate enroll attempt done")
|
||||
|
||||
print("listing - device should still only have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
del stored
|
||||
|
||||
print("enroll new finger")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p2 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll new finger done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 2 prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 2
|
||||
assert (stored[0].equal(p1) and stored[1].equal(p2)) or (stored[0].equal(p2) and stored[1].equal(p1))
|
||||
del stored
|
||||
|
||||
print("deleting first print")
|
||||
d.delete_print_sync(p1)
|
||||
print("delete done")
|
||||
del p1
|
||||
|
||||
print("listing - device should only have second print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p2)
|
||||
del stored
|
||||
del p2
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
270
tests/egismoc-0587/device
Normal file
270
tests/egismoc-0587/device
Normal file
@@ -0,0 +1,270 @@
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb3/3-5
|
||||
N: bus/usb/003/009=12010002FF0000407A1C870567640102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
E: BUSNUM=003
|
||||
E: DEVNAME=/dev/bus/usb/003/009
|
||||
E: DEVNUM=009
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_MODEL=ETU905A88-E
|
||||
E: ID_MODEL_ENC=ETU905A88-E
|
||||
E: ID_MODEL_ID=0587
|
||||
E: ID_PATH=pci-0000:00:14.0-usb-0:5
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_5
|
||||
E: ID_PATH_WITH_USB_REVISION=pci-0000:00:14.0-usbv2-0:5
|
||||
E: ID_PERSIST=0
|
||||
E: ID_REVISION=6467
|
||||
E: ID_SERIAL=EGIS_ETU905A88-E_198427PCU834
|
||||
E: ID_SERIAL_SHORT=198427PCU834
|
||||
E: ID_USB_INTERFACES=:ff0000:
|
||||
E: ID_USB_MODEL=ETU905A88-E
|
||||
E: ID_USB_MODEL_ENC=ETU905A88-E
|
||||
E: ID_USB_MODEL_ID=0587
|
||||
E: ID_USB_REVISION=6467
|
||||
E: ID_USB_SERIAL=EGIS_ETU905A88-E_198427PCU834
|
||||
E: ID_USB_SERIAL_SHORT=198427PCU834
|
||||
E: ID_USB_VENDOR=EGIS
|
||||
E: ID_USB_VENDOR_ENC=EGIS
|
||||
E: ID_USB_VENDOR_ID=1c7a
|
||||
E: ID_VENDOR=EGIS
|
||||
E: ID_VENDOR_ENC=EGIS
|
||||
E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
|
||||
E: ID_VENDOR_ID=1c7a
|
||||
E: MAJOR=189
|
||||
E: MINOR=264
|
||||
E: PRODUCT=1c7a/587/6467
|
||||
E: SUBSYSTEM=usb
|
||||
E: TYPE=255/0/0
|
||||
A: authorized=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=ff\n
|
||||
A: bDeviceProtocol=00\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=100mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=6467\n
|
||||
A: bmAttributes=a0\n
|
||||
A: busnum=3\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002FF0000407A1C870567640102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
A: dev=189:264\n
|
||||
A: devnum=9\n
|
||||
A: devpath=5\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4e/device:4f/device:54
|
||||
A: idProduct=0587\n
|
||||
A: idVendor=1c7a\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=EGIS\n
|
||||
A: maxchild=0\n
|
||||
A: physical_location/dock=no\n
|
||||
A: physical_location/horizontal_position=left\n
|
||||
A: physical_location/lid=no\n
|
||||
A: physical_location/panel=top\n
|
||||
A: physical_location/vertical_position=upper\n
|
||||
L: port=../3-0:1.0/usb3-port5
|
||||
A: power/active_duration=58096\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=183928\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/persist=0\n
|
||||
A: power/runtime_active_kids=0\n
|
||||
A: power/runtime_active_time=58510\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=125136\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=ETU905A88-E\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=fixed\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=198427PCU834\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=547\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb3
|
||||
N: bus/usb/003/001=12010002090001406B1D020006060302010109021900010100E0000904000001090000000705810304000C
|
||||
E: BUSNUM=003
|
||||
E: CURRENT_TAGS=:seat:
|
||||
E: DEVNAME=/dev/bus/usb/003/001
|
||||
E: DEVNUM=001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||
E: ID_MODEL=xHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_REVISION=0606
|
||||
E: ID_SERIAL=Linux_6.6.0-14-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_USB_MODEL=xHCI_Host_Controller
|
||||
E: ID_USB_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_USB_MODEL_ID=0002
|
||||
E: ID_USB_REVISION=0606
|
||||
E: ID_USB_SERIAL=Linux_6.6.0-14-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_USB_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_VENDOR=Linux_6.6.0-14-generic_xhci-hcd
|
||||
E: ID_USB_VENDOR_ENC=Linux\x206.6.0-14-generic\x20xhci-hcd
|
||||
E: ID_USB_VENDOR_ID=1d6b
|
||||
E: ID_VENDOR=Linux_6.6.0-14-generic_xhci-hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.6.0-14-generic\x20xhci-hcd
|
||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: MAJOR=189
|
||||
E: MINOR=256
|
||||
E: PRODUCT=1d6b/2/606
|
||||
E: SUBSYSTEM=usb
|
||||
E: TAGS=:seat:
|
||||
E: TYPE=9/0/1
|
||||
A: authorized=1\n
|
||||
A: authorized_default=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=09\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=0mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0606\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=3\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002090001406B1D020006060302010109021900010100E0000904000001090000000705810304000C
|
||||
A: dev=189:256\n
|
||||
A: devnum=1\n
|
||||
A: devpath=0\n
|
||||
L: driver=../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4e/device:4f
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.6.0-14-generic xhci-hcd\n
|
||||
A: maxchild=12\n
|
||||
A: power/active_duration=5145268\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=5191200\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_kids=2\n
|
||||
A: power/runtime_active_time=5145262\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=45937\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=xHCI Host Controller\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0000:00:14.0\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=637\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0
|
||||
E: DRIVER=xhci_hcd
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_MODEL_FROM_DATABASE=Alder Lake PCH USB 3.2 xHCI Host Controller
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||
E: MODALIAS=pci:v00008086d000051EDsv00001043sd0000201Fbc0Csc03i30
|
||||
E: PCI_CLASS=C0330
|
||||
E: PCI_ID=8086:51ED
|
||||
E: PCI_SLOT_NAME=0000:00:14.0
|
||||
E: PCI_SUBSYS_ID=1043:201F
|
||||
E: SUBSYSTEM=pci
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0330\n
|
||||
H: config=8680ED51060490020130030C000080000400262F62000000000000000000000000000000000000000000000043101F20000000007000000000000000FF010000FD0134A089C27F8000000000000000003F6DD80F000000000000000000000000316000000000000000000000000000000180C2C1080000000000000000000000059087001805E0FE000000000000000009B014F01000400100000000C10A080000080E00001800008F50020000010000090000018680C00009001014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B50F110112000000
|
||||
A: consistent_dma_mask_bits=64\n
|
||||
A: d3cold_allowed=1\n
|
||||
A: dbc=disabled\n
|
||||
A: dbc_bInterfaceProtocol=01\n
|
||||
A: dbc_bcdDevice=0010\n
|
||||
A: dbc_idProduct=0010\n
|
||||
A: dbc_idVendor=1d6b\n
|
||||
A: device=0x51ed\n
|
||||
A: dma_mask_bits=64\n
|
||||
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4e
|
||||
A: index=10\n
|
||||
L: iommu=../../virtual/iommu/dmar1
|
||||
L: iommu_group=../../../kernel/iommu_groups/11
|
||||
A: irq=145\n
|
||||
A: label=Onboard - Other\n
|
||||
A: local_cpulist=0-19\n
|
||||
A: local_cpus=fffff\n
|
||||
A: modalias=pci:v00008086d000051EDsv00001043sd0000201Fbc0Csc03i30\n
|
||||
A: msi_bus=1\n
|
||||
A: msi_irqs/145=msi\n
|
||||
A: numa_node=-1\n
|
||||
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 1 32 128 1\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 10 11 2112 11\nxHCI ring segments 38 38 4096 38\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0\n
|
||||
A: power/async=enabled\n
|
||||
A: power/control=auto\n
|
||||
A: power/runtime_active_kids=2\n
|
||||
A: power/runtime_active_time=5192072\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=enabled\n
|
||||
A: power/wakeup_abort_count=0\n
|
||||
A: power/wakeup_active=0\n
|
||||
A: power/wakeup_active_count=0\n
|
||||
A: power/wakeup_count=0\n
|
||||
A: power/wakeup_expire_count=0\n
|
||||
A: power/wakeup_last_time_ms=0\n
|
||||
A: power/wakeup_max_time_ms=0\n
|
||||
A: power/wakeup_total_time_ms=0\n
|
||||
A: power_state=D0\n
|
||||
A: resource=0x000000622f260000 0x000000622f26ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||
A: revision=0x01\n
|
||||
A: subsystem_device=0x201f\n
|
||||
A: subsystem_vendor=0x1043\n
|
||||
A: vendor=0x8086\n
|
||||
|
||||
BIN
tests/egismoc-05a1/custom.pcapng
Normal file
BIN
tests/egismoc-05a1/custom.pcapng
Normal file
Binary file not shown.
156
tests/egismoc-05a1/custom.py
Executable file
156
tests/egismoc-05a1/custom.py
Executable file
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import time
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
d.open_sync()
|
||||
|
||||
assert d.get_driver() == "egismoc"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
def enroll_progress(*args):
|
||||
print("finger status: ", d.get_finger_status())
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
print('indentification_done: ', identify_match, identify_print)
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
# Beginning with list and clear assumes you begin with >0 prints enrolled before capturing
|
||||
|
||||
print("listing - device should have prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) > 0
|
||||
del stored
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
print("enrolling")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.LEFT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p1 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
|
||||
print("verifying")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(p1)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("verify done")
|
||||
assert verify_res == True
|
||||
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
del stored
|
||||
|
||||
print('async identifying')
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
print("try to enroll duplicate")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
try:
|
||||
d.enroll_sync(template, None, enroll_progress, None)
|
||||
except GLib.Error as error:
|
||||
assert error.matches(FPrint.DeviceError.quark(),
|
||||
FPrint.DeviceError.DATA_DUPLICATE)
|
||||
except Exception as exc:
|
||||
raise
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("duplicate enroll attempt done")
|
||||
|
||||
print("listing - device should still only have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
del stored
|
||||
|
||||
print("enroll new finger")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p2 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll new finger done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 2 prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 2
|
||||
assert (stored[0].equal(p1) and stored[1].equal(p2)) or (stored[0].equal(p2) and stored[1].equal(p1))
|
||||
del stored
|
||||
|
||||
print("deleting first print")
|
||||
d.delete_print_sync(p1)
|
||||
print("delete done")
|
||||
del p1
|
||||
|
||||
print("listing - device should only have second print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p2)
|
||||
del stored
|
||||
del p2
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
262
tests/egismoc-05a1/device
Normal file
262
tests/egismoc-05a1/device
Normal file
@@ -0,0 +1,262 @@
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-5
|
||||
N: bus/usb/001/003=12010002FF0000407A1CA10513120102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
E: BUSNUM=001
|
||||
E: DEVNAME=/dev/bus/usb/001/003
|
||||
E: DEVNUM=003
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_BUS=usb
|
||||
E: ID_MODEL=ETU905A80-E
|
||||
E: ID_MODEL_ENC=ETU905A80-E
|
||||
E: ID_MODEL_ID=05a1
|
||||
E: ID_REVISION=1213
|
||||
E: ID_SERIAL=EGIS_ETU905A80-E_0C5A44PCU833
|
||||
E: ID_SERIAL_SHORT=0C5A44PCU833
|
||||
E: ID_USB_INTERFACES=:ff0000:
|
||||
E: ID_USB_MODEL=ETU905A80-E
|
||||
E: ID_USB_MODEL_ENC=ETU905A80-E
|
||||
E: ID_USB_MODEL_ID=05a1
|
||||
E: ID_USB_REVISION=1213
|
||||
E: ID_USB_SERIAL=EGIS_ETU905A80-E_0C5A44PCU833
|
||||
E: ID_USB_SERIAL_SHORT=0C5A44PCU833
|
||||
E: ID_USB_VENDOR=EGIS
|
||||
E: ID_USB_VENDOR_ENC=EGIS
|
||||
E: ID_USB_VENDOR_ID=1c7a
|
||||
E: ID_VENDOR=EGIS
|
||||
E: ID_VENDOR_ENC=EGIS
|
||||
E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
|
||||
E: ID_VENDOR_ID=1c7a
|
||||
E: MAJOR=189
|
||||
E: MINOR=2
|
||||
E: PRODUCT=1c7a/5a1/1213
|
||||
E: SUBSYSTEM=usb
|
||||
E: TYPE=255/0/0
|
||||
A: authorized=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=ff\n
|
||||
A: bDeviceProtocol=00\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=100mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=1213\n
|
||||
A: bmAttributes=a0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002FF0000407A1CA10513120102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
A: dev=189:2\n
|
||||
A: devnum=3\n
|
||||
A: devpath=5\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:51/device:52/device:57
|
||||
A: idProduct=05a1\n
|
||||
A: idVendor=1c7a\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=EGIS\n
|
||||
A: maxchild=0\n
|
||||
A: physical_location/dock=no\n
|
||||
A: physical_location/horizontal_position=center\n
|
||||
A: physical_location/lid=no\n
|
||||
A: physical_location/panel=unknown\n
|
||||
A: physical_location/vertical_position=center\n
|
||||
L: port=../1-0:1.0/usb1-port5
|
||||
A: power/active_duration=955612\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=955612\n
|
||||
A: power/control=on\n
|
||||
A: power/level=on\n
|
||||
A: power/persist=0\n
|
||||
A: power/runtime_active_kids=0\n
|
||||
A: power/runtime_active_time=955338\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=1\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=ETU905A80-E\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=fixed\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0C5A44PCU833\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=491\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1
|
||||
N: bus/usb/001/001=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C
|
||||
E: BUSNUM=001
|
||||
E: CURRENT_TAGS=:seat:
|
||||
E: DEVNAME=/dev/bus/usb/001/001
|
||||
E: DEVNUM=001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||
E: ID_MODEL=xHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_REVISION=0605
|
||||
E: ID_SERIAL=Linux_6.5.0-9-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_USB_MODEL=xHCI_Host_Controller
|
||||
E: ID_USB_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_USB_MODEL_ID=0002
|
||||
E: ID_USB_REVISION=0605
|
||||
E: ID_USB_SERIAL=Linux_6.5.0-9-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_USB_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_VENDOR=Linux_6.5.0-9-generic_xhci-hcd
|
||||
E: ID_USB_VENDOR_ENC=Linux\x206.5.0-9-generic\x20xhci-hcd
|
||||
E: ID_USB_VENDOR_ID=1d6b
|
||||
E: ID_VENDOR=Linux_6.5.0-9-generic_xhci-hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.5.0-9-generic\x20xhci-hcd
|
||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: MAJOR=189
|
||||
E: MINOR=0
|
||||
E: PRODUCT=1d6b/2/605
|
||||
E: SUBSYSTEM=usb
|
||||
E: TAGS=:seat:
|
||||
E: TYPE=9/0/1
|
||||
A: authorized=1\n
|
||||
A: authorized_default=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=09\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=0mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0605\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C
|
||||
A: dev=189:0\n
|
||||
A: devnum=1\n
|
||||
A: devpath=0\n
|
||||
L: driver=../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:51/device:52
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.5.0-9-generic xhci-hcd\n
|
||||
A: maxchild=12\n
|
||||
A: power/active_duration=956044\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=956044\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_kids=2\n
|
||||
A: power/runtime_active_time=956041\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=xHCI Host Controller\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0000:00:14.0\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=181\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0
|
||||
E: DRIVER=xhci_hcd
|
||||
E: ID_MODEL_FROM_DATABASE=Alder Lake PCH USB 3.2 xHCI Host Controller
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||
E: MODALIAS=pci:v00008086d000051EDsv0000144Dsd0000C1CAbc0Csc03i30
|
||||
E: PCI_CLASS=C0330
|
||||
E: PCI_ID=8086:51ED
|
||||
E: PCI_SLOT_NAME=0000:00:14.0
|
||||
E: PCI_SUBSYS_ID=144D:C1CA
|
||||
E: SUBSYSTEM=pci
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0330\n
|
||||
H: config=8680ED51060490020130030C0000800004001A3E6000000000000000000000000000000000000000000000004D14CAC1000000007000000000000000FF010000FD0134A089C27F8000000000000000003F6DD80F000000000000000000000000316000000000000000000000000000000180C2C108000000000000000000000005908700D804E0FE000000000000000009B014F01000400100000000C10A080000080E00001800008F50020000010000090000018680C00009001014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B50F110112000000
|
||||
A: consistent_dma_mask_bits=64\n
|
||||
A: d3cold_allowed=1\n
|
||||
A: dbc=disabled\n
|
||||
A: dbc_bInterfaceProtocol=01\n
|
||||
A: dbc_bcdDevice=0010\n
|
||||
A: dbc_idProduct=0010\n
|
||||
A: dbc_idVendor=1d6b\n
|
||||
A: device=0x51ed\n
|
||||
A: dma_mask_bits=64\n
|
||||
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:51
|
||||
A: index=9\n
|
||||
L: iommu=../../virtual/iommu/dmar2
|
||||
L: iommu_group=../../../kernel/iommu_groups/11
|
||||
A: irq=142\n
|
||||
A: label=Onboard - Other\n
|
||||
A: local_cpulist=0-15\n
|
||||
A: local_cpus=ffff\n
|
||||
A: modalias=pci:v00008086d000051EDsv0000144Dsd0000C1CAbc0Csc03i30\n
|
||||
A: msi_bus=1\n
|
||||
A: msi_irqs/142=msi\n
|
||||
A: numa_node=-1\n
|
||||
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 7 2112 7\nxHCI ring segments 28 28 4096 28\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 1 32 128 1\nbuffer-32 0 0 32 0\n
|
||||
A: power/async=enabled\n
|
||||
A: power/control=auto\n
|
||||
A: power/runtime_active_kids=1\n
|
||||
A: power/runtime_active_time=957198\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=enabled\n
|
||||
A: power/wakeup_abort_count=0\n
|
||||
A: power/wakeup_active=0\n
|
||||
A: power/wakeup_active_count=0\n
|
||||
A: power/wakeup_count=0\n
|
||||
A: power/wakeup_expire_count=0\n
|
||||
A: power/wakeup_last_time_ms=0\n
|
||||
A: power/wakeup_max_time_ms=0\n
|
||||
A: power/wakeup_total_time_ms=0\n
|
||||
A: power_state=D0\n
|
||||
A: resource=0x000000603e1a0000 0x000000603e1affff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||
A: revision=0x01\n
|
||||
A: subsystem_device=0xc1ca\n
|
||||
A: subsystem_vendor=0x144d\n
|
||||
A: vendor=0x8086\n
|
||||
|
||||
BIN
tests/egismoc/custom.pcapng
Normal file
BIN
tests/egismoc/custom.pcapng
Normal file
Binary file not shown.
156
tests/egismoc/custom.py
Executable file
156
tests/egismoc/custom.py
Executable file
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import time
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
d.open_sync()
|
||||
|
||||
assert d.get_driver() == "egismoc"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
def enroll_progress(*args):
|
||||
print("finger status: ", d.get_finger_status())
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
print('indentification_done: ', identify_match, identify_print)
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
# Beginning with list and clear assumes you begin with >0 prints enrolled before capturing
|
||||
|
||||
print("listing - device should have prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) > 0
|
||||
del stored
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
print("enrolling")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.LEFT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p1 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
|
||||
print("verifying")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(p1)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("verify done")
|
||||
assert verify_res == True
|
||||
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
del stored
|
||||
|
||||
print('async identifying')
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
print("try to enroll duplicate")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
try:
|
||||
d.enroll_sync(template, None, enroll_progress, None)
|
||||
except GLib.Error as error:
|
||||
assert error.matches(FPrint.DeviceError.quark(),
|
||||
FPrint.DeviceError.DATA_DUPLICATE)
|
||||
except Exception as exc:
|
||||
raise
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("duplicate enroll attempt done")
|
||||
|
||||
print("listing - device should still only have 1 print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p1)
|
||||
del stored
|
||||
|
||||
print("enroll new finger")
|
||||
template = FPrint.Print.new(d)
|
||||
template.set_finger(FPrint.Finger.RIGHT_INDEX)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p2 = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll new finger done")
|
||||
del template
|
||||
|
||||
print("listing - device should have 2 prints")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 2
|
||||
assert (stored[0].equal(p1) and stored[1].equal(p2)) or (stored[0].equal(p2) and stored[1].equal(p1))
|
||||
del stored
|
||||
|
||||
print("deleting first print")
|
||||
d.delete_print_sync(p1)
|
||||
print("delete done")
|
||||
del p1
|
||||
|
||||
print("listing - device should only have second print")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p2)
|
||||
del stored
|
||||
del p2
|
||||
|
||||
print("clear device storage")
|
||||
d.clear_storage_sync()
|
||||
print("clear done")
|
||||
|
||||
print("listing - device should be empty")
|
||||
stored = d.list_prints_sync()
|
||||
assert len(stored) == 0
|
||||
del stored
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
262
tests/egismoc/device
Normal file
262
tests/egismoc/device
Normal file
@@ -0,0 +1,262 @@
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb3/3-5
|
||||
N: bus/usb/003/012=12010002FF0000407A1C820581110102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
E: BUSNUM=003
|
||||
E: CURRENT_TAGS=:snap_cups_ippeveprinter:snap_cups_cupsd:
|
||||
E: DEVNAME=/dev/bus/usb/003/012
|
||||
E: DEVNUM=012
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_BUS=usb
|
||||
E: ID_MODEL=ETU905A80-E
|
||||
E: ID_MODEL_ENC=ETU905A80-E
|
||||
E: ID_MODEL_ID=0582
|
||||
E: ID_PATH=pci-0000:00:14.0-usb-0:5
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_5
|
||||
E: ID_REVISION=1181
|
||||
E: ID_SERIAL=EGIS_ETU905A80-E_0E7828PBS393
|
||||
E: ID_SERIAL_SHORT=0E7828PBS393
|
||||
E: ID_USB_INTERFACES=:ff0000:
|
||||
E: ID_USB_MODEL=ETU905A80-E
|
||||
E: ID_USB_MODEL_ENC=ETU905A80-E
|
||||
E: ID_USB_MODEL_ID=0582
|
||||
E: ID_USB_REVISION=1181
|
||||
E: ID_USB_SERIAL=EGIS_ETU905A80-E_0E7828PBS393
|
||||
E: ID_USB_SERIAL_SHORT=0E7828PBS393
|
||||
E: ID_USB_VENDOR=EGIS
|
||||
E: ID_USB_VENDOR_ENC=EGIS
|
||||
E: ID_USB_VENDOR_ID=1c7a
|
||||
E: ID_VENDOR=EGIS
|
||||
E: ID_VENDOR_ENC=EGIS
|
||||
E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
|
||||
E: ID_VENDOR_ID=1c7a
|
||||
E: MAJOR=189
|
||||
E: MINOR=267
|
||||
E: PRODUCT=1c7a/582/1181
|
||||
E: SUBSYSTEM=usb
|
||||
E: TAGS=:snap_cups_ippeveprinter:snap_cups_cupsd:
|
||||
E: TYPE=255/0/0
|
||||
A: authorized=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=ff\n
|
||||
A: bDeviceProtocol=00\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=100mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=1181\n
|
||||
A: bmAttributes=a0\n
|
||||
A: busnum=3\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002FF0000407A1C820581110102030109022700010100A0320904000003FF000000070581020002000705020200020007058303400005
|
||||
A: dev=189:267\n
|
||||
A: devnum=12\n
|
||||
A: devpath=5\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:51/device:52/device:57
|
||||
A: idProduct=0582\n
|
||||
A: idVendor=1c7a\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=EGIS\n
|
||||
A: maxchild=0\n
|
||||
A: physical_location/dock=no\n
|
||||
A: physical_location/horizontal_position=center\n
|
||||
A: physical_location/lid=no\n
|
||||
A: physical_location/panel=unknown\n
|
||||
A: physical_location/vertical_position=center\n
|
||||
L: port=../3-0:1.0/usb3-port5
|
||||
A: power/active_duration=1425996\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=1426656\n
|
||||
A: power/control=on\n
|
||||
A: power/level=on\n
|
||||
A: power/persist=0\n
|
||||
A: power/runtime_active_kids=0\n
|
||||
A: power/runtime_active_time=1426124\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=1\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=ETU905A80-E\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=fixed\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0E7828PBS393\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=2803\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb3
|
||||
N: bus/usb/003/001=12010002090001406B1D020002060302010109021900010100E0000904000001090000000705810304000C
|
||||
E: BUSNUM=003
|
||||
E: CURRENT_TAGS=:seat:snap_cups_cupsd:snap_cups_ippeveprinter:
|
||||
E: DEVNAME=/dev/bus/usb/003/001
|
||||
E: DEVNUM=001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_BUS=usb
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||
E: ID_MODEL=xHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_REVISION=0602
|
||||
E: ID_SERIAL=Linux_6.2.0-34-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_USB_MODEL=xHCI_Host_Controller
|
||||
E: ID_USB_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_USB_MODEL_ID=0002
|
||||
E: ID_USB_REVISION=0602
|
||||
E: ID_USB_SERIAL=Linux_6.2.0-34-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_USB_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_USB_VENDOR=Linux_6.2.0-34-generic_xhci-hcd
|
||||
E: ID_USB_VENDOR_ENC=Linux\x206.2.0-34-generic\x20xhci-hcd
|
||||
E: ID_USB_VENDOR_ID=1d6b
|
||||
E: ID_VENDOR=Linux_6.2.0-34-generic_xhci-hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.2.0-34-generic\x20xhci-hcd
|
||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: MAJOR=189
|
||||
E: MINOR=256
|
||||
E: PRODUCT=1d6b/2/602
|
||||
E: SUBSYSTEM=usb
|
||||
E: TAGS=:snap_cups_cupsd:seat:snap_cups_ippeveprinter:
|
||||
E: TYPE=9/0/1
|
||||
A: authorized=1\n
|
||||
A: authorized_default=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=09\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=0mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0602\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=3\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002090001406B1D020002060302010109021900010100E0000904000001090000000705810304000C
|
||||
A: dev=189:256\n
|
||||
A: devnum=1\n
|
||||
A: devpath=0\n
|
||||
L: driver=../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:51/device:52
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.2.0-34-generic xhci-hcd\n
|
||||
A: maxchild=12\n
|
||||
A: power/active_duration=337953872\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=337978524\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_kids=1\n
|
||||
A: power/runtime_active_time=337962424\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=616\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=xHCI Host Controller\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0000:00:14.0\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=4969\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0
|
||||
E: DRIVER=xhci_hcd
|
||||
E: ID_MODEL_FROM_DATABASE=Alder Lake PCH USB 3.2 xHCI Host Controller
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||
E: MODALIAS=pci:v00008086d000051EDsv0000144Dsd0000C870bc0Csc03i30
|
||||
E: PCI_CLASS=C0330
|
||||
E: PCI_ID=8086:51ED
|
||||
E: PCI_SLOT_NAME=0000:00:14.0
|
||||
E: PCI_SUBSYS_ID=144D:C870
|
||||
E: SUBSYSTEM=pci
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0330\n
|
||||
H: config=8680ED51060490020130030C000080000400161D6000000000000000000000000000000000000000000000004D1470C8000000007000000000000000FF010000FD0134A089C27F8000000000000000003F6DD80F000000000000000000000000316000000000000000000000000000000180C2C1080000000000000000000000059087007805E0FE000000000000000009B014F01000400100000000C10A080000080E00001800008F50020000010000090000018680C00009001014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B50F010112000000
|
||||
A: consistent_dma_mask_bits=64\n
|
||||
A: d3cold_allowed=1\n
|
||||
A: dbc=disabled\n
|
||||
A: device=0x51ed\n
|
||||
A: dma_mask_bits=64\n
|
||||
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:51
|
||||
A: index=7\n
|
||||
L: iommu=../../virtual/iommu/dmar1
|
||||
L: iommu_group=../../../kernel/iommu_groups/8
|
||||
A: irq=145\n
|
||||
A: label=Onboard - Other\n
|
||||
A: local_cpulist=0-15\n
|
||||
A: local_cpus=ffff\n
|
||||
A: modalias=pci:v00008086d000051EDsv0000144Dsd0000C870bc0Csc03i30\n
|
||||
A: msi_bus=1\n
|
||||
A: msi_irqs/145=msi\n
|
||||
A: numa_node=-1\n
|
||||
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 9 2112 9\nxHCI ring segments 26 34 4096 34\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 32 128 1\nbuffer-32 0 0 32 0\n
|
||||
A: power/async=enabled\n
|
||||
A: power/control=auto\n
|
||||
A: power/runtime_active_kids=1\n
|
||||
A: power/runtime_active_time=337964621\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=438\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=enabled\n
|
||||
A: power/wakeup_abort_count=0\n
|
||||
A: power/wakeup_active=0\n
|
||||
A: power/wakeup_active_count=7\n
|
||||
A: power/wakeup_count=0\n
|
||||
A: power/wakeup_expire_count=7\n
|
||||
A: power/wakeup_last_time_ms=336554844\n
|
||||
A: power/wakeup_max_time_ms=105\n
|
||||
A: power/wakeup_total_time_ms=721\n
|
||||
A: power_state=D0\n
|
||||
A: resource=0x000000601d160000 0x000000601d16ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||
A: revision=0x01\n
|
||||
A: subsystem_device=0xc870\n
|
||||
A: subsystem_vendor=0x144d\n
|
||||
A: vendor=0x8086\n
|
||||
|
||||
BIN
tests/focaltech_moc/custom.pcapng
Normal file
BIN
tests/focaltech_moc/custom.pcapng
Normal file
Binary file not shown.
89
tests/focaltech_moc/custom.py
Executable file
89
tests/focaltech_moc/custom.py
Executable file
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
assert d.get_driver() == "focaltech_moc"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert not d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert not d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
d.open_sync()
|
||||
|
||||
template = FPrint.Print.new(d)
|
||||
|
||||
def enroll_progress(*args):
|
||||
#assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
|
||||
print("finger status: ", d.get_finger_status())
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
print('indentification_done: ', identify_match, identify_print)
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
# List, enroll, list, verify, identify, delete
|
||||
print("enrolling")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll done")
|
||||
|
||||
print("listing")
|
||||
stored = d.list_prints_sync()
|
||||
print("listing done")
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p)
|
||||
print("verifying")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(p)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("verify done")
|
||||
del p
|
||||
assert verify_res == True
|
||||
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
del stored
|
||||
|
||||
print('async identifying')
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
print("deleting")
|
||||
d.delete_print_sync(p)
|
||||
print("delete done")
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
385
tests/focaltech_moc/device
Normal file
385
tests/focaltech_moc/device
Normal file
File diff suppressed because one or more lines are too long
@@ -6,6 +6,8 @@ envs.set('G_MESSAGES_DEBUG', 'all')
|
||||
# Setup paths
|
||||
envs.set('MESON_SOURCE_ROOT', meson.project_source_root())
|
||||
envs.set('MESON_BUILD_ROOT', meson.project_build_root())
|
||||
envs.set('G_TEST_SRCDIR', meson.current_source_dir())
|
||||
envs.set('G_TEST_BUILDDIR', meson.current_build_dir())
|
||||
envs.prepend('LD_LIBRARY_PATH', meson.project_build_root() / 'libfprint')
|
||||
|
||||
# Set FP_DEVICE_EMULATION so that drivers can adapt (e.g. to use fixed
|
||||
@@ -13,7 +15,7 @@ envs.prepend('LD_LIBRARY_PATH', meson.project_build_root() / 'libfprint')
|
||||
envs.set('FP_DEVICE_EMULATION', '1')
|
||||
|
||||
# Set a colon-separated list of native drivers we enable in tests
|
||||
envs.set('FP_DRIVERS_WHITELIST', ':'.join([
|
||||
envs.set('FP_DRIVERS_ALLOWLIST', ':'.join([
|
||||
'virtual_image',
|
||||
'virtual_device',
|
||||
'virtual_device_storage',
|
||||
@@ -49,7 +51,14 @@ drivers_tests = [
|
||||
'goodixmoc',
|
||||
'nb1010',
|
||||
'egis0570',
|
||||
'egismoc',
|
||||
'egismoc-05a1',
|
||||
'egismoc-0586',
|
||||
'egismoc-0587',
|
||||
'fpcmoc',
|
||||
'realtek',
|
||||
'realtek-5816',
|
||||
'focaltech_moc',
|
||||
]
|
||||
|
||||
if get_option('introspection')
|
||||
@@ -71,6 +80,12 @@ envs_str = run_command(python3, '-c', env_parser_cmd,
|
||||
env: envs,
|
||||
check: installed_tests).stdout().strip()
|
||||
|
||||
envs_str = ' '.join([
|
||||
envs_str,
|
||||
'G_TEST_SRCDIR=' + installed_tests_testdir,
|
||||
'G_TEST_BUILDDIR=' + installed_tests_execdir,
|
||||
])
|
||||
|
||||
if get_option('introspection')
|
||||
envs.prepend('GI_TYPELIB_PATH', meson.project_build_root() / 'libfprint')
|
||||
virtual_devices_tests = [
|
||||
@@ -88,11 +103,17 @@ if get_option('introspection')
|
||||
base_args = files(vdtest + '.py')
|
||||
suite = ['virtual-driver']
|
||||
|
||||
r = run_command(unittest_inspector, files(vdtest + '.py'), check: true)
|
||||
r = run_command(unittest_inspector, files(vdtest + '.py'), check: false)
|
||||
unit_tests = r.stdout().strip().split('\n')
|
||||
|
||||
if r.returncode() == 0 and unit_tests.length() > 0
|
||||
suite += vdtest
|
||||
elif r.returncode() == 77
|
||||
test(vdtest,
|
||||
sh,
|
||||
args: ['-c', 'exit 77']
|
||||
)
|
||||
continue
|
||||
else
|
||||
unit_tests = [vdtest]
|
||||
endif
|
||||
@@ -139,7 +160,7 @@ if get_option('introspection')
|
||||
endif
|
||||
else
|
||||
test(vdtest,
|
||||
find_program('sh'),
|
||||
sh,
|
||||
args: ['-c', 'exit 77']
|
||||
)
|
||||
endif
|
||||
@@ -149,7 +170,7 @@ if get_option('introspection')
|
||||
foreach driver_test: drivers_tests
|
||||
driver_name = driver_test.split('-')[0]
|
||||
driver_envs = envs
|
||||
driver_envs.set('FP_DRIVERS_WHITELIST', driver_name)
|
||||
driver_envs.set('FP_DRIVERS_ALLOWLIST', driver_name)
|
||||
|
||||
if (driver_name in supported_drivers and
|
||||
gusb_dep.version().version_compare('>= 0.3.0'))
|
||||
@@ -193,7 +214,7 @@ if get_option('introspection')
|
||||
endif
|
||||
else
|
||||
test(driver_test,
|
||||
find_program('sh'),
|
||||
sh,
|
||||
args: ['-c', 'exit 77']
|
||||
)
|
||||
endif
|
||||
@@ -212,13 +233,13 @@ if get_option('introspection')
|
||||
else
|
||||
warning('Skipping all driver tests as introspection bindings are missing')
|
||||
test('virtual-image',
|
||||
find_program('sh'),
|
||||
sh,
|
||||
args: ['-c', 'exit 77']
|
||||
)
|
||||
|
||||
foreach driver_test: drivers_tests
|
||||
test(driver_test,
|
||||
find_program('sh'),
|
||||
sh,
|
||||
args: ['-c', 'exit 77']
|
||||
)
|
||||
endforeach
|
||||
@@ -247,10 +268,6 @@ endif
|
||||
|
||||
unit_tests_deps = { 'fpi-assembling' : [cairo_dep] }
|
||||
|
||||
test_config = configuration_data()
|
||||
test_config.set_quoted('SOURCE_ROOT', meson.project_source_root())
|
||||
test_config_h = configure_file(output: 'test-config.h', configuration: test_config)
|
||||
|
||||
foreach test_name: unit_tests
|
||||
if unit_tests_deps.has_key(test_name)
|
||||
missing_deps = false
|
||||
@@ -265,7 +282,7 @@ foreach test_name: unit_tests
|
||||
# Create a dummy test that always skips instead
|
||||
warning('Test @0@ cannot be compiled due to missing dependencies'.format(test_name))
|
||||
test(test_name,
|
||||
find_program('sh'),
|
||||
sh,
|
||||
suite: ['unit-tests'],
|
||||
args: ['-c', 'exit 77'],
|
||||
)
|
||||
@@ -278,7 +295,7 @@ foreach test_name: unit_tests
|
||||
|
||||
basename = 'test-' + test_name
|
||||
test_exe = executable(basename,
|
||||
sources: [basename + '.c', test_config_h],
|
||||
sources: basename + '.c',
|
||||
dependencies: [ libfprint_private_dep ] + extra_deps,
|
||||
c_args: common_cflags,
|
||||
link_whole: test_utils,
|
||||
@@ -331,7 +348,7 @@ endif
|
||||
|
||||
valgrind = find_program('valgrind', required: false)
|
||||
if valgrind.found()
|
||||
glib_share = glib_dep.get_pkgconfig_variable('prefix') / 'share' / glib_dep.name()
|
||||
glib_share = glib_dep.get_variable(pkgconfig: 'prefix') / 'share' / glib_dep.name()
|
||||
glib_suppressions = glib_share + '/valgrind/glib.supp'
|
||||
libfprint_suppressions = '@0@/@1@'.format(meson.project_source_root(),
|
||||
files('libfprint.supp')[0])
|
||||
|
||||
BIN
tests/realtek-5816/custom.pcapng
Normal file
BIN
tests/realtek-5816/custom.pcapng
Normal file
Binary file not shown.
110
tests/realtek-5816/custom.py
Executable file
110
tests/realtek-5816/custom.py
Executable file
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
assert d.get_driver() == "realtek"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert not d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
d.open_sync()
|
||||
|
||||
# 1. verify clear storage command, 2. make sure later asserts are good
|
||||
d.clear_storage_sync()
|
||||
|
||||
template = FPrint.Print.new(d)
|
||||
|
||||
def enroll_progress(*args):
|
||||
# assert d.get_finger_status() & FPrint.FingerStatusFlags.NEEDED
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
try:
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
except gi.repository.GLib.GError as e:
|
||||
print("Please try again")
|
||||
else:
|
||||
print('indentification_done: ', identify_match, identify_print)
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
def start_identify_async(prints):
|
||||
global identified
|
||||
print('async identifying')
|
||||
d.identify(prints, callback=identify_done)
|
||||
del prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
identified = False
|
||||
|
||||
# List, enroll, list, verify, identify, delete
|
||||
print("enrolling")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll done")
|
||||
|
||||
print("listing")
|
||||
stored = d.list_prints_sync()
|
||||
print("listing done")
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p)
|
||||
print("verifying")
|
||||
try:
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(p)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
except gi.repository.GLib.GError as e:
|
||||
print("Please try again")
|
||||
else:
|
||||
print("verify done")
|
||||
del p
|
||||
assert verify_res == True
|
||||
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
del stored
|
||||
|
||||
print('async identifying')
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
print("deleting")
|
||||
d.delete_print_sync(p)
|
||||
print("delete done")
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
250
tests/realtek-5816/device
Normal file
250
tests/realtek-5816/device
Normal file
@@ -0,0 +1,250 @@
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-6
|
||||
N: bus/usb/001/006=12010102EF020140DA0B165800000301020109022E00010104A0FA0904000004FF02000507050102000200070583034000080705840340000807058202000200
|
||||
E: DEVNAME=/dev/bus/usb/001/006
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: PRODUCT=bda/5816/0
|
||||
E: TYPE=239/2/1
|
||||
E: BUSNUM=001
|
||||
E: DEVNUM=006
|
||||
E: MAJOR=189
|
||||
E: MINOR=5
|
||||
E: SUBSYSTEM=usb
|
||||
E: ID_VENDOR=Generic
|
||||
E: ID_VENDOR_ENC=Generic
|
||||
E: ID_VENDOR_ID=0bda
|
||||
E: ID_MODEL=Realtek_USB2.0_Finger_Print_Bridge
|
||||
E: ID_MODEL_ENC=Realtek\x20USB2.0\x20Finger\x20Print\x20Bridge
|
||||
E: ID_MODEL_ID=5816
|
||||
E: ID_REVISION=0000
|
||||
E: ID_SERIAL=Generic_Realtek_USB2.0_Finger_Print_Bridge_201801010001
|
||||
E: ID_SERIAL_SHORT=201801010001
|
||||
E: ID_BUS=usb
|
||||
E: ID_USB_INTERFACES=:ff0200:
|
||||
E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Corp.
|
||||
E: ID_PATH=pci-0000:00:14.0-usb-0:6
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_6
|
||||
A: authorized=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=ef\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=02\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=500mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0000\n
|
||||
A: bmAttributes=a0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=Realtek USB2.0 Finger Print Bridge\n
|
||||
H: descriptors=12010102EF020140DA0B165800000301020109022E00010104A0FA0904000004FF02000507050102000200070583034000080705840340000807058202000200
|
||||
A: dev=189:5\n
|
||||
A: devnum=6\n
|
||||
A: devpath=6\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:52
|
||||
A: idProduct=5816\n
|
||||
A: idVendor=0bda\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Generic\n
|
||||
A: maxchild=0\n
|
||||
A: physical_location/dock=no\n
|
||||
A: physical_location/horizontal_position=left\n
|
||||
A: physical_location/lid=no\n
|
||||
A: physical_location/panel=top\n
|
||||
A: physical_location/vertical_position=upper\n
|
||||
L: port=../1-0:1.0/usb1-port6
|
||||
A: power/active_duration=37699\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=37699\n
|
||||
A: power/control=on\n
|
||||
A: power/level=on\n
|
||||
A: power/persist=1\n
|
||||
A: power/runtime_active_kids=0\n
|
||||
A: power/runtime_active_time=37457\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=1\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=Realtek USB2.0 Finger Print Bridge\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=removable\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=201801010001\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=22\n
|
||||
A: version= 2.01\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1
|
||||
N: bus/usb/001/001=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C
|
||||
E: DEVNAME=/dev/bus/usb/001/001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: PRODUCT=1d6b/2/608
|
||||
E: TYPE=9/0/1
|
||||
E: BUSNUM=001
|
||||
E: DEVNUM=001
|
||||
E: MAJOR=189
|
||||
E: MINOR=0
|
||||
E: SUBSYSTEM=usb
|
||||
E: ID_VENDOR=Linux_6.8.0-40-generic_xhci-hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.8.0-40-generic\x20xhci-hcd
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: ID_MODEL=xHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_REVISION=0608
|
||||
E: ID_SERIAL=Linux_6.8.0-40-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_BUS=usb
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||
E: TAGS=:seat:
|
||||
E: CURRENT_TAGS=:seat:
|
||||
A: authorized=1\n
|
||||
A: authorized_default=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=09\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=0mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0608\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C
|
||||
A: dev=189:0\n
|
||||
A: devnum=1\n
|
||||
A: devpath=0\n
|
||||
L: driver=../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.8.0-40-generic xhci-hcd\n
|
||||
A: maxchild=16\n
|
||||
A: power/active_duration=1096259\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=1096259\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_kids=3\n
|
||||
A: power/runtime_active_time=1096256\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=xHCI Host Controller\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0000:00:14.0\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=229\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0
|
||||
E: DRIVER=xhci_hcd
|
||||
E: PCI_CLASS=C0330
|
||||
E: PCI_ID=8086:A36D
|
||||
E: PCI_SUBSYS_ID=1028:085C
|
||||
E: PCI_SLOT_NAME=0000:00:14.0
|
||||
E: MODALIAS=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30
|
||||
E: SUBSYSTEM=pci
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||
E: ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0330\n
|
||||
H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000005B17C10300000000316000000000000000000000000000000180C2C10800000000000000000000000590B7001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000
|
||||
A: consistent_dma_mask_bits=64\n
|
||||
A: d3cold_allowed=1\n
|
||||
A: dbc=disabled\n
|
||||
A: dbc_bInterfaceProtocol=01\n
|
||||
A: dbc_bcdDevice=0010\n
|
||||
A: dbc_idProduct=0010\n
|
||||
A: dbc_idVendor=1d6b\n
|
||||
A: device=0xa36d\n
|
||||
A: dma_mask_bits=64\n
|
||||
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b
|
||||
A: index=4\n
|
||||
L: iommu=../../virtual/iommu/dmar1
|
||||
L: iommu_group=../../../kernel/iommu_groups/4
|
||||
A: irq=125\n
|
||||
A: label=Onboard - Other\n
|
||||
A: local_cpulist=0-3\n
|
||||
A: local_cpus=f\n
|
||||
A: modalias=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30\n
|
||||
A: msi_bus=1\n
|
||||
A: msi_irqs/125=msi\n
|
||||
A: msi_irqs/126=msi\n
|
||||
A: msi_irqs/127=msi\n
|
||||
A: msi_irqs/128=msi\n
|
||||
A: msi_irqs/129=msi\n
|
||||
A: numa_node=-1\n
|
||||
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 7 2112 7\nxHCI ring segments 25 25 4096 25\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 12 32 128 1\nbuffer-32 0 0 32 0\n
|
||||
A: power/async=enabled\n
|
||||
A: power/control=on\n
|
||||
A: power/runtime_active_kids=1\n
|
||||
A: power/runtime_active_time=1096935\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=1\n
|
||||
A: power/wakeup=enabled\n
|
||||
A: power/wakeup_abort_count=0\n
|
||||
A: power/wakeup_active=0\n
|
||||
A: power/wakeup_active_count=0\n
|
||||
A: power/wakeup_count=0\n
|
||||
A: power/wakeup_expire_count=0\n
|
||||
A: power/wakeup_last_time_ms=0\n
|
||||
A: power/wakeup_max_time_ms=0\n
|
||||
A: power/wakeup_total_time_ms=0\n
|
||||
A: power_state=D0\n
|
||||
A: resource=0x00000000d2300000 0x00000000d230ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||
A: revision=0x10\n
|
||||
A: subsystem_device=0x085c\n
|
||||
A: subsystem_vendor=0x1028\n
|
||||
A: vendor=0x8086\n
|
||||
|
||||
BIN
tests/realtek/custom.pcapng
Normal file
BIN
tests/realtek/custom.pcapng
Normal file
Binary file not shown.
110
tests/realtek/custom.py
Executable file
110
tests/realtek/custom.py
Executable file
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import traceback
|
||||
import sys
|
||||
import gi
|
||||
|
||||
gi.require_version('FPrint', '2.0')
|
||||
from gi.repository import FPrint, GLib
|
||||
|
||||
# Exit with error on any exception, included those happening in async callbacks
|
||||
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
|
||||
|
||||
ctx = GLib.main_context_default()
|
||||
|
||||
c = FPrint.Context()
|
||||
c.enumerate()
|
||||
devices = c.get_devices()
|
||||
|
||||
d = devices[0]
|
||||
del devices
|
||||
|
||||
assert d.get_driver() == "realtek"
|
||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
|
||||
assert not d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||
|
||||
d.open_sync()
|
||||
|
||||
# 1. verify clear storage command, 2. make sure later asserts are good
|
||||
d.clear_storage_sync()
|
||||
|
||||
template = FPrint.Print.new(d)
|
||||
|
||||
def enroll_progress(*args):
|
||||
# assert d.get_finger_status() & FPrint.FingerStatusFlags.NEEDED
|
||||
print('enroll progress: ' + str(args))
|
||||
|
||||
def identify_done(dev, res):
|
||||
global identified
|
||||
identified = True
|
||||
try:
|
||||
identify_match, identify_print = dev.identify_finish(res)
|
||||
except gi.repository.GLib.GError as e:
|
||||
print("Please try again")
|
||||
else:
|
||||
print('indentification_done: ', identify_match, identify_print)
|
||||
assert identify_match.equal(identify_print)
|
||||
|
||||
def start_identify_async(prints):
|
||||
global identified
|
||||
print('async identifying')
|
||||
d.identify(prints, callback=identify_done)
|
||||
del prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
identified = False
|
||||
|
||||
# List, enroll, list, verify, identify, delete
|
||||
print("enrolling")
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
p = d.enroll_sync(template, None, enroll_progress, None)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
print("enroll done")
|
||||
|
||||
print("listing")
|
||||
stored = d.list_prints_sync()
|
||||
print("listing done")
|
||||
assert len(stored) == 1
|
||||
assert stored[0].equal(p)
|
||||
print("verifying")
|
||||
try:
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
verify_res, verify_print = d.verify_sync(p)
|
||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||
except gi.repository.GLib.GError as e:
|
||||
print("Please try again")
|
||||
else:
|
||||
print("verify done")
|
||||
del p
|
||||
assert verify_res == True
|
||||
|
||||
identified = False
|
||||
deserialized_prints = []
|
||||
for p in stored:
|
||||
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
|
||||
assert deserialized_prints[-1].equal(p)
|
||||
del stored
|
||||
|
||||
print('async identifying')
|
||||
d.identify(deserialized_prints, callback=identify_done)
|
||||
del deserialized_prints
|
||||
|
||||
while not identified:
|
||||
ctx.iteration(True)
|
||||
|
||||
print("deleting")
|
||||
d.delete_print_sync(p)
|
||||
print("delete done")
|
||||
|
||||
d.close_sync()
|
||||
|
||||
del d
|
||||
del c
|
||||
244
tests/realtek/device
Normal file
244
tests/realtek/device
Normal file
@@ -0,0 +1,244 @@
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-8
|
||||
N: bus/usb/001/025=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200
|
||||
E: DEVNAME=/dev/bus/usb/001/025
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: PRODUCT=bda/5813/2101
|
||||
E: TYPE=239/2/1
|
||||
E: BUSNUM=001
|
||||
E: DEVNUM=025
|
||||
E: MAJOR=189
|
||||
E: MINOR=24
|
||||
E: SUBSYSTEM=usb
|
||||
E: ID_VENDOR=Generic
|
||||
E: ID_VENDOR_ENC=Generic
|
||||
E: ID_VENDOR_ID=0bda
|
||||
E: ID_MODEL=Realtek_USB2.0_Finger_Print_Bridge
|
||||
E: ID_MODEL_ENC=Realtek\x20USB2.0\x20Finger\x20Print\x20Bridge
|
||||
E: ID_MODEL_ID=5813
|
||||
E: ID_REVISION=2101
|
||||
E: ID_SERIAL=Generic_Realtek_USB2.0_Finger_Print_Bridge_201801010001
|
||||
E: ID_SERIAL_SHORT=201801010001
|
||||
E: ID_BUS=usb
|
||||
E: ID_USB_INTERFACES=:ff0200:
|
||||
E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Corp.
|
||||
E: ID_PATH=pci-0000:00:14.0-usb-0:8
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_8
|
||||
A: authorized=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=ef\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=02\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=500mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=2101\n
|
||||
A: bmAttributes=a0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=Realtek USB2.0 Finger Print Bridge\n
|
||||
H: descriptors=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200
|
||||
A: dev=189:24\n
|
||||
A: devnum=25\n
|
||||
A: devpath=8\n
|
||||
L: driver=../../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:54
|
||||
A: idProduct=5813\n
|
||||
A: idVendor=0bda\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Generic\n
|
||||
A: maxchild=0\n
|
||||
A: physical_location/dock=no\n
|
||||
A: physical_location/horizontal_position=left\n
|
||||
A: physical_location/lid=no\n
|
||||
A: physical_location/panel=top\n
|
||||
A: physical_location/vertical_position=upper\n
|
||||
L: port=../1-0:1.0/usb1-port8
|
||||
A: power/active_duration=271844\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=2\n
|
||||
A: power/autosuspend_delay_ms=2000\n
|
||||
A: power/connected_duration=271844\n
|
||||
A: power/control=on\n
|
||||
A: power/level=on\n
|
||||
A: power/persist=1\n
|
||||
A: power/runtime_active_kids=0\n
|
||||
A: power/runtime_active_time=271564\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=1\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=Realtek USB2.0 Finger Print Bridge\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=removable\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=201801010001\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=297176\n
|
||||
A: version= 2.01\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0/usb1
|
||||
N: bus/usb/001/001=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C
|
||||
E: DEVNAME=/dev/bus/usb/001/001
|
||||
E: DEVTYPE=usb_device
|
||||
E: DRIVER=usb
|
||||
E: PRODUCT=1d6b/2/605
|
||||
E: TYPE=9/0/1
|
||||
E: BUSNUM=001
|
||||
E: DEVNUM=001
|
||||
E: MAJOR=189
|
||||
E: MINOR=0
|
||||
E: SUBSYSTEM=usb
|
||||
E: ID_VENDOR=Linux_6.5.0-18-generic_xhci-hcd
|
||||
E: ID_VENDOR_ENC=Linux\x206.5.0-18-generic\x20xhci-hcd
|
||||
E: ID_VENDOR_ID=1d6b
|
||||
E: ID_MODEL=xHCI_Host_Controller
|
||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||
E: ID_MODEL_ID=0002
|
||||
E: ID_REVISION=0605
|
||||
E: ID_SERIAL=Linux_6.5.0-18-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||
E: ID_BUS=usb
|
||||
E: ID_USB_INTERFACES=:090000:
|
||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||
E: ID_AUTOSUSPEND=1
|
||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||
E: ID_PATH=pci-0000:00:14.0
|
||||
E: ID_PATH_TAG=pci-0000_00_14_0
|
||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
|
||||
E: TAGS=:seat:
|
||||
E: CURRENT_TAGS=:seat:
|
||||
A: authorized=1\n
|
||||
A: authorized_default=1\n
|
||||
A: avoid_reset_quirk=0\n
|
||||
A: bConfigurationValue=1\n
|
||||
A: bDeviceClass=09\n
|
||||
A: bDeviceProtocol=01\n
|
||||
A: bDeviceSubClass=00\n
|
||||
A: bMaxPacketSize0=64\n
|
||||
A: bMaxPower=0mA\n
|
||||
A: bNumConfigurations=1\n
|
||||
A: bNumInterfaces= 1\n
|
||||
A: bcdDevice=0605\n
|
||||
A: bmAttributes=e0\n
|
||||
A: busnum=1\n
|
||||
A: configuration=
|
||||
H: descriptors=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C
|
||||
A: dev=189:0\n
|
||||
A: devnum=1\n
|
||||
A: devpath=0\n
|
||||
L: driver=../../../../bus/usb/drivers/usb
|
||||
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c
|
||||
A: idProduct=0002\n
|
||||
A: idVendor=1d6b\n
|
||||
A: interface_authorized_default=1\n
|
||||
A: ltm_capable=no\n
|
||||
A: manufacturer=Linux 6.5.0-18-generic xhci-hcd\n
|
||||
A: maxchild=16\n
|
||||
A: power/active_duration=351477916\n
|
||||
A: power/async=enabled\n
|
||||
A: power/autosuspend=0\n
|
||||
A: power/autosuspend_delay_ms=0\n
|
||||
A: power/connected_duration=351477916\n
|
||||
A: power/control=auto\n
|
||||
A: power/level=auto\n
|
||||
A: power/runtime_active_kids=3\n
|
||||
A: power/runtime_active_time=351477912\n
|
||||
A: power/runtime_enabled=enabled\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=0\n
|
||||
A: power/wakeup=disabled\n
|
||||
A: power/wakeup_abort_count=\n
|
||||
A: power/wakeup_active=\n
|
||||
A: power/wakeup_active_count=\n
|
||||
A: power/wakeup_count=\n
|
||||
A: power/wakeup_expire_count=\n
|
||||
A: power/wakeup_last_time_ms=\n
|
||||
A: power/wakeup_max_time_ms=\n
|
||||
A: power/wakeup_total_time_ms=\n
|
||||
A: product=xHCI Host Controller\n
|
||||
A: quirks=0x0\n
|
||||
A: removable=unknown\n
|
||||
A: rx_lanes=1\n
|
||||
A: serial=0000:00:14.0\n
|
||||
A: speed=480\n
|
||||
A: tx_lanes=1\n
|
||||
A: urbnum=2135\n
|
||||
A: version= 2.00\n
|
||||
|
||||
P: /devices/pci0000:00/0000:00:14.0
|
||||
E: DRIVER=xhci_hcd
|
||||
E: PCI_CLASS=C0330
|
||||
E: PCI_ID=8086:A36D
|
||||
E: PCI_SUBSYS_ID=1028:085C
|
||||
E: PCI_SLOT_NAME=0000:00:14.0
|
||||
E: MODALIAS=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30
|
||||
E: SUBSYSTEM=pci
|
||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
||||
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
|
||||
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
|
||||
E: ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller
|
||||
A: ari_enabled=0\n
|
||||
A: broken_parity_status=0\n
|
||||
A: class=0x0c0330\n
|
||||
H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004505531F00000000316000000000000000000000000000000180C2C108000000000000000000000005908700D802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000
|
||||
A: consistent_dma_mask_bits=64\n
|
||||
A: d3cold_allowed=1\n
|
||||
A: dbc=disabled\n
|
||||
A: dbc_bInterfaceProtocol=01\n
|
||||
A: dbc_bcdDevice=0010\n
|
||||
A: dbc_idProduct=0010\n
|
||||
A: dbc_idVendor=1d6b\n
|
||||
A: device=0xa36d\n
|
||||
A: dma_mask_bits=64\n
|
||||
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||
A: driver_override=(null)\n
|
||||
A: enable=1\n
|
||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b
|
||||
A: index=4\n
|
||||
A: irq=126\n
|
||||
A: label=Onboard - Other\n
|
||||
A: local_cpulist=0-3\n
|
||||
A: local_cpus=f\n
|
||||
A: modalias=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30\n
|
||||
A: msi_bus=1\n
|
||||
A: msi_irqs/126=msi\n
|
||||
A: numa_node=-1\n
|
||||
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 7 2112 7\nxHCI ring segments 24 24 4096 24\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 12 32 128 1\nbuffer-32 0 0 32 0\n
|
||||
A: power/async=enabled\n
|
||||
A: power/control=on\n
|
||||
A: power/runtime_active_kids=1\n
|
||||
A: power/runtime_active_time=351478612\n
|
||||
A: power/runtime_enabled=forbidden\n
|
||||
A: power/runtime_status=active\n
|
||||
A: power/runtime_suspended_time=0\n
|
||||
A: power/runtime_usage=1\n
|
||||
A: power/wakeup=enabled\n
|
||||
A: power/wakeup_abort_count=0\n
|
||||
A: power/wakeup_active=0\n
|
||||
A: power/wakeup_active_count=0\n
|
||||
A: power/wakeup_count=0\n
|
||||
A: power/wakeup_expire_count=0\n
|
||||
A: power/wakeup_last_time_ms=0\n
|
||||
A: power/wakeup_max_time_ms=0\n
|
||||
A: power/wakeup_total_time_ms=0\n
|
||||
A: power_state=D0\n
|
||||
A: resource=0x00000000d2300000 0x00000000d230ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
|
||||
A: revision=0x10\n
|
||||
A: subsystem_device=0x085c\n
|
||||
A: subsystem_vendor=0x1028\n
|
||||
A: vendor=0x8086\n
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <cairo.h>
|
||||
#include "fpi-assembling.h"
|
||||
#include "fpi-image.h"
|
||||
#include "test-config.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -67,8 +66,7 @@ test_frame_assembling (void)
|
||||
g_autoptr(FpImage) fp_img = NULL;
|
||||
GSList *frames = NULL;
|
||||
|
||||
g_assert_false (SOURCE_ROOT == NULL);
|
||||
path = g_build_path (G_DIR_SEPARATOR_S, SOURCE_ROOT, "tests", "vfs5011", "capture.png", NULL);
|
||||
path = g_test_build_filename (G_TEST_DIST, "vfs5011", "capture.png", NULL);
|
||||
|
||||
img = cairo_image_surface_create_from_png (path);
|
||||
data = cairo_image_surface_get_data (img);
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
#!/bin/sh -e
|
||||
|
||||
if [ ! -x "$UDEV_HWDB" ]; then
|
||||
echo "E: UDEV_HWDB (${UDEV_HWDB}) unset or not executable."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$UDEV_HWDB_CHECK_CONTENTS" == 1 ]; then
|
||||
generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint-XXXXXX.hwdb")
|
||||
if [ "$UDEV_HWDB_CHECK_CONTENTS" = 1 ]; then
|
||||
generated_rules=$(mktemp "${TMPDIR:-/tmp}/libfprint.hwdb.XXXXXX")
|
||||
else
|
||||
generated_rules=/dev/null
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user