Compare commits

..
Author SHA1 Message Date
Marco Trevisan (Treviño) 0c97a47d8e Release 1.94.10 2026-02-10 03:18:14 +01:00
Petko BordjukovandMarco Trevisan 5f1da71e70 synaptics: Add 06cb:00e9
Tested working on an HP x360 1040 G8

Reverts: 0edae7b641
2026-02-10 02:01:08 +00:00
Ankur 87092d74ff Add support for 04f3:0ca7 Elan Microelectronics Corp. ELAN:ARM-M4 2025-12-18 10:59:29 -08:00
herman lin df67c08a97 elanmoc: Add new PID 0xCB0 2025-12-16 16:20:35 +08:00
Marco Trevisan (Treviño) b069c78348 fpcmoc: Do not leak the interrupt cancellable
g_set_object adds a reference already so we need to cleanup the original
reference first if we do not want to leak it
2025-12-09 20:37:34 +01:00
Marco Trevisan (Treviño) bd7c745b02 ci: Use rawhide for testing again
Reverts commit: 9141014456
2025-12-06 03:17:52 +01:00
Marco Trevisan (Treviño) aa010b5c3b fp-device: Clarify getter for open property 2025-12-06 03:17:52 +01:00
Marco Trevisan (Treviño) a9c6621119 focaltech_moc: add new pid:0xA27A 2025-12-06 01:39:32 +00:00
Ryan WongandMarco Trevisan 3cd4f4d80d Realtek: Add new ID 2541:fa03
This FPreader was found on Minisforum X1 Pro MiniPC, and it is
listed by lsusb as "Generic Realtek USB2.0 Finger Print Bridge".
Though the VID is not the same as the well-known "0bda", we can
confirm it's from Realtek by analyzing Windows version driver.

Signed-off-by: Ryan Wong <colorfulshark@gmail.com>
2025-12-06 01:33:10 +00:00
Himura KazutoandMarco Trevisan 3460b020e1 egismoc: support ETU905A88-E device (1c7a:0584) 2025-12-06 01:26:29 +00:00
herman linandMarco Trevisan 0202368f17 elanmoc: Add new PID 0x0CA8 2025-12-06 01:21:04 +00:00
Hao ChenandMarco Trevisan b039469711 focaltech: add support for 2808:1579 2025-12-06 01:15:36 +00:00
Marco Trevisan (Treviño) c2988ae33d drivers: Do not use Fp-prefix for driver-specific types
It's a libfprint specific prefix, so let's avoid confusion.
2025-12-06 01:09:38 +00:00
Marco Trevisan (Treviño) 9a4faf378e libfprint: Use fatal-warnings on g-i-scanner
Be strict on introspection checks, so that we are sure to do the things
properly.
2025-12-06 01:03:51 +00:00
jialeiandMarco Trevisan 1af1acd81c goodixmoc:add new PID 0x66A9 2025-12-06 00:52:02 +00:00
Aris LinandMarco Trevisan 83367979a1 synaptics: add new PID 0x1A0 2025-12-06 00:42:44 +00:00
SilverDiamondandMarco Trevisan ebbf806d5c egismoc: add 1c7a:0588 2025-12-06 00:35:37 +00:00
With Mask 35956799e7 Edit autosuspend.hwdb 2025-11-08 20:57:52 +00:00
With Mask c7ab8e992c feat: Add support for Synaptics 06cb:0169 2025-11-08 10:30:27 +00:00
Danny 596b5f8032 fpcmoc: add 10a5:a306 fingerprint reader 2025-08-08 21:30:32 +02:00
Aris LinandMarco Trevisan 7f5304d6ee synaptics: add new PID 0x019F, 0x109 and 0x10A 2025-07-31 23:56:39 +00:00
Aris LinandMarco Trevisan bde868f05e synaptics: add usb reset in probe to recover stall condition 2025-07-31 23:56:39 +00:00
Marco Trevisan (Treviño) a7448fbb4a ci: Only run pages step on push events 2025-08-01 01:47:17 +02:00
Marco Trevisan (Treviño) f84ab3d104 gcovr: Add gcovr project configuration
And mark suspicious hits as warnings instead of failures
2025-08-01 01:42:01 +02:00
Benjamin Berg da42268911 goodixmoc: fix crash in exit callback handler
If the button shield command cannot be executed due to an underlying
error then resp is NULL. Avoid the crash by adding the appropriate
check.

Closes: #694
2025-07-24 08:39:54 +02:00
Benjamin Berg d83a785260 ci: permit coverage failures for now
gcovr seems to fail for unclear reasons. Permit failures to not block
merge requests.
2025-07-23 19:09:54 +02:00
Jordan PetridisandBenjamin Berg 2b100a912b ci: Pin the version of the Flatpak template
In [1] the template broke due to the inclusion of
a sub-include which doesn't resolve across different
gitlab instances without the same group setup.

Pin the template for now to the previous working commit

[1] https://gitlab.gnome.org/GNOME/citemplates/-/merge_requests/104#note_2501085
2025-07-23 19:09:04 +02:00
Marco Trevisan (Treviño) dc8b05f0a3 Release 1.94.9 2025-02-20 18:41:27 +01:00
Marco Trevisan (Treviño) c37da8568f build: Use fs to get files basename
We can safely bump meson
2025-02-20 18:41:27 +01:00
Marco Trevisan (Treviño) e401fc10e8 build: Do not use deprecated features in meson 2025-02-20 18:28:15 +01:00
Marco Trevisan (Treviño) db48d1a4e4 build: Adapt meson version to requirements 2025-02-20 18:28:15 +01:00
Marco Trevisan (Treviño) d1504a30b7 fp-device: Clarify docs about FP_DEVICE_RETRY_TOO_FAST
This is an error that is valid also for touch devices, so let's make it
more generic in description
2025-02-20 17:20:03 +01:00
Marco Trevisan (Treviño) 7208b29756 tests: Ignore testing external tools with valgrind 2025-02-20 15:50:46 +00:00
Marco Trevisan (Treviño) e9dbfbec39 ci: Install appstream for testing metainfo 2025-02-20 15:50:46 +00:00
Marco Trevisan (Treviño) c6ca915067 tests: Validate the generated metainfo if appstreamcli is available 2025-02-20 15:50:46 +00:00
Marco Trevisan (Treviño) 385bc5e384 libfprint/fprint-list-metainfo: Generate AppStream metainfo
UI tools can use this information to see what package provides support
for specific devices, so let's provide the data since we have it.
2025-02-20 15:50:46 +00:00
Marco Trevisan (Treviño) ee73d67765 scripts/uncrustify: Use 2-spaces indentation for defines too 2025-02-20 15:50:46 +00:00
Marco Trevisan (Treviño) 4dd51f38c7 examples/clear-storage: Remove local storage for devices without storage 2025-02-20 16:37:11 +01:00
Marco Trevisan (Treviño) 5b300edbe5 examples/storage: Clear storage per device
We used to clear the whole storage file, but this has to be done
per-device, not globally
2025-02-20 16:35:58 +01:00
Marco Trevisan (Treviño) 817281f6fd examples/clear-storage: Cleanup code and use better error handling 2025-02-20 16:35:58 +01:00
Abhinav BaidandMarco Trevisan (Treviño) aa18595ec7 Add clear-storage example 2025-02-20 16:35:58 +01:00
Marco Trevisan (Treviño) fa5828f8c0 fp-device: Fix introspection warnings in handling closure tag
It has to be defined in the callback, not on the data.
2025-02-20 14:34:13 +01:00
Marco Trevisan (Treviño) fc3effd73b goodixmoc/proto: Use a byte-reader to parse the finger ID 2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 63b5908f38 goodix: Read the header using byte reader 2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 7b97bed91f ci: Add job testing libfprint using address and undefined sanitizers 2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 41949db6ce uru4000: Fix shifting using unsigned types
../libfprint/drivers/uru4000.c:743:35: runtime error: left shift of 138 by 24
places cannot be represented in type 'int'
    #0 0x7fa3e696e06d in imaging_run_state ../libfprint/drivers/uru4000.c:743
    #1 0x7fa3e6a366f6 in __ssm_call_handler ../libfprint/fpi-ssm.c:254
    #2 0x7fa3e6a38cc8 in fpi_ssm_next_state ../libfprint/fpi-ssm.c:465
    #3 0x7fa3e696bd07 in sm_read_reg_cb ../libfprint/drivers/uru4000.c:515
    #4 0x7fa3e6a3db74 in transfer_finish_cb ../libfprint/fpi-usb-transfer.c:352
    #5 0x7fa3ed9b9862 in g_task_return_now ../../glib/gio/gtask.c:1363
    #6 0x7fa3ed9b989c in complete_in_idle_cb ../../glib/gio/gtask.c:1377
    #7 0x7fa3ede4a70b in g_main_dispatch ../../glib/glib/gmain.c:3373
    #8 0x7fa3ede4c8de in g_main_context_dispatch_unlocked ../../glib/glib/gmain.c:4224
    #9 0x7fa3ede4c8de in g_main_context_iterate_unlocked ../../glib/glib/gmain.c:4289
    #10 0x7fa3ede4cfef in g_main_context_iteration ../../glib/glib/gmain.c:4354
    #11 0x7fa3e68d4a1b in fp_device_capture_sync ../libfprint/fp-device.c:2048
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) d8e0791554 goodixmoc/proto: Use FpiByteReader to parse the body
We had some read issues, so let's just use the safer reader that
makes things cleaner too

../libfprint/drivers/goodixmoc/goodix_proto.c:418:42: runtime error:
load of misaligned address 0x0000115ced29 for type 'uint16_t', which
requires 2 byte alignment
0x0000115ced29: note: pointer points here
 00 c0 3f  00 21 64 1c 00 00 00 00  64 00 43 01 01 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00
              ^
    #0 0x7f974ff9e868 in gx_proto_parse_body ../libfprint/drivers/goodixmoc/goodix_proto.c:418
    #1 0x7f974ff8ec79 in fp_cmd_receive_cb ../libfprint/drivers/goodixmoc/goodix.c:185
    #2 0x7f975003ca0c in transfer_finish_cb ../libfprint/fpi-usb-transfer.c:352
    #3 0x7f9756e57862 in g_task_return_now ../../glib/gio/gtask.c:1363
    #4 0x7f9756e5789c in complete_in_idle_cb ../../glib/gio/gtask.c:1377
    #5 0x7f97577f070b in g_main_dispatch ../../glib/glib/gmain.c:3373
    #6 0x7f97577f28de in g_main_context_dispatch_unlocked ../../glib/glib/gmain.c:4224
    #7 0x7f97577f28de in g_main_context_iterate_unlocked ../../glib/glib/gmain.c:4289
    #8 0x7f97577f2fef in g_main_context_iteration ../../glib/glib/gmain.c:4354
    #9 0x7f974fed4656 in fp_device_verify_sync ../libfprint/fp-device.c:1976
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) c7059dc61c goodixmoc: Use FpiByteReader to safely read the device CRC
This is was leading to a potential error due to misaligned memory:

../libfprint/drivers/goodixmoc/goodix.c:167:20: runtime error: load of
misaligned address 0x00001165c989 for type 'uint32_t', which requires 4 byte
alignment
0x00001165c989: note: pointer points here
 00 00 00  00 0a ac b3 09 00 00 00  00 00 00 55 53 42 00 00  00 00 00 56 42 53 00 00  00 00 00 30 30
              ^
    #0 0x7ff3ba98d190 in fp_cmd_receive_cb ../libfprint/drivers/goodixmoc/goodix.c:167
    #1 0x7ff3baa3b235 in transfer_finish_cb ../libfprint/fpi-usb-transfer.c:352
    #2 0x7ff3c18ca862 in g_task_return_now ../../glib/gio/gtask.c:1363
    #3 0x7ff3c18ca89c in complete_in_idle_cb ../../glib/gio/gtask.c:1377
    #4 0x7ff3c228470b in g_main_dispatch ../../glib/glib/gmain.c:3373
    #5 0x7ff3c22868de in g_main_context_dispatch_unlocked ../../glib/glib/gmain.c:4224
    #6 0x7ff3c22868de in g_main_context_iterate_unlocked ../../glib/glib/gmain.c:4289
    #7 0x7ff3c2286fef in g_main_context_iteration ../../glib/glib/gmain.c:4354
    #8 0x7ff3ba8d2fe5 in fp_device_open_sync ../libfprint/fp-device.c:1874
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 0c315b4f0a tests/goodixmoc: Add explicit test on print description
So that we can ensure that what we get from device matches
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) b04553cac9 goodix-proto: Do not memcpy NULL values
../libfprint/drivers/goodixmoc/goodix_proto.c:214:5: runtime error: null pointer passed as argument 2, which is declared to never be null
    #0 0x7f378839c3e5 in gx_proto_build_package ../libfprint/drivers/goodixmoc/goodix_proto.c:214
    #1 0x7f378838fd9e in alloc_cmd_transfer ../libfprint/drivers/goodixmoc/goodix.c:309
    #2 0x7f378838ffe4 in goodix_sensor_cmd ../libfprint/drivers/goodixmoc/goodix.c:336
    #3 0x7f378839a778 in gx_fp_template_delete_all ../libfprint/drivers/goodixmoc/goodix.c:1602
    #4 0x7f37882d3d59 in fp_device_clear_storage ../libfprint/fp-device.c:1820
    #5 0x7f37882d50af in fp_device_clear_storage_sync ../libfprint/fp-device.c:2132
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) c1dcaa805d goodixmoc: Fix potential invalid shift on integer type
../libfprint/drivers/goodixmoc/goodix_proto.c:111:26: runtime error: left shift of 1 by 31 places cannot be represented in type 'int'
    #0 0x7f6776799c2e in reflect ../libfprint/drivers/goodixmoc/goodix_proto.c:111
    #1 0x7f677679a0f3 in crc32_final ../libfprint/drivers/goodixmoc/goodix_proto.c:147
    #2 0x7f677679a3ee in gx_proto_crc32_calc ../libfprint/drivers/goodixmoc/goodix_proto.c:164
    #3 0x7f677679d7aa in gx_proto_init_sensor_config ../libfprint/drivers/goodixmoc/goodix_proto.c:464
    #4 0x7f6776797b40 in gx_fp_init ../libfprint/drivers/goodixmoc/goodix.c:1415
    #5 0x7f67766cc56e in fp_device_open ../libfprint/fp-device.c:866
    #6 0x7f67766d2fd4 in fp_device_open_sync ../libfprint/fp-device.c:1872
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 7b2895271d synaptics: Do not call memcpy with NULL data
../libfprint/drivers/synaptics/bmkt_message.c:260:5: runtime error: null pointer passed as argument 2, which is declared to never be null
    #0 0x7fd21f154592 in bmkt_compose_message ../libfprint/drivers/synaptics/bmkt_message.c:260
    #1 0x7fd21f14596c in synaptics_sensor_cmd ../libfprint/drivers/synaptics/synaptics.c:417
    #2 0x7fd21f14d93f in dev_probe ../libfprint/drivers/synaptics/synaptics.c:1329
    #3 0x7fd21f0ca61d in device_idle_probe_cb ../libfprint/fp-device.c:375
    #4 0x7fd21f21a431 in timeout_dispatch ../libfprint/fpi-device.c:336
    #5 0x7fd2269cf70b in g_main_dispatch ../../glib/glib/gmain.c:3373
    #6 0x7fd2269d18de in g_main_context_dispatch_unlocked ../../glib/glib/gmain.c:4224
    #7 0x7fd2269d18de in g_main_context_iterate_unlocked ../../glib/glib/gmain.c:4289
    #8 0x7fd2269d1fef in g_main_context_iteration ../../glib/glib/gmain.c:4354
    #9 0x7fd21f0c5a85 in fp_context_enumerate ../libfprint/fp-context.c:575
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 3e653fe85b build/tests: Increase timeout multiplier in valgrind
CI is quite slow these days, so let's give valgrind more time
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 830a9977c0 build: Support running tests with memory sanitizers
When memory sanitizers are set, tests may fail because we are indirectly
LD_PRELOAD'ing (through umockdev). While we could ensure that sanitizer
libraries are loaded first, it's just something we don't care because we
don't want to test the launcher wrappers themselves.

So, let's just ignore the link order and live with it
2025-02-13 23:51:52 +00:00
Marco Trevisan (Treviño) 6b914a2070 data: Update unsupported devices list 2025-02-14 00:40:16 +01:00
Marco Trevisan (Treviño) 22e6670aa0 elanspi: Add elanspi PID 0x2766
Patch by Z. A.

Closes: #571
2025-02-14 00:29:17 +01:00
Marco Trevisan (Treviño) 6723b74f86 elanspi: Add elanspi PID 0x3128
Patch by Alexey Vishnyakov

Closes: #650
2025-02-13 23:22:46 +01:00
Marco Trevisan (Treviño) 7d9638bc43 goodix: Add support for PID 0x60C2
Patch by Sergey Kokorin

Closes: #646
2025-02-13 22:01:02 +00:00
huan_huangandMarco Trevisan 559c18785b realtek: modify the way to store userid in enroll flow
Signed-off-by: huan_huang <huan_huang@realsil.com.cn>
2025-02-13 20:40:49 +00:00
MrNerdHairandMarco Trevisan 9e8dda5f17 upekts: fix typo 2025-02-13 19:20:10 +00:00
MrNerdHairandMarco Trevisan f906afb757 upekts: handle more retryable verify errors 2025-02-13 19:20:10 +00:00
MrNerdHairandMarco Trevisan 1c4ed2e225 fp-device: add FP_DEVICE_RETRY_TOO_FAST error code 2025-02-13 19:20:10 +00:00
MrNerdHairandMarco Trevisan cdc22b4553 upekts: fix verify 2025-02-13 19:20:10 +00:00
Marco Trevisan (Treviño) 57c535d0cb libfprint.supp: Ignore libusb context init potential leak 2025-02-13 18:52:24 +00:00
Marco Trevisan (Treviño) a94a55b8df ci: Use distro-provided umockdev
It's new enough nowadays
2025-02-13 18:52:24 +00:00
Marco Trevisan (Treviño) 133eaab061 uru4000: Use OpenSSL to perform AES-ECB encryption
Drop usage of NSS library now that openssl >= 3.0 has not anymore any
license incompatibility.

OpenSSL will provide us a better ground for further developments and
it's also the preferred crypto library by most distros these days
2025-02-13 18:52:24 +00:00
DadoumandMarco Trevisan 7a60912b61 Empty commit to hopefully fix the pipeline. 2025-02-13 18:52:24 +00:00
Marco Trevisan (Treviño) 6702c32b2b tests/meson: Ignore debug messages when generating hwdb 2025-02-13 19:31:16 +01:00
Marco Trevisan (Treviño) b8ed4b5d63 tests/virtual-image: Use sleep multiplier when running under valgrind 2025-02-13 18:46:15 +01:00
Marco Trevisan (Treviño) 8433563602 tests: Do not enable virtual device hot seconds under valgrind
Valgrind tests may be slow, leading the devices to be considered hot.

We don't disable this for other tests, since we may still want to be
sure that the logic is fine for normal usage
2025-02-13 18:46:15 +01:00
Marco Trevisan (Treviño) 026c09d0b4 virtual-{image, device}: Make hot seconds value to be configurable 2025-02-13 18:46:15 +01:00
Marco Trevisan (Treviño) 3abdda4391 tests/virtual-image: Do not send images or retries if driver is not waiting finger 2025-02-13 03:36:52 +01:00
Marco Trevisan (Treviño) 981f8e0a42 virtual-image: Only receive image when waiting for finger
We may send an image when not waiting it, leading to a failure:

libfprint-image_device-DEBUG: 00:55:29.669: Image device internal state change
  from FPI_IMAGE_DEVICE_STATE_DEACTIVATING to FPI_IMAGE_DEVICE_STATE_INACTIVE
libfprint-image-DEBUG: 00:55:31.861: Minutiae scan completed in 2.204906 secs
libfprint-print-DEBUG: 00:55:56.902: score 1093/40
libfprint-device-DEBUG: 00:55:56.902: Device reported verify result
libfprint-device-DEBUG: 00:55:56.902: Device reported verify completion
libfprint-device-DEBUG: 00:55:56.903: Updated temperature model after 27.26
  seconds, ratio 0.69 -> 0.73, active 1 -> 1,
  FP_TEMPERATURE_WARM -> FP_TEMPERATURE_HOT
libfprint-device-DEBUG: 00:55:56.906: Completing action
  FPI_DEVICE_ACTION_VERIFY in idle!
libfprint-device-DEBUG: 00:55:56.906: Updated temperature model after 0.00
  seconds, ratio 0.73 -> 0.73, active 0 -> 0,
  FP_TEMPERATURE_HOT -> FP_TEMPERATURE_HOT
libfprint-device-DEBUG: 00:55:56.910: Updated temperature model after 0.00
  seconds, ratio 0.73 -> 0.73, active 1 -> 1,
  FP_TEMPERATURE_HOT -> FP_TEMPERATURE_HOT
libfprint-device-DEBUG: 00:55:56.910: Updated temperature model after 0.00
  seconds, ratio 0.73 -> 0.73, active 0 -> 0,
  FP_TEMPERATURE_HOT -> FP_TEMPERATURE_HOT
libfprint-virtual_image-DEBUG: 00:55:56.912: image data: 0xc8f6c10
libfprint-device-DEBUG: 00:55:56.916: Device reported finger status change:
  FP_FINGER_STATUS_PRESENT
libfprint-image_device-DEBUG: 00:55:56.917: Ignoring finger presence report as
  the device is not active!
libfprint-image_device-CRITICAL **: 00:55:56.918:
  fpi_image_device_image_captured: assertion
  'priv->state == FPI_IMAGE_DEVICE_STATE_CAPTURE' failed
2025-02-13 02:51:41 +01:00
DadoumandMarco Trevisan f18e11b435 Empty commit to hopefully fix the pipeline. 2025-02-12 21:03:10 +00:00
Dadoum .andMarco Trevisan 42d10118a3 Synaptics: add new PID 0x016C 2025-02-12 21:03:10 +00:00
Johnathon ClarkandMarco Trevisan 51d827fc74 Add support for the 10a5:c844 FPC fingerprint reader as found on
recent Lenovo Yoga i9 laptops.
2025-02-12 20:55:19 +00:00
wangyongandMarco Trevisan 1859a1e5d1 add new pid: 0xa99a, 0xa57a, 0xa78a 2025-02-12 20:45:15 +00:00
Marco Trevisan (Treviño) 7292dd642c ci: Only run uncrustify check if source files have been changed 2025-02-12 20:36:46 +00:00
Marco Trevisan (Treviño) 8e22b2e22e ci: scan-build, ignore meson-built files
Like .gir introspection files that are generated are currently failing
2025-02-12 20:36:46 +00:00
Marco Trevisan (Treviño) 28b9ab7e37 tests: Ignore more python leaks 2025-02-12 20:36:46 +00:00
Marco Trevisan (Treviño) 9141014456 ci: Let's stick to fedora 41 for now
Rawhide seems to be a bit broken, so let's go with the stable version
2025-02-12 20:36:46 +00:00
Marco Trevisan (Treviño) 6f3ab36b2e ci: Enable running pipelines on schedules or to force rebuild 2025-02-12 20:36:46 +00:00
Marco Trevisan (Treviño) d3035d5703 ci: Use rules to control when to run images build 2025-02-12 20:36:46 +00:00
Egor IgnatovandMarco Trevisan 042365dbec elanmoc: Add new PID 0x0C98
Tested-on: Lenovo IdeaPad 5 2-in-1 16AHP9
Signed-off-by: Egor Ignatov <egori@altlinux.org>
2025-02-11 20:54:24 +00:00
Zihan Chen 0c7211329e synaptics: add new PID 0x0174
Found and tested on HP Omnibook Ultra Flip
2025-02-11 20:02:38 +00:00
herman lin e1b6d8a461 elanmoc: Add new PID 0x0C9D and 0x0CA3 2025-02-10 13:49:05 +08:00
Aris Lin 09ec6e66e3 synaptics: Add new PID 0x0107 and 0x108, also fine tune PID sequence 2024-11-18 11:18:29 +08:00
SirCipherz 8ce356fccc Update autosuspend.hwdb 2024-09-05 11:05:02 +02:00
SirCipherz 98f5ad1f80 Add support for goodix 689a 2024-09-04 16:31:06 +02:00
Marco Trevisan (Treviño) 29f919b4eb build: Sum arrays instead of mixing them 2024-09-03 06:29:55 +02:00
Marco Trevisan (Treviño) e57bab2f1e Release 1.94.8 2024-09-03 05:14:11 +02:00
huan_huangandMarco Trevisan (Treviño) a88582761f realtek: add support for rts5816
Signed-off-by: huan_huang <huan_huang@realsil.com.cn>
2024-09-03 04:44:04 +02:00
Marco Trevisan (Treviño) 75adfd37d1 egismoc: Add PID 0x0583
As per comment:
 - https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/630#note_2547528
2024-08-30 04:42:56 +02:00
Tamer HassanandMarco Trevisan (Treviño) 990bd40cbf egismoc: add 0586 support 2024-08-30 04:42:56 +02:00
Tamer HassanandMarco Trevisan (Treviño) c7e95bb41f egismoc: add 0587 support (also supports 0586 but missing device file) 2024-08-30 04:42:56 +02:00
NkaspersandMarco Trevisan (Treviño) 4611cc4a1b Synaptics: add new PID 0x00C4
And drop it from the unsupported list
2024-08-30 04:34:34 +02:00
Marco Trevisan (Treviño) 78c78432b9 build: Generalize spi drivers detection
Don't be limited to elan only
2024-08-30 04:16:48 +02:00
Daniel SchaeferandMarco Trevisan (Treviño) 10e1cd76aa Don't build SPI driver on non-Linux
Doesn't build on other operating systems.
With auto-detection we don't have to manually select all other drivers.

Signed-off-by: Daniel Schaefer <dhs@frame.work>
2024-08-30 04:06:43 +02:00
Daniel SchaeferandMarco Trevisan c84d3774cf libfprint: Don't build SPI backend if not SPI driver
The SPI backend only builds on Linux, this makes it work non non-Linux platforms, such as FreeBSD.

Signed-off-by: Daniel Schaefer <dhs@frame.work>
2024-08-30 02:00:16 +00:00
Haowei LoandMarco Trevisan 04a167b09b fpcmoc: Add PID 0x9524 and 0x9544
Change-Id: Id85116df233308297cf3d7b56146582a79f5fcdd
2024-08-30 01:33:03 +00:00
Aris LinandMarco Trevisan 538a18cf17 synaptics: Add new PID 0x00C6 2024-08-30 00:57:29 +00:00
Aris LinandMarco Trevisan 2e766904f0 synaptics: Add new PID 0x019D 2024-08-30 00:57:29 +00:00
haoweiloandMarco Trevisan 9f55ef690d fpcmoc: fixed the error jumping to wrong state at end of custom enroll 2024-08-30 00:47:01 +00:00
herman lin b6061c0af8 elanmoc: Add new PID 0x0C9F 2024-08-08 14:08:19 +08:00
Marco Trevisan (Treviño) 3f70bde21c fp-device: Do not duplicate udev paths strings
This is happening already internally when using g_value_set_string
2024-06-17 19:08:16 +00:00
Timo SchraderandMarco Trevisan dd6f020378 goodixmoc: Add PID 0x609A 2024-06-17 17:57:29 +00:00
craigcabrey 2a4c05662a goodixmoc: Add PID 0x6512 2024-06-15 12:17:34 -05:00
Marco Trevisan (Treviño) eaec2339cc libfprint-fprint-list-udev-hwdb: Add new broadcom device IDs 2024-05-22 17:09:38 +02:00
Marco Trevisan (Treviño) 83035be830 README: Add contact information 2024-05-03 15:35:11 +02:00
Marco Trevisan (Treviño) 4709efc678 fpi-device: Clarify transfer of errors in device complete tasks 2024-04-17 17:00:47 +00:00
Marco Trevisan (Treviño) 37ded921fd fpi-device: Simplify logic of fpi_device_task_return_data_free
The clear functions will do NULL checks already, so there's no need to
duplicate such effort
2024-04-17 17:00:47 +00:00
Haowei Lo b7f3544e98 fpcmoc: Transfer error from autoptr before fpi_device_close_complete
Fixed coredump because of trying to free a null space

Change-Id: If5a23ba7b4f307580593712612e150d1ab893826
2024-04-18 00:38:44 +08:00
steven.chenandMarco Trevisan 093f2fc0a6 fpcmoc: Modify ctrl timeout to fix identify return failed 2024-04-17 15:05:06 +00:00
Lee Jiajun c5def9a528 goodixmoc: Add PID 0x609A 2024-04-17 09:37:25 +00:00
haoweiloandMarco Trevisan e71f3de786 fpcmoc: add error handling to evt_finger_dwn
Redo the current task state
if we got failed status from evt_finger_dwn
2024-04-17 08:33:24 +00:00
haoweiloandMarco Trevisan 420fd7416d fpcmoc: fix incorrect immobile handling during enrollment
For the custom enrollment,
if the number of immobile touches have reached the maximum,
we should treat this touch as normal (valid) and increase
the enrollment progress.
2024-04-17 08:33:24 +00:00
Haowei Lo f505158c04 fpcmoc: clean cmd_ssm before callback
fixed assertion of "cmd_ssm is not null"

Change-Id: I8f914468dc0e40c6cac33d680411a2d957cf2296
2024-04-16 21:46:19 +08:00
Jichi Zhang fb13722629 goodixmoc: Add PID 0x650C 2024-03-13 05:16:16 -07:00
Marco Trevisan (Treviño) 666cd0c08d egismoc: Use FpiByteReader to compute the check bytes
We can read the values in the proper format without having to
deal with endianness ourself, so let's do this instead of manual
labor.
2024-02-20 18:07:18 +01:00
Marco Trevisan (Treviño) e055781006 egismoc: Use FpiByteWriter to allocate the commit payload 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 48c8c539c7 egismoc: Use FpiByteWriter to generate the get check command 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 40c7599fb1 egismoc: Compute the delete command using FpiByteWriter 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 28c26c7d7e egismoc: Use FpiByteReader to read the enrolled IDs 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) dd5a71695f egismoc: Use FpiByteWriter to prepare the command message 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 977d324970 egismoc: Do not store twice the number of enrolled IDs
We already store it in the array, so let's just use that value
2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 4992110829 fpi-byte-writer: Zero-init the allocated data by default
This could have been done via fill method + pos reset, but it's just
something we normally want to do for safety, so let's do it all the
times.
2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 53f2539b6a fpi-byte-writer: Use nicer API to unset the parent data 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 18e2906d62 fpi-byte-writer: Initialize the parent size when initializing with size 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 19806546a2 fpi-byte-writer: Add change pos method
It allows to move the position of the cursor with a relative position.
2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 75559415fe fpi-byte-writer/reader: Add autopointers definitions 2024-02-20 17:57:46 +01:00
Marco Trevisan (Treviño) 7dbb21e77a build/tests: Skip a test if the test requires it during inspection
In case we don't have dependencies, we should skip the test, otherwise
we can just fail at test time
2024-02-20 08:25:53 +01:00
Marco Trevisan (Treviño) 4b72f27de6 build: Look for sh just once 2024-02-20 08:22:42 +01:00
Marco Trevisan (Treviño) 5ada931ede ci: Export coverage to pages
So that we can link it outside
2024-02-20 01:55:11 +01:00
158 changed files with 3343 additions and 6522 deletions
+80 -43
View File
@@ -4,7 +4,7 @@ include:
- project: 'freedesktop/ci-templates' - project: 'freedesktop/ci-templates'
ref: master ref: master
file: '/templates/fedora.yml' file: '/templates/fedora.yml'
- remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml' - remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/71e636e012ae0ab04c5e0fe40ca73ada91ae6bde/flatpak/flatpak_ci_initiative.yml'
default: default:
# Auto-retry jobs in case of infra failures # Auto-retry jobs in case of infra failures
@@ -28,6 +28,8 @@ workflow:
rules: rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event' - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- if: $CI_PIPELINE_SOURCE == 'push' - if: $CI_PIPELINE_SOURCE == 'push'
- if: $CI_PIPELINE_SOURCE == 'schedule'
- if: $CI_PROJECT_NAMESPACE == 'libfprint' && $LIBFPRINT_CI_ACTION != ''
stages: stages:
- image-build - image-build
@@ -35,12 +37,13 @@ stages:
- build - build
- test - test
- flatpak - flatpak
- deploy
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
.build_one_driver_template: &build_one_driver .build_one_driver_template: &build_one_driver
script: script:
# Build with a driver that doesn't need imaging, or nss # Build with a driver that doesn't need imaging, or openssl
- meson setup _build --werror -Ddrivers=$driver - meson setup _build --werror -Ddrivers=$driver
- meson compile -C _build - meson compile -C _build
- rm -rf _build/ - rm -rf _build/
@@ -56,11 +59,16 @@ image: $FEDORA_IMAGE
script: script:
- ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD) - ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD)
.standard_job:
rules:
- when: on_success
- if: $CI_PIPELINE_SOURCE == "schedule"
when: never
build: build:
stage: build stage: build
except: extends:
variables: - .standard_job
- $CI_PIPELINE_SOURCE == "schedule"
variables: variables:
driver: virtual_image driver: virtual_image
<<: *build_one_driver <<: *build_one_driver
@@ -75,13 +83,12 @@ build:
test: test:
stage: test stage: test
except: extends:
variables: - .standard_job
- $CI_PIPELINE_SOURCE == "schedule"
script: script:
- meson setup _build --werror -Ddrivers=all -Db_coverage=true - meson setup _build --werror -Ddrivers=all -Db_coverage=true
- meson test -C _build --print-errorlogs --no-stdsplit --timeout-multiplier 3 - meson test -C _build --print-errorlogs --no-stdsplit --timeout-multiplier 3
- ninja -C _build coverage - ninja -C _build coverage || true
- cat _build/meson-logs/coverage.txt || true - cat _build/meson-logs/coverage.txt || true
artifacts: artifacts:
reports: reports:
@@ -99,10 +106,8 @@ test:
test_valgrind: test_valgrind:
stage: test stage: test
allow_failure: true extends:
except: - .standard_job
variables:
- $CI_PIPELINE_SOURCE == "schedule"
script: script:
- meson setup _build -Ddrivers=all - meson setup _build -Ddrivers=all
- meson compile -C _build - meson compile -C _build
@@ -117,11 +122,27 @@ test_valgrind:
- _build/meson-logs/testlog-valgrind.txt - _build/meson-logs/testlog-valgrind.txt
expire_in: 1 week expire_in: 1 week
test_asan:
stage: test
extends:
- .standard_job
script:
- meson setup _build -Ddrivers=all -Db_sanitize=address,undefined
- meson test -C _build --print-errorlogs --no-stdsplit
artifacts:
reports:
junit: "_build/meson-logs/testlog.junit.xml"
expose_as: 'Sanitizers test logs'
when: always
paths:
- _build/meson-logs
- _build/meson-logs/testlog.txt
expire_in: 1 week
test_installed: test_installed:
stage: test stage: test
except: extends:
variables: - .standard_job
- $CI_PIPELINE_SOURCE == "schedule"
script: script:
- meson setup _build --prefix=/usr -Ddrivers=all - meson setup _build --prefix=/usr -Ddrivers=all
- meson install -C _build - meson install -C _build
@@ -143,9 +164,8 @@ test_installed:
test_scan_build: test_scan_build:
stage: test stage: test
except: extends:
variables: - .standard_job
- $CI_PIPELINE_SOURCE == "schedule"
allow_failure: true allow_failure: true
script: script:
- meson setup _build -Ddrivers=all - meson setup _build -Ddrivers=all
@@ -160,19 +180,23 @@ test_scan_build:
test_indent: test_indent:
stage: check-source stage: check-source
except: extends:
variables: - .standard_job
- $CI_PIPELINE_SOURCE == "schedule"
script: script:
- scripts/uncrustify.sh - scripts/uncrustify.sh
- git diff - git diff
- git diff-index --name-only --exit-code HEAD - git diff-index --name-only --exit-code HEAD
rules:
- changes:
compare_to: 'refs/heads/master'
paths:
- '**/*.c'
- '**/*.h'
test_unsupported_list: test_unsupported_list:
stage: check-source stage: check-source
except: extends:
variables: - .standard_job
- $CI_PIPELINE_SOURCE == "schedule"
allow_failure: true allow_failure: true
script: script:
- tests/hwdb-check-unsupported.py - tests/hwdb-check-unsupported.py
@@ -192,7 +216,7 @@ flatpak:
- if: '$CI_PROJECT_PATH != "libfprint/libfprint"' - if: '$CI_PROJECT_PATH != "libfprint/libfprint"'
when: manual when: manual
allow_failure: true allow_failure: true
- if: '$CI_PIPELINE_SOURCE == "schedule"' - if: $CI_PIPELINE_SOURCE == "schedule"
when: never when: never
- if: '$CI_COMMIT_BRANCH == "master"' - if: '$CI_COMMIT_BRANCH == "master"'
allow_failure: true allow_failure: true
@@ -213,9 +237,6 @@ flatpak:
.container_fedora_build_base: .container_fedora_build_base:
extends: .fdo.container-build@fedora extends: .fdo.container-build@fedora
stage: image-build stage: image-build
only:
variables:
- $CI_PIPELINE_SOURCE == "never"
variables: variables:
GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
# a list of packages to install # a list of packages to install
@@ -226,6 +247,8 @@ flatpak:
libudev-devel libudev-devel
FDO_DISTRIBUTION_EXEC: | FDO_DISTRIBUTION_EXEC: |
$LIBFPRINT_EXEC $LIBFPRINT_EXEC
rules:
- when: never
.container_fedora_build_forced: .container_fedora_build_forced:
variables: variables:
@@ -235,25 +258,39 @@ container_fedora_build_schedule:
extends: extends:
- .container_fedora_build_base - .container_fedora_build_base
- .container_fedora_build_forced - .container_fedora_build_forced
only: rules:
variables: - if: $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"
- $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES" when: always
container_fedora_build_manual: container_fedora_build_manual:
extends: extends:
- .container_fedora_build_base - .container_fedora_build_base
- .container_fedora_build_forced - .container_fedora_build_forced
only: rules:
variables: - if: $LIBFPRINT_CI_ACTION == "build-image"
- $LIBFPRINT_CI_ACTION == "build-image" when: always
container_fedora_build_on_deps_changed: container_fedora_build_on_deps_changed:
extends: .container_fedora_build_base extends: .container_fedora_build_base
only: rules:
variables: - if: $CI_PROJECT_NAMESPACE == "libfprint" && $CI_PIPELINE_SOURCE != "schedule"
- $CI_PROJECT_NAMESPACE == "libfprint" && $CI_PIPELINE_SOURCE != "schedule" changes:
refs: compare_to: 'refs/heads/master'
- branches paths:
- merge_requests - '.gitlab-ci/libfprint-image-variables.yaml'
changes: - '.gitlab-ci/libfprint-templates.yaml'
- .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 && $CI_PIPELINE_SOURCE == "push"
+1 -1
View File
@@ -1,2 +1,2 @@
variables: variables:
LIBFPRINT_IMAGE_TAG: v3 LIBFPRINT_IMAGE_TAG: v6
+5 -7
View File
@@ -3,6 +3,7 @@
.libfprint_common_variables: .libfprint_common_variables:
LIBFPRINT_DEPENDENCIES: LIBFPRINT_DEPENDENCIES:
appstream
doxygen doxygen
dnf-plugins-core dnf-plugins-core
flatpak-builder flatpak-builder
@@ -17,12 +18,14 @@
gtk-doc gtk-doc
gtk3-devel gtk3-devel
libabigail libabigail
libasan
libgusb-devel libgusb-devel
libgudev-devel libgudev-devel
libubsan
libX11-devel libX11-devel
libXv-devel libXv-devel
meson meson
nss-devel openssl-devel
pixman-devel pixman-devel
python3-cairo python3-cairo
python3-gobject python3-gobject
@@ -40,10 +43,5 @@
glibc \ glibc \
libgusb \ libgusb \
libusb \ libusb \
nss \ openssl \
pixman pixman
git clone https://github.com/martinpitt/umockdev.git && \
cd umockdev && \
meson _build --prefix=/usr && \
ninja -C _build && ninja -C _build install
+1 -1
View File
@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/sh
# This wrapper just disables the malloc checker # This wrapper just disables the malloc checker
exec /usr/bin/scan-build --status-bugs -disable-checker unix.Malloc "$@" exec /usr/bin/scan-build --status-bugs -disable-checker unix.Malloc --exclude "_build/meson-private" "$@"
+45
View File
@@ -1,6 +1,51 @@
This file lists notable changes in each release. For the full history of all This file lists notable changes in each release. For the full history of all
changes, see ChangeLog. changes, see ChangeLog.
2026-02-10: v1.94.10 release
Highlights:
* synaptics: Add USB reset in probe to recover stall condition
* synaptics: New PIDs 0x0169, 0x019F, 0x00E9, 0x01A0, 0x0109, 0x010A
* goodixmoc: New PID 0x66A9
* goodixmoc: Fix crash in exit callback handler
* fpcmoc: New PID 0xA306
* fpcmoc: Fix interrupt cancellable leak
* elanmoc: New PIDs 0x0CA7, 0x0CA8, 0x0CB0
* egismoc: New PIDs 0x0584, 0x0588
* focaltech_moc: New PIDs 0xA27A, 0x1579
* realtek: New PID 0xFA03
* fp-device: Clarify getter for open property
* libfprint: Use fatal-warnings on g-i-scanner
2025-02-20: v1.94.9 release
Highlights:
* uru4000: Use OpenSSL to perform AES-ECB encryption, as per this libfprint
does not support on NSS, but on openssl (>= 3.0).
* goodixmoc: New PIDs 0x60C2, 0x689A
* synaptics: New PIDs 0x016C, 0x0174, 0x0107, 0x0108, 0x00C2, 0x00F0
* fpcmoc: New PID 0xC844
* focaltech_moc: New PIDs 0xA99A, 0xA57A, 0xA78A
* elanmoc: New PIDs 0x0C98, 0x0C9D, 0x0CA3
* elanspi: New PIDs 0x3128, 0x2766
* fp-device: Add FP_DEVICE_RETRY_TOO_FAST retry error
* data: AppStream meta info listing supported USB devices.
* fixed various memory issues in multiple devices
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 2024-02-20: v1.94.7 release
Highlights: Highlights:
-25
View File
@@ -1,25 +0,0 @@
### libfprint-TOD v1
- First public release
- Based on [libfprint 1.90.1](https://gitlab.freedesktop.org/libfprint/libfprint/-/releases#v1.90.1)
- Bumped TOD version to 1
### Highlights of the Drivers API changes
Both the driver and external APIs have changed, as both the verify and the identify functions now have early reporting mechanisms.
- Added API for early report of matching results or retry errors
- Verify and identification completion functions have been simplified
- Support variadic arguments in error functions
- Various re-definitions of ownership handling
- Add convenience API to change state after a timeout
- Add unit tests for all the drivers API
### Drivers required changes
As per the early report mechanism, drivers need to adapt, in particular:
- New pkg-config dependency name is `libfprint-2-tod-1`
- Verification and Identification API for non-image drivers has changed and drivers need to both `report` the result of the action and complete it:
- `fpi_device_{verify,identify}_report` must inform whether a match/no-match or identification happened or report a *retry error*.
- `fpi_device_{verify,identify}_complete` must be called once the device has completed the verification / identification process, in case reporting device errors (not retry ones!)
You can see examples of changes needed in the [reference example driver](https://gitlab.freedesktop.org/3v1n0/libfprint-tod-example-driver/-/commit/8308f84f7d1cfd1b9ed0936c13c73b43a4a46772) or the [upstream synaptics driver](https://gitlab.freedesktop.org/libfprint/libfprint/-/merge_requests/112/diffs)
+9 -4
View File
@@ -19,10 +19,6 @@
</div> </div>
## TOD Informations
See https://gitlab.freedesktop.org/3v1n0/libfprint/-/blob/tod/README.tod.md
## History ## History
**LibFPrint** was originally developed as part of an **LibFPrint** was originally developed as part of an
@@ -50,6 +46,12 @@ We include **Bozorth3** from the **[US Export Controlled]**
distribution, which we have determined to be fine distribution, which we have determined to be fine
being shipped in an open source project. 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/> <br/>
<div align="right"> <div align="right">
@@ -66,6 +68,9 @@ being shipped in an open source project.
[Unsupported]: https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices [Unsupported]: https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices
[Supported]: https://fprint.freedesktop.org/supported-devices.html [Supported]: https://fprint.freedesktop.org/supported-devices.html
[Website]: https://fprint.freedesktop.org/ [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 [Contribute]: ./HACKING.md
[License]: ./COPYING [License]: ./COPYING
-9
View File
@@ -1,9 +0,0 @@
### libfprint-TOD - libfprint for Touch OEM Drivers
This is a light fork of libfprint to expose internal Drivers API in order to
create drivers as shared libraries.
Fork is hosted at: https://gitlab.freedesktop.org/3v1n0/libfprint/tree/tod
An example driver implementation is available:
- https://gitlab.freedesktop.org/3v1n0/libfprint-tod-example-driver
+78 -7
View File
@@ -79,6 +79,11 @@ usb:v1C7Ap0571*
# Supported by libfprint driver egismoc # Supported by libfprint driver egismoc
usb:v1C7Ap0582* usb:v1C7Ap0582*
usb:v1C7Ap0583*
usb:v1C7Ap0584*
usb:v1C7Ap0586*
usb:v1C7Ap0587*
usb:v1C7Ap0588*
usb:v1C7Ap05A1* usb:v1C7Ap05A1*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -155,7 +160,14 @@ usb:v04F3p0C82*
usb:v04F3p0C88* usb:v04F3p0C88*
usb:v04F3p0C8C* usb:v04F3p0C8C*
usb:v04F3p0C8D* usb:v04F3p0C8D*
usb:v04F3p0C98*
usb:v04F3p0C99* usb:v04F3p0C99*
usb:v04F3p0C9D*
usb:v04F3p0C9F*
usb:v04F3p0CA3*
usb:v04F3p0CA7*
usb:v04F3p0CA8*
usb:v04F3p0CB0*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -167,16 +179,25 @@ usb:v1C7Ap0603*
# Supported by libfprint driver focaltech_moc # Supported by libfprint driver focaltech_moc
usb:v2808p9E48* usb:v2808p9E48*
usb:v2808pD979* usb:v2808pD979*
usb:v2808pA27A*
usb:v2808pA959* usb:v2808pA959*
usb:v2808pA99A*
usb:v2808pA57A*
usb:v2808pA78A*
usb:v2808p1579*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
# Supported by libfprint driver fpcmoc # Supported by libfprint driver fpcmoc
usb:v10A5pFFE0* usb:v10A5pFFE0*
usb:v10A5pA305* usb:v10A5pA305*
usb:v10A5pA306*
usb:v10A5pDA04* usb:v10A5pDA04*
usb:v10A5pD805* usb:v10A5pD805*
usb:v10A5pD205* usb:v10A5pD205*
usb:v10A5p9524*
usb:v10A5p9544*
usb:v10A5pC844*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -185,10 +206,12 @@ usb:v27C6p5840*
usb:v27C6p6014* usb:v27C6p6014*
usb:v27C6p6092* usb:v27C6p6092*
usb:v27C6p6094* usb:v27C6p6094*
usb:v27C6p609A*
usb:v27C6p609C* usb:v27C6p609C*
usb:v27C6p60A2* usb:v27C6p60A2*
usb:v27C6p60A4* usb:v27C6p60A4*
usb:v27C6p60BC* usb:v27C6p60BC*
usb:v27C6p60C2*
usb:v27C6p6304* usb:v27C6p6304*
usb:v27C6p631C* usb:v27C6p631C*
usb:v27C6p633C* usb:v27C6p633C*
@@ -199,6 +222,8 @@ usb:v27C6p63AC*
usb:v27C6p63BC* usb:v27C6p63BC*
usb:v27C6p63CC* usb:v27C6p63CC*
usb:v27C6p6496* usb:v27C6p6496*
usb:v27C6p650A*
usb:v27C6p650C*
usb:v27C6p6582* usb:v27C6p6582*
usb:v27C6p6584* usb:v27C6p6584*
usb:v27C6p658C* usb:v27C6p658C*
@@ -207,6 +232,9 @@ usb:v27C6p6594*
usb:v27C6p659A* usb:v27C6p659A*
usb:v27C6p659C* usb:v27C6p659C*
usb:v27C6p6A94* usb:v27C6p6A94*
usb:v27C6p6512*
usb:v27C6p689A*
usb:v27C6p66A9*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -217,27 +245,42 @@ usb:v298Dp1010*
# Supported by libfprint driver realtek # Supported by libfprint driver realtek
usb:v0BDAp5813* usb:v0BDAp5813*
usb:v0BDAp5816*
usb:v2541pFA03*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
# Supported by libfprint driver synaptics # Supported by libfprint driver synaptics
usb:v06CBp00BD* usb:v06CBp00BD*
usb:v06CBp00C2*
usb:v06CBp00C4*
usb:v06CBp00C6*
usb:v06CBp00DF* usb:v06CBp00DF*
usb:v06CBp00E9*
usb:v06CBp00F0*
usb:v06CBp00F9* usb:v06CBp00F9*
usb:v06CBp00FC* usb:v06CBp00FC*
usb:v06CBp00C2*
usb:v06CBp0100* usb:v06CBp0100*
usb:v06CBp00F0*
usb:v06CBp0103* usb:v06CBp0103*
usb:v06CBp0104*
usb:v06CBp0106*
usb:v06CBp0107*
usb:v06CBp0108*
usb:v06CBp0109*
usb:v06CBp010A*
usb:v06CBp0123* usb:v06CBp0123*
usb:v06CBp0124* usb:v06CBp0124*
usb:v06CBp0126* usb:v06CBp0126*
usb:v06CBp0129* usb:v06CBp0129*
usb:v06CBp0168*
usb:v06CBp015F* usb:v06CBp015F*
usb:v06CBp0104* usb:v06CBp0168*
usb:v06CBp0169*
usb:v06CBp016C*
usb:v06CBp0173* usb:v06CBp0173*
usb:v06CBp0106* usb:v06CBp0174*
usb:v06CBp019D*
usb:v06CBp019F*
usb:v06CBp01A0*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -306,7 +349,10 @@ usb:v138Ap0091*
ID_PERSIST=0 ID_PERSIST=0
# Known unsupported devices # Known unsupported devices
usb:v0A5Cp5802*
usb:v047Dp00F2* usb:v047Dp00F2*
usb:v047Dp8054*
usb:v047Dp8055*
usb:v04E8p730B* usb:v04E8p730B*
usb:v04F3p036B* usb:v04F3p036B*
usb:v04F3p0C00* usb:v04F3p0C00*
@@ -314,16 +360,25 @@ usb:v04F3p0C4C*
usb:v04F3p0C57* usb:v04F3p0C57*
usb:v04F3p0C5E* usb:v04F3p0C5E*
usb:v04F3p0C5A* usb:v04F3p0C5A*
usb:v04F3p0C60*
usb:v04F3p0C6C* usb:v04F3p0C6C*
usb:v04F3p0C70* usb:v04F3p0C70*
usb:v04F3p0C72* usb:v04F3p0C72*
usb:v04F3p0C77* usb:v04F3p0C77*
usb:v04F3p0C7C*
usb:v04F3p0C7F*
usb:v04F3p0C80*
usb:v04F3p0C85*
usb:v04F3p0C90*
usb:v04F3p2706* usb:v04F3p2706*
usb:v04F3p3032* usb:v04F3p3032*
usb:v04F3p3057* usb:v04F3p3057*
usb:v04F3p3104* usb:v04F3p3104*
usb:v04F3p310D* usb:v04F3p310D*
usb:v04F3p3128* usb:v04F3p3128*
usb:v04F3p0C8A*
usb:v05BAp000E*
usb:v06CBp0051*
usb:v06CBp0081* usb:v06CBp0081*
usb:v06CBp0088* usb:v06CBp0088*
usb:v06CBp008A* usb:v06CBp008A*
@@ -334,7 +389,6 @@ usb:v06CBp00A8*
usb:v06CBp00B7* usb:v06CBp00B7*
usb:v06CBp00BB* usb:v06CBp00BB*
usb:v06CBp00BE* usb:v06CBp00BE*
usb:v06CBp00C4*
usb:v06CBp00CB* usb:v06CBp00CB*
usb:v06CBp00C9* usb:v06CBp00C9*
usb:v06CBp00D8* usb:v06CBp00D8*
@@ -342,8 +396,8 @@ usb:v06CBp00DA*
usb:v06CBp00DC* usb:v06CBp00DC*
usb:v06CBp00E4* usb:v06CBp00E4*
usb:v06CBp00E7* usb:v06CBp00E7*
usb:v06CBp00E9*
usb:v06CBp00FD* usb:v06CBp00FD*
usb:v06CBp00FF*
usb:v0A5Cp5801* usb:v0A5Cp5801*
usb:v0A5Cp5805* usb:v0A5Cp5805*
usb:v0A5Cp5834* usb:v0A5Cp5834*
@@ -353,10 +407,18 @@ usb:v0A5Cp5842*
usb:v0A5Cp5843* usb:v0A5Cp5843*
usb:v0A5Cp5844* usb:v0A5Cp5844*
usb:v0A5Cp5845* usb:v0A5Cp5845*
usb:v0A5Cp5860*
usb:v0A5Cp5863*
usb:v0A5Cp5864*
usb:v0A5Cp5865*
usb:v0A5Cp5866*
usb:v0A5Cp5867*
usb:v0BDAp5812* usb:v0BDAp5812*
usb:v10A5p0007* usb:v10A5p0007*
usb:v10A5p9200* usb:v10A5p9200*
usb:v10A5p9800* usb:v10A5p9800*
usb:v10A5pA120*
usb:v10A5pA900*
usb:v10A5pE340* usb:v10A5pE340*
usb:v1188p9545* usb:v1188p9545*
usb:v138Ap0007* usb:v138Ap0007*
@@ -378,6 +440,9 @@ usb:v1C7Ap0300*
usb:v1C7Ap0575* usb:v1C7Ap0575*
usb:v1C7Ap0576* usb:v1C7Ap0576*
usb:v1C7Ap0577* usb:v1C7Ap0577*
usb:v1C7Ap057E*
usb:v2541p0236*
usb:v2541p9711*
usb:v27C6p5042* usb:v27C6p5042*
usb:v27C6p5110* usb:v27C6p5110*
usb:v27C6p5117* usb:v27C6p5117*
@@ -406,11 +471,17 @@ usb:v27C6p5740*
usb:v27C6p5E0A* usb:v27C6p5E0A*
usb:v27C6p581A* usb:v27C6p581A*
usb:v27C6p589A* usb:v27C6p589A*
usb:v27C6p5F10*
usb:v27C6p6382* usb:v27C6p6382*
usb:v2808p9338* usb:v2808p9338*
usb:v2808p9348*
usb:v2808p93A9* usb:v2808p93A9*
usb:v2808pA658*
usb:v2808pC652*
usb:v298Dp2020* usb:v298Dp2020*
usb:v298Dp2033* usb:v298Dp2033*
usb:v2DF0p0003*
usb:v3274p8012*
usb:v3538p0930* usb:v3538p0930*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
-10
View File
@@ -1,10 +0,0 @@
The libfprint-2-2 postinst script calls udevadmin trigger for all the supported
USB readers. The list of readers used in that file is generated using the gbp
import hook when `gbp import-orig` (via --uscan or with a tarball) is used.
Alternatively it can be called manually by using:
GBP_SOURCES_DIR=. debian/update-udev-triggers.sh
When preparing a new upstream release, this script should be called against the
upstream provided .hwdb file.
-14
View File
@@ -1,14 +0,0 @@
### libfprint-TOD - libfprint for Touch OEM Drivers
This is a light fork of libfprint to expose internal Drivers API in order to
create drivers as shared libraries.
Fork is hosted at: https://gitlab.freedesktop.org/3v1n0/libfprint/tree/tod
Packaging for this is handled via gbp, so you need to make sure that you have
added the remote:
git remote add origin-tod https://gitlab.freedesktop.org/3v1n0/libfprint.git
git fetch origin-tod --tags
To get the latest tod release, just use `gbp import-orig --uscan`.
-1012
View File
File diff suppressed because it is too large Load Diff
-203
View File
@@ -1,203 +0,0 @@
Source: libfprint
Priority: optional
Section: libs
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
XSBC-Original-Maintainer: FingerForce Team <fingerforce-devel@lists.alioth.debian.org>
Uploaders: Marco Trevisan <marco@ubuntu.com>
Build-Depends: debhelper-compat (= 13),
gir1.2-gobject-2.0-dev <!nogir>,
gir1.2-gio-2.0-dev <!nogir>,
gobject-introspection,
gtk-doc-tools,
libcairo-dev <!nocheck>,
libgirepository1.0-dev,
libglib2.0-dev,
libgudev-1.0-dev,
libgusb-dev,
libnss3-dev,
libpixman-1-dev,
meson,
python3 <!nocheck>,
python3-cairo <!nocheck>,
python3-gi <!nocheck>,
systemd-dev,
umockdev <!nocheck>
Build-Depends-Indep: libglib2.0-doc <!nodoc>, libgusb-doc <!nodoc>
Standards-Version: 4.6.2
Homepage: https://www.freedesktop.org/wiki/Software/fprint/libfprint
Vcs-Browser: https://salsa.debian.org/ubuntu-dev-team/libfprint/tree/noble
Vcs-Git: https://salsa.debian.org/ubuntu-dev-team/libfprint.git -b noble
Package: libfprint-2-2
Architecture: any
Depends: ${misc:Depends}, ${shlibs:Depends}
Pre-Depends: ${misc:Pre-Depends}
Description: async fingerprint library of fprint project, shared libraries
The fprint project aims to support for consumer fingerprint reader devices.
.
Previously, Linux support for such devices has been scattered amongst different
projects (many incomplete) and inconsistent in that application developers
would have to implement support for each type of fingerprint reader separately.
The idea is to change that by providing a central system to support all the
fingerprint readers as it's possible to get hands on.
.
libfprint is the centre of efforts, this component does the dirty job of
talking to fingerprint reading devices, and processing fingerprint data.
.
This library depends on the new libusb, which performs asynchronous callbacks,
allowing fprint to perform non-blocking device tasks.
.
This package provides shared libraries.
Package: libfprint-2-dev
Section: libdevel
Architecture: any
Multi-Arch: same
Depends: gir1.2-fprint-2.0 (= ${binary:Version}),
libfprint-2-2 (= ${binary:Version}),
${misc:Depends},
${gir:Depends},
Provides: ${gir:Provides},
Suggests: libfprint-2-doc
Description: async fingerprint library of fprint project, development headers
The fprint project aims to support for consumer fingerprint reader devices.
.
Previously, Linux support for such devices has been scattered amongst different
projects (many incomplete) and inconsistent in that application developers
would have to implement support for each type of fingerprint reader separately.
The idea is to change that by providing a central system to support all the
fingerprint readers as it's possible to get hands on.
.
libfprint is the centre of efforts, this component does the dirty job of
talking to fingerprint reading devices, and processing fingerprint data.
.
This library depends on the new libusb, which performs asynchronous callbacks,
allowing fprint to perform non-blocking device tasks.
.
This package provides development headers.
Package: libfprint-2-doc
Section: doc
Architecture: all
Multi-Arch: foreign
Depends: ${misc:Depends}
Description: async fingerprint library of fprint project, API documentation
The fprint project aims to support for consumer fingerprint reader devices.
.
Previously, Linux support for such devices has been scattered amongst different
projects (many incomplete) and inconsistent in that application developers
would have to implement support for each type of fingerprint reader separately.
The idea is to change that by providing a central system to support all the
fingerprint readers as it's possible to get hands on.
.
libfprint is the centre of efforts, this component does the dirty job of
talking to fingerprint reading devices, and processing fingerprint data.
.
This library depends on the new libusb, which performs asynchronous callbacks,
allowing fprint to perform non-blocking device tasks.
.
This package provides the API documentation.
Package: gir1.2-fprint-2.0
Architecture: any
Multi-Arch: same
Section: introspection
Depends: ${gir:Depends}, ${misc:Depends}, ${shlibs:Depends}
Pre-Depends: ${misc:Pre-Depends}
Description: async fingerprint library of fprint project, gir bindings
The fprint project aims to support for consumer fingerprint reader devices.
.
Previously, Linux support for such devices has been scattered amongst different
projects (many incomplete) and inconsistent in that application developers
would have to implement support for each type of fingerprint reader separately.
The idea is to change that by providing a central system to support all the
fingerprint readers as it's possible to get hands on.
.
libfprint is the centre of efforts, this component does the dirty job of
talking to fingerprint reading devices, and processing fingerprint data.
.
This library depends on the new libusb, which performs asynchronous callbacks,
allowing fprint to perform non-blocking device tasks.
.
This package can be used by other packages using the GIRepository format to
generate dynamic bindings.
Package: libfprint-2-tod1
Architecture: any
Multi-Arch: same
Depends: ${misc:Depends}, ${shlibs:Depends}
Pre-Depends: ${misc:Pre-Depends}
Description: async fingerprint library of fprint project, drivers shared libraries
The fprint project aims to support for consumer fingerprint reader devices.
.
Previously, Linux support for such devices has been scattered amongst different
projects (many incomplete) and inconsistent in that application developers
would have to implement support for each type of fingerprint reader separately.
The idea is to change that by providing a central system to support all the
fingerprint readers as it's possible to get hands on.
.
libfprint is the centre of efforts, this component does the dirty job of
talking to fingerprint reading devices, and processing fingerprint data.
.
This library depends on the new libusb, which performs asynchronous callbacks,
allowing fprint to perform non-blocking device tasks.
.
This package provides shared libraries for the TOD drivers.
Package: libfprint-2-tod-dev
Section: libdevel
Architecture: any
Multi-Arch: same
Depends: libfprint-2-tod1 (= ${binary:Version}),
libfprint-2-dev (= ${binary:Version}),
libglib2.0-dev (>= 2.56),
libgudev-1.0-dev,
libgusb-dev (>= 0.2.0),
libpixman-1-dev,
libnss3-dev,
${misc:Depends}
Description: async fingerprint library of fprint project, drivers development headers
The fprint project aims to support for consumer fingerprint reader devices.
.
Previously, Linux support for such devices has been scattered amongst different
projects (many incomplete) and inconsistent in that application developers
would have to implement support for each type of fingerprint reader separately.
The idea is to change that by providing a central system to support all the
fingerprint readers as it's possible to get hands on.
.
libfprint is the centre of efforts, this component does the dirty job of
talking to fingerprint reading devices, and processing fingerprint data.
.
This library depends on the new libusb, which performs asynchronous callbacks,
allowing fprint to perform non-blocking device tasks.
.
This package provides development headers for creating device drivers.
An example driver is available at:
https://gitlab.freedesktop.org/3v1n0/libfprint-tod-example-driver
Package: libfprint-2-tests
Architecture: any
Depends: gir1.2-fprint-2.0 (= ${binary:Version}),
libfprint-2-2 (= ${binary:Version}),
python3,
python3-cairo,
python3-gi,
umockdev,
${misc:Depends}, ${shlibs:Depends}
Description: Tests for async fingerprint library of fprint project
The fprint project aims to support for consumer fingerprint reader devices.
.
Previously, Linux support for such devices has been scattered amongst different
projects (many incomplete) and inconsistent in that application developers
would have to implement support for each type of fingerprint reader separately.
The idea is to change that by providing a central system to support all the
fingerprint readers as it's possible to get hands on.
.
libfprint is the centre of efforts, this component does the dirty job of
talking to fingerprint reading devices, and processing fingerprint data.
.
This library depends on the new libusb, which performs asynchronous callbacks,
allowing fprint to perform non-blocking device tasks.
.
This package contains test programs, designed to be run as part of a
regression testsuite.
-45
View File
@@ -1,45 +0,0 @@
This package was debianized by Ulises Vitulli <uvitulli@fi.uba.ar> on
Fri, 19 Sep 2008 05:14:30 -0300.
It was downloaded from <http://reactivated.net/fprint/wiki/Libfprint>
Upstream Authors, and Copyright:
Copyright © 2007 Daniel Drake <dsd@gentoo.org>
Copyright © 2006-2007 Timo Hoenig <thoenig@suse.de>
Copyright © 2006 Pavel Machek <pavel@suse.cz>
Copyright © 1999 Erik Walthinsen <omega@cse.ogi.edu>
Copyright © 2004,2006 Thomas Vander Stichele <thomas at apestaart dot org>
Copyright © 2007 Cyrille Bagard
Copyright © 2007 Vasily Khoruzhick
Copyright © 2007 Jan-Michael Brummer <buzz2@gmx.de>
Copyright © 2007 Anthony Bretaudeau <wxcover@users.sourceforge.net>
License:
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
The files under libfprint/nbis directory has this license:
This software was developed at the National Institute of Standards and
Technology (NIST) by employees of the Federal Government in the course
of their official duties. Pursuant to title 17 Section 105 of the
United States Code, this software is not subject to copyright protection
and is in the public domain. NIST assumes no responsibility whatsoever for
its use by other parties, and makes no guarantees, expressed or implied,
about its quality, reliability, or any other characteristic.
The Debian packaging is © 2008, Ulises Vitulli <uvitulli@fi.uba.ar> and is
licensed under the LGPL v2.1, see `/usr/share/common-licenses/LGPL-2.1'.
Vendored
-2
View File
@@ -1,2 +0,0 @@
NEWS
README.md
-8
View File
@@ -1,8 +0,0 @@
#!/bin/sh
set -e
dch -v"$GBP_DEBIAN_VERSION" "New upstream release"
git add debian/changelog
debcommit
debian/update-udev-triggers.sh
-19
View File
@@ -1,19 +0,0 @@
[DEFAULT]
pristine-tar = True
debian-branch = noble
upstream-vcs-tag = v%(version)s
upstream-branch = upstream-tod
debian-tag=ubuntu/%(version)s
[buildpackage]
sign-tags = True
[dch]
multimaint-merge = True
[import-orig]
postimport = debian/gbp-post-import-hook.sh
[pq]
patch-numbers = False
-1
View File
@@ -1 +0,0 @@
usr/lib/${DEB_HOST_MULTIARCH}/girepository-1.0/FPrint-*.typelib
-3
View File
@@ -1,3 +0,0 @@
usr/lib/udev/hwdb.d/
usr/lib/udev/rules.d/
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9].so.*
-3
View File
@@ -1,3 +0,0 @@
# For security reasons, we don't want the fingerprint readers to be accessible
# by unprivileged users
udev-rule-missing-uaccess
-315
View File
@@ -1,315 +0,0 @@
#!/bin/sh
set -e
#DEBHELPER#
if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2>&1; then
# apply hwdb rules at package installation, see
# <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683863#27>
# NOTA BENE: after the DEBHELPER section since dh_installudev
# adds stuff there
# The devices ID list is auto-generated using the gbp postimport hook
# see debian/README.sources for more details.
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1600 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1660 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1680 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1681 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1682 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1683 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1684 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1685 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1686 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1687 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1688 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1689 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168a || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168b || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168c || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168d || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168e || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168f || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2500 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2580 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2550 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2810 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2660 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2680 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2681 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2682 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2683 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2684 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2685 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2686 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2687 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2688 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2689 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268a || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268b || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268c || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268d || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268e || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268f || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2691 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=5731 || true
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=5501 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0570 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0571 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0582 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=05a1 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0903 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0907 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c01 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c02 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c03 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c04 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c05 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c06 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c07 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c08 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c09 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0a || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0b || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0c || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0e || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0f || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c10 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c11 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c12 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c13 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c14 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c15 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c16 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c17 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c18 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c19 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1a || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1b || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1c || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1e || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1f || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c20 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c21 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c22 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c23 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c24 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c25 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c26 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c27 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c28 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c29 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2a || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2b || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2c || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2e || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2f || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c30 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c31 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c32 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c33 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c3d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c42 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4b || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4f || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c63 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c6e || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c58 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c7d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c7e || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c82 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c88 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c8c || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c8d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c99 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0603 || true
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=9e48 || true
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=d979 || true
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=a959 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=ffe0 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=a305 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=da04 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=d805 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=d205 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5840 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6014 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6092 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6094 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=609c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=60a2 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=60a4 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=60bc || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6304 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=631c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=633c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=634c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6384 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=639c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=63ac || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=63bc || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=63cc || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6496 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6582 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6584 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=658c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6592 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6594 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=659a || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=659c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6a94 || true
udevadm trigger --action=add --attr-match=idVendor=298d --attr-match=idProduct=1010 || true
udevadm trigger --action=add --attr-match=idVendor=0bda --attr-match=idProduct=5813 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00bd || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00df || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00f9 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00fc || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c2 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0100 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00f0 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0103 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0123 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0124 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0126 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0129 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0168 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=015f || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0104 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0173 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0106 || true
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=2016 || true
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1000 || true
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1001 || true
udevadm trigger --action=add --attr-match=idVendor=0483 --attr-match=idProduct=2015 || true
udevadm trigger --action=add --attr-match=idVendor=0483 --attr-match=idProduct=2017 || true
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=3001 || true
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=2020 || true
udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00bc || true
udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00bd || true
udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00ca || true
udevadm trigger --action=add --attr-match=idVendor=05ba --attr-match=idProduct=0007 || true
udevadm trigger --action=add --attr-match=idVendor=05ba --attr-match=idProduct=0008 || true
udevadm trigger --action=add --attr-match=idVendor=05ba --attr-match=idProduct=000a || true
udevadm trigger --action=add --attr-match=idVendor=061a --attr-match=idProduct=0110 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0050 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0001 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0005 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0008 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0010 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0011 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0015 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0017 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0018 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0091 || true
udevadm trigger --action=add --attr-match=idVendor=047d --attr-match=idProduct=00f2 || true
udevadm trigger --action=add --attr-match=idVendor=04e8 --attr-match=idProduct=730b || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=036b || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c00 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4c || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c57 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c5e || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c5a || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c6c || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c70 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c72 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c77 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=2706 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3032 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3057 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3104 || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=310d || true
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3128 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0081 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0088 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=008a || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=009a || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=009b || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00a2 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00a8 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00b7 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00bb || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00be || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c4 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00cb || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c9 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00d8 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00da || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00dc || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e4 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e7 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e9 || true
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00fd || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5801 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5805 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5834 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5840 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5841 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5842 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5843 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5844 || true
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5845 || true
udevadm trigger --action=add --attr-match=idVendor=0bda --attr-match=idProduct=5812 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=0007 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=9200 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=9800 || true
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=e340 || true
udevadm trigger --action=add --attr-match=idVendor=1188 --attr-match=idProduct=9545 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0007 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003a || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003c || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003d || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003f || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0090 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0092 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0094 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0097 || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=009d || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=00ab || true
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=00a6 || true
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1002 || true
udevadm trigger --action=add --attr-match=idVendor=1491 --attr-match=idProduct=0088 || true
udevadm trigger --action=add --attr-match=idVendor=16d1 --attr-match=idProduct=1027 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0300 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0575 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0576 || true
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0577 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5042 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5110 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5117 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5120 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5125 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5201 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=521d || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5301 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=530c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=532d || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5335 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=533c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5381 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5385 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=538c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=538d || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5395 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5503 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=550a || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=550c || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5584 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55a2 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55a4 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55b4 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5740 || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5e0a || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=581a || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=589a || true
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6382 || true
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=9338 || true
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=93a9 || true
udevadm trigger --action=add --attr-match=idVendor=298d --attr-match=idProduct=2020 || true
udevadm trigger --action=add --attr-match=idVendor=298d --attr-match=idProduct=2033 || true
udevadm trigger --action=add --attr-match=idVendor=3538 --attr-match=idProduct=0930 || true
fi
exit 0
-17
View File
@@ -1,17 +0,0 @@
#!/bin/sh
set -e
#DEBHELPER#
if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2>&1; then
# apply hwdb rules at package installation, see
# <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683863#27>
# NOTA BENE: after the DEBHELPER section since dh_installudev
# adds stuff there
# The devices ID list is auto-generated using the gbp postimport hook
# see debian/README.sources for more details.
@UDEVADM_TRIGGERS@
fi
exit 0
-94
View File
@@ -1,94 +0,0 @@
libfprint-2.so.2 libfprint-2-2 #MINVER#
* Build-Depends-Package: libfprint-2-dev
LIBFPRINT_2.0.0@LIBFPRINT_2.0.0 1:1.90.1
fp_context_enumerate@LIBFPRINT_2.0.0 1:1.90.1
fp_context_get_devices@LIBFPRINT_2.0.0 1:1.90.1
fp_context_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_context_new@LIBFPRINT_2.0.0 1:1.90.1
fp_device_capture@LIBFPRINT_2.0.0 1:1.90.1
fp_device_capture_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_capture_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_device_clear_storage@LIBFPRINT_2.0.0 1:1.94.1
fp_device_clear_storage_finish@LIBFPRINT_2.0.0 1:1.94.1
fp_device_clear_storage_sync@LIBFPRINT_2.0.0 1:1.94.1
fp_device_close@LIBFPRINT_2.0.0 1:1.90.1
fp_device_close_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_close_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_device_delete_print@LIBFPRINT_2.0.0 1:1.90.1
fp_device_delete_print_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_delete_print_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_device_enroll@LIBFPRINT_2.0.0 1:1.90.1
fp_device_enroll_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_enroll_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_device_error_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_device_error_quark@LIBFPRINT_2.0.0 1:1.90.1
fp_device_feature_get_type@LIBFPRINT_2.0.0 1:1.94.1
fp_device_get_device_id@LIBFPRINT_2.0.0 1:1.90.1
fp_device_get_driver@LIBFPRINT_2.0.0 1:1.90.1
fp_device_get_features@LIBFPRINT_2.0.0 1:1.94.1
fp_device_get_finger_status@LIBFPRINT_2.0.0 1:1.90.4
fp_device_get_name@LIBFPRINT_2.0.0 1:1.90.1
fp_device_get_nr_enroll_stages@LIBFPRINT_2.0.0 1:1.90.1
fp_device_get_scan_type@LIBFPRINT_2.0.0 1:1.90.1
fp_device_get_temperature@LIBFPRINT_2.0.0 1:1.94.1
fp_device_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_device_has_feature@LIBFPRINT_2.0.0 1:1.94.1
fp_device_has_storage@LIBFPRINT_2.0.0 1:1.90.1
fp_device_identify@LIBFPRINT_2.0.0 1:1.90.1
fp_device_identify_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_identify_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_device_is_open@LIBFPRINT_2.0.0 1:1.90.1
fp_device_list_prints@LIBFPRINT_2.0.0 1:1.90.1
fp_device_list_prints_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_list_prints_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_device_open@LIBFPRINT_2.0.0 1:1.90.1
fp_device_open_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_open_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_device_resume@LIBFPRINT_2.0.0 1:1.94.1
fp_device_resume_finish@LIBFPRINT_2.0.0 1:1.94.1
fp_device_resume_sync@LIBFPRINT_2.0.0 1:1.94.1
fp_device_retry_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_device_retry_quark@LIBFPRINT_2.0.0 1:1.90.1
fp_device_supports_capture@LIBFPRINT_2.0.0 1:1.90.1
fp_device_supports_identify@LIBFPRINT_2.0.0 1:1.90.1
fp_device_suspend@LIBFPRINT_2.0.0 1:1.94.1
fp_device_suspend_finish@LIBFPRINT_2.0.0 1:1.94.1
fp_device_suspend_sync@LIBFPRINT_2.0.0 1:1.94.1
fp_device_type_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_device_verify@LIBFPRINT_2.0.0 1:1.90.1
fp_device_verify_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_device_verify_sync@LIBFPRINT_2.0.0 1:1.90.1
fp_finger_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_finger_status_flags_get_type@LIBFPRINT_2.0.0 1:1.90.4
fp_image_detect_minutiae@LIBFPRINT_2.0.0 1:1.90.1
fp_image_detect_minutiae_finish@LIBFPRINT_2.0.0 1:1.90.1
fp_image_device_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_image_get_binarized@LIBFPRINT_2.0.0 1:1.90.1
fp_image_get_data@LIBFPRINT_2.0.0 1:1.90.1
fp_image_get_height@LIBFPRINT_2.0.0 1:1.90.1
fp_image_get_minutiae@LIBFPRINT_2.0.0 1:1.90.1
fp_image_get_ppmm@LIBFPRINT_2.0.0 1:1.90.1
fp_image_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_image_get_width@LIBFPRINT_2.0.0 1:1.90.1
fp_image_new@LIBFPRINT_2.0.0 1:1.90.1
fp_minutia_get_coords@LIBFPRINT_2.0.0 1:1.90.1
fp_print_compatible@LIBFPRINT_2.0.0 1:1.90.1
fp_print_deserialize@LIBFPRINT_2.0.0 1:1.90.1
fp_print_equal@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_description@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_device_id@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_device_stored@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_driver@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_enroll_date@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_finger@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_image@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_print_get_username@LIBFPRINT_2.0.0 1:1.90.1
fp_print_new@LIBFPRINT_2.0.0 1:1.90.1
fp_print_serialize@LIBFPRINT_2.0.0 1:1.90.1
fp_print_set_description@LIBFPRINT_2.0.0 1:1.90.1
fp_print_set_enroll_date@LIBFPRINT_2.0.0 1:1.90.1
fp_print_set_finger@LIBFPRINT_2.0.0 1:1.90.1
fp_print_set_username@LIBFPRINT_2.0.0 1:1.90.1
fp_scan_type_get_type@LIBFPRINT_2.0.0 1:1.90.1
fp_temperature_get_type@LIBFPRINT_2.0.0 1:1.94.1
-4
View File
@@ -1,4 +0,0 @@
usr/include/libfprint-[0-9]/*.h
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9].so
usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/libfprint-[0-9].pc
usr/share/gir-1.0/FPrint-*.gir
-1
View File
@@ -1 +0,0 @@
usr/share/gtk-doc/*/libfprint-*
-2
View File
@@ -1,2 +0,0 @@
usr/libexec/installed-tests/libfprint-[0-9]
usr/share/installed-tests/libfprint-[0-9]
-3
View File
@@ -1,3 +0,0 @@
usr/include/libfprint-[0-9]/tod-[0-9]/*
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9]-tod.so
usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/libfprint-[0-9]-tod-[0-9].pc
-1
View File
@@ -1 +0,0 @@
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9]-tod.so.*
-239
View File
@@ -1,239 +0,0 @@
libfprint-2-tod.so.1 libfprint-2-tod1 #MINVER#
LIBFPRINT_TOD_1.0.0@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
LIBFPRINT_TOD_1_1.92@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
LIBFPRINT_TOD_1_1.94@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
fpi_assemble_frames@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_assemble_lines@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_dup_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_dup_string_utf16@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_dup_string_utf32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_dup_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_free@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_float32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_float32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_float64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_float64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_int8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_pos@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_remaining@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_size@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_sub_reader@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_get_uint8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_init@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_masked_scan_uint32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_masked_scan_uint32_peek@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_float32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_float32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_float64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_float64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_int8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_sub_reader@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_peek_uint8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_set_pos@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_skip@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_skip_string_utf16@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_skip_string_utf32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_reader_skip_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_ensure_free_space@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_fill@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_free@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_free_and_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_get_remaining@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_init@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_init_with_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_init_with_size@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_new_with_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_new_with_size@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_float32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_float32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_float64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_float64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_int8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_string_utf16@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_string_utf32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_put_uint8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_reset@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_byte_writer_reset_and_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_action_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_action_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
fpi_device_action_is_cancelled@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_add_timeout@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_capture_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_class_auto_initialize_features@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_device_clear_storage_complete@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_device_close_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_configure_wakeup@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
fpi_device_critical_enter@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
fpi_device_critical_leave@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
fpi_device_delete_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_enroll_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_enroll_progress@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_error_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_error_new_msg@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_cancellable@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_capture_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_current_action@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_delete_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_driver_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_enroll_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_identify_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_udev_data@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_device_get_usb_device@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_verify_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_get_virtual_env@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_identify_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_identify_report@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_list_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_open_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_probe_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_remove@LIBFPRINT_TOD_1.0.0 1:1.90.5+tod1
fpi_device_report_finger_status@LIBFPRINT_TOD_1.0.0 1:1.90.5+tod1
fpi_device_report_finger_status_changes@LIBFPRINT_TOD_1.0.0 1:1.90.5+tod1
fpi_device_resume@LIBFPRINT_TOD_1_1.94 1:1.94.5+tod1
fpi_device_resume_complete@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
fpi_device_retry_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_retry_new_msg@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_set_nr_enroll_stages@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_set_scan_type@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_suspend@LIBFPRINT_TOD_1_1.94 1:1.94.5+tod1
fpi_device_suspend_complete@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
fpi_device_udev_subtype_flags_get_type@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
fpi_device_update_features@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_device_update_temp@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
fpi_device_verify_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_device_verify_report@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_do_movement_estimation@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_activate@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_activate_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_close_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_deactivate@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_deactivate_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_image_captured@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_open_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_report_finger_status@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_retry_scan@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_session_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_set_bz3_threshold@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_image_device_state_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
fpi_image_flags_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
fpi_image_resize@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_match_result_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
fpi_mean_sq_diff_norm@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_print_add_from_image@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_print_add_print@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_print_bz3_match@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_print_fill_from_user_id@LIBFPRINT_TOD_1.0.0 1:1.90.2+tod1
fpi_print_generate_user_id@LIBFPRINT_TOD_1.0.0 1:1.90.2+tod1
fpi_print_set_device_stored@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_print_set_type@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_print_type_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
fpi_spi_transfer_get_type@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_new@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_read@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_read_full@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_ref@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_submit@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_submit_sync@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_unref@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_write@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_spi_transfer_write_full@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_cancel_delayed_state_change@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_dup_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_free@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_get_cur_state@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_get_device@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_get_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_jump_to_state@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_jump_to_state_delayed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_jump_to_state_delayed@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_jump_to_state_delayed_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
fpi_ssm_mark_completed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_mark_completed_delayed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_mark_completed_delayed@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_mark_completed_delayed_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
fpi_ssm_mark_failed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_new_full@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_new_full@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_new_full_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
fpi_ssm_next_state@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_next_state_delayed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_next_state_delayed@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_next_state_delayed_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
fpi_ssm_set_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_silence_debug@LIBFPRINT_TOD_1_1.94 1:1.94.3+tod1
fpi_ssm_spi_transfer_cb@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_spi_transfer_with_weak_pointer_cb@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
fpi_ssm_start@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_start_subsm@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_usb_transfer_cb@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_ssm_usb_transfer_with_weak_pointer_cb@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_std_sq_dev@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_transfer_type_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
fpi_usb_transfer_fill_bulk@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_fill_bulk_full@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_fill_control@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_fill_interrupt@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_fill_interrupt_full@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_ref@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_submit@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_submit_sync@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
fpi_usb_transfer_unref@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
-37
View File
@@ -1,37 +0,0 @@
From a603b95786836d27679301ecd4e68e4227ab4c82 Mon Sep 17 00:00:00 2001
From: herman lin <herman.lin@emc.com.tw>
Date: Thu, 8 May 2025 15:34:37 +0800
Subject: [PATCH] elanmoc: Add new PID 0x0CA8
---
data/autosuspend.hwdb | 1 +
libfprint/drivers/elanmoc/elanmoc.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
index 39dd316..43190cb 100644
--- a/data/autosuspend.hwdb
+++ b/data/autosuspend.hwdb
@@ -157,6 +157,7 @@ usb:v04F3p0C8C*
usb:v04F3p0C8D*
usb:v04F3p0C99*
usb:v04F3p0C9F*
+usb:v04F3p0CA8*
ID_AUTOSUSPEND=1
ID_PERSIST=0
diff --git a/libfprint/drivers/elanmoc/elanmoc.c b/libfprint/drivers/elanmoc/elanmoc.c
index 42a84a6..0e99e57 100644
--- a/libfprint/drivers/elanmoc/elanmoc.c
+++ b/libfprint/drivers/elanmoc/elanmoc.c
@@ -33,6 +33,7 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x04f3, .pid = 0x0c8d, },
{ .vid = 0x04f3, .pid = 0x0c99, },
{ .vid = 0x04f3, .pid = 0x0c9f, },
+ { .vid = 0x04f3, .pid = 0x0ca8, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
};
--
2.43.0
-28
View File
@@ -1,28 +0,0 @@
Subject: elanmoc: Add new PID 0x0C9F
Origin: upstream, https://gitlab.freedesktop.org/libfprint/libfprint/-/merge_requests/501
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/libfprint/+bug/2089367
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
index 8e0e6eab12e772058a8957a2b9f2d39e0bdc8e11..342c6d0e6538028d90a11d1607cd9e07086aeb8c 100644
--- a/data/autosuspend.hwdb
+++ b/data/autosuspend.hwdb
@@ -156,6 +156,7 @@ usb:v04F3p0C88*
usb:v04F3p0C8C*
usb:v04F3p0C8D*
usb:v04F3p0C99*
+usb:v04F3p0C9F*
ID_AUTOSUSPEND=1
ID_PERSIST=0
diff --git a/libfprint/drivers/elanmoc/elanmoc.c b/libfprint/drivers/elanmoc/elanmoc.c
index e86b79a28ec2240a303ad602b567d10447e3b09b..42a84a627e68020bb070bce1a6cffa669cffe9ed 100644
--- a/libfprint/drivers/elanmoc/elanmoc.c
+++ b/libfprint/drivers/elanmoc/elanmoc.c
@@ -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 */
};
-37
View File
@@ -1,37 +0,0 @@
From 763b6830006ca88bced7744c219c9a961d1637f4 Mon Sep 17 00:00:00 2001
From: jialei <jialei@egoodix.com>
Date: Wed, 29 Oct 2025 14:32:54 +0800
Subject: [PATCH] goodixmoc:add new PID 0x66A9
---
data/autosuspend.hwdb | 1 +
libfprint/drivers/goodixmoc/goodix.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
index 74ac65b..df18494 100644
--- a/data/autosuspend.hwdb
+++ b/data/autosuspend.hwdb
@@ -207,6 +207,7 @@ usb:v27C6p6594*
usb:v27C6p659A*
usb:v27C6p659C*
usb:v27C6p6A94*
+usb:v27C6p66A9*
ID_AUTOSUSPEND=1
ID_PERSIST=0
diff --git a/libfprint/drivers/goodixmoc/goodix.c b/libfprint/drivers/goodixmoc/goodix.c
index 5a3ffac..8aea175 100644
--- a/libfprint/drivers/goodixmoc/goodix.c
+++ b/libfprint/drivers/goodixmoc/goodix.c
@@ -1632,6 +1632,7 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x27c6, .pid = 0x659A, },
{ .vid = 0x27c6, .pid = 0x659C, },
{ .vid = 0x27c6, .pid = 0x6A94, },
+ { .vid = 0x27c6, .pid = 0x66A9, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
};
--
2.43.0
@@ -1,44 +0,0 @@
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
Date: Wed, 22 May 2024 17:08:19 +0200
Subject: libfprint-fprint-list-udev-hwdb: Add new broadcom device IDs
(cherry picked from commit eaec2339ccaee64b2bdb1d1e27f51ada673e4087)
---
data/autosuspend.hwdb | 6 ++++++
libfprint/fprint-list-udev-hwdb.c | 6 ++++++
2 files changed, 12 insertions(+)
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
index 74ac65b..cb3e74b 100644
--- a/data/autosuspend.hwdb
+++ b/data/autosuspend.hwdb
@@ -353,6 +353,12 @@ 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*
diff --git a/libfprint/fprint-list-udev-hwdb.c b/libfprint/fprint-list-udev-hwdb.c
index bace9f9..4d056ae 100644
--- a/libfprint/fprint-list-udev-hwdb.c
+++ b/libfprint/fprint-list-udev-hwdb.c
@@ -76,6 +76,12 @@ static const FpIdEntry allowlist_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 },
-7
View File
@@ -1,7 +0,0 @@
libfprint-fprint-list-udev-hwdb-Add-new-broadcom-device-I.patch
elanmoc-add-new-pid-0x0c9f.patch
synaptics-Add-new-PID-0x0107-and-0x108.patch
synaptics-Add-new-PID-0x019D.patch
synaptics-add-new-PID-0x019F-0x109-and-0x10A.patch
goodixmoc-add-new-PID-0x66A9.patch
elanmoc-Add-new-PID-0x0CA8.patch
@@ -1,39 +0,0 @@
From a8ef1672a4ca7e60760349ce320a8f5b778244d5 Mon Sep 17 00:00:00 2001
From: Aris Lin <aris.lin@synaptics.com>
Date: Mon, 18 Nov 2024 11:18:29 +0800
Subject: [PATCH] synaptics: Add new PID 0x0107 and 0x108
---
data/autosuspend.hwdb | 2 ++
libfprint/drivers/synaptics/synaptics.c | 2 ++
2 files changed, 4 insertions(+)
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
index 74ac65b..386d8bd 100644
--- a/data/autosuspend.hwdb
+++ b/data/autosuspend.hwdb
@@ -229,6 +229,8 @@ usb:v06CBp00C2*
usb:v06CBp0100*
usb:v06CBp00F0*
usb:v06CBp0103*
+usb:v06CBp0107*
+usb:v06CBp0108*
usb:v06CBp0123*
usb:v06CBp0124*
usb:v06CBp0126*
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
index 138e734..a5d2990 100644
--- a/libfprint/drivers/synaptics/synaptics.c
+++ b/libfprint/drivers/synaptics/synaptics.c
@@ -39,6 +39,8 @@ static const FpIdEntry id_table[] = {
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0107, },
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0108, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
--
2.43.0
-40
View File
@@ -1,40 +0,0 @@
From 2e766904f0250873aaa2133f5d0e84440843ec8b Mon Sep 17 00:00:00 2001
From: Aris Lin <aris.lin@synaptics.com>
Date: Mon, 13 May 2024 16:21:57 +0800
Subject: [PATCH] synaptics: Add new PID 0x019D
Origin: upstream, https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/2e766904f0250873aaa2133f5d0e84440843ec8b
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2114712
Signed-off-by: Atlas Yu <atlas.yu@canonical.com>
---
data/autosuspend.hwdb | 1 +
libfprint/drivers/synaptics/synaptics.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
index 342c6d0..ef81674 100644
--- a/data/autosuspend.hwdb
+++ b/data/autosuspend.hwdb
@@ -243,6 +243,7 @@ usb:v06CBp015F*
usb:v06CBp0104*
usb:v06CBp0173*
usb:v06CBp0106*
+usb:v06CBp019D*
ID_AUTOSUSPEND=1
ID_PERSIST=0
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
index 138e734..7b7bf73 100644
--- a/libfprint/drivers/synaptics/synaptics.c
+++ b/libfprint/drivers/synaptics/synaptics.c
@@ -48,6 +48,7 @@ static const FpIdEntry id_table[] = {
{ .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 = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
};
--
2.43.0
@@ -1,54 +0,0 @@
From: Aris Lin <aris.lin@synaptics.com>
Date: Mon, 14 Jul 2025 11:52:56 +0800
Subject: [PATCH] synaptics: add new PID 0x019F, 0x109 and 0x10A
Origin: upstream, https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/7f5304d6eec37955c8d462e571c3d72af0be4684
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2133704
Signed-off-by: Bin Li <binli@ubuntu.com>
---
data/autosuspend.hwdb | 3 +++
libfprint/drivers/synaptics/synaptics.c | 3 +++
2 files changed, 6 insertions(+)
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
index 7a1759e..10e643c 100644
--- a/data/autosuspend.hwdb
+++ b/data/autosuspend.hwdb
@@ -232,6 +232,8 @@ usb:v06CBp00F0*
usb:v06CBp0103*
usb:v06CBp0107*
usb:v06CBp0108*
+usb:v06CBp0109*
+usb:v06CBp010A*
usb:v06CBp0123*
usb:v06CBp0124*
usb:v06CBp0126*
@@ -242,6 +244,7 @@ usb:v06CBp0104*
usb:v06CBp0173*
usb:v06CBp0106*
usb:v06CBp019D*
+usb:v06CBp019F*
ID_AUTOSUSPEND=1
ID_PERSIST=0
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
index d272421..29fb5f1 100644
--- a/libfprint/drivers/synaptics/synaptics.c
+++ b/libfprint/drivers/synaptics/synaptics.c
@@ -41,6 +41,8 @@ static const FpIdEntry id_table[] = {
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0107, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0108, },
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0109, },
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x010A, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
@@ -51,6 +53,7 @@ static const FpIdEntry id_table[] = {
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019D, },
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019F, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
};
-26
View File
@@ -1,26 +0,0 @@
#!/usr/bin/make -f
export DEB_BUILD_MAINT_OPTIONS = optimize=-lto
export DPKG_GENSYMBOLS_CHECK_LEVEL = 2
BUILDDIR = $(CURDIR)/obj-$(DEB_HOST_GNU_TYPE)
# Configuration arguments
CONFIG_ARGS = \
-Dudev_hwdb=enabled \
-Dudev_rules=enabled \
-Ddrivers=all \
-Dgtk-examples=false
%:
dh $@ --with gir
override_dh_auto_configure:
dh_auto_configure -- $(CONFIG_ARGS)
override_dh_auto_test:
dh_auto_test -- -C $(BUILDDIR) --timeout-multiplier 5
override_dh_auto_clean:
rm -rf tests/__pycache__
dh_auto_clean
-1
View File
@@ -1 +0,0 @@
3.0 (quilt)
-3
View File
@@ -1,3 +0,0 @@
# This TOD driver binary is built using sources inside this package
# but at previous version, see tests/tod-drivers/README.md for more information
libfprint source: source-is-missing [tests/tod-drivers/tod-*.so]
-6
View File
@@ -1,6 +0,0 @@
Test-Command: gnome-desktop-testing-runner libfprint-2
Features: test-name=installed-tests
Classes: desktop
Depends: gnome-desktop-testing,
libfprint-2-tests
Restrictions: allow-stderr
-32
View File
@@ -1,32 +0,0 @@
#!/bin/bash
set -e
srcdir="${GBP_SOURCES_DIR:-.}"
debpath="$(dirname "$0")"
autosuspend_file="$srcdir/data/autosuspend.hwdb"
commands_lines=()
while IFS= read -r line; do
if [[ $line =~ ^usb:v([A-Fa-f0-9]{4})p([A-Fa-f0-9]{4}) ]]; then
vendor="$(echo "${BASH_REMATCH[1]}" | tr '[:upper:]' '[:lower:]')"
product="$(echo "${BASH_REMATCH[2]}" | tr '[:upper:]' '[:lower:]')"
commands_lines+=("\tudevadm trigger --action=add --attr-match=idVendor=$vendor --attr-match=idProduct=$product || true")
fi
done < "$autosuspend_file"
UDEVADM_TRIGGERS=$( IFS=$'\n'; echo -e "${commands_lines[*]}" )
export UDEVADM_TRIGGERS
for i in "$debpath"/libfprint-*.post*.in; do
out="${i%.in}"
perl -pe 's/\@UDEVADM_TRIGGERS\@/`printenv UDEVADM_TRIGGERS`/e' "$i" > "$out"
if [ -n "$GBP_BRANCH" ]; then
if ! git diff-index --quiet HEAD -- "$out"; then
git add "$out"
dch "${out#$srcdir}: Devices triggers updated"
git add debian/changelog
debcommit
fi
fi
done
-4
View File
@@ -1,4 +0,0 @@
---
Bug-Database: https://gitlab.freedesktop.org/3v1n0/libfprint/-/issues
Bug-Submit: https://gitlab.freedesktop.org/3v1n0/libfprint/-/issues/new
Repository-Browse: https://gitlab.freedesktop.org/3v1n0/libfprint/tree/tod
-5
View File
@@ -1,5 +0,0 @@
version=4
opts=versionmangle=s/_/./g \
https://gitlab.freedesktop.org/3v1n0/@PACKAGE@/tags \
.*\/archive\/[Vv]_?([\d_\+\.]+(?:\+git[0-9]+)?\+tod[0-9]+)\/@PACKAGE@-.*@ARCHIVE_EXT@
+8 -5
View File
@@ -101,11 +101,14 @@ plot_minutiae (unsigned char *rgbdata,
{ {
int i; int i;
#define write_pixel(num) do { \ #define write_pixel(num) \
rgbdata[((num) * 3)] = 0xff; \ do \
rgbdata[((num) * 3) + 1] = 0; \ { \
rgbdata[((num) * 3) + 2] = 0; \ rgbdata[((num) * 3)] = 0xff; \
} while(0) rgbdata[((num) * 3) + 1] = 0; \
rgbdata[((num) * 3) + 2] = 0; \
} \
while(0)
for (i = 0; i < minutiae->len; i++) for (i = 0; i < minutiae->len; i++)
{ {
+208
View File
@@ -0,0 +1,208 @@
/*
* Example storage clearing program, which deletes all the
* fingers which have been previously enrolled to disk.
* Copyright (C) 2020 Marco Trevisan <marco.trevisan@canonical.com>
* Copyright (C) 2024 Abhinav Baid <abhinavbaid@gmail.com>
*
* 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
*/
#define FP_COMPONENT "example-clear-storage"
#include <stdlib.h>
#include <stdio.h>
#include <libfprint/fprint.h>
#include <glib-unix.h>
#include "storage.h"
#include "utilities.h"
typedef struct _ClearStorageData
{
GMainLoop *loop;
GCancellable *cancellable;
unsigned int sigint_handler;
int ret_value;
} ClearStorageData;
static void
clear_storage_data_free (ClearStorageData *clear_storage_data)
{
g_clear_handle_id (&clear_storage_data->sigint_handler, g_source_remove);
g_clear_object (&clear_storage_data->cancellable);
g_main_loop_unref (clear_storage_data->loop);
g_free (clear_storage_data);
}
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClearStorageData, clear_storage_data_free)
static void
on_device_closed (FpDevice *dev, GAsyncResult *res, void *user_data)
{
g_autoptr(GError) error = NULL;
ClearStorageData *clear_storage_data = user_data;
fp_device_close_finish (dev, res, &error);
if (error)
g_warning ("Failed closing device %s", error->message);
g_main_loop_quit (clear_storage_data->loop);
}
static void
clear_storage_quit (FpDevice *dev,
ClearStorageData *clear_storage_data)
{
if (!fp_device_is_open (dev))
{
g_main_loop_quit (clear_storage_data->loop);
return;
}
fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed,
clear_storage_data);
}
static void
on_clear_storage_completed (FpDevice *dev, GAsyncResult *res, void *user_data)
{
g_autoptr(GError) error = NULL;
ClearStorageData *clear_storage_data = user_data;
if (fp_device_clear_storage_finish (dev, res, &error))
{
if (!clear_saved_prints (dev, &error))
{
g_warning ("Clear saved prints from local storage failed: %s",
error->message);
clear_storage_data->ret_value = EXIT_FAILURE;
}
else
{
g_print ("Clear storage successful!\n");
clear_storage_data->ret_value = EXIT_SUCCESS;
}
clear_storage_quit (dev, clear_storage_data);
return;
}
g_warning ("Failed to clear storage: %s", error->message);
clear_storage_data->ret_value = EXIT_FAILURE;
if (g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_NOT_SUPPORTED))
{
g_autoptr(GError) clear_error = NULL;
if (clear_saved_prints (dev, &clear_error))
clear_storage_data->ret_value = EXIT_SUCCESS;
else
g_warning ("Clear saved prints from local storage failed: %s",
clear_error->message);
}
clear_storage_quit (dev, clear_storage_data);
}
static void
start_clear_storage (FpDevice *dev, ClearStorageData *clear_storage_data)
{
char buffer[20];
g_print ("Clear device storage? [Y/n]? ");
if (fgets (buffer, sizeof (buffer), stdin) &&
(buffer[0] == 'Y' || buffer[0] == 'y'))
{
fp_device_clear_storage (dev, clear_storage_data->cancellable,
(GAsyncReadyCallback) on_clear_storage_completed,
clear_storage_data);
return;
}
clear_storage_quit (dev, clear_storage_data);
}
static void
on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
{
g_autoptr(GError) error = NULL;
ClearStorageData *clear_storage_data = user_data;
if (!fp_device_open_finish (dev, res, &error))
{
g_warning ("Failed to open device: %s", error->message);
clear_storage_quit (dev, clear_storage_data);
return;
}
g_print ("Opened device. ");
start_clear_storage (dev, clear_storage_data);
}
static gboolean
sigint_cb (void *user_data)
{
ClearStorageData *clear_storage_data = user_data;
g_cancellable_cancel (clear_storage_data->cancellable);
return G_SOURCE_CONTINUE;
}
int
main (void)
{
g_autoptr(FpContext) ctx = NULL;
g_autoptr(ClearStorageData) clear_storage_data = NULL;
GPtrArray *devices;
FpDevice *dev;
setenv ("G_MESSAGES_DEBUG", "all", 0);
setenv ("LIBUSB_DEBUG", "3", 0);
ctx = fp_context_new ();
devices = fp_context_get_devices (ctx);
if (!devices)
{
g_warning ("Impossible to get devices");
return EXIT_FAILURE;
}
dev = discover_device (devices);
if (!dev)
{
g_warning ("No devices detected.");
return EXIT_FAILURE;
}
clear_storage_data = g_new0 (ClearStorageData, 1);
clear_storage_data->ret_value = EXIT_FAILURE;
clear_storage_data->loop = g_main_loop_new (NULL, FALSE);
clear_storage_data->cancellable = g_cancellable_new ();
clear_storage_data->sigint_handler = g_unix_signal_add_full (G_PRIORITY_HIGH,
SIGINT,
sigint_cb,
clear_storage_data,
NULL);
fp_device_open (dev, clear_storage_data->cancellable,
(GAsyncReadyCallback) on_device_opened,
clear_storage_data);
g_main_loop_run (clear_storage_data->loop);
return clear_storage_data->ret_value;
}
+1 -10
View File
@@ -5,6 +5,7 @@ examples = [
'img-capture', 'img-capture',
'manage-prints', 'manage-prints',
'verify', 'verify',
'clear-storage',
] ]
foreach example: examples foreach example: examples
@@ -26,13 +27,3 @@ if installed_tests
install_subdir('prints', install_subdir('prints',
install_dir: installed_tests_testdir) install_dir: installed_tests_testdir)
endif endif
if get_option('tod')
executable('tod-inspector',
sources: 'tod-inspector.c',
dependencies: [
libfprint_dep,
tod_dep,
],
)
endif
+63 -5
View File
@@ -26,6 +26,7 @@
#include "storage.h" #include "storage.h"
#include <errno.h> #include <errno.h>
#include <glib/gstdio.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@@ -55,6 +56,18 @@ get_print_data_descriptor (FpPrint *print, FpDevice *dev, FpFinger finger)
finger); finger);
} }
static char *
get_print_prefix_for_device (FpDevice *dev)
{
const char *driver;
const char *dev_id;
driver = fp_device_get_driver (dev);
dev_id = fp_device_get_device_id (dev);
return g_strdup_printf ("%s/%s/", driver, dev_id);
}
static GVariantDict * static GVariantDict *
load_data (void) load_data (void)
{ {
@@ -169,8 +182,6 @@ gallery_data_load (FpDevice *dev)
g_autoptr(GVariant) dict_variant = NULL; g_autoptr(GVariant) dict_variant = NULL;
g_autofree char *dev_prefix = NULL; g_autofree char *dev_prefix = NULL;
GPtrArray *gallery; GPtrArray *gallery;
const char *driver;
const char *dev_id;
GVariantIter iter; GVariantIter iter;
GVariant *value; GVariant *value;
gchar *key; gchar *key;
@@ -178,9 +189,7 @@ gallery_data_load (FpDevice *dev)
gallery = g_ptr_array_new_with_free_func (g_object_unref); gallery = g_ptr_array_new_with_free_func (g_object_unref);
dict = load_data (); dict = load_data ();
dict_variant = g_variant_dict_end (dict); dict_variant = g_variant_dict_end (dict);
driver = fp_device_get_driver (dev); dev_prefix = get_print_prefix_for_device (dev);
dev_id = fp_device_get_device_id (dev);
dev_prefix = g_strdup_printf ("%s/%s/", driver, dev_id);
g_variant_iter_init (&iter, dict_variant); g_variant_iter_init (&iter, dict_variant);
while (g_variant_iter_loop (&iter, "{sv}", &key, &value)) while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
@@ -208,6 +217,55 @@ gallery_data_load (FpDevice *dev)
return gallery; return gallery;
} }
gboolean
clear_saved_prints (FpDevice *dev,
GError **error)
{
g_autoptr(GVariantDict) dict = NULL;
g_autoptr(GVariantDict) updated_dict = NULL;
g_autoptr(GVariant) dict_variant = NULL;
g_autofree char *dev_prefix = NULL;
GPtrArray *print_keys;
GVariantIter iter;
GVariant *value;
gchar *key;
print_keys = g_ptr_array_new_with_free_func (g_free);
dict = load_data ();
dict_variant = g_variant_dict_end (dict);
dev_prefix = get_print_prefix_for_device (dev);
g_variant_iter_init (&iter, dict_variant);
while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
{
if (!g_str_has_prefix (key, dev_prefix))
continue;
g_ptr_array_add (print_keys, g_strdup (key));
}
if (!print_keys->len)
return TRUE;
updated_dict = load_data ();
for (guint i = 0; i < print_keys->len; ++i)
{
key = g_ptr_array_index (print_keys, i);
if (!g_variant_dict_remove (updated_dict, key))
{
g_warning ("Print '%s' key not found!", key);
continue;
}
g_debug ("Dropping print '%s' from gallery", key);
}
save_data (g_variant_dict_end (updated_dict));
return TRUE;
}
FpPrint * FpPrint *
print_create_template (FpDevice *dev, FpFinger finger, gboolean load_existing) print_create_template (FpDevice *dev, FpFinger finger, gboolean load_existing)
{ {
+5
View File
@@ -20,12 +20,17 @@
#pragma once #pragma once
#include <glib.h>
#include <libfprint/fprint.h>
int print_data_save (FpPrint *print, int print_data_save (FpPrint *print,
FpFinger finger, FpFinger finger,
gboolean update_fingerprint); gboolean update_fingerprint);
FpPrint * print_data_load (FpDevice *dev, FpPrint * print_data_load (FpDevice *dev,
FpFinger finger); FpFinger finger);
GPtrArray * gallery_data_load (FpDevice *dev); GPtrArray * gallery_data_load (FpDevice *dev);
gboolean clear_saved_prints (FpDevice *dev,
GError **error);
FpPrint * print_create_template (FpDevice *dev, FpPrint * print_create_template (FpDevice *dev,
FpFinger finger, FpFinger finger,
const gboolean load_existing); const gboolean load_existing);
-161
View File
@@ -1,161 +0,0 @@
/*
* Shared library loader for libfprint
* Copyright (C) 2021 Marco Trevisan <marco.trevisan@canonical.com>
*
* 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
*/
#include <libfprint/fprint.h>
#include "libfprint/tod/tod-shared-loader.h"
#include "libfprint/fpi-device.h"
static char *
id_table_to_string (FpDeviceType device_type,
const FpIdEntry *id_table)
{
const FpIdEntry *entry;
char *str = NULL;
if (!id_table)
return g_strdup ("INVALID: Empty ID table");
entry = id_table;
while (TRUE)
{
g_autofree char *value = NULL;
if (device_type == FP_DEVICE_TYPE_VIRTUAL)
{
if (entry->virtual_envvar)
value = g_strdup (entry->virtual_envvar);
}
else if (device_type == FP_DEVICE_TYPE_USB)
{
if (entry->vid)
value = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid);
}
else if (device_type == FP_DEVICE_TYPE_UDEV)
{
if (entry->hid_id.vid)
{
g_autofree gchar *udev_flags = NULL;
udev_flags = g_flags_to_string (fpi_device_udev_subtype_flags_get_type (),
entry->udev_types);
value = g_strdup_printf ("%s (%04x:%04x) [%s]",
entry->spi_acpi_id,
entry->hid_id.vid, entry->hid_id.pid,
udev_flags);
}
else
{
value = g_strdup (entry->spi_acpi_id);
}
}
else
{
return g_strdup ("Unsupported device type");
}
if (!value)
return str;
if (!str)
{
str = g_steal_pointer (&value);
}
else
{
g_autofree char *tmp = g_steal_pointer (&str);
str = g_strconcat (tmp, ", ", value, NULL);
}
entry++;
}
return str;
}
static const char *
device_type_to_string (FpDeviceType device_type)
{
g_autoptr(GEnumClass) device_types = g_type_class_ref (fp_device_type_get_type ());
GEnumValue *value = g_enum_get_value (device_types, device_type);
return value->value_nick;
}
static const char *
scan_type_to_string (FpScanType scan_type)
{
g_autoptr(GEnumClass) scan_types = g_type_class_ref (fp_scan_type_get_type ());
GEnumValue *value = g_enum_get_value (scan_types, scan_type);
return value->value_nick;
}
int
main (void)
{
g_autoptr(GArray) shared_drivers = NULL;
guint i;
tod_shared_drivers_register ();
shared_drivers = tod_shared_drivers_get ();
g_print ("Found %u drivers\n", shared_drivers->len);
for (i = 0; i < shared_drivers->len; i++)
{
GType driver = g_array_index (shared_drivers, GType, i);
g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver);
g_autofree char *id_table = NULL;
g_autofree char *features = NULL;
id_table = id_table_to_string (cls->type, cls->id_table);
features = g_flags_to_string (fp_device_feature_get_type (), cls->features);
g_print ("ID: %s\n", cls->id);
g_print ("Full Name: %s\n", cls->full_name);
g_print ("Type: %s\n", device_type_to_string (cls->type));
g_print ("Enroll stages: %d\n", cls->nr_enroll_stages);
g_print ("Scan type: %s\n", scan_type_to_string (cls->scan_type));
g_print ("Seconds to get Hot: %d\n", cls->temp_hot_seconds);
g_print ("Seconds to get Cold: %d\n", cls->temp_cold_seconds);
g_print ("Supported Devices: %s\n", id_table);
g_print ("Supported features: %s\n", features);
g_print ("Implemented VFuncs:\n");
g_print (" usb_discover: %s\n", cls->usb_discover ? "true" : "false");
g_print (" probe: %s\n", cls->probe ? "true" : "false");
g_print (" open: %s\n", cls->open ? "true" : "false");
g_print (" close: %s\n", cls->close ? "true" : "false");
g_print (" suspend: %s\n", cls->suspend ? "true" : "false");
g_print (" resume: %s\n", cls->resume ? "true" : "false");
g_print (" enroll: %s\n", cls->enroll ? "true" : "false");
g_print (" verify: %s\n", cls->verify ? "true" : "false");
g_print (" identify: %s\n", cls->identify ? "true" : "false");
g_print (" capture: %s\n", cls->capture ? "true" : "false");
g_print (" list: %s\n", cls->list ? "true" : "false");
g_print (" delete: %s\n", cls->delete ? "true" : "false");
g_print (" clear_storage: %s\n", cls->clear_storage ? "true" : "false");
g_print (" cancel: %s\n", cls->cancel ? "true" : "false");
if (i < shared_drivers->len - 1)
g_print ("------------\n");
}
tod_shared_drivers_unregister ();
}
+1
View File
@@ -0,0 +1 @@
gcov-ignore-parse-errors = suspicious_hits.warn
+242 -157
View File
@@ -32,6 +32,7 @@
#include <sys/param.h> #include <sys/param.h>
#include "drivers_api.h" #include "drivers_api.h"
#include "fpi-byte-writer.h"
#include "egismoc.h" #include "egismoc.h"
@@ -42,15 +43,19 @@ struct _FpiDeviceEgisMoc
FpiSsm *cmd_ssm; FpiSsm *cmd_ssm;
FpiUsbTransfer *cmd_transfer; FpiUsbTransfer *cmd_transfer;
GCancellable *interrupt_cancellable; GCancellable *interrupt_cancellable;
int enrolled_num;
GPtrArray *enrolled_ids; GPtrArray *enrolled_ids;
gint max_enroll_stages;
}; };
G_DEFINE_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FP_TYPE_DEVICE); G_DEFINE_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FP_TYPE_DEVICE);
static const FpIdEntry egismoc_id_table[] = { static const FpIdEntry egismoc_id_table[] = {
{ .vid = 0x1c7a, .pid = 0x0582, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 }, { .vid = 0x1c7a, .pid = 0x0582, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 },
{ .vid = 0x1c7a, .pid = 0x0583, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 },
{ .vid = 0x1c7a, .pid = 0x0584, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 | EGISMOC_DRIVER_MAX_ENROLL_STAGES_20 },
{ .vid = 0x1c7a, .pid = 0x0586, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 | EGISMOC_DRIVER_MAX_ENROLL_STAGES_20 },
{ .vid = 0x1c7a, .pid = 0x0587, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 | EGISMOC_DRIVER_MAX_ENROLL_STAGES_20 },
{ .vid = 0x1c7a, .pid = 0x0588, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 | EGISMOC_DRIVER_MAX_ENROLL_STAGES_20 },
{ .vid = 0x1c7a, .pid = 0x05a1, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE2 }, { .vid = 0x1c7a, .pid = 0x05a1, .driver_data = EGISMOC_DRIVER_CHECK_PREFIX_TYPE2 },
{ .vid = 0, .pid = 0, .driver_data = 0 } { .vid = 0, .pid = 0, .driver_data = 0 }
}; };
@@ -154,8 +159,6 @@ egismoc_task_ssm_done (FpiSsm *ssm,
self->task_ssm = NULL; self->task_ssm = NULL;
g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref); g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref);
self->enrolled_ids = NULL;
self->enrolled_num = -1;
if (error) if (error)
fpi_device_action_error (device, error); fpi_device_action_error (device, error);
@@ -273,43 +276,24 @@ egismoc_cmd_ssm_done (FpiSsm *ssm,
data->callback (device, NULL, 0, g_steal_pointer (&local_error)); data->callback (device, NULL, 0, g_steal_pointer (&local_error));
} }
typedef union
{
guint16 check_value;
guchar check_bytes[EGISMOC_CHECK_BYTES_LENGTH];
} EgisMocCheckBytes;
G_STATIC_ASSERT (G_SIZEOF_MEMBER (EgisMocCheckBytes, check_value) ==
sizeof (guint8) * EGISMOC_CHECK_BYTES_LENGTH);
/* /*
* Derive the 2 "check bytes" for write payloads * Derive the 2 "check bytes" for write payloads
* 32-bit big-endian sum of all 16-bit words (including check bytes) MOD 0xFFFF * 32-bit big-endian sum of all 16-bit words (including check bytes) MOD 0xFFFF
* should be 0, otherwise the device will reject the payload * should be 0, otherwise the device will reject the payload
*/ */
static EgisMocCheckBytes static guint16
egismoc_get_check_bytes (const guchar *value, egismoc_get_check_bytes (FpiByteReader *reader)
const gsize value_length)
{ {
fp_dbg ("Get check bytes"); fp_dbg ("Get check bytes");
EgisMocCheckBytes check_bytes;
const size_t steps = (value_length + 1) / 2;
guint16 values[steps];
size_t sum_values = 0; size_t sum_values = 0;
guint16 val;
for (int i = 0, j = 0; i < value_length; i += 2, j++) fpi_byte_reader_set_pos (reader, 0);
{
values[j] = (value[i] << 8 & 0xff00);
if (i < value_length - 1) while (fpi_byte_reader_get_uint16_be (reader, &val))
values[j] |= value[i + 1] & 0x00ff; sum_values += val;
}
for (int i = 0; i < steps; i++) return G_MAXUINT16 - (sum_values % G_MAXUINT16);
sum_values += values[i];
check_bytes.check_value = GUINT16_TO_BE (0xffff - (sum_values % 0xffff));
return check_bytes;
} }
static void static void
@@ -319,22 +303,15 @@ egismoc_exec_cmd (FpDevice *device,
GDestroyNotify cmd_destroy, GDestroyNotify cmd_destroy,
SynCmdMsgCallback callback) SynCmdMsgCallback callback)
{ {
fp_dbg ("Execute command and get response"); g_auto(FpiByteWriter) writer = {0};
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
EgisMocCheckBytes check_bytes;
g_autofree guchar *buffer_out = NULL;
gsize buffer_out_length = 0;
g_autoptr(FpiUsbTransfer) transfer = NULL; g_autoptr(FpiUsbTransfer) transfer = NULL;
CommandData *data = g_new0 (CommandData, 1); FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
g_autofree CommandData *data = NULL;
gsize buffer_out_length = 0;
gboolean written = TRUE;
guint16 check_value;
g_assert (self->cmd_ssm == NULL); fp_dbg ("Execute command and get response");
self->cmd_ssm = fpi_ssm_new (device,
egismoc_cmd_run_state,
CMD_STATES);
transfer = fpi_usb_transfer_new (device);
transfer->short_is_error = TRUE;
/* /*
* buffer_out should be a fully composed command (with prefix, check bytes, etc) * buffer_out should be a fully composed command (with prefix, check bytes, etc)
@@ -347,40 +324,60 @@ egismoc_exec_cmd (FpDevice *device,
buffer_out_length = egismoc_write_prefix_len buffer_out_length = egismoc_write_prefix_len
+ EGISMOC_CHECK_BYTES_LENGTH + EGISMOC_CHECK_BYTES_LENGTH
+ cmd_length; + cmd_length;
buffer_out = g_new0 (guchar, buffer_out_length);
fpi_byte_writer_init_with_size (&writer, buffer_out_length +
(buffer_out_length % 2 ? 1 : 0), TRUE);
/* Prefix */ /* Prefix */
memcpy (buffer_out, egismoc_write_prefix, egismoc_write_prefix_len); written &= fpi_byte_writer_put_data (&writer, egismoc_write_prefix,
egismoc_write_prefix_len);
/* Check Bytes - leave them as 00 for now then later generate and copy over /* Check Bytes - leave them as 00 for now then later generate and copy over
* the real ones */ * the real ones */
written &= fpi_byte_writer_change_pos (&writer, EGISMOC_CHECK_BYTES_LENGTH);
/* Command Payload */ /* Command Payload */
memcpy (buffer_out + egismoc_write_prefix_len + EGISMOC_CHECK_BYTES_LENGTH, written &= fpi_byte_writer_put_data (&writer, cmd, cmd_length);
cmd, cmd_length);
/* destroy cmd if requested */
if (cmd_destroy)
cmd_destroy (cmd);
/* Now fetch and set the "real" check bytes based on the currently /* Now fetch and set the "real" check bytes based on the currently
* assembled payload */ * assembled payload */
check_bytes = egismoc_get_check_bytes (buffer_out, buffer_out_length); check_value = egismoc_get_check_bytes (FPI_BYTE_READER (&writer));
memcpy (buffer_out + egismoc_write_prefix_len, check_bytes.check_bytes, fpi_byte_writer_set_pos (&writer, egismoc_write_prefix_len);
EGISMOC_CHECK_BYTES_LENGTH); written &= fpi_byte_writer_put_uint16_be (&writer, check_value);
/* destroy cmd if requested */
if (cmd_destroy)
g_clear_pointer (&cmd, cmd_destroy);
g_assert (self->cmd_ssm == NULL);
self->cmd_ssm = fpi_ssm_new (device,
egismoc_cmd_run_state,
CMD_STATES);
data = g_new0 (CommandData, 1);
data->callback = callback;
fpi_ssm_set_data (self->cmd_ssm, g_steal_pointer (&data), g_free);
if (!written)
{
fpi_ssm_start (self->cmd_ssm, egismoc_cmd_ssm_done);
fpi_ssm_mark_failed (self->cmd_ssm,
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
return;
}
transfer = fpi_usb_transfer_new (device);
transfer->short_is_error = TRUE;
transfer->ssm = self->cmd_ssm;
fpi_usb_transfer_fill_bulk_full (transfer, fpi_usb_transfer_fill_bulk_full (transfer,
EGISMOC_EP_CMD_OUT, EGISMOC_EP_CMD_OUT,
g_steal_pointer (&buffer_out), fpi_byte_writer_reset_and_get_data (&writer),
buffer_out_length, buffer_out_length,
g_free); g_free);
transfer->ssm = self->cmd_ssm;
g_assert (self->cmd_transfer == NULL); g_assert (self->cmd_transfer == NULL);
self->cmd_transfer = g_steal_pointer (&transfer); self->cmd_transfer = g_steal_pointer (&transfer);
data->callback = callback;
fpi_ssm_set_data (self->cmd_ssm, data, g_free);
fpi_ssm_start (self->cmd_ssm, egismoc_cmd_ssm_done); fpi_ssm_start (self->cmd_ssm, egismoc_cmd_ssm_done);
} }
@@ -419,11 +416,13 @@ egismoc_get_enrolled_prints (FpDevice *device)
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device); FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
g_autoptr(GPtrArray) result = g_ptr_array_new_with_free_func (g_object_unref); g_autoptr(GPtrArray) result = g_ptr_array_new_with_free_func (g_object_unref);
FpPrint *print = NULL;
for (int i = 0; i < self->enrolled_num; i++) if (!self->enrolled_ids)
return g_steal_pointer (&result);
for (guint i = 0; i < self->enrolled_ids->len; i++)
{ {
print = fp_print_new (device); FpPrint *print = fp_print_new (device);
egismoc_set_print_data (print, g_ptr_array_index (self->enrolled_ids, i), NULL); egismoc_set_print_data (print, g_ptr_array_index (self->enrolled_ids, i), NULL);
g_ptr_array_add (result, g_object_ref_sink (print)); g_ptr_array_add (result, g_object_ref_sink (print));
} }
@@ -448,26 +447,37 @@ egismoc_list_fill_enrolled_ids_cb (FpDevice *device,
g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref); g_clear_pointer (&self->enrolled_ids, g_ptr_array_unref);
self->enrolled_ids = g_ptr_array_new_with_free_func (g_free); self->enrolled_ids = g_ptr_array_new_with_free_func (g_free);
self->enrolled_num = 0;
FpiByteReader reader;
gboolean read = TRUE;
fpi_byte_reader_init (&reader, buffer_in, length_in);
read &= fpi_byte_reader_set_pos (&reader, EGISMOC_LIST_RESPONSE_PREFIX_SIZE);
/* /*
* Each fingerprint ID will be returned in this response as a 32 byte array * Each fingerprint ID will be returned in this response as a 32 byte array
* The other stuff in the payload is 16 bytes long, so if there is at least 1 * The other stuff in the payload is 16 bytes long, so if there is at least 1
* print then the length should be at least 16+32=48 bytes long * print then the length should be at least 16+32=48 bytes long
*/ */
for (int pos = EGISMOC_LIST_RESPONSE_PREFIX_SIZE; while (read)
pos < length_in - EGISMOC_LIST_RESPONSE_SUFFIX_SIZE;
pos += EGISMOC_FINGERPRINT_DATA_SIZE, self->enrolled_num++)
{ {
g_autofree gchar *print_id = g_strndup ((gchar *) buffer_in + pos, const guint8 *data;
EGISMOC_FINGERPRINT_DATA_SIZE); g_autofree gchar *print_id = NULL;
fp_dbg ("Device fingerprint %0d: %.*s", self->enrolled_num,
read &= fpi_byte_reader_get_data (&reader, EGISMOC_FINGERPRINT_DATA_SIZE,
&data);
if (!read)
break;
print_id = g_strndup ((gchar *) data, EGISMOC_FINGERPRINT_DATA_SIZE);
fp_dbg ("Device fingerprint %0d: %.*s", self->enrolled_ids->len + 1,
EGISMOC_FINGERPRINT_DATA_SIZE, print_id); EGISMOC_FINGERPRINT_DATA_SIZE, print_id);
g_ptr_array_add (self->enrolled_ids, g_steal_pointer (&print_id)); g_ptr_array_add (self->enrolled_ids, g_steal_pointer (&print_id));
} }
fp_info ("Number of currently enrolled fingerprints on the device is %d", fp_info ("Number of currently enrolled fingerprints on the device is %d",
self->enrolled_num); self->enrolled_ids->len);
if (self->task_ssm) if (self->task_ssm)
fpi_ssm_next_state (self->task_ssm); fpi_ssm_next_state (self->task_ssm);
@@ -514,6 +524,7 @@ egismoc_get_delete_cmd (FpDevice *device,
{ {
fp_dbg ("Get delete command"); fp_dbg ("Get delete command");
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device); FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
g_auto(FpiByteWriter) writer = {0};
g_autoptr(GVariant) print_data = NULL; g_autoptr(GVariant) print_data = NULL;
g_autoptr(GVariant) print_data_id_var = NULL; g_autoptr(GVariant) print_data_id_var = NULL;
const guchar *print_data_id = NULL; const guchar *print_data_id = NULL;
@@ -521,7 +532,7 @@ egismoc_get_delete_cmd (FpDevice *device,
g_autofree gchar *print_description = NULL; g_autofree gchar *print_description = NULL;
g_autofree guchar *enrolled_print_id = NULL; g_autofree guchar *enrolled_print_id = NULL;
g_autofree guchar *result = NULL; g_autofree guchar *result = NULL;
gsize pos = 0; gboolean written = TRUE;
/* /*
* The final command body should contain: * The final command body should contain:
@@ -537,7 +548,12 @@ egismoc_get_delete_cmd (FpDevice *device,
* identifiers (enrolled_list) * identifiers (enrolled_list)
*/ */
const int num_to_delete = (!delete_print) ? self->enrolled_num : 1; int num_to_delete = 0;
if (delete_print)
num_to_delete = 1;
else if (self->enrolled_ids)
num_to_delete = self->enrolled_ids->len;
const gsize body_length = sizeof (guchar) * EGISMOC_FINGERPRINT_DATA_SIZE * const gsize body_length = sizeof (guchar) * EGISMOC_FINGERPRINT_DATA_SIZE *
num_to_delete; num_to_delete;
/* total_length is the 6 various bytes plus prefix and body payload */ /* total_length is the 6 various bytes plus prefix and body payload */
@@ -545,10 +561,10 @@ egismoc_get_delete_cmd (FpDevice *device,
body_length; body_length;
/* pre-fill entire payload with 00s */ /* pre-fill entire payload with 00s */
result = g_new0 (guchar, total_length); fpi_byte_writer_init_with_size (&writer, total_length, TRUE);
/* start with 00 00 (just move starting offset up by 2) */ /* start with 00 00 (just move starting offset up by 2) */
pos = 2; written &= fpi_byte_writer_set_pos (&writer, 2);
/* Size Counter bytes */ /* Size Counter bytes */
/* "easiest" way to handle 2-bytes size for counter is to hard-code logic for /* "easiest" way to handle 2-bytes size for counter is to hard-code logic for
@@ -557,37 +573,31 @@ egismoc_get_delete_cmd (FpDevice *device,
* (assumed max is 10) */ * (assumed max is 10) */
if (num_to_delete > 7) if (num_to_delete > 7)
{ {
memset (result + pos, 0x01, sizeof (guchar)); written &= fpi_byte_writer_put_uint8 (&writer, 0x01);
pos += sizeof (guchar); written &= fpi_byte_writer_put_uint8 (&writer, ((num_to_delete - 8) * 0x20) + 0x07);
memset (result + pos, ((num_to_delete - 8) * 0x20) + 0x07, sizeof (guchar));
pos += sizeof (guchar);
} }
else else
{ {
/* first byte is 0x00, just skip it */ /* first byte is 0x00, just skip it */
pos += sizeof (guchar); written &= fpi_byte_writer_change_pos (&writer, 1);
memset (result + pos, (num_to_delete * 0x20) + 0x07, sizeof (guchar)); written &= fpi_byte_writer_put_uint8 (&writer, (num_to_delete * 0x20) + 0x07);
pos += sizeof (guchar);
} }
/* command prefix */ /* command prefix */
memcpy (result + pos, cmd_delete_prefix, cmd_delete_prefix_len); written &= fpi_byte_writer_put_data (&writer, cmd_delete_prefix,
pos += cmd_delete_prefix_len; cmd_delete_prefix_len);
/* 2-bytes size logic for counter again */ /* 2-bytes size logic for counter again */
if (num_to_delete > 7) if (num_to_delete > 7)
{ {
memset (result + pos, 0x01, sizeof (guchar)); written &= fpi_byte_writer_put_uint8 (&writer, 0x01);
pos += sizeof (guchar); written &= fpi_byte_writer_put_uint8 (&writer, (num_to_delete - 8) * 0x20);
memset (result + pos, ((num_to_delete - 8) * 0x20), sizeof (guchar));
pos += sizeof (guchar);
} }
else else
{ {
/* first byte is 0x00, just skip it */ /* first byte is 0x00, just skip it */
pos += sizeof (guchar); written &= fpi_byte_writer_change_pos (&writer, 1);
memset (result + pos, (num_to_delete * 0x20), sizeof (guchar)); written &= fpi_byte_writer_put_uint8 (&writer, num_to_delete * 0x20);
pos += sizeof (guchar);
} }
/* append desired 32-byte fingerprint IDs */ /* append desired 32-byte fingerprint IDs */
@@ -614,21 +624,26 @@ egismoc_get_delete_cmd (FpDevice *device,
fp_info ("Delete fingerprint %s (%s)", print_description, print_data_id); fp_info ("Delete fingerprint %s (%s)", print_description, print_data_id);
memcpy (result + pos, print_data_id, EGISMOC_FINGERPRINT_DATA_SIZE); written &= fpi_byte_writer_put_data (&writer, print_data_id,
EGISMOC_FINGERPRINT_DATA_SIZE);
} }
/* Otherwise assume this is a "clear" - just loop through and append all enrolled IDs */ /* Otherwise assume this is a "clear" - just loop through and append all enrolled IDs */
else else if (self->enrolled_ids)
{ {
for (int i = 0; i < self->enrolled_ids->len; i++) for (guint i = 0; i < self->enrolled_ids->len && written; i++)
memcpy (result + pos + (EGISMOC_FINGERPRINT_DATA_SIZE * i), {
g_ptr_array_index (self->enrolled_ids, i), written &= fpi_byte_writer_put_data (&writer,
EGISMOC_FINGERPRINT_DATA_SIZE); g_ptr_array_index (self->enrolled_ids, i),
EGISMOC_FINGERPRINT_DATA_SIZE);
}
} }
g_assert (written);
if (length_out) if (length_out)
*length_out = total_length; *length_out = total_length;
return g_steal_pointer (&result); return fpi_byte_writer_reset_and_get_data (&writer);
} }
static void static void
@@ -687,9 +702,7 @@ egismoc_delete_run_state (FpiSsm *ssm,
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case DELETE_GET_ENROLLED_IDS: case DELETE_GET_ENROLLED_IDS:
/* get enrolled_ids and enrolled_num from device for use building /* get enrolled_ids from device for use building delete payload below */
* delete payload below
*/
egismoc_exec_cmd (device, cmd_list, cmd_list_len, NULL, egismoc_exec_cmd (device, cmd_list, cmd_list_len, NULL,
egismoc_list_fill_enrolled_ids_cb); egismoc_list_fill_enrolled_ids_cb);
break; break;
@@ -761,7 +774,7 @@ egismoc_enroll_status_report (FpDevice *device,
enroll_print->stage++; enroll_print->stage++;
fp_info ("Partial capture successful. Please touch the sensor again (%d/%d)", fp_info ("Partial capture successful. Please touch the sensor again (%d/%d)",
enroll_print->stage, enroll_print->stage,
EGISMOC_MAX_ENROLL_NUM); self->max_enroll_stages);
fpi_device_enroll_progress (device, enroll_print->stage, enroll_print->print, NULL); fpi_device_enroll_progress (device, enroll_print->stage, enroll_print->print, NULL);
break; break;
@@ -841,7 +854,7 @@ egismoc_read_capture_cb (FpDevice *device,
egismoc_enroll_status_report (device, enroll_print, ENROLL_STATUS_RETRY, error); egismoc_enroll_status_report (device, enroll_print, ENROLL_STATUS_RETRY, error);
} }
if (enroll_print->stage == EGISMOC_ENROLL_TIMES) if (enroll_print->stage == self->max_enroll_stages)
fpi_ssm_next_state (self->task_ssm); fpi_ssm_next_state (self->task_ssm);
else else
fpi_ssm_jump_to_state (self->task_ssm, ENROLL_CAPTURE_SENSOR_RESET); fpi_ssm_jump_to_state (self->task_ssm, ENROLL_CAPTURE_SENSOR_RESET);
@@ -884,26 +897,28 @@ egismoc_get_check_cmd (FpDevice *device,
{ {
fp_dbg ("Get check command"); fp_dbg ("Get check command");
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device); FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
g_auto(FpiByteWriter) writer = {0};
g_autofree guchar *result = NULL; g_autofree guchar *result = NULL;
gsize pos = 0; gboolean written = TRUE;
/* /*
* The final command body should contain: * The final command body should contain:
* 1) hard-coded 00 00 * 1) hard-coded 00 00
* 2) 2-byte size indiciator, 20*Number enrolled identifiers plus 9 in form of: * 2) 2-byte size indiciator, 20*Number enrolled identifiers plus 9 in form of:
* (enrolled_num + 1) * 0x20 + 0x09 * (enrolled_ids->len + 1) * 0x20 + 0x09
* Since max prints can be higher than 7 then this goes up to 2 bytes * Since max prints can be higher than 7 then this goes up to 2 bytes
* (e9 + 9 = 109) * (e9 + 9 = 109)
* 3) Hard-coded prefix (cmd_check_prefix) * 3) Hard-coded prefix (cmd_check_prefix)
* 4) 2-byte size indiciator, 20*Number of enrolled identifiers without plus 9 * 4) 2-byte size indiciator, 20*Number of enrolled identifiers without plus 9
* ((enrolled_num + 1) * 0x20) * ((enrolled_ids->len + 1) * 0x20)
* 5) Hard-coded 32 * 0x00 bytes * 5) Hard-coded 32 * 0x00 bytes
* 6) All of the currently registered prints in their 32-byte device identifiers * 6) All of the currently registered prints in their 32-byte device identifiers
* (enrolled_list) * (enrolled_list)
* 7) Hard-coded suffix (cmd_check_suffix) * 7) Hard-coded suffix (cmd_check_suffix)
*/ */
const gsize body_length = sizeof (guchar) * self->enrolled_num * g_assert (self->enrolled_ids);
const gsize body_length = sizeof (guchar) * self->enrolled_ids->len *
EGISMOC_FINGERPRINT_DATA_SIZE; EGISMOC_FINGERPRINT_DATA_SIZE;
/* prefix length can depend on the type */ /* prefix length can depend on the type */
@@ -921,87 +936,82 @@ egismoc_get_check_cmd (FpDevice *device,
+ cmd_check_suffix_len; + cmd_check_suffix_len;
/* pre-fill entire payload with 00s */ /* pre-fill entire payload with 00s */
result = g_new0 (guchar, total_length); fpi_byte_writer_init_with_size (&writer, total_length, TRUE);
/* start with 00 00 (just move starting offset up by 2) */ /* start with 00 00 (just move starting offset up by 2) */
pos = 2; written &= fpi_byte_writer_set_pos (&writer, 2);
/* Size Counter bytes */ /* Size Counter bytes */
/* "easiest" way to handle 2-bytes size for counter is to hard-code logic for /* "easiest" way to handle 2-bytes size for counter is to hard-code logic for
* when we go to the 2nd byte * when we go to the 2nd byte
* note this will not work in case any model ever supports more than 14 prints * note this will not work in case any model ever supports more than 14 prints
* (assumed max is 10) */ * (assumed max is 10) */
if (self->enrolled_num > 6) if (self->enrolled_ids->len > 6)
{ {
memset (result + pos, 0x01, sizeof (guchar)); written &= fpi_byte_writer_put_uint8 (&writer, 0x01);
pos += sizeof (guchar); written &= fpi_byte_writer_put_uint8 (&writer,
memset (result + pos, ((self->enrolled_num - 7) * 0x20) + 0x09, ((self->enrolled_ids->len - 7) * 0x20)
sizeof (guchar)); + 0x09);
pos += sizeof (guchar);
} }
else else
{ {
/* first byte is 0x00, just skip it */ /* first byte is 0x00, just skip it */
pos += sizeof (guchar); written &= fpi_byte_writer_change_pos (&writer, 1);
memset (result + pos, ((self->enrolled_num + 1) * 0x20) + 0x09, written &= fpi_byte_writer_put_uint8 (&writer,
sizeof (guchar)); ((self->enrolled_ids->len + 1) * 0x20) +
pos += sizeof (guchar); 0x09);
} }
/* command prefix */ /* command prefix */
if (fpi_device_get_driver_data (device) & EGISMOC_DRIVER_CHECK_PREFIX_TYPE2) if (fpi_device_get_driver_data (device) & EGISMOC_DRIVER_CHECK_PREFIX_TYPE2)
{ written &= fpi_byte_writer_put_data (&writer, cmd_check_prefix_type2,
memcpy (result + pos, cmd_check_prefix_type2, cmd_check_prefix_type2_len); cmd_check_prefix_type2_len);
pos += cmd_check_prefix_type2_len;
}
else else
{ written &= fpi_byte_writer_put_data (&writer, cmd_check_prefix_type1,
memcpy (result + pos, cmd_check_prefix_type1, cmd_check_prefix_type1_len); cmd_check_prefix_type1_len);
pos += cmd_check_prefix_type1_len;
}
/* 2-bytes size logic for counter again */ /* 2-bytes size logic for counter again */
if (self->enrolled_num > 6) if (self->enrolled_ids->len > 6)
{ {
memset (result + pos, 0x01, sizeof (guchar)); written &= fpi_byte_writer_put_uint8 (&writer, 0x01);
pos += sizeof (guchar); written &= fpi_byte_writer_put_uint8 (&writer,
memset (result + pos, (self->enrolled_num - 7) * 0x20, sizeof (guchar)); (self->enrolled_ids->len - 7) * 0x20);
pos += sizeof (guchar);
} }
else else
{ {
/* first byte is 0x00, just skip it */ /* first byte is 0x00, just skip it */
pos += sizeof (guchar); written &= fpi_byte_writer_change_pos (&writer, 1);
memset (result + pos, (self->enrolled_num + 1) * 0x20, sizeof (guchar)); written &= fpi_byte_writer_put_uint8 (&writer,
pos += sizeof (guchar); (self->enrolled_ids->len + 1) * 0x20);
} }
/* add 00s "separator" to offset position */ /* add 00s "separator" to offset position */
pos += EGISMOC_CMD_CHECK_SEPARATOR_LENGTH; written &= fpi_byte_writer_change_pos (&writer,
EGISMOC_CMD_CHECK_SEPARATOR_LENGTH);
/* append all currently registered 32-byte fingerprint IDs */ for (guint i = 0; i < self->enrolled_ids->len && written; i++)
const gsize print_id_length = sizeof (guchar) * EGISMOC_FINGERPRINT_DATA_SIZE;
for (int i = 0; i < self->enrolled_num; i++)
{ {
gchar *device_print_id = g_ptr_array_index (self->enrolled_ids, i); written &= fpi_byte_writer_put_data (&writer,
memcpy (result + pos + (print_id_length * i), device_print_id, print_id_length); g_ptr_array_index (self->enrolled_ids, i),
EGISMOC_FINGERPRINT_DATA_SIZE);
} }
pos += body_length;
/* command suffix */ /* command suffix */
memcpy (result + pos, cmd_check_suffix, cmd_check_suffix_len); written &= fpi_byte_writer_put_data (&writer, cmd_check_suffix,
cmd_check_suffix_len);
g_assert (written);
if (length_out) if (length_out)
*length_out = total_length; *length_out = total_length;
return g_steal_pointer (&result); return fpi_byte_writer_reset_and_get_data (&writer);
} }
static void static void
egismoc_enroll_run_state (FpiSsm *ssm, egismoc_enroll_run_state (FpiSsm *ssm,
FpDevice *device) FpDevice *device)
{ {
g_auto(FpiByteWriter) writer = {0};
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device); FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
EnrollPrint *enroll_print = fpi_ssm_get_data (ssm); EnrollPrint *enroll_print = fpi_ssm_get_data (ssm);
g_autofree guchar *payload = NULL; g_autofree guchar *payload = NULL;
@@ -1012,13 +1022,13 @@ egismoc_enroll_run_state (FpiSsm *ssm,
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case ENROLL_GET_ENROLLED_IDS: case ENROLL_GET_ENROLLED_IDS:
/* get enrolled_ids and enrolled_num from device for use in check stages below */ /* get enrolled_ids from device for use in check stages below */
egismoc_exec_cmd (device, cmd_list, cmd_list_len, egismoc_exec_cmd (device, cmd_list, cmd_list_len,
NULL, egismoc_list_fill_enrolled_ids_cb); NULL, egismoc_list_fill_enrolled_ids_cb);
break; break;
case ENROLL_CHECK_ENROLLED_NUM: case ENROLL_CHECK_ENROLLED_NUM:
if (self->enrolled_num >= EGISMOC_MAX_ENROLL_NUM) if (self->enrolled_ids->len >= EGISMOC_MAX_ENROLL_NUM)
{ {
egismoc_enroll_status_report (device, enroll_print, ENROLL_STATUS_DEVICE_FULL, egismoc_enroll_status_report (device, enroll_print, ENROLL_STATUS_DEVICE_FULL,
fpi_device_error_new (FP_DEVICE_ERROR_DATA_FULL)); fpi_device_error_new (FP_DEVICE_ERROR_DATA_FULL));
@@ -1089,14 +1099,23 @@ egismoc_enroll_run_state (FpiSsm *ssm,
device_print_id = g_strndup (user_id, EGISMOC_FINGERPRINT_DATA_SIZE); device_print_id = g_strndup (user_id, EGISMOC_FINGERPRINT_DATA_SIZE);
egismoc_set_print_data (enroll_print->print, device_print_id, user_id); egismoc_set_print_data (enroll_print->print, device_print_id, user_id);
/* create new dynamic payload of cmd_new_print_prefix + device_print_id */ fpi_byte_writer_init (&writer);
payload_length = cmd_new_print_prefix_len + EGISMOC_FINGERPRINT_DATA_SIZE; if (!fpi_byte_writer_put_data (&writer, cmd_new_print_prefix,
payload = g_new0 (guchar, payload_length); cmd_new_print_prefix_len))
memcpy (payload, cmd_new_print_prefix, cmd_new_print_prefix_len); {
memcpy (payload + cmd_new_print_prefix_len, device_print_id, fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
EGISMOC_FINGERPRINT_DATA_SIZE); break;
}
if (!fpi_byte_writer_put_data (&writer, (guint8 *) device_print_id,
EGISMOC_FINGERPRINT_DATA_SIZE))
{
fpi_ssm_mark_failed (ssm, fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
break;
}
egismoc_exec_cmd (device, g_steal_pointer (&payload), payload_length, payload_length = fpi_byte_writer_get_size (&writer);
egismoc_exec_cmd (device, fpi_byte_writer_reset_and_get_data (&writer),
payload_length,
g_free, egismoc_task_ssm_next_state_cb); g_free, egismoc_task_ssm_next_state_cb);
break; break;
@@ -1239,13 +1258,13 @@ egismoc_identify_run_state (FpiSsm *ssm,
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case IDENTIFY_GET_ENROLLED_IDS: case IDENTIFY_GET_ENROLLED_IDS:
/* get enrolled_ids and enrolled_num from device for use in check stages below */ /* get enrolled_ids from device for use in check stages below */
egismoc_exec_cmd (device, cmd_list, cmd_list_len, egismoc_exec_cmd (device, cmd_list, cmd_list_len,
NULL, egismoc_list_fill_enrolled_ids_cb); NULL, egismoc_list_fill_enrolled_ids_cb);
break; break;
case IDENTIFY_CHECK_ENROLLED_NUM: case IDENTIFY_CHECK_ENROLLED_NUM:
if (self->enrolled_num == 0) if (self->enrolled_ids->len == 0)
{ {
fpi_ssm_mark_failed (g_steal_pointer (&self->task_ssm), fpi_ssm_mark_failed (g_steal_pointer (&self->task_ssm),
fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND)); fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND));
@@ -1446,6 +1465,71 @@ egismoc_dev_init_handler (FpiSsm *ssm,
NULL); NULL);
} }
static void
egismoc_probe (FpDevice *device)
{
GUsbDevice *usb_dev;
GError *error = NULL;
g_autofree gchar *serial = NULL;
FpiDeviceEgisMoc *self = FPI_DEVICE_EGISMOC (device);
fp_dbg ("%s enter --> ", G_STRFUNC);
/* Claim usb interface */
usb_dev = fpi_device_get_usb_device (device);
if (!g_usb_device_open (usb_dev, &error))
{
fp_dbg ("%s g_usb_device_open failed %s", G_STRFUNC, error->message);
fpi_device_probe_complete (device, NULL, NULL, error);
return;
}
if (!g_usb_device_reset (usb_dev, &error))
{
fp_dbg ("%s g_usb_device_reset failed %s", G_STRFUNC, error->message);
g_usb_device_close (usb_dev, NULL);
fpi_device_probe_complete (device, NULL, NULL, error);
return;
}
if (!g_usb_device_claim_interface (usb_dev, 0, 0, &error))
{
fp_dbg ("%s g_usb_device_claim_interface failed %s", G_STRFUNC, error->message);
g_usb_device_close (usb_dev, NULL);
fpi_device_probe_complete (device, NULL, NULL, error);
return;
}
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") == 0)
serial = g_strdup ("emulated-device");
else
serial = g_usb_device_get_string_descriptor (usb_dev,
g_usb_device_get_serial_number_index (usb_dev),
&error);
if (error)
{
fp_dbg ("%s g_usb_device_get_string_descriptor failed %s", G_STRFUNC, error->message);
g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (device)),
0, 0, NULL);
g_usb_device_close (usb_dev, NULL);
fpi_device_probe_complete (device, NULL, NULL, error);
return;
}
if (fpi_device_get_driver_data (device) & EGISMOC_DRIVER_MAX_ENROLL_STAGES_20)
self->max_enroll_stages = 20;
else
self->max_enroll_stages = EGISMOC_MAX_ENROLL_STAGES_DEFAULT;
fpi_device_set_nr_enroll_stages (device, self->max_enroll_stages);
g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (device)), 0, 0, NULL);
g_usb_device_close (usb_dev, NULL);
fpi_device_probe_complete (device, serial, NULL, error);
}
static void static void
egismoc_open (FpDevice *device) egismoc_open (FpDevice *device)
{ {
@@ -1526,10 +1610,11 @@ fpi_device_egismoc_class_init (FpiDeviceEgisMocClass *klass)
dev_class->type = FP_DEVICE_TYPE_USB; dev_class->type = FP_DEVICE_TYPE_USB;
dev_class->scan_type = FP_SCAN_TYPE_PRESS; dev_class->scan_type = FP_SCAN_TYPE_PRESS;
dev_class->id_table = egismoc_id_table; dev_class->id_table = egismoc_id_table;
dev_class->nr_enroll_stages = EGISMOC_ENROLL_TIMES; dev_class->nr_enroll_stages = EGISMOC_MAX_ENROLL_STAGES_DEFAULT;
/* device should be "always off" unless being used */ /* device should be "always off" unless being used */
dev_class->temp_hot_seconds = 0; dev_class->temp_hot_seconds = 0;
dev_class->probe = egismoc_probe;
dev_class->open = egismoc_open; dev_class->open = egismoc_open;
dev_class->cancel = egismoc_cancel; dev_class->cancel = egismoc_cancel;
dev_class->suspend = egismoc_suspend; dev_class->suspend = egismoc_suspend;
+4 -3
View File
@@ -36,6 +36,7 @@ G_DECLARE_FINAL_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FPI, DEVICE_EGISMOC,
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 (1 << 0) #define EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 (1 << 0)
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE2 (1 << 1) #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_OUT (0x02 | FPI_USB_ENDPOINT_OUT)
#define EGISMOC_EP_CMD_IN (0x81 | FPI_USB_ENDPOINT_IN) #define EGISMOC_EP_CMD_IN (0x81 | FPI_USB_ENDPOINT_IN)
@@ -49,7 +50,7 @@ G_DECLARE_FINAL_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FPI, DEVICE_EGISMOC,
#define EGISMOC_USB_IN_RECV_LENGTH 4096 #define EGISMOC_USB_IN_RECV_LENGTH 4096
#define EGISMOC_USB_INTERRUPT_IN_RECV_LENGTH 64 #define EGISMOC_USB_INTERRUPT_IN_RECV_LENGTH 64
#define EGISMOC_ENROLL_TIMES 10 #define EGISMOC_MAX_ENROLL_STAGES_DEFAULT 10
#define EGISMOC_MAX_ENROLL_NUM 10 #define EGISMOC_MAX_ENROLL_NUM 10
#define EGISMOC_FINGERPRINT_DATA_SIZE 32 #define EGISMOC_FINGERPRINT_DATA_SIZE 32
#define EGISMOC_LIST_RESPONSE_PREFIX_SIZE 14 #define EGISMOC_LIST_RESPONSE_PREFIX_SIZE 14
@@ -100,11 +101,11 @@ static guchar cmd_read_capture[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x02, 0x
static gsize cmd_read_capture_len = sizeof (cmd_read_capture) / sizeof (cmd_read_capture[0]); 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 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 gsize rsp_read_success_prefix_len = sizeof (rsp_read_success_prefix) / sizeof (rsp_read_success_prefix[0]);
static guchar rsp_read_success_suffix[] = {0x0a, 0x90, 0x00}; 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 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 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 gsize rsp_read_offcenter_prefix_len = sizeof (rsp_read_offcenter_prefix) / sizeof (rsp_read_offcenter_prefix[0]);
static guchar rsp_read_offcenter_suffix[] = {0x0a, 0x64, 0x91}; 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 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 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 gsize rsp_read_dirty_prefix_len = sizeof (rsp_read_dirty_prefix) / sizeof (rsp_read_dirty_prefix[0]);
+14 -7
View File
@@ -31,7 +31,14 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x04f3, .pid = 0x0c88, }, { .vid = 0x04f3, .pid = 0x0c88, },
{ .vid = 0x04f3, .pid = 0x0c8c, }, { .vid = 0x04f3, .pid = 0x0c8c, },
{ .vid = 0x04f3, .pid = 0x0c8d, }, { .vid = 0x04f3, .pid = 0x0c8d, },
{ .vid = 0x04f3, .pid = 0x0c98, },
{ .vid = 0x04f3, .pid = 0x0c99, }, { .vid = 0x04f3, .pid = 0x0c99, },
{ .vid = 0x04f3, .pid = 0x0c9d, },
{ .vid = 0x04f3, .pid = 0x0c9f, },
{ .vid = 0x04f3, .pid = 0x0ca3, },
{ .vid = 0x04f3, .pid = 0x0ca7, },
{ .vid = 0x04f3, .pid = 0x0ca8, },
{ .vid = 0x04f3, .pid = 0x0cb0, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };
@@ -128,10 +135,10 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
} }
typedef enum { typedef enum {
FP_CMD_SEND = 0, ELAN_MOC_CMD_SEND = 0,
FP_CMD_GET, ELAN_MOC_CMD_GET,
FP_CMD_NUM_STATES, ELAN_MOC_CMD_NUM_STATES,
} FpCmdState; } ElanMocCmdState;
static void static void
fp_cmd_run_state (FpiSsm *ssm, fp_cmd_run_state (FpiSsm *ssm,
@@ -142,7 +149,7 @@ fp_cmd_run_state (FpiSsm *ssm,
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_CMD_SEND: case ELAN_MOC_CMD_SEND:
if (self->cmd_transfer) if (self->cmd_transfer)
{ {
self->cmd_transfer->ssm = ssm; self->cmd_transfer->ssm = ssm;
@@ -158,7 +165,7 @@ fp_cmd_run_state (FpiSsm *ssm,
} }
break; break;
case FP_CMD_GET: case ELAN_MOC_CMD_GET:
if (self->cmd_len_in == 0) if (self->cmd_len_in == 0)
{ {
CommandData *data = fpi_ssm_get_data (ssm); CommandData *data = fpi_ssm_get_data (ssm);
@@ -225,7 +232,7 @@ elanmoc_get_cmd (FpDevice *device, guint8 *buffer_out,
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self), self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
fp_cmd_run_state, fp_cmd_run_state,
FP_CMD_NUM_STATES); ELAN_MOC_CMD_NUM_STATES);
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free); fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
+2
View File
@@ -340,9 +340,11 @@ static const struct elanspi_regtable elanspi_calibration_table_new_page1 = {
// using checkargs ACPI:HIDPID // using checkargs ACPI:HIDPID
static const FpIdEntry elanspi_id_table[] = { static const FpIdEntry elanspi_id_table[] = {
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x2766}, .driver_data = ELANSPI_NO_ROTATE},
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3057}, .driver_data = ELANSPI_180_ROTATE}, {.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3057}, .driver_data = ELANSPI_180_ROTATE},
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3087}, .driver_data = ELANSPI_180_ROTATE}, {.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3087}, .driver_data = ELANSPI_180_ROTATE},
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30c6}, .driver_data = ELANSPI_180_ROTATE}, {.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30c6}, .driver_data = ELANSPI_180_ROTATE},
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3128}, .driver_data = ELANSPI_90LEFT_ROTATE},
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN70A1", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3134}, .driver_data = ELANSPI_90LEFT_ROTATE}, {.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN70A1", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3134}, .driver_data = ELANSPI_90LEFT_ROTATE},
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3148}, .driver_data = ELANSPI_180_ROTATE}, {.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3148}, .driver_data = ELANSPI_180_ROTATE},
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE}, {.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE},
@@ -29,7 +29,12 @@ G_DEFINE_TYPE (FpiDeviceFocaltechMoc, fpi_device_focaltech_moc, FP_TYPE_DEVICE)
static const FpIdEntry id_table[] = { static const FpIdEntry id_table[] = {
{ .vid = 0x2808, .pid = 0x9e48, }, { .vid = 0x2808, .pid = 0x9e48, },
{ .vid = 0x2808, .pid = 0xd979, }, { .vid = 0x2808, .pid = 0xd979, },
{ .vid = 0x2808, .pid = 0xa27a, },
{ .vid = 0x2808, .pid = 0xa959, }, { .vid = 0x2808, .pid = 0xa959, },
{ .vid = 0x2808, .pid = 0xa99a, },
{ .vid = 0x2808, .pid = 0xa57a, },
{ .vid = 0x2808, .pid = 0xa78a, },
{ .vid = 0x2808, .pid = 0x1579, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };
@@ -232,10 +237,10 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
} }
typedef enum { typedef enum {
FP_CMD_SEND = 0, FOCALTECH_CMD_SEND = 0,
FP_CMD_GET, FOCALTECH_CMD_GET,
FP_CMD_NUM_STATES, FOCALTECH_CMD_NUM_STATES,
} FpCmdState; } FocaltechCmdState;
static void static void
fp_cmd_run_state (FpiSsm *ssm, fp_cmd_run_state (FpiSsm *ssm,
@@ -246,7 +251,7 @@ fp_cmd_run_state (FpiSsm *ssm,
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_CMD_SEND: case FOCALTECH_CMD_SEND:
if (self->cmd_transfer) if (self->cmd_transfer)
{ {
self->cmd_transfer->ssm = ssm; self->cmd_transfer->ssm = ssm;
@@ -263,7 +268,7 @@ fp_cmd_run_state (FpiSsm *ssm,
break; break;
case FP_CMD_GET: case FOCALTECH_CMD_GET:
if (self->cmd_len_in == 0) if (self->cmd_len_in == 0)
{ {
CommandData *data = fpi_ssm_get_data (ssm); CommandData *data = fpi_ssm_get_data (ssm);
@@ -331,7 +336,7 @@ focaltech_moc_get_cmd (FpDevice *device, guint8 *buffer_out,
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self), self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
fp_cmd_run_state, fp_cmd_run_state,
FP_CMD_NUM_STATES); FOCALTECH_CMD_NUM_STATES);
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free); fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
+82 -55
View File
@@ -21,7 +21,7 @@
#define FP_COMPONENT "fpcmoc" #define FP_COMPONENT "fpcmoc"
#define MAX_ENROLL_SAMPLES (25) #define MAX_ENROLL_SAMPLES (25)
#define CTRL_TIMEOUT (1000) #define CTRL_TIMEOUT (2000)
#define DATA_TIMEOUT (5000) #define DATA_TIMEOUT (5000)
/* Usb port setting */ /* Usb port setting */
@@ -65,9 +65,13 @@ typedef struct
static const FpIdEntry id_table[] = { static const FpIdEntry id_table[] = {
{ .vid = 0x10A5, .pid = 0xFFE0, }, { .vid = 0x10A5, .pid = 0xFFE0, },
{ .vid = 0x10A5, .pid = 0xA305, }, { .vid = 0x10A5, .pid = 0xA305, },
{ .vid = 0x10A5, .pid = 0xA306, },
{ .vid = 0x10A5, .pid = 0xDA04, }, { .vid = 0x10A5, .pid = 0xDA04, },
{ .vid = 0x10A5, .pid = 0xD805, }, { .vid = 0x10A5, .pid = 0xD805, },
{ .vid = 0x10A5, .pid = 0xD205, }, { .vid = 0x10A5, .pid = 0xD205, },
{ .vid = 0x10A5, .pid = 0x9524, },
{ .vid = 0x10A5, .pid = 0x9544, },
{ .vid = 0x10A5, .pid = 0xC844, },
/* terminating entry */ /* terminating entry */
{ .vid = 0, .pid = 0, .driver_data = 0 }, { .vid = 0, .pid = 0, .driver_data = 0 },
}; };
@@ -82,7 +86,7 @@ fpc_suspend_resume_cb (FpiUsbTransfer *transfer,
fp_dbg ("%s current ssm state: %d", G_STRFUNC, ssm_state); fp_dbg ("%s current ssm state: %d", G_STRFUNC, ssm_state);
if (ssm_state == FP_CMD_SUSPENDED) if (ssm_state == FPC_CMD_SUSPENDED)
{ {
if (error) if (error)
fpi_ssm_mark_failed (transfer->ssm, error); fpi_ssm_mark_failed (transfer->ssm, error);
@@ -90,12 +94,12 @@ fpc_suspend_resume_cb (FpiUsbTransfer *transfer,
fpi_device_suspend_complete (device, error); fpi_device_suspend_complete (device, error);
/* The resume handler continues to the next state! */ /* The resume handler continues to the next state! */
} }
else if (ssm_state == FP_CMD_RESUME) else if (ssm_state == FPC_CMD_RESUME)
{ {
if (error) if (error)
fpi_ssm_mark_failed (transfer->ssm, error); fpi_ssm_mark_failed (transfer->ssm, error);
else else
fpi_ssm_jump_to_state (transfer->ssm, FP_CMD_GET_DATA); fpi_ssm_jump_to_state (transfer->ssm, FPC_CMD_GET_DATA);
fpi_device_resume_complete (device, error); fpi_device_resume_complete (device, error);
} }
@@ -114,7 +118,7 @@ fpc_cmd_receive_cb (FpiUsbTransfer *transfer,
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && (self->cmd_suspended)) if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && (self->cmd_suspended))
{ {
g_error_free (error); g_error_free (error);
fpi_ssm_jump_to_state (transfer->ssm, FP_CMD_SUSPENDED); fpi_ssm_jump_to_state (transfer->ssm, FPC_CMD_SUSPENDED);
return; return;
} }
@@ -135,7 +139,7 @@ fpc_cmd_receive_cb (FpiUsbTransfer *transfer,
fp_dbg ("%s current ssm request: %d state: %d", G_STRFUNC, data->request, ssm_state); fp_dbg ("%s current ssm request: %d state: %d", G_STRFUNC, data->request, ssm_state);
/* clean cmd_ssm except capture command for suspend/resume case */ /* clean cmd_ssm except capture command for suspend/resume case */
if (ssm_state != FP_CMD_SEND || data->request != FPC_CMD_ARM) if (ssm_state != FPC_CMD_SEND || data->request != FPC_CMD_ARM)
self->cmd_ssm = NULL; self->cmd_ssm = NULL;
if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE) if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE)
@@ -149,13 +153,13 @@ fpc_cmd_receive_cb (FpiUsbTransfer *transfer,
} }
else if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE_EVTDATA) else if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE_EVTDATA)
{ {
if (ssm_state == FP_CMD_SEND) if (ssm_state == FPC_CMD_SEND)
{ {
fpi_ssm_next_state (transfer->ssm); fpi_ssm_next_state (transfer->ssm);
return; return;
} }
if (ssm_state == FP_CMD_GET_DATA) if (ssm_state == FPC_CMD_GET_DATA)
{ {
fpc_cmd_response_t evt_data = {0}; fpc_cmd_response_t evt_data = {0};
fp_dbg ("%s recv evt data length: %ld", G_STRFUNC, transfer->actual_length); fp_dbg ("%s recv evt data length: %ld", G_STRFUNC, transfer->actual_length);
@@ -269,6 +273,7 @@ fpc_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
FpiDeviceFpcMoc *self = FPI_DEVICE_FPCMOC (dev); FpiDeviceFpcMoc *self = FPI_DEVICE_FPCMOC (dev);
CommandData *data = fpi_ssm_get_data (ssm); CommandData *data = fpi_ssm_get_data (ssm);
self->cmd_ssm = NULL;
/* Notify about the SSM failure from here instead. */ /* Notify about the SSM failure from here instead. */
if (error) if (error)
{ {
@@ -276,8 +281,6 @@ fpc_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
if (data->callback) if (data->callback)
data->callback (self, NULL, error); data->callback (self, NULL, error);
} }
self->cmd_ssm = NULL;
} }
static void static void
@@ -289,11 +292,11 @@ fpc_cmd_run_state (FpiSsm *ssm,
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_CMD_SEND: case FPC_CMD_SEND:
fpc_send_ctrl_cmd (dev); fpc_send_ctrl_cmd (dev);
break; break;
case FP_CMD_GET_DATA: case FPC_CMD_GET_DATA:
transfer = fpi_usb_transfer_new (dev); transfer = fpi_usb_transfer_new (dev);
transfer->ssm = ssm; transfer->ssm = ssm;
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE); fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
@@ -304,7 +307,7 @@ fpc_cmd_run_state (FpiSsm *ssm,
fpi_ssm_get_data (ssm)); fpi_ssm_get_data (ssm));
break; break;
case FP_CMD_SUSPENDED: case FPC_CMD_SUSPENDED:
transfer = fpi_usb_transfer_new (dev); transfer = fpi_usb_transfer_new (dev);
transfer->ssm = ssm; transfer->ssm = ssm;
fpi_usb_transfer_fill_control (transfer, fpi_usb_transfer_fill_control (transfer,
@@ -320,7 +323,7 @@ fpc_cmd_run_state (FpiSsm *ssm,
fpc_suspend_resume_cb, NULL); fpc_suspend_resume_cb, NULL);
break; break;
case FP_CMD_RESUME: case FPC_CMD_RESUME:
transfer = fpi_usb_transfer_new (dev); transfer = fpi_usb_transfer_new (dev);
transfer->ssm = ssm; transfer->ssm = ssm;
fpi_usb_transfer_fill_control (transfer, fpi_usb_transfer_fill_control (transfer,
@@ -351,21 +354,22 @@ fpc_sensor_cmd (FpiDeviceFpcMoc *self,
data = g_memdup2 (cmd_data, sizeof (CommandData)); data = g_memdup2 (cmd_data, sizeof (CommandData));
g_clear_object (&self->interrupt_cancellable);
if (wait_data_delay) if (wait_data_delay)
{ {
self->cmd_data_timeout = 0; self->cmd_data_timeout = 0;
g_set_object (&self->interrupt_cancellable, g_cancellable_new ()); self->interrupt_cancellable = g_cancellable_new ();
} }
else else
{ {
self->cmd_data_timeout = DATA_TIMEOUT; self->cmd_data_timeout = DATA_TIMEOUT;
g_clear_object (&self->interrupt_cancellable);
} }
g_assert (self->cmd_ssm == NULL); g_assert (self->cmd_ssm == NULL);
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self), self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
fpc_cmd_run_state, fpc_cmd_run_state,
FP_CMD_NUM_STATES); FPC_CMD_NUM_STATES);
fpi_ssm_set_data (self->cmd_ssm, data, g_free); fpi_ssm_set_data (self->cmd_ssm, data, g_free);
fpi_ssm_start (self->cmd_ssm, fpc_cmd_ssm_done); fpi_ssm_start (self->cmd_ssm, fpc_cmd_ssm_done);
@@ -388,7 +392,7 @@ fpc_dev_release_interface (FpiDeviceFpcMoc *self,
} }
/* Notify close complete */ /* 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 static gboolean
@@ -446,10 +450,16 @@ fpc_evt_cb (FpiDeviceFpcMoc *self,
break; break;
case FPC_EVT_FINGER_DWN: 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), fpi_device_report_finger_status_changes (FP_DEVICE (self),
FP_FINGER_STATUS_PRESENT, FP_FINGER_STATUS_PRESENT,
FP_FINGER_STATUS_NONE); 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; break;
case FPC_EVT_IMG: case FPC_EVT_IMG:
@@ -734,7 +744,7 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
case FPC_ENROL_STATUS_COMPLETED: case FPC_ENROL_STATUS_COMPLETED:
self->enroll_stage++; self->enroll_stage++;
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL); fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_COMPLETE); fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROLL_COMPLETE);
return; return;
case FPC_ENROL_STATUS_IMAGE_TOO_SIMILAR: case FPC_ENROL_STATUS_IMAGE_TOO_SIMILAR:
@@ -742,15 +752,22 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
/* here should tips remove finger and try again */ /* here should tips remove finger and try again */
if (self->max_immobile_stage) 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)", fp_dbg ("Skip similar handle due to customer enrollment %d(%d)",
self->immobile_stage, self->max_immobile_stage); self->immobile_stage, self->max_immobile_stage);
/* Skip too similar handle, treat as normal enroll progress. */ /* 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, FPC_ENROLL_COMPLETE);
return;
}
break; break;
} }
self->immobile_stage++;
} }
fpi_device_enroll_progress (FP_DEVICE (self), fpi_device_enroll_progress (FP_DEVICE (self),
self->enroll_stage, self->enroll_stage,
@@ -763,7 +780,10 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL); fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
/* Used for customer enrollment scheme */ /* Used for customer enrollment scheme */
if (self->enroll_stage >= (self->max_enroll_stage - self->max_immobile_stage)) if (self->enroll_stage >= (self->max_enroll_stage - self->max_immobile_stage))
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_COMPLETE); {
fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROLL_COMPLETE);
return;
}
break; break;
case FPC_ENROL_STATUS_IMAGE_LOW_COVERAGE: case FPC_ENROL_STATUS_IMAGE_LOW_COVERAGE:
@@ -796,7 +816,7 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
} }
else else
{ {
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE); fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROLL_CAPTURE);
} }
} }
@@ -924,7 +944,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_ENROLL_ENUM: case FPC_ENROLL_ENUM:
{ {
FPC_FID_DATA pquery_data = {0}; FPC_FID_DATA pquery_data = {0};
gsize query_data_len = 0; gsize query_data_len = 0;
@@ -949,7 +969,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_CREATE: case FPC_ENROLL_CREATE:
{ {
recv_data_len = sizeof (FPC_BEGIN_ENROL); recv_data_len = sizeof (FPC_BEGIN_ENROL);
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
@@ -964,7 +984,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_CAPTURE: case FPC_ENROLL_CAPTURE:
{ {
guint32 capture_id = FPC_CAPTUREID_RESERVED; guint32 capture_id = FPC_CAPTUREID_RESERVED;
fpi_device_report_finger_status_changes (device, fpi_device_report_finger_status_changes (device,
@@ -982,7 +1002,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_GET_IMG: case FPC_ENROLL_GET_IMG:
{ {
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA; cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
cmd_data.request = FPC_CMD_GET_IMG; cmd_data.request = FPC_CMD_GET_IMG;
@@ -996,7 +1016,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_UPDATE: case FPC_ENROLL_UPDATE:
{ {
recv_data_len = sizeof (FPC_ENROL); recv_data_len = sizeof (FPC_ENROL);
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
@@ -1011,7 +1031,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_COMPLETE: case FPC_ENROLL_COMPLETE:
{ {
recv_data_len = sizeof (FPC_END_ENROL); recv_data_len = sizeof (FPC_END_ENROL);
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
@@ -1026,7 +1046,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_CHECK_DUPLICATE: case FPC_ENROLL_CHECK_DUPLICATE:
{ {
recv_data_len = sizeof (FPC_IDENTIFY); recv_data_len = sizeof (FPC_IDENTIFY);
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
@@ -1041,7 +1061,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_BINDID: case FPC_ENROLL_BINDID:
{ {
FPC_FID_DATA data = {0}; FPC_FID_DATA data = {0};
gsize data_len = 0; gsize data_len = 0;
@@ -1095,7 +1115,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_COMMIT: case FPC_ENROLL_COMMIT:
{ {
recv_data_len = sizeof (gint32); recv_data_len = sizeof (gint32);
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
@@ -1110,7 +1130,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_DICARD: case FPC_ENROLL_DICARD:
{ {
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE;
cmd_data.request = FPC_CMD_ABORT; cmd_data.request = FPC_CMD_ABORT;
@@ -1123,7 +1143,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_CLEANUP: case FPC_ENROLL_CLEANUP:
{ {
if (self->do_cleanup == TRUE) if (self->do_cleanup == TRUE)
{ {
@@ -1268,7 +1288,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_VERIFY_CAPTURE: case FPC_VERIFY_CAPTURE:
{ {
guint32 capture_id = FPC_CAPTUREID_RESERVED; guint32 capture_id = FPC_CAPTUREID_RESERVED;
fpi_device_report_finger_status_changes (device, fpi_device_report_finger_status_changes (device,
@@ -1286,7 +1306,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_VERIFY_GET_IMG: case FPC_VERIFY_GET_IMG:
{ {
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA; cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
cmd_data.request = FPC_CMD_GET_IMG; cmd_data.request = FPC_CMD_GET_IMG;
@@ -1300,7 +1320,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_VERIFY_IDENTIFY: case FPC_VERIFY_IDENTIFY:
{ {
gsize recv_data_len = sizeof (FPC_IDENTIFY); gsize recv_data_len = sizeof (FPC_IDENTIFY);
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
@@ -1315,7 +1335,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_VERIFY_CANCEL: case FPC_VERIFY_CANCEL:
{ {
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE;
cmd_data.request = FPC_CMD_ABORT; cmd_data.request = FPC_CMD_ABORT;
@@ -1385,7 +1405,7 @@ fpc_clear_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_CLEAR_DELETE_DB: case FPC_CLEAR_DELETE_DB:
{ {
if (self->dbid) if (self->dbid)
{ {
@@ -1412,7 +1432,7 @@ fpc_clear_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_CLEAR_CREATE_DB: case FPC_CLEAR_CREATE_DB:
{ {
if (self->dbid) if (self->dbid)
{ {
@@ -1517,7 +1537,7 @@ fpc_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_INIT: case FPC_INIT:
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA; cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
cmd_data.request = FPC_CMD_INIT; cmd_data.request = FPC_CMD_INIT;
cmd_data.value = 0x1; cmd_data.value = 0x1;
@@ -1529,7 +1549,7 @@ fpc_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
fpc_sensor_cmd (self, FALSE, &cmd_data); fpc_sensor_cmd (self, FALSE, &cmd_data);
break; break;
case FP_LOAD_DB: case FPC_INIT_LOAD_DB:
{ {
gsize recv_data_len = sizeof (FPC_LOAD_DB); gsize recv_data_len = sizeof (FPC_LOAD_DB);
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE; cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
@@ -1620,9 +1640,13 @@ fpc_dev_probe (FpDevice *device)
{ {
case 0xFFE0: case 0xFFE0:
case 0xA305: case 0xA305:
case 0xA306:
case 0xD805: case 0xD805:
case 0xDA04: case 0xDA04:
case 0xD205: case 0xD205:
case 0x9524:
case 0x9544:
case 0xC844:
self->max_enroll_stage = MAX_ENROLL_SAMPLES; self->max_enroll_stage = MAX_ENROLL_SAMPLES;
break; break;
@@ -1659,7 +1683,7 @@ fpc_dev_open (FpDevice *device)
} }
self->task_ssm = fpi_ssm_new (device, fpc_init_sm_run_state, self->task_ssm = fpi_ssm_new (device, fpc_init_sm_run_state,
FP_INIT_NUM_STATES); FPC_INIT_NUM_STATES);
fpi_ssm_start (self->task_ssm, fpc_init_ssm_done); fpi_ssm_start (self->task_ssm, fpc_init_ssm_done);
} }
@@ -1671,6 +1695,7 @@ fpc_dev_close (FpDevice *device)
fp_dbg ("%s enter -->", G_STRFUNC); fp_dbg ("%s enter -->", G_STRFUNC);
g_clear_pointer (&self->dbid, g_free); g_clear_pointer (&self->dbid, g_free);
g_cancellable_cancel (self->interrupt_cancellable);
g_clear_object (&self->interrupt_cancellable); g_clear_object (&self->interrupt_cancellable);
fpc_dev_release_interface (self, NULL); fpc_dev_release_interface (self, NULL);
} }
@@ -1682,8 +1707,8 @@ fpc_dev_verify_identify (FpDevice *device)
fp_dbg ("%s enter -->", G_STRFUNC); fp_dbg ("%s enter -->", G_STRFUNC);
self->task_ssm = fpi_ssm_new_full (device, fpc_verify_sm_run_state, self->task_ssm = fpi_ssm_new_full (device, fpc_verify_sm_run_state,
FP_VERIFY_NUM_STATES, FPC_VERIFY_NUM_STATES,
FP_VERIFY_CANCEL, FPC_VERIFY_CANCEL,
"verify_identify"); "verify_identify");
fpi_ssm_start (self->task_ssm, fpc_verify_ssm_done); fpi_ssm_start (self->task_ssm, fpc_verify_ssm_done);
@@ -1699,8 +1724,8 @@ fpc_dev_enroll (FpDevice *device)
self->enroll_stage = 0; self->enroll_stage = 0;
self->immobile_stage = 0; self->immobile_stage = 0;
self->task_ssm = fpi_ssm_new_full (device, fpc_enroll_sm_run_state, self->task_ssm = fpi_ssm_new_full (device, fpc_enroll_sm_run_state,
FP_ENROLL_NUM_STATES, FPC_ENROLL_NUM_STATES,
FP_ENROLL_DICARD, FPC_ENROLL_DICARD,
"enroll"); "enroll");
fpi_ssm_start (self->task_ssm, fpc_enroll_ssm_done); fpi_ssm_start (self->task_ssm, fpc_enroll_ssm_done);
@@ -1751,7 +1776,7 @@ fpc_dev_suspend (FpDevice *device)
} }
g_assert (self->cmd_ssm); g_assert (self->cmd_ssm);
g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FP_CMD_GET_DATA); g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FPC_CMD_GET_DATA);
self->cmd_suspended = TRUE; self->cmd_suspended = TRUE;
g_cancellable_cancel (self->interrupt_cancellable); g_cancellable_cancel (self->interrupt_cancellable);
} }
@@ -1773,10 +1798,12 @@ fpc_dev_resume (FpDevice *device)
g_assert (self->cmd_ssm); g_assert (self->cmd_ssm);
g_assert (self->cmd_suspended); g_assert (self->cmd_suspended);
g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FP_CMD_SUSPENDED); g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FPC_CMD_SUSPENDED);
self->cmd_suspended = FALSE; self->cmd_suspended = FALSE;
g_set_object (&self->interrupt_cancellable, g_cancellable_new ());
fpi_ssm_jump_to_state (self->cmd_ssm, FP_CMD_RESUME); g_clear_object (&self->interrupt_cancellable);
self->interrupt_cancellable = g_cancellable_new ();
fpi_ssm_jump_to_state (self->cmd_ssm, FPC_CMD_RESUME);
} }
static void static void
@@ -1840,8 +1867,8 @@ fpc_dev_clear_storage (FpDevice *device)
fp_dbg ("%s enter -->", G_STRFUNC); fp_dbg ("%s enter -->", G_STRFUNC);
self->task_ssm = fpi_ssm_new_full (device, fpc_clear_sm_run_state, self->task_ssm = fpi_ssm_new_full (device, fpc_clear_sm_run_state,
FP_CLEAR_NUM_STATES, FPC_CLEAR_NUM_STATES,
FP_CLEAR_NUM_STATES, FPC_CLEAR_NUM_STATES,
"Clear storage"); "Clear storage");
fpi_ssm_start (self->task_ssm, fpc_clear_ssm_done); fpi_ssm_start (self->task_ssm, fpc_clear_ssm_done);
+32 -32
View File
@@ -178,44 +178,44 @@ typedef enum {
} FpcCmdType; } FpcCmdType;
typedef enum { typedef enum {
FP_CMD_SEND = 0, FPC_CMD_SEND = 0,
FP_CMD_GET_DATA, FPC_CMD_GET_DATA,
FP_CMD_SUSPENDED, FPC_CMD_SUSPENDED,
FP_CMD_RESUME, FPC_CMD_RESUME,
FP_CMD_NUM_STATES, FPC_CMD_NUM_STATES,
} FpCmdState; } FpcCmdState;
typedef enum { typedef enum {
FP_INIT = 0, FPC_INIT = 0,
FP_LOAD_DB, FPC_INIT_LOAD_DB,
FP_INIT_NUM_STATES, FPC_INIT_NUM_STATES,
} FpInitState; } FpcInitState;
typedef enum { typedef enum {
FP_ENROLL_ENUM = 0, FPC_ENROLL_ENUM = 0,
FP_ENROLL_CREATE, FPC_ENROLL_CREATE,
FP_ENROLL_CAPTURE, FPC_ENROLL_CAPTURE,
FP_ENROLL_GET_IMG, FPC_ENROLL_GET_IMG,
FP_ENROLL_UPDATE, FPC_ENROLL_UPDATE,
FP_ENROLL_COMPLETE, FPC_ENROLL_COMPLETE,
FP_ENROLL_CHECK_DUPLICATE, FPC_ENROLL_CHECK_DUPLICATE,
FP_ENROLL_BINDID, FPC_ENROLL_BINDID,
FP_ENROLL_COMMIT, FPC_ENROLL_COMMIT,
FP_ENROLL_DICARD, FPC_ENROLL_DICARD,
FP_ENROLL_CLEANUP, FPC_ENROLL_CLEANUP,
FP_ENROLL_NUM_STATES, FPC_ENROLL_NUM_STATES,
} FpEnrollState; } FpcEnrollState;
typedef enum { typedef enum {
FP_VERIFY_CAPTURE = 0, FPC_VERIFY_CAPTURE = 0,
FP_VERIFY_GET_IMG, FPC_VERIFY_GET_IMG,
FP_VERIFY_IDENTIFY, FPC_VERIFY_IDENTIFY,
FP_VERIFY_CANCEL, FPC_VERIFY_CANCEL,
FP_VERIFY_NUM_STATES, FPC_VERIFY_NUM_STATES,
} FpVerifyState; } FpcVerifyState;
typedef enum { typedef enum {
FP_CLEAR_DELETE_DB = 0, FPC_CLEAR_DELETE_DB = 0,
FP_CLEAR_CREATE_DB, FPC_CLEAR_CREATE_DB,
FP_CLEAR_NUM_STATES, FPC_CLEAR_NUM_STATES,
} FpClearState; } FpClearState;
+66 -41
View File
@@ -128,11 +128,13 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
GError *error) GError *error)
{ {
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device); FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
FpiByteReader reader = {0};
CommandData *data = user_data; CommandData *data = user_data;
int ret = -1, ssm_state = 0; int ssm_state = 0;
gxfp_cmd_response_t cmd_reponse = {0, }; gxfp_cmd_response_t cmd_reponse = {0, };
pack_header header; pack_header header;
guint32 crc32_calc = 0; guint32 crc32_calc = 0;
guint32 crc32 = 0;
guint16 cmd = 0; guint16 cmd = 0;
if (error) if (error)
@@ -154,8 +156,10 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
return; return;
} }
ret = gx_proto_parse_header (transfer->buffer, transfer->actual_length, &header); reader.data = transfer->buffer;
if (ret != 0) reader.size = transfer->actual_length;
if (gx_proto_parse_header (&reader, &header) != 0)
{ {
fpi_ssm_mark_failed (transfer->ssm, fpi_ssm_mark_failed (transfer->ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
@@ -163,8 +167,17 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
return; return;
} }
if (!fpi_byte_reader_set_pos (&reader, PACKAGE_HEADER_SIZE + header.len))
{
fpi_ssm_mark_failed (transfer->ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
"Package crc read failed"));
}
gx_proto_crc32_calc (transfer->buffer, PACKAGE_HEADER_SIZE + header.len, (uint8_t *) &crc32_calc); gx_proto_crc32_calc (transfer->buffer, PACKAGE_HEADER_SIZE + header.len, (uint8_t *) &crc32_calc);
if(crc32_calc != GUINT32_FROM_LE (*(uint32_t *) (transfer->buffer + PACKAGE_HEADER_SIZE + header.len)))
if (!fpi_byte_reader_get_uint32_le (&reader, &crc32) ||
crc32_calc != crc32)
{ {
fpi_ssm_mark_failed (transfer->ssm, fpi_ssm_mark_failed (transfer->ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
@@ -174,8 +187,11 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
cmd = MAKE_CMD_EX (header.cmd0, header.cmd1); cmd = MAKE_CMD_EX (header.cmd0, header.cmd1);
ret = gx_proto_parse_body (cmd, &transfer->buffer[PACKAGE_HEADER_SIZE], header.len, &cmd_reponse); fpi_byte_reader_set_pos (&reader, 0);
if (ret != 0) reader.data = &transfer->buffer[PACKAGE_HEADER_SIZE];
reader.size = header.len;
if (gx_proto_parse_body (cmd, &reader, &cmd_reponse) != 0)
{ {
fpi_ssm_mark_failed (transfer->ssm, fpi_ssm_mark_failed (transfer->ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
@@ -222,7 +238,7 @@ fp_cmd_run_state (FpiSsm *ssm,
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_CMD_SEND: case GOODIX_CMD_SEND:
if (self->cmd_transfer) if (self->cmd_transfer)
{ {
self->cmd_transfer->ssm = ssm; self->cmd_transfer->ssm = ssm;
@@ -238,7 +254,7 @@ fp_cmd_run_state (FpiSsm *ssm,
} }
break; break;
case FP_CMD_GET_ACK: case GOODIX_CMD_GET_ACK:
transfer = fpi_usb_transfer_new (dev); transfer = fpi_usb_transfer_new (dev);
transfer->ssm = ssm; transfer->ssm = ssm;
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE); fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
@@ -250,7 +266,7 @@ fp_cmd_run_state (FpiSsm *ssm,
break; break;
case FP_CMD_GET_DATA: case GOODIX_CMD_GET_DATA:
transfer = fpi_usb_transfer_new (dev); transfer = fpi_usb_transfer_new (dev);
transfer->ssm = ssm; transfer->ssm = ssm;
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE); fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
@@ -338,7 +354,7 @@ goodix_sensor_cmd (FpiDeviceGoodixMoc *self,
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self), self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
fp_cmd_run_state, fp_cmd_run_state,
FP_CMD_NUM_STATES); GOODIX_CMD_NUM_STATES);
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free); fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
@@ -477,7 +493,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_VERIFY_PWR_BTN_SHIELD_ON: case GOODIX_VERIFY_PWR_BTN_SHIELD_ON:
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON, goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON,
false, false,
NULL, NULL,
@@ -485,7 +501,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_pwr_btn_shield_cb); fp_pwr_btn_shield_cb);
break; break;
case FP_VERIFY_CAPTURE: case GOODIX_VERIFY_CAPTURE:
fpi_device_report_finger_status_changes (device, fpi_device_report_finger_status_changes (device,
FP_FINGER_STATUS_NEEDED, FP_FINGER_STATUS_NEEDED,
FP_FINGER_STATUS_NONE); FP_FINGER_STATUS_NONE);
@@ -496,7 +512,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_verify_capture_cb); fp_verify_capture_cb);
break; break;
case FP_VERIFY_IDENTIFY: case GOODIX_VERIFY_IDENTIFY:
goodix_sensor_cmd (self, MOC_CMD0_IDENTIFY, MOC_CMD1_DEFAULT, goodix_sensor_cmd (self, MOC_CMD0_IDENTIFY, MOC_CMD1_DEFAULT,
false, false,
(const guint8 *) nonce, (const guint8 *) nonce,
@@ -504,7 +520,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_verify_cb); fp_verify_cb);
break; break;
case FP_VERIFY_PWR_BTN_SHIELD_OFF: case GOODIX_VERIFY_PWR_BTN_SHIELD_OFF:
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF, goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF,
false, false,
NULL, NULL,
@@ -666,7 +682,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
self->enroll_stage, self->enroll_stage,
NULL, NULL,
fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL)); fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL));
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE); fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CAPTURE);
return; return;
} }
fpi_device_report_finger_status_changes (FP_DEVICE (self), fpi_device_report_finger_status_changes (FP_DEVICE (self),
@@ -684,7 +700,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
self->enroll_stage, self->enroll_stage,
NULL, NULL,
fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER)); fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER));
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE); fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CAPTURE);
return; return;
} }
else else
@@ -730,7 +746,7 @@ fp_enroll_update_cb (FpiDeviceGoodixMoc *self,
/* if enroll complete, no need to wait finger up */ /* if enroll complete, no need to wait finger up */
if (self->enroll_stage >= self->max_enroll_stage) if (self->enroll_stage >= self->max_enroll_stage)
{ {
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CHECK_DUPLICATE); fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CHECK_DUPLICATE);
return; return;
} }
@@ -796,7 +812,7 @@ fp_finger_mode_cb (FpiDeviceGoodixMoc *self,
/* if reach max timeout(5sec) finger not up, switch to finger up again */ /* if reach max timeout(5sec) finger not up, switch to finger up again */
if (resp->finger_status.status == GX_ERROR_WAIT_FINGER_UP_TIMEOUT) if (resp->finger_status.status == GX_ERROR_WAIT_FINGER_UP_TIMEOUT)
{ {
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_WAIT_FINGER_UP); fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_WAIT_FINGER_UP);
return; return;
} }
else if (resp->finger_status.status != GX_SUCCESS) else if (resp->finger_status.status != GX_SUCCESS)
@@ -811,7 +827,7 @@ fp_finger_mode_cb (FpiDeviceGoodixMoc *self,
FP_FINGER_STATUS_PRESENT); FP_FINGER_STATUS_PRESENT);
if (self->enroll_stage < self->max_enroll_stage) if (self->enroll_stage < self->max_enroll_stage)
{ {
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE); fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CAPTURE);
return; return;
} }
fpi_ssm_next_state (self->task_ssm); fpi_ssm_next_state (self->task_ssm);
@@ -837,7 +853,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_ENROLL_PWR_BTN_SHIELD_ON: case GOODIX_ENROLL_PWR_BTN_SHIELD_ON:
{ {
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON, goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON,
false, false,
@@ -847,7 +863,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_ENUM: case GOODIX_ENROLL_ENUM:
{ {
goodix_sensor_cmd (self, MOC_CMD0_GETFINGERLIST, MOC_CMD1_DEFAULT, goodix_sensor_cmd (self, MOC_CMD0_GETFINGERLIST, MOC_CMD1_DEFAULT,
false, false,
@@ -857,7 +873,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_CREATE: case GOODIX_ENROLL_CREATE:
{ {
goodix_sensor_cmd (self, MOC_CMD0_ENROLL_INIT, MOC_CMD1_DEFAULT, goodix_sensor_cmd (self, MOC_CMD0_ENROLL_INIT, MOC_CMD1_DEFAULT,
false, false,
@@ -867,7 +883,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_CAPTURE: case GOODIX_ENROLL_CAPTURE:
fpi_device_report_finger_status_changes (device, fpi_device_report_finger_status_changes (device,
FP_FINGER_STATUS_NEEDED, FP_FINGER_STATUS_NEEDED,
FP_FINGER_STATUS_NONE); FP_FINGER_STATUS_NONE);
@@ -878,7 +894,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_enroll_capture_cb); fp_enroll_capture_cb);
break; break;
case FP_ENROLL_UPDATE: case GOODIX_ENROLL_UPDATE:
dummy[0] = 1; dummy[0] = 1;
dummy[1] = self->sensorcfg->config[2]; dummy[1] = self->sensorcfg->config[2];
dummy[2] = self->sensorcfg->config[3]; dummy[2] = self->sensorcfg->config[3];
@@ -889,7 +905,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_enroll_update_cb); fp_enroll_update_cb);
break; break;
case FP_ENROLL_WAIT_FINGER_UP: case GOODIX_ENROLL_WAIT_FINGER_UP:
dummy[0] = 0; dummy[0] = 0;
goodix_sensor_cmd (self, MOC_CMD0_FINGER_MODE, MOC_CMD1_SET_FINGER_UP, goodix_sensor_cmd (self, MOC_CMD0_FINGER_MODE, MOC_CMD1_SET_FINGER_UP,
true, true,
@@ -898,7 +914,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_finger_mode_cb); fp_finger_mode_cb);
break; break;
case FP_ENROLL_CHECK_DUPLICATE: case GOODIX_ENROLL_CHECK_DUPLICATE:
goodix_sensor_cmd (self, MOC_CMD0_CHECK4DUPLICATE, MOC_CMD1_DEFAULT, goodix_sensor_cmd (self, MOC_CMD0_CHECK4DUPLICATE, MOC_CMD1_DEFAULT,
false, false,
(const guint8 *) &dummy, (const guint8 *) &dummy,
@@ -906,7 +922,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_enroll_check_duplicate_cb); fp_enroll_check_duplicate_cb);
break; break;
case FP_ENROLL_COMMIT: case GOODIX_ENROLL_COMMIT:
{ {
fpi_device_get_enroll_data (device, &print); fpi_device_get_enroll_data (device, &print);
user_id = fpi_print_generate_user_id (print); user_id = fpi_print_generate_user_id (print);
@@ -959,7 +975,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
} }
break; break;
case FP_ENROLL_PWR_BTN_SHIELD_OFF: case GOODIX_ENROLL_PWR_BTN_SHIELD_OFF:
{ {
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF, goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF,
false, false,
@@ -1050,7 +1066,7 @@ fp_init_cb_reset_or_complete (FpiDeviceGoodixMoc *self,
{ {
fp_warn ("Template storage appears to have been corrupted! Error was: %s", error->message); fp_warn ("Template storage appears to have been corrupted! Error was: %s", error->message);
fp_warn ("A known reason for this to happen is a firmware bug triggered by another storage area being initialized."); fp_warn ("A known reason for this to happen is a firmware bug triggered by another storage area being initialized.");
fpi_ssm_jump_to_state (self->task_ssm, FP_INIT_RESET_DEVICE); fpi_ssm_jump_to_state (self->task_ssm, GOODIX_INIT_RESET_DEVICE);
} }
else else
{ {
@@ -1091,7 +1107,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_INIT_VERSION: case GOODIX_INIT_VERSION:
goodix_sensor_cmd (self, MOC_CMD0_GET_VERSION, MOC_CMD1_DEFAULT, goodix_sensor_cmd (self, MOC_CMD0_GET_VERSION, MOC_CMD1_DEFAULT,
false, false,
&dummy, &dummy,
@@ -1099,7 +1115,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_init_version_cb); fp_init_version_cb);
break; break;
case FP_INIT_CONFIG: case GOODIX_INIT_CONFIG:
goodix_sensor_cmd (self, MOC_CMD0_UPDATE_CONFIG, MOC_CMD1_WRITE_CFG_TO_FLASH, goodix_sensor_cmd (self, MOC_CMD0_UPDATE_CONFIG, MOC_CMD1_WRITE_CFG_TO_FLASH,
false, false,
(guint8 *) self->sensorcfg, (guint8 *) self->sensorcfg,
@@ -1107,7 +1123,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_init_config_cb); fp_init_config_cb);
break; break;
case FP_INIT_TEMPLATE_LIST: case GOODIX_INIT_TEMPLATE_LIST:
/* List prints to check whether the template DB was corrupted. /* List prints to check whether the template DB was corrupted.
* As of 2022-06-13 there is a known firmware issue that can cause the * As of 2022-06-13 there is a known firmware issue that can cause the
* stored templates for Linux to be corrupted when the Windows storage * stored templates for Linux to be corrupted when the Windows storage
@@ -1122,7 +1138,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
fp_init_cb_reset_or_complete); fp_init_cb_reset_or_complete);
break; break;
case FP_INIT_RESET_DEVICE: case GOODIX_INIT_RESET_DEVICE:
fp_warn ("Resetting device storage, you will need to enroll all prints again!"); fp_warn ("Resetting device storage, you will need to enroll all prints again!");
goodix_sensor_cmd (self, MOC_CMD0_DELETETEMPLATE, MOC_CMD1_DELETE_ALL, goodix_sensor_cmd (self, MOC_CMD0_DELETETEMPLATE, MOC_CMD1_DELETE_ALL,
FALSE, FALSE,
@@ -1363,8 +1379,10 @@ gx_fp_probe (FpDevice *device)
case 0x6014: case 0x6014:
case 0x6092: case 0x6092:
case 0x6094: case 0x6094:
case 0x609A:
case 0x609C: case 0x609C:
case 0x60BC: case 0x60BC:
case 0x60C2:
case 0x6304: case 0x6304:
case 0x631C: case 0x631C:
case 0x633C: case 0x633C:
@@ -1374,6 +1392,8 @@ gx_fp_probe (FpDevice *device)
case 0x63AC: case 0x63AC:
case 0x63BC: case 0x63BC:
case 0x63CC: case 0x63CC:
case 0x650A:
case 0x650C:
case 0x6582: case 0x6582:
case 0x6A94: case 0x6A94:
case 0x659A: case 0x659A:
@@ -1432,7 +1452,7 @@ gx_fp_init (FpDevice *device)
} }
self->task_ssm = fpi_ssm_new (device, fp_init_sm_run_state, self->task_ssm = fpi_ssm_new (device, fp_init_sm_run_state,
FP_INIT_NUM_STATES); GOODIX_INIT_NUM_STATES);
fpi_ssm_start (self->task_ssm, fp_init_ssm_done); fpi_ssm_start (self->task_ssm, fp_init_ssm_done);
@@ -1463,9 +1483,7 @@ gx_fp_exit_cb (FpiDeviceGoodixMoc *self,
gxfp_cmd_response_t *resp, gxfp_cmd_response_t *resp,
GError *error) GError *error)
{ {
if (resp && resp->result >= GX_FAILED)
if (resp->result >= GX_FAILED)
fp_dbg ("Setting power button shield failed, result: 0x%x", resp->result); fp_dbg ("Setting power button shield failed, result: 0x%x", resp->result);
self->is_power_button_shield_on = false; self->is_power_button_shield_on = false;
gx_fp_release_interface (self, error); gx_fp_release_interface (self, error);
@@ -1500,8 +1518,8 @@ gx_fp_verify_identify (FpDevice *device)
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device); FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
self->task_ssm = fpi_ssm_new_full (device, fp_verify_sm_run_state, self->task_ssm = fpi_ssm_new_full (device, fp_verify_sm_run_state,
FP_VERIFY_NUM_STATES, GOODIX_VERIFY_NUM_STATES,
FP_VERIFY_PWR_BTN_SHIELD_OFF, GOODIX_VERIFY_PWR_BTN_SHIELD_OFF,
"verify"); "verify");
fpi_ssm_start (self->task_ssm, fp_verify_ssm_done); fpi_ssm_start (self->task_ssm, fp_verify_ssm_done);
@@ -1517,8 +1535,8 @@ gx_fp_enroll (FpDevice *device)
self->enroll_stage = 0; self->enroll_stage = 0;
self->task_ssm = fpi_ssm_new_full (device, fp_enroll_sm_run_state, self->task_ssm = fpi_ssm_new_full (device, fp_enroll_sm_run_state,
FP_ENROLL_NUM_STATES, GOODIX_ENROLL_NUM_STATES,
FP_ENROLL_PWR_BTN_SHIELD_OFF, GOODIX_ENROLL_PWR_BTN_SHIELD_OFF,
"enroll"); "enroll");
fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done); fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done);
@@ -1610,10 +1628,12 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x27c6, .pid = 0x6014, }, { .vid = 0x27c6, .pid = 0x6014, },
{ .vid = 0x27c6, .pid = 0x6092, }, { .vid = 0x27c6, .pid = 0x6092, },
{ .vid = 0x27c6, .pid = 0x6094, }, { .vid = 0x27c6, .pid = 0x6094, },
{ .vid = 0x27c6, .pid = 0x609A, },
{ .vid = 0x27c6, .pid = 0x609C, }, { .vid = 0x27c6, .pid = 0x609C, },
{ .vid = 0x27c6, .pid = 0x60A2, }, { .vid = 0x27c6, .pid = 0x60A2, },
{ .vid = 0x27c6, .pid = 0x60A4, }, { .vid = 0x27c6, .pid = 0x60A4, },
{ .vid = 0x27c6, .pid = 0x60BC, }, { .vid = 0x27c6, .pid = 0x60BC, },
{ .vid = 0x27c6, .pid = 0x60C2, },
{ .vid = 0x27c6, .pid = 0x6304, }, { .vid = 0x27c6, .pid = 0x6304, },
{ .vid = 0x27c6, .pid = 0x631C, }, { .vid = 0x27c6, .pid = 0x631C, },
{ .vid = 0x27c6, .pid = 0x633C, }, { .vid = 0x27c6, .pid = 0x633C, },
@@ -1624,6 +1644,8 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x27c6, .pid = 0x63BC, }, { .vid = 0x27c6, .pid = 0x63BC, },
{ .vid = 0x27c6, .pid = 0x63CC, }, { .vid = 0x27c6, .pid = 0x63CC, },
{ .vid = 0x27c6, .pid = 0x6496, }, { .vid = 0x27c6, .pid = 0x6496, },
{ .vid = 0x27c6, .pid = 0x650A, },
{ .vid = 0x27c6, .pid = 0x650C, },
{ .vid = 0x27c6, .pid = 0x6582, }, { .vid = 0x27c6, .pid = 0x6582, },
{ .vid = 0x27c6, .pid = 0x6584, }, { .vid = 0x27c6, .pid = 0x6584, },
{ .vid = 0x27c6, .pid = 0x658C, }, { .vid = 0x27c6, .pid = 0x658C, },
@@ -1632,6 +1654,9 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x27c6, .pid = 0x659A, }, { .vid = 0x27c6, .pid = 0x659A, },
{ .vid = 0x27c6, .pid = 0x659C, }, { .vid = 0x27c6, .pid = 0x659C, },
{ .vid = 0x27c6, .pid = 0x6A94, }, { .vid = 0x27c6, .pid = 0x6A94, },
{ .vid = 0x27c6, .pid = 0x6512, },
{ .vid = 0x27c6, .pid = 0x689A, },
{ .vid = 0x27c6, .pid = 0x66A9, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };
+28 -28
View File
@@ -25,39 +25,39 @@
G_DECLARE_FINAL_TYPE (FpiDeviceGoodixMoc, fpi_device_goodixmoc, FPI, DEVICE_GOODIXMOC, FpDevice) G_DECLARE_FINAL_TYPE (FpiDeviceGoodixMoc, fpi_device_goodixmoc, FPI, DEVICE_GOODIXMOC, FpDevice)
typedef enum { typedef enum {
FP_CMD_SEND = 0, GOODIX_CMD_SEND = 0,
FP_CMD_GET_ACK, GOODIX_CMD_GET_ACK,
FP_CMD_GET_DATA, GOODIX_CMD_GET_DATA,
FP_CMD_NUM_STATES, GOODIX_CMD_NUM_STATES,
} FpCmdState; } GoodixCmdState;
typedef enum { typedef enum {
FP_INIT_VERSION = 0, GOODIX_INIT_VERSION = 0,
FP_INIT_CONFIG, GOODIX_INIT_CONFIG,
FP_INIT_TEMPLATE_LIST, GOODIX_INIT_TEMPLATE_LIST,
FP_INIT_RESET_DEVICE, GOODIX_INIT_RESET_DEVICE,
FP_INIT_NUM_STATES, GOODIX_INIT_NUM_STATES,
} FpInitState; } GoodixInitState;
typedef enum { typedef enum {
FP_ENROLL_PWR_BTN_SHIELD_ON = 0, GOODIX_ENROLL_PWR_BTN_SHIELD_ON = 0,
FP_ENROLL_ENUM, GOODIX_ENROLL_ENUM,
FP_ENROLL_CREATE, GOODIX_ENROLL_CREATE,
FP_ENROLL_CAPTURE, GOODIX_ENROLL_CAPTURE,
FP_ENROLL_UPDATE, GOODIX_ENROLL_UPDATE,
FP_ENROLL_WAIT_FINGER_UP, GOODIX_ENROLL_WAIT_FINGER_UP,
FP_ENROLL_CHECK_DUPLICATE, GOODIX_ENROLL_CHECK_DUPLICATE,
FP_ENROLL_COMMIT, GOODIX_ENROLL_COMMIT,
FP_ENROLL_PWR_BTN_SHIELD_OFF, GOODIX_ENROLL_PWR_BTN_SHIELD_OFF,
FP_ENROLL_NUM_STATES, GOODIX_ENROLL_NUM_STATES,
} FpEnrollState; } GoodixEnrollState;
typedef enum { typedef enum {
FP_VERIFY_PWR_BTN_SHIELD_ON = 0, GOODIX_VERIFY_PWR_BTN_SHIELD_ON = 0,
FP_VERIFY_CAPTURE, GOODIX_VERIFY_CAPTURE,
FP_VERIFY_IDENTIFY, GOODIX_VERIFY_IDENTIFY,
FP_VERIFY_PWR_BTN_SHIELD_OFF, GOODIX_VERIFY_PWR_BTN_SHIELD_OFF,
FP_VERIFY_NUM_STATES, GOODIX_VERIFY_NUM_STATES,
} FpVerifyState; } GoodixVerifyState;
+161 -118
View File
@@ -18,6 +18,8 @@
*/ */
#include <glib.h> #include <glib.h>
#include <stdint.h>
#include "goodix_proto.h" #include "goodix_proto.h"
/* /*
@@ -107,7 +109,7 @@ reflect (uint32_t data, uint8_t n_bits)
* If the LSB bit is set, set the reflection of it. * If the LSB bit is set, set the reflection of it.
*/ */
if (data & 0x01) if (data & 0x01)
reflection |= (1 << ((n_bits - 1) - bit)); reflection |= (1LU << ((n_bits - 1) - bit));
data = (data >> 1); data = (data >> 1);
} }
@@ -211,7 +213,11 @@ gx_proto_build_package (uint8_t *ppackage,
init_pack_header (&header, payload_size, cmd, 0); init_pack_header (&header, payload_size, cmd, 0);
memcpy (ppackage, &header, PACKAGE_HEADER_SIZE); memcpy (ppackage, &header, PACKAGE_HEADER_SIZE);
memcpy (ppackage + PACKAGE_HEADER_SIZE, payload, payload_size);
if (payload)
memcpy (ppackage + PACKAGE_HEADER_SIZE, payload, payload_size);
else
ppackage[PACKAGE_HEADER_SIZE] = 0;
gx_proto_crc32_calc (ppackage, PACKAGE_HEADER_SIZE + payload_size, ppackage + PACKAGE_HEADER_SIZE + payload_size); gx_proto_crc32_calc (ppackage, PACKAGE_HEADER_SIZE + payload_size, ppackage + PACKAGE_HEADER_SIZE + payload_size);
@@ -220,94 +226,108 @@ gx_proto_build_package (uint8_t *ppackage,
int int
gx_proto_parse_header ( gx_proto_parse_header (FpiByteReader *reader,
uint8_t *buffer, pack_header *pheader)
uint32_t buffer_len,
pack_header *pheader)
{ {
if (!buffer || !pheader) if (!pheader)
return -1;
if (buffer_len < PACKAGE_HEADER_SIZE + PACKAGE_CRC_SIZE)
return -1; return -1;
memcpy (pheader, buffer, sizeof (pack_header)); if (!fpi_byte_reader_get_uint8 (reader, &pheader->cmd0))
pheader->len = GUINT16_FROM_LE (pheader->len); g_return_val_if_reached (-1);
if (buffer_len < pheader->len + PACKAGE_HEADER_SIZE)
return -1; if (!fpi_byte_reader_get_uint8 (reader, &pheader->cmd1))
g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_uint8 (reader, &pheader->packagenum))
g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_uint8 (reader, &pheader->reserved))
g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_uint16_le (reader, &pheader->len))
g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_uint8 (reader, &pheader->crc8))
g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_uint8 (reader, &pheader->rev_crc8))
g_return_val_if_reached (-1);
pheader->len -= PACKAGE_CRC_SIZE; pheader->len -= PACKAGE_CRC_SIZE;
return 0; return 0;
} }
static int static int
gx_proto_parse_fingerid ( gx_proto_parse_fingerid (FpiByteReader *reader,
uint8_t * fid_buffer, ptemplate_format_t template)
uint16_t fid_buffer_size,
ptemplate_format_t template
)
{ {
uint8_t * buffer = NULL; uint8_t byte;
uint16_t Offset = 0; const uint8_t *buffer;
if (!template || !fid_buffer) if (!template)
return -1; return -1;
if (fid_buffer_size < G_STRUCT_OFFSET (template_format_t, payload) + sizeof (uint32_t)) if (!fpi_byte_reader_get_uint8 (reader, &byte) || byte != 67)
return -1; g_return_val_if_reached (-1);
buffer = fid_buffer; if (!fpi_byte_reader_get_uint8 (reader, &template->type))
Offset = 0; g_return_val_if_reached (-1);
if (buffer[Offset++] != 67) if (!fpi_byte_reader_get_uint8 (reader, &template->finger_index))
return -1; g_return_val_if_reached (-1);
template->type = buffer[Offset++]; if (!fpi_byte_reader_skip (reader, 1))
template->finger_index = buffer[Offset++]; g_return_val_if_reached (-1);
Offset++;
memcpy (template->accountid, &buffer[Offset], sizeof (template->accountid)); if (!fpi_byte_reader_get_data (reader, sizeof (template->accountid), &buffer))
Offset += sizeof (template->accountid); g_return_val_if_reached (-1);
memcpy (template->tid, &buffer[Offset], sizeof (template->tid));
Offset += sizeof (template->tid); // Offset == 68 memcpy (template->accountid, buffer, sizeof (template->accountid));
template->payload.size = buffer[Offset++];
if (template->payload.size > sizeof (template->payload.data)) if (!fpi_byte_reader_get_data (reader, sizeof (template->tid), &buffer))
return -1; g_return_val_if_reached (-1);
if (template->payload.size + Offset > fid_buffer_size)
return -1; memcpy (template->tid, buffer, sizeof (template->tid));
memset (template->payload.data, 0, template->payload.size);
memcpy (template->payload.data, &buffer[Offset], template->payload.size); if (!fpi_byte_reader_get_uint8 (reader, &template->payload.size))
g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_data (reader, template->payload.size, &buffer))
g_return_val_if_reached (-1);
memcpy (template->payload.data, buffer, template->payload.size);
return 0; return 0;
} }
int int
gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_cmd_response_t presp) gx_proto_parse_body (uint16_t cmd, FpiByteReader *byte_reader, pgxfp_cmd_response_t presp)
{ {
uint16_t offset = 0; if (!presp)
uint8_t *fingerlist = NULL; return -1;
if (!fpi_byte_reader_get_uint8 (byte_reader, &presp->result))
g_return_val_if_reached (-1);
if (!buffer || !presp)
return -1;
if (buffer_len < 1)
return -1;
presp->result = buffer[0];
switch (HIBYTE (cmd)) switch (HIBYTE (cmd))
{ {
case RESPONSE_PACKAGE_CMD: case RESPONSE_PACKAGE_CMD:
{ {
if (buffer_len < sizeof (gxfp_parse_msg_t) + 1) if (!fpi_byte_reader_get_uint8 (byte_reader, &presp->parse_msg.ack_cmd))
return -1; g_return_val_if_reached (-1);
presp->parse_msg.ack_cmd = buffer[1];
} }
break; break;
case MOC_CMD0_UPDATE_CONFIG: case MOC_CMD0_UPDATE_CONFIG:
{ {
presp->finger_config.status = buffer[0]; presp->finger_config.status = presp->result;
if (buffer_len >= 3) /* to compatiable old version firmware */
presp->finger_config.max_stored_prints = buffer[2]; presp->finger_config.max_stored_prints = FP_MAX_FINGERNUM;
else
/* to compatiable old version firmware */
presp->finger_config.max_stored_prints = FP_MAX_FINGERNUM;
if (fpi_byte_reader_skip (byte_reader, 1))
fpi_byte_reader_get_uint8 (byte_reader,
&presp->finger_config.max_stored_prints);
} }
break; break;
@@ -318,85 +338,99 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
case MOC_CMD0_PWR_BTN_SHIELD: case MOC_CMD0_PWR_BTN_SHIELD:
presp->power_button_shield_resp.resp_cmd1 = LOBYTE (cmd); presp->power_button_shield_resp.resp_cmd1 = LOBYTE (cmd);
if (buffer_len >= 2) uint8_t support_pwr_shield;
{
uint8_t support_pwr_shield = buffer[1]; if (fpi_byte_reader_get_uint8 (byte_reader, &support_pwr_shield) &&
if (support_pwr_shield == 0xFF) support_pwr_shield == 0xFF)
g_debug ("Power button shield feature not supported!\n"); g_debug ("Power button shield feature not supported!\n");
}
break; break;
case MOC_CMD0_GET_VERSION: case MOC_CMD0_GET_VERSION:
if (buffer_len < sizeof (gxfp_version_info_t) + 1) const uint8_t *version_info;
return -1;
memcpy (&presp->version_info, buffer + 1, sizeof (gxfp_version_info_t)); if (!fpi_byte_reader_get_data (byte_reader, sizeof (gxfp_version_info_t), &version_info))
g_return_val_if_reached (-1);
memcpy (&presp->version_info, version_info, sizeof (gxfp_version_info_t));
break; break;
case MOC_CMD0_CAPTURE_DATA: case MOC_CMD0_CAPTURE_DATA:
if (LOBYTE (cmd) == MOC_CMD1_DEFAULT) if (LOBYTE (cmd) == MOC_CMD1_DEFAULT)
{ {
if (buffer_len < sizeof (gxfp_capturedata_t) + 1) if (!fpi_byte_reader_get_uint8 (byte_reader,
return -1; &presp->capture_data_resp.img_quality))
presp->capture_data_resp.img_quality = buffer[1]; g_return_val_if_reached (-1);
presp->capture_data_resp.img_coverage = buffer[2];
if (!fpi_byte_reader_get_uint8 (byte_reader,
&presp->capture_data_resp.img_coverage))
g_return_val_if_reached (-1);
} }
break; break;
case MOC_CMD0_ENROLL_INIT: case MOC_CMD0_ENROLL_INIT:
if (buffer_len < sizeof (gxfp_enroll_create_t) + 1) if (presp->result != GX_SUCCESS)
return -1; break;
if (presp->result == GX_SUCCESS) const uint8_t *tid;
memcpy (&presp->enroll_create.tid, &buffer[1], TEMPLATE_ID_SIZE); if (!fpi_byte_reader_get_data (byte_reader, TEMPLATE_ID_SIZE, &tid))
g_return_val_if_reached (-1);
memcpy (presp->enroll_create.tid, tid, TEMPLATE_ID_SIZE);
break; break;
case MOC_CMD0_ENROLL: case MOC_CMD0_ENROLL:
if (buffer_len < sizeof (gxfp_enroll_update_t)) presp->enroll_update.rollback = (presp->result < 0x80) ? false : true;
return -1; if (!fpi_byte_reader_get_uint8 (byte_reader,
presp->enroll_update.rollback = (buffer[0] < 0x80) ? false : true; &presp->enroll_update.img_overlay))
presp->enroll_update.img_overlay = buffer[1]; g_return_val_if_reached (-1);
presp->enroll_update.img_preoverlay = buffer[2];
if (!fpi_byte_reader_get_uint8 (byte_reader,
&presp->enroll_update.img_preoverlay))
g_return_val_if_reached (-1);
break; break;
case MOC_CMD0_CHECK4DUPLICATE: case MOC_CMD0_CHECK4DUPLICATE:
presp->check_duplicate_resp.duplicate = (presp->result == 0) ? false : true; presp->check_duplicate_resp.duplicate = (presp->result == 0) ? false : true;
if (presp->check_duplicate_resp.duplicate) if (presp->check_duplicate_resp.duplicate)
{ {
if (buffer_len < 3) uint16_t tid_size;
return -1; FpiByteReader tid_reader;
uint16_t tid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + 1));
offset += 3;
if (buffer_len < tid_size + offset) if (!fpi_byte_reader_get_uint16_le (byte_reader, &tid_size))
return -1; g_return_val_if_reached (-1);
if (gx_proto_parse_fingerid (buffer + offset, tid_size, &presp->check_duplicate_resp.template) != 0)
return -1; if (!fpi_byte_reader_get_sub_reader (byte_reader, &tid_reader, tid_size))
g_return_val_if_reached (-1);
if (gx_proto_parse_fingerid (&tid_reader, &presp->check_duplicate_resp.template) != 0)
g_return_val_if_reached (-1);
} }
break; break;
case MOC_CMD0_GETFINGERLIST: case MOC_CMD0_GETFINGERLIST:
if (presp->result != GX_SUCCESS) if (presp->result != GX_SUCCESS)
break; break;
if (buffer_len < 2)
return -1; if (!fpi_byte_reader_get_uint8 (byte_reader,
presp->finger_list_resp.finger_num = buffer[1]; &presp->finger_list_resp.finger_num))
fingerlist = buffer + 2; g_return_val_if_reached (-1);
for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++) for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++)
{ {
uint16_t fingerid_length; uint16_t fingerid_length;
if (buffer_len < offset + 2) FpiByteReader fingerid_reader;
return -1;
fingerid_length = GUINT16_FROM_LE (*(uint16_t *) (fingerlist + offset)); if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_length))
offset += 2; g_return_val_if_reached (-1);
if (buffer_len < fingerid_length + offset)
return -1; if (!fpi_byte_reader_get_sub_reader (byte_reader, &fingerid_reader,
if (gx_proto_parse_fingerid (fingerlist + offset, fingerid_length))
fingerid_length, g_return_val_if_reached (-1);
if (gx_proto_parse_fingerid (&fingerid_reader,
&presp->finger_list_resp.finger_list[num]) != 0) &presp->finger_list_resp.finger_list[num]) != 0)
{ {
g_warning ("Failed to parse finger list"); g_warning ("Failed to parse finger list");
return -1; g_return_val_if_reached (-1);
} }
offset += fingerid_length;
} }
break; break;
@@ -405,23 +439,32 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
uint32_t score = 0; uint32_t score = 0;
uint8_t study = 0; uint8_t study = 0;
uint16_t fingerid_size = 0; uint16_t fingerid_size = 0;
presp->verify.match = (buffer[0] == 0) ? true : false;
presp->verify.match = (presp->result == 0) ? true : false;
if (presp->verify.match) if (presp->verify.match)
{ {
if (buffer_len < 10) FpiByteReader finger_reader;
return -1;
offset += 1; if (!fpi_byte_reader_get_uint16_le (byte_reader,
presp->verify.rejectdetail = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset)); &presp->verify.rejectdetail))
offset += 2; g_return_val_if_reached (-1);
score = GUINT32_FROM_LE (*(uint32_t *) (buffer + offset));
offset += 4; if (!fpi_byte_reader_get_uint32_le (byte_reader, &score))
study = buffer[offset]; g_return_val_if_reached (-1);
offset += 1;
fingerid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset)); if (!fpi_byte_reader_get_uint8 (byte_reader, &study))
offset += 2; g_return_val_if_reached (-1);
if (buffer_len < fingerid_size + offset)
return -1; if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_size))
if (gx_proto_parse_fingerid (buffer + offset, fingerid_size, &presp->verify.template) != 0) g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_sub_reader (byte_reader, &finger_reader,
fingerid_size))
g_return_val_if_reached (-1);
if (gx_proto_parse_fingerid (&finger_reader,
&presp->verify.template) != 0)
{ {
presp->result = GX_FAILED; presp->result = GX_FAILED;
break; break;
@@ -432,7 +475,7 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
break; break;
case MOC_CMD0_FINGER_MODE: case MOC_CMD0_FINGER_MODE:
presp->finger_status.status = buffer[0]; presp->finger_status.status = presp->result;
break; break;
default: default:
+6 -6
View File
@@ -22,6 +22,8 @@
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include "fpi-byte-reader.h"
#define PACKAGE_CRC_SIZE (4) #define PACKAGE_CRC_SIZE (4)
#define PACKAGE_HEADER_SIZE (8) #define PACKAGE_HEADER_SIZE (8)
@@ -133,7 +135,7 @@ typedef struct _template_format
typedef struct _gxfp_verify typedef struct _gxfp_verify
{ {
bool match; bool match;
uint32_t rejectdetail; uint16_t rejectdetail;
template_format_t template; template_format_t template;
} gxfp_verify_t, *pgxfp_verify_t; } gxfp_verify_t, *pgxfp_verify_t;
@@ -232,13 +234,11 @@ int gx_proto_build_package (uint8_t *ppackage,
const uint8_t *payload, const uint8_t *payload,
uint32_t payload_size); uint32_t payload_size);
int gx_proto_parse_header (uint8_t *buffer, int gx_proto_parse_header (FpiByteReader *reader,
uint32_t buffer_len, pack_header *pheader);
pack_header *pheader);
int gx_proto_parse_body (uint16_t cmd, int gx_proto_parse_body (uint16_t cmd,
uint8_t *buffer, FpiByteReader *byte_reader,
uint16_t buffer_len,
pgxfp_cmd_response_t presponse); pgxfp_cmd_response_t presponse);
int gx_proto_init_sensor_config (pgxfp_sensor_cfg_t pconfig); int gx_proto_init_sensor_config (pgxfp_sensor_cfg_t pconfig);
+239 -73
View File
@@ -28,6 +28,8 @@ G_DEFINE_TYPE (FpiDeviceRealtek, fpi_device_realtek, FP_TYPE_DEVICE)
static const FpIdEntry id_table[] = { static const FpIdEntry id_table[] = {
{ .vid = 0x0bda, .pid = 0x5813, }, { .vid = 0x0bda, .pid = 0x5813, },
{ .vid = 0x0bda, .pid = 0x5816, },
{ .vid = 0x2541, .pid = 0xfa03, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };
@@ -92,6 +94,50 @@ fp_task_ssm_generic_cb (FpiDeviceRealtek *self,
fpi_ssm_next_state (self->task_ssm); fpi_ssm_next_state (self->task_ssm);
} }
static void
fp_get_device_info_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
self->template_len = TEMPLATE_LEN_COMMON;
fpi_ssm_next_state (self->task_ssm);
}
static void
fp_update_template_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES);
}
static void
fp_enroll_commit_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_ENROLL_NUM_STATES);
}
static void static void
fp_finish_capture_cb (FpiDeviceRealtek *self, fp_finish_capture_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in, uint8_t *buffer_in,
@@ -103,8 +149,17 @@ fp_finish_capture_cb (FpiDeviceRealtek *self,
return; return;
} }
gint capture_status = buffer_in[0]; /* We hope this polling CMD can be completed before the action is cancelled */
GCancellable *cancellable = fpi_device_get_cancellable (FP_DEVICE (self));
if (g_cancellable_is_cancelled (cancellable))
{
fpi_ssm_mark_failed (self->task_ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
"Action is cancelled!"));
return;
}
gint capture_status = buffer_in[0];
if (capture_status == 0) if (capture_status == 0)
{ {
fpi_device_report_finger_status_changes (FP_DEVICE (self), fpi_device_report_finger_status_changes (FP_DEVICE (self),
@@ -238,7 +293,6 @@ fp_identify_feature_cb (FpiDeviceRealtek *self,
} }
gint in_status = buffer_in[0]; gint in_status = buffer_in[0];
if (in_status == FP_RTK_CMD_ERR) if (in_status == FP_RTK_CMD_ERR)
{ {
fpi_ssm_mark_failed (self->task_ssm, fpi_ssm_mark_failed (self->task_ssm,
@@ -291,7 +345,7 @@ fp_identify_feature_cb (FpiDeviceRealtek *self,
else else
{ {
fpi_device_identify_report (device, print, match, error); fpi_device_identify_report (device, print, match, error);
fpi_ssm_mark_completed (self->task_ssm); fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES);
} }
return; return;
} }
@@ -340,9 +394,9 @@ fp_get_delete_pos_cb (FpiDeviceRealtek *self,
for (gint i = 0; i < self->template_num; i++) for (gint i = 0; i < self->template_num; i++)
{ {
if (buffer_in[i * TEMPLATE_LEN] != 0) if (buffer_in[i * self->template_len] != 0)
{ {
memcpy (temp_userid, buffer_in + i * TEMPLATE_LEN + UID_OFFSET, DEFAULT_UID_LEN); memcpy (temp_userid, buffer_in + i * self->template_len + UID_OFFSET, DEFAULT_UID_LEN);
if (g_strcmp0 (fp_print_get_description (print), (const char *) temp_userid) == 0) if (g_strcmp0 (fp_print_get_description (print), (const char *) temp_userid) == 0)
{ {
self->pos_index = i; self->pos_index = i;
@@ -380,10 +434,25 @@ fp_get_enroll_num_cb (FpiDeviceRealtek *self,
} }
static void static void
fp_get_template_cb (FpiDeviceRealtek *self, fp_verify_get_template_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in, uint8_t *buffer_in,
GError *error) GError *error)
{ {
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
fpi_ssm_next_state (self->task_ssm);
}
static void
fp_enroll_get_template_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
g_autofree guchar *seq_list = NULL;
gboolean found = FALSE; gboolean found = FALSE;
if (error) if (error)
@@ -394,7 +463,7 @@ fp_get_template_cb (FpiDeviceRealtek *self,
for (gint i = 0; i < self->template_num; i++) for (gint i = 0; i < self->template_num; i++)
{ {
if (buffer_in[i * TEMPLATE_LEN] == 0) if (buffer_in[i * self->template_len] == 0)
{ {
self->pos_index = i; self->pos_index = i;
found = TRUE; found = TRUE;
@@ -425,7 +494,6 @@ fp_check_duplicate_cb (FpiDeviceRealtek *self,
} }
gint in_status = buffer_in[0]; gint in_status = buffer_in[0];
if (in_status == FP_RTK_CMD_ERR) if (in_status == FP_RTK_CMD_ERR)
{ {
fpi_ssm_mark_failed (self->task_ssm, fpi_ssm_mark_failed (self->task_ssm,
@@ -471,10 +539,10 @@ fp_list_cb (FpiDeviceRealtek *self,
for (gint i = 0; i < self->template_num; i++) for (gint i = 0; i < self->template_num; i++)
{ {
if (buffer_in[i * TEMPLATE_LEN] != 0) if (buffer_in[i * self->template_len] != 0)
{ {
FpPrint *print = NULL; FpPrint *print = NULL;
print = fp_print_from_data (self, buffer_in + i * TEMPLATE_LEN + SUBFACTOR_OFFSET); print = fp_print_from_data (self, buffer_in + i * self->template_len + SUBFACTOR_OFFSET);
g_ptr_array_add (list_result, g_object_ref_sink (print)); g_ptr_array_add (list_result, g_object_ref_sink (print));
found = TRUE; found = TRUE;
} }
@@ -518,11 +586,11 @@ parse_status (guint8 *buffer, gint status_type)
{ {
switch (status_type) switch (status_type)
{ {
case FP_RTK_MSG_PLAINTEXT_NO_STATUS: case FP_RTK_MSG_NO_STATUS:
return 0; return 0;
break; break;
case FP_RTK_MSG_PLAINTEXT: case FP_RTK_MSG_DEFAULT:
return buffer[0]; return buffer[0];
break; break;
@@ -621,13 +689,13 @@ fp_cmd_run_state (FpiSsm *ssm, FpDevice *dev)
break; break;
case FP_RTK_CMD_TRANS_DATA: case FP_RTK_CMD_TRANS_DATA:
if (self->cmd_type == FP_RTK_CMD_ONLY) if (self->cmd_type == FP_RTK_CMD_BULK_ONLY)
{ {
fpi_ssm_jump_to_state (ssm, FP_RTK_CMD_GET_STATUS); fpi_ssm_jump_to_state (ssm, FP_RTK_CMD_GET_STATUS);
break; break;
} }
if (self->cmd_type == FP_RTK_CMD_WRITE) if (self->cmd_type == FP_RTK_CMD_BULK_WRITE)
{ {
if (self->data_transfer) if (self->data_transfer)
{ {
@@ -688,10 +756,10 @@ fp_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
} }
static FpiUsbTransfer * static FpiUsbTransfer *
prepare_transfer (FpDevice *dev, prepare_bulk_transfer (FpDevice *dev,
guint8 *data, guint8 *data,
gsize data_len, gsize data_len,
GDestroyNotify free_func) GDestroyNotify free_func)
{ {
g_autoptr(FpiUsbTransfer) transfer = NULL; g_autoptr(FpiUsbTransfer) transfer = NULL;
@@ -708,29 +776,100 @@ prepare_transfer (FpDevice *dev,
return g_steal_pointer (&transfer); return g_steal_pointer (&transfer);
} }
static void static void
realtek_sensor_cmd (FpiDeviceRealtek *self, fp_ctrl_cmd_cb (FpiUsbTransfer *transfer,
guint8 *cmd, FpDevice *device,
guint8 *trans_data, gpointer user_data,
FpRtkMsgType message_type, GError *error)
gboolean bwait_data_delay, {
SynCmdMsgCallback callback) FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device);
g_autofree CommandData *data = g_steal_pointer (&user_data);
g_return_if_fail (data != NULL);
if (error)
{
fpi_ssm_mark_failed (transfer->ssm, error);
return;
}
if (transfer->direction == G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE)
{
if (data->callback)
data->callback (self, NULL, NULL);
}
else
{
if (transfer->actual_length == 0)
{
fp_info ("Control transfer receive data failed!");
fpi_ssm_mark_failed (transfer->ssm,
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID));
return;
}
if (data->callback)
data->callback (self, transfer->buffer, NULL);
}
}
static void
rtk_send_ctrl_cmd (FpiDeviceRealtek *self,
struct rtk_cmd_ctrl *ctrl_cmd,
guint8 *cmd_data,
SynCmdMsgCallback callback)
{
FpiUsbTransfer *transfer = NULL;
g_autofree CommandData *data = g_new0 (CommandData, 1);
data->callback = callback;
transfer = fpi_usb_transfer_new (FP_DEVICE (self));
fpi_usb_transfer_fill_control (transfer,
ctrl_cmd->direction,
G_USB_DEVICE_REQUEST_TYPE_VENDOR,
G_USB_DEVICE_RECIPIENT_DEVICE,
ctrl_cmd->request,
ctrl_cmd->value,
ctrl_cmd->index,
ctrl_cmd->len);
transfer->ssm = self->task_ssm;
if (ctrl_cmd->direction == G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST &&
cmd_data != NULL && ctrl_cmd->len != 0)
memcpy (transfer->buffer, cmd_data, ctrl_cmd->len);
fpi_usb_transfer_submit (transfer,
CMD_TIMEOUT,
NULL,
fp_ctrl_cmd_cb,
g_steal_pointer (&data));
}
static void
rtk_sensor_bulk_cmd (FpiDeviceRealtek *self,
guint8 *cmd,
guint8 *trans_data,
FpRtkMsgType message_type,
gboolean bwait_data_delay,
SynCmdMsgCallback callback)
{ {
g_autoptr(FpiUsbTransfer) cmd_transfer = NULL; g_autoptr(FpiUsbTransfer) cmd_transfer = NULL;
g_autoptr(FpiUsbTransfer) data_transfer = NULL; g_autoptr(FpiUsbTransfer) data_transfer = NULL;
CommandData *data = g_new0 (CommandData, 1); CommandData *data = g_new0 (CommandData, 1);
self->cmd_type = GET_CMD_TYPE (cmd[0]); self->cmd_type = GET_BULK_CMD_TYPE (cmd[0]);
self->message_type = message_type; self->message_type = message_type;
self->trans_data_len = GET_TRANS_DATA_LEN (cmd[11], cmd[10]); self->trans_data_len = GET_TRANS_DATA_LEN (cmd[11], cmd[10]);
self->cmd_cancellable = bwait_data_delay; self->cmd_cancellable = bwait_data_delay;
cmd_transfer = prepare_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_TOTAL_LEN, NULL); cmd_transfer = prepare_bulk_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_BULK_TOTAL_LEN, NULL);
self->cmd_transfer = g_steal_pointer (&cmd_transfer); self->cmd_transfer = g_steal_pointer (&cmd_transfer);
if ((self->cmd_type == FP_RTK_CMD_WRITE) && trans_data) if ((self->cmd_type == FP_RTK_CMD_BULK_WRITE) && trans_data)
{ {
data_transfer = prepare_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free); data_transfer = prepare_bulk_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free);
self->data_transfer = g_steal_pointer (&data_transfer); self->data_transfer = g_steal_pointer (&data_transfer);
} }
@@ -829,34 +968,49 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_RTK_VERIFY_GET_TEMPLATE:
g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_verify_get_template_cb);
break;
case FP_RTK_VERIFY_CAPTURE: case FP_RTK_VERIFY_CAPTURE:
fpi_device_report_finger_status_changes (device, fpi_device_report_finger_status_changes (device,
FP_FINGER_STATUS_NEEDED, FP_FINGER_STATUS_NEEDED,
FP_FINGER_STATUS_NONE); FP_FINGER_STATUS_NONE);
cmd_buf = (guint8 *) &co_start_capture; cmd_buf = (guint8 *) &co_start_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break; break;
case FP_RTK_VERIFY_FINISH_CAPTURE: case FP_RTK_VERIFY_FINISH_CAPTURE:
cmd_buf = (guint8 *) &co_finish_capture; cmd_buf = (guint8 *) &co_finish_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb);
break; break;
case FP_RTK_VERIFY_ACCEPT_SAMPLE: case FP_RTK_VERIFY_ACCEPT_SAMPLE:
co_accept_sample.param[0] = self->fp_purpose; co_accept_sample.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_accept_sample; cmd_buf = (guint8 *) &co_accept_sample;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb);
break; break;
case FP_RTK_VERIFY_INDENTIFY_FEATURE: case FP_RTK_VERIFY_INDENTIFY_FEATURE:
cmd_buf = (guint8 *) &tls_identify_feature; cmd_buf = (guint8 *) &nor_identify_feature;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 0, fp_identify_feature_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_identify_feature_cb);
break; break;
case FP_RTK_VERIFY_UPDATE_TEMPLATE: case FP_RTK_VERIFY_UPDATE_TEMPLATE:
cmd_buf = (guint8 *) &co_update_template; cmd_buf = (guint8 *) &co_update_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_update_template_cb);
break;
case FP_RTK_VERIFY_CANCEL_CAPTURE:
co_cancel_capture.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_cancel_capture;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break; break;
} }
} }
@@ -869,7 +1023,6 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device); FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device);
FpPrint *print = NULL; FpPrint *print = NULL;
guint8 *cmd_buf = NULL; guint8 *cmd_buf = NULL;
guint8 *trans_id = NULL;
GVariant *uid = NULL; GVariant *uid = NULL;
GVariant *data = NULL; GVariant *data = NULL;
gsize user_id_len; gsize user_id_len;
@@ -880,17 +1033,17 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
case FP_RTK_ENROLL_GET_TEMPLATE: case FP_RTK_ENROLL_GET_TEMPLATE:
g_assert (self->template_num > 0); g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num); co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num); co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template; cmd_buf = (guint8 *) &co_get_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_template_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_enroll_get_template_cb);
break; break;
case FP_RTK_ENROLL_BEGIN_POS: case FP_RTK_ENROLL_BEGIN_POS:
tls_enroll_begin.param[0] = self->pos_index; nor_enroll_begin.param[0] = self->pos_index;
cmd_buf = (guint8 *) &tls_enroll_begin; cmd_buf = (guint8 *) &nor_enroll_begin;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break; break;
case FP_RTK_ENROLL_CAPTURE: case FP_RTK_ENROLL_CAPTURE:
@@ -899,39 +1052,42 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
FP_FINGER_STATUS_NONE); FP_FINGER_STATUS_NONE);
cmd_buf = (guint8 *) &co_start_capture; cmd_buf = (guint8 *) &co_start_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break; break;
case FP_RTK_ENROLL_FINISH_CAPTURE: case FP_RTK_ENROLL_FINISH_CAPTURE:
cmd_buf = (guint8 *) &co_finish_capture; cmd_buf = (guint8 *) &co_finish_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb);
break; break;
case FP_RTK_ENROLL_ACCEPT_SAMPLE: case FP_RTK_ENROLL_ACCEPT_SAMPLE:
co_accept_sample.param[0] = self->fp_purpose; co_accept_sample.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_accept_sample; cmd_buf = (guint8 *) &co_accept_sample;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb);
break; break;
case FP_RTK_ENROLL_CHECK_DUPLICATE: case FP_RTK_ENROLL_CHECK_DUPLICATE:
cmd_buf = (guint8 *) &co_check_duplicate; cmd_buf = (guint8 *) &co_check_duplicate;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_check_duplicate_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_check_duplicate_cb);
break; break;
case FP_RTK_ENROLL_COMMIT: case FP_RTK_ENROLL_COMMIT:
gchar *valid_uid = NULL;
gint payload_len;
payload_len = UID_PAYLOAD_LEN_DEFAULT;
fpi_device_get_enroll_data (device, &print); fpi_device_get_enroll_data (device, &print);
user_id = fpi_print_generate_user_id (print); user_id = fpi_print_generate_user_id (print);
user_id_len = strlen (user_id); user_id_len = MIN (DEFAULT_UID_LEN, strlen (user_id));
user_id_len = MIN (DEFAULT_UID_LEN, user_id_len);
payload = g_malloc0 (UID_PAYLOAD_LEN); payload = g_malloc0 (payload_len);
memcpy (payload, user_id, user_id_len); memcpy (payload, user_id, user_id_len);
valid_uid = (gchar *) payload;
trans_id = g_steal_pointer (&payload);
finger = SUB_FINGER_01; finger = SUB_FINGER_01;
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
user_id, valid_uid,
user_id_len, user_id_len,
1); 1);
data = g_variant_new ("(y@ay)", data = g_variant_new ("(y@ay)",
@@ -941,14 +1097,23 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
fpi_print_set_type (print, FPI_PRINT_RAW); fpi_print_set_type (print, FPI_PRINT_RAW);
fpi_print_set_device_stored (print, TRUE); fpi_print_set_device_stored (print, TRUE);
g_object_set (print, "fpi-data", data, NULL); g_object_set (print, "fpi-data", data, NULL);
g_object_set (print, "description", user_id, NULL); g_object_set (print, "description", valid_uid, NULL);
g_debug ("user_id: %s, finger: 0x%x", user_id, finger); g_debug ("user_id: %s, finger: 0x%x", user_id, finger);
tls_enroll_commit.param[0] = SUB_FINGER_01; nor_enroll_commit.param[0] = SUB_FINGER_01;
cmd_buf = (guint8 *) &tls_enroll_commit; nor_enroll_commit.data_len[0] = GET_LEN_L (payload_len);
realtek_sensor_cmd (self, cmd_buf, trans_id, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); nor_enroll_commit.data_len[1] = GET_LEN_H (payload_len);
cmd_buf = (guint8 *) &nor_enroll_commit;
rtk_sensor_bulk_cmd (self, cmd_buf, g_steal_pointer (&payload),
FP_RTK_MSG_DEFAULT, 1, fp_enroll_commit_cb);
break; break;
case FP_RTK_ENROLL_CANCEL_CAPTURE:
co_cancel_capture.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_cancel_capture;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
} }
} }
@@ -960,15 +1125,19 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm)) switch (fpi_ssm_get_cur_state (ssm))
{ {
case FP_RTK_INIT_GET_DEVICE_INFO:
rtk_send_ctrl_cmd (self, &get_device_info, NULL, fp_get_device_info_cb);
break;
case FP_RTK_INIT_SELECT_OS: case FP_RTK_INIT_SELECT_OS:
co_select_system.param[0] = 0x01; co_select_system.param[0] = 0x01;
cmd_buf = (guint8 *) &co_select_system; cmd_buf = (guint8 *) &co_select_system;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break; break;
case FP_RTK_INIT_GET_ENROLL_NUM: case FP_RTK_INIT_GET_ENROLL_NUM:
cmd_buf = (guint8 *) &co_get_enroll_num; cmd_buf = (guint8 *) &co_get_enroll_num;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_enroll_num_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_enroll_num_cb);
break; break;
} }
} }
@@ -984,17 +1153,17 @@ fp_delete_sm_run_state (FpiSsm *ssm, FpDevice *device)
case FP_RTK_DELETE_GET_POS: case FP_RTK_DELETE_GET_POS:
g_assert (self->template_num > 0); g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num); co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num); co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template; cmd_buf = (guint8 *) &co_get_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_delete_pos_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_delete_pos_cb);
break; break;
case FP_RTK_DELETE_PRINT: case FP_RTK_DELETE_PRINT:
co_delete_record.param[0] = self->pos_index; co_delete_record.param[0] = self->pos_index;
cmd_buf = (guint8 *) &co_delete_record; cmd_buf = (guint8 *) &co_delete_record;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break; break;
} }
} }
@@ -1012,17 +1181,14 @@ identify_verify (FpDevice *device)
g_assert (current_action == FPI_DEVICE_ACTION_VERIFY || g_assert (current_action == FPI_DEVICE_ACTION_VERIFY ||
current_action == FPI_DEVICE_ACTION_IDENTIFY); current_action == FPI_DEVICE_ACTION_IDENTIFY);
if (current_action == FPI_DEVICE_ACTION_IDENTIFY) self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY;
self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY;
else
self->fp_purpose = FP_RTK_PURPOSE_VERIFY;
g_assert (!self->task_ssm); g_assert (!self->task_ssm);
self->task_ssm = fpi_ssm_new_full (device, self->task_ssm = fpi_ssm_new_full (device,
fp_verify_sm_run_state, fp_verify_sm_run_state,
FP_RTK_VERIFY_NUM_STATES, FP_RTK_VERIFY_NUM_STATES,
FP_RTK_VERIFY_NUM_STATES, FP_RTK_VERIFY_CANCEL_CAPTURE,
"Verify & Identify"); "Verify & Identify");
fpi_ssm_start (self->task_ssm, fp_verify_ssm_done); fpi_ssm_start (self->task_ssm, fp_verify_ssm_done);
@@ -1042,7 +1208,7 @@ enroll (FpDevice *device)
self->task_ssm = fpi_ssm_new_full (device, self->task_ssm = fpi_ssm_new_full (device,
fp_enroll_sm_run_state, fp_enroll_sm_run_state,
FP_RTK_ENROLL_NUM_STATES, FP_RTK_ENROLL_NUM_STATES,
FP_RTK_ENROLL_NUM_STATES, FP_RTK_ENROLL_CANCEL_CAPTURE,
"Enroll"); "Enroll");
fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done); fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done);
@@ -1167,7 +1333,7 @@ clear_storage (FpDevice *device)
G_DEBUG_HERE (); G_DEBUG_HERE ();
co_delete_record.param[0] = 0xff; co_delete_record.param[0] = 0xff;
cmd_buf = (guint8 *) &co_delete_record; cmd_buf = (guint8 *) &co_delete_record;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_clear_storage_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_clear_storage_cb);
} }
static void static void
@@ -1179,11 +1345,11 @@ list_print (FpDevice *device)
G_DEBUG_HERE (); G_DEBUG_HERE ();
g_assert (self->template_num > 0); g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num); co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num); co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template; cmd_buf = (guint8 *) &co_get_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_list_cb); rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 1, fp_list_cb);
} }
static void static void
+61 -35
View File
@@ -30,16 +30,17 @@
#define EP_IN_MAX_BUF_SIZE 2048 #define EP_IN_MAX_BUF_SIZE 2048
#define FP_RTK_CMD_TOTAL_LEN 12 #define FP_RTK_CMD_BULK_TOTAL_LEN 12
#define FP_RTK_CMD_LEN 2 #define FP_RTK_CMD_BULK_LEN 2
#define FP_RTK_CMD_PARAM_LEN 4 #define FP_RTK_CMD_BULK_PARAM_LEN 4
#define FP_RTK_CMD_ADDR_LEN 4 #define FP_RTK_CMD_BULK_ADDR_LEN 4
#define FP_RTK_CMD_DATA_LEN 2 #define FP_RTK_CMD_BULK_DATA_LEN 2
#define TEMPLATE_LEN_COMMON 35
#define TEMPLATE_LEN 35
#define SUBFACTOR_OFFSET 2 #define SUBFACTOR_OFFSET 2
#define UID_OFFSET 3 #define UID_OFFSET 3
#define UID_PAYLOAD_LEN 32 #define UID_PAYLOAD_LEN_DEFAULT 32
/* Command transfer timeout :ms*/ /* Command transfer timeout :ms*/
#define CMD_TIMEOUT 1000 #define CMD_TIMEOUT 1000
@@ -50,7 +51,7 @@
#define DEFAULT_UID_LEN 28 #define DEFAULT_UID_LEN 28
#define SUB_FINGER_01 0xFF #define SUB_FINGER_01 0xFF
#define GET_CMD_TYPE(val) ((val & 0xC0) >> 6) #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_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_L(total_data_len) ((total_data_len) & 0xff)
#define GET_LEN_H(total_data_len) ((total_data_len) >> 8) #define GET_LEN_H(total_data_len) ((total_data_len) >> 8)
@@ -67,19 +68,19 @@ typedef struct
} CommandData; } CommandData;
typedef enum { typedef enum {
FP_RTK_CMD_ONLY = 0, FP_RTK_CMD_BULK_ONLY = 0,
FP_RTK_CMD_READ, FP_RTK_CMD_BULK_READ,
FP_RTK_CMD_WRITE, FP_RTK_CMD_BULK_WRITE,
} FpRtkCmdType; } FpRtkCmdType;
typedef enum { typedef enum {
FP_RTK_MSG_PLAINTEXT = 0, FP_RTK_MSG_DEFAULT = 0,
FP_RTK_MSG_PLAINTEXT_NO_STATUS, FP_RTK_MSG_NO_STATUS,
} FpRtkMsgType; } FpRtkMsgType;
typedef enum { typedef enum {
FP_RTK_PURPOSE_IDENTIFY = 0x01, /* identify before enroll */ FP_RTK_PURPOSE_VERIFY = 0x01,
FP_RTK_PURPOSE_VERIFY = 0x02, FP_RTK_PURPOSE_IDENTIFY = 0x02,
FP_RTK_PURPOSE_ENROLL = 0x04, FP_RTK_PURPOSE_ENROLL = 0x04,
} FpRtkPurpose; } FpRtkPurpose;
@@ -107,15 +108,18 @@ typedef enum {
FP_RTK_ENROLL_ACCEPT_SAMPLE, FP_RTK_ENROLL_ACCEPT_SAMPLE,
FP_RTK_ENROLL_CHECK_DUPLICATE, FP_RTK_ENROLL_CHECK_DUPLICATE,
FP_RTK_ENROLL_COMMIT, FP_RTK_ENROLL_COMMIT,
FP_RTK_ENROLL_CANCEL_CAPTURE,
FP_RTK_ENROLL_NUM_STATES, FP_RTK_ENROLL_NUM_STATES,
} FpRtkEnrollState; } FpRtkEnrollState;
typedef enum { typedef enum {
FP_RTK_VERIFY_CAPTURE = 0, FP_RTK_VERIFY_GET_TEMPLATE = 0,
FP_RTK_VERIFY_CAPTURE,
FP_RTK_VERIFY_FINISH_CAPTURE, FP_RTK_VERIFY_FINISH_CAPTURE,
FP_RTK_VERIFY_ACCEPT_SAMPLE, FP_RTK_VERIFY_ACCEPT_SAMPLE,
FP_RTK_VERIFY_INDENTIFY_FEATURE, FP_RTK_VERIFY_INDENTIFY_FEATURE,
FP_RTK_VERIFY_UPDATE_TEMPLATE, FP_RTK_VERIFY_UPDATE_TEMPLATE,
FP_RTK_VERIFY_CANCEL_CAPTURE,
FP_RTK_VERIFY_NUM_STATES, FP_RTK_VERIFY_NUM_STATES,
} FpRtkVerifyState; } FpRtkVerifyState;
@@ -126,7 +130,8 @@ typedef enum {
} FpRtkDeleteState; } FpRtkDeleteState;
typedef enum { typedef enum {
FP_RTK_INIT_SELECT_OS = 0, FP_RTK_INIT_GET_DEVICE_INFO = 0,
FP_RTK_INIT_SELECT_OS,
FP_RTK_INIT_GET_ENROLL_NUM, FP_RTK_INIT_GET_ENROLL_NUM,
FP_RTK_INIT_NUM_STATES, FP_RTK_INIT_NUM_STATES,
} FpRtkInitState; } FpRtkInitState;
@@ -155,66 +160,87 @@ struct _FpiDeviceRealtek
FpRtkPurpose fp_purpose; FpRtkPurpose fp_purpose;
gint pos_index; gint pos_index;
gint template_num; gint template_num;
gint template_len;
}; };
struct realtek_fp_cmd struct rtk_cmd_bulk
{ {
uint8_t cmd[FP_RTK_CMD_LEN]; uint8_t cmd[FP_RTK_CMD_BULK_LEN];
uint8_t param[FP_RTK_CMD_PARAM_LEN]; uint8_t param[FP_RTK_CMD_BULK_PARAM_LEN];
uint8_t addr[FP_RTK_CMD_ADDR_LEN]; uint8_t addr[FP_RTK_CMD_BULK_ADDR_LEN];
uint8_t data_len[FP_RTK_CMD_DATA_LEN]; uint8_t data_len[FP_RTK_CMD_BULK_DATA_LEN];
}; };
static struct realtek_fp_cmd co_start_capture = { 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}, .cmd = {0x05, 0x05},
}; };
static struct realtek_fp_cmd co_finish_capture = { static struct rtk_cmd_bulk co_finish_capture = {
.cmd = {0x45, 0x06}, .cmd = {0x45, 0x06},
.data_len = {0x05}, .data_len = {0x05},
}; };
static struct realtek_fp_cmd co_accept_sample = { static struct rtk_cmd_bulk co_accept_sample = {
.cmd = {0x45, 0x08}, .cmd = {0x45, 0x08},
.data_len = {0x09}, .data_len = {0x09},
}; };
static struct realtek_fp_cmd tls_identify_feature = { static struct rtk_cmd_bulk nor_identify_feature = {
.cmd = {0x45, 0x22}, .cmd = {0x45, 0x22},
.data_len = {0x2A}, .data_len = {0x2A},
}; };
static struct realtek_fp_cmd co_get_enroll_num = { static struct rtk_cmd_bulk co_get_enroll_num = {
.cmd = {0x45, 0x0d}, .cmd = {0x45, 0x0d},
.data_len = {0x02}, .data_len = {0x02},
}; };
static struct realtek_fp_cmd co_get_template = { static struct rtk_cmd_bulk co_get_template = {
.cmd = {0x45, 0x0E}, .cmd = {0x45, 0x0E},
}; };
static struct realtek_fp_cmd tls_enroll_begin = { static struct rtk_cmd_bulk nor_enroll_begin = {
.cmd = {0x05, 0x20}, .cmd = {0x05, 0x20},
}; };
static struct realtek_fp_cmd co_check_duplicate = { static struct rtk_cmd_bulk co_check_duplicate = {
.cmd = {0x45, 0x10}, .cmd = {0x45, 0x10},
.data_len = {0x22}, .data_len = {0x22},
}; };
static struct realtek_fp_cmd tls_enroll_commit = { static struct rtk_cmd_bulk nor_enroll_commit = {
.cmd = {0x85, 0x21}, .cmd = {0x85, 0x21},
.data_len = {0x20},
}; };
static struct realtek_fp_cmd co_update_template = { static struct rtk_cmd_bulk co_update_template = {
.cmd = {0x05, 0x11}, .cmd = {0x05, 0x11},
}; };
static struct realtek_fp_cmd co_delete_record = { static struct rtk_cmd_bulk co_delete_record = {
.cmd = {0x05, 0x0F}, .cmd = {0x05, 0x0F},
}; };
static struct realtek_fp_cmd co_select_system = { static struct rtk_cmd_bulk co_select_system = {
.cmd = {0x05, 0x13}, .cmd = {0x05, 0x13},
}; };
static struct rtk_cmd_bulk co_cancel_capture = {
.cmd = {0x05, 0x07},
};
+2 -1
View File
@@ -256,7 +256,8 @@ bmkt_compose_message (uint8_t *cmd, int *cmd_len, uint8_t msg_id, uint8_t seq_nu
cmd[BMKT_MESSAGE_SEQ_NUM_FIELD] = seq_num; cmd[BMKT_MESSAGE_SEQ_NUM_FIELD] = seq_num;
cmd[BMKT_MESSAGE_ID_FIELD] = msg_id; cmd[BMKT_MESSAGE_ID_FIELD] = msg_id;
cmd[BMKT_MESSAGE_PAYLOAD_LEN_FIELD] = payload_size; cmd[BMKT_MESSAGE_PAYLOAD_LEN_FIELD] = payload_size;
memcpy (&cmd[BMKT_MESSAGE_PAYLOAD_FIELD], payload, payload_size); if (payload_size > 0)
memcpy (&cmd[BMKT_MESSAGE_PAYLOAD_FIELD], payload, payload_size);
*cmd_len = message_len; *cmd_len = message_len;
+24 -5
View File
@@ -32,22 +32,35 @@ static void compose_and_send_identify_msg (FpDevice *device);
static const FpIdEntry id_table[] = { static const FpIdEntry id_table[] = {
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00BD, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00BD, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C2, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C4, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C6, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00DF, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00DF, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00E9, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F9, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F9, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00FC, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00FC, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C2, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0104, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0107, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0108, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0109, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x010A, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x015F, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x015F, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0104, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0169, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x016C, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, }, { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0174, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019D, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019F, },
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x01A0, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };
@@ -1247,6 +1260,12 @@ dev_probe (FpDevice *device)
return; return;
} }
if (!g_usb_device_reset (usb_dev, &error))
{
fp_dbg ("%s g_usb_device_reset failed %s", G_STRFUNC, error->message);
goto err_close;
}
if (!g_usb_device_claim_interface (usb_dev, 0, 0, &error)) if (!g_usb_device_claim_interface (usb_dev, 0, 0, &error))
goto err_close; goto err_close;
+14 -6
View File
@@ -196,8 +196,9 @@ struct read_msg_data
static void __read_msg_async (FpDevice *dev, static void __read_msg_async (FpDevice *dev,
struct read_msg_data *udata); struct read_msg_data *udata);
#define READ_MSG_DATA_CB_ERR(dev, udata, error) (udata)->callback (dev, \ #define READ_MSG_DATA_CB_ERR(dev, udata, error) \
READ_MSG_CMD, 0, 0, NULL, 0, (udata)->user_data, error) (udata)->callback (dev, \
READ_MSG_CMD, 0, 0, NULL, 0, (udata)->user_data, error)
static void static void
busy_ack_sent_cb (FpiUsbTransfer *transfer, FpDevice *device, busy_ack_sent_cb (FpiUsbTransfer *transfer, FpDevice *device,
@@ -1243,7 +1244,7 @@ do_verify_stop (FpDevice *dev, FpiMatchResult res, GError *error)
FpiSsm *ssm = deinitsm_new (dev, data); FpiSsm *ssm = deinitsm_new (dev, data);
/* Report the error immediately if possible, otherwise delay it. */ /* Report the error immediately if possible, otherwise delay it. */
if (error && error->domain == FP_DEVICE_RETRY) if (!error || error->domain == FP_DEVICE_RETRY)
fpi_device_verify_report (dev, res, NULL, error); fpi_device_verify_report (dev, res, NULL, error);
else else
data->error = error; data->error = error;
@@ -1295,7 +1296,7 @@ verify_start_sm_run_state (FpiSsm *ssm, FpDevice *dev)
memcpy (msg, verify_hdr, sizeof (verify_hdr)); memcpy (msg, verify_hdr, sizeof (verify_hdr));
memcpy (msg + sizeof (verify_hdr), data, data_len); memcpy (msg + sizeof (verify_hdr), data, data_len);
transfer = alloc_send_cmd28_transfer (dev, 0x03, data, data_len); transfer = alloc_send_cmd28_transfer (dev, 0x03, msg, msg_len);
g_free (msg); g_free (msg);
@@ -1341,7 +1342,6 @@ v_handle_resp00 (FpDevice *dev, unsigned char *data,
fp_dbg ("good image"); fp_dbg ("good image");
break; break;
case 0x1c: /* FIXME what does this one mean? */
case 0x0b: /* FIXME what does this one mean? */ case 0x0b: /* FIXME what does this one mean? */
case 0x23: /* FIXME what does this one mean? */ case 0x23: /* FIXME what does this one mean? */
error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL); error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL);
@@ -1351,6 +1351,14 @@ v_handle_resp00 (FpDevice *dev, unsigned char *data,
error = fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER); error = fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER);
break; break;
case 0x1c: /* swipe too fast */
error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_FAST);
break;
case 0x1d: /* too much horizontal movement */
error = fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER);
break;
case 0x1e: /* swipe too short */ case 0x1e: /* swipe too short */
error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT); error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT);
break; break;
@@ -1439,7 +1447,7 @@ verify_rd2800_cb (FpDevice *dev, enum read_msg_type msgtype,
do_verify_stop (dev, do_verify_stop (dev,
FPI_MATCH_ERROR, FPI_MATCH_ERROR,
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
"Response hat wrong command sequence")); "Response had wrong command sequence"));
return; return;
} }
+59 -65
View File
@@ -20,8 +20,8 @@
#define FP_COMPONENT "uru4000" #define FP_COMPONENT "uru4000"
#include <nss.h> #include <openssl/evp.h>
#include <pk11pub.h> #include <openssl/err.h>
#include "drivers_api.h" #include "drivers_api.h"
@@ -148,10 +148,7 @@ struct _FpiDeviceUru4000
int fwfixer_offset; int fwfixer_offset;
unsigned char fwfixer_value; unsigned char fwfixer_value;
CK_MECHANISM_TYPE cipher; EVP_CIPHER_CTX *cipher_ctx;
PK11SlotInfo *slot;
PK11SymKey *symkey;
SECItem *param;
}; };
G_DECLARE_FINAL_TYPE (FpiDeviceUru4000, fpi_device_uru4000, FPI, DEVICE_URU4000, G_DECLARE_FINAL_TYPE (FpiDeviceUru4000, fpi_device_uru4000, FPI, DEVICE_URU4000,
FpImageDevice); FpImageDevice);
@@ -246,13 +243,29 @@ response_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *e
fpi_ssm_mark_failed (ssm, error); fpi_ssm_mark_failed (ssm, error);
} }
static GError *
openssl_device_error (void)
{
char buf[256];
unsigned long e;
e = ERR_get_error ();
if (e == 0)
return fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
"unexpected OpenSSL error");
ERR_error_string_n (e, buf, G_N_ELEMENTS (buf));
return fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, "OpenSSL error: %s",
buf);
}
static void static void
challenge_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error) challenge_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error)
{ {
FpiSsm *ssm = user_data; FpiSsm *ssm = user_data;
FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev);
unsigned char respdata[CR_LENGTH]; unsigned char respdata[CR_LENGTH * 2];
PK11Context *ctx;
int outlen; int outlen;
if (error) if (error)
@@ -261,17 +274,39 @@ challenge_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *
return; return;
} }
if (transfer->actual_length != CR_LENGTH)
{
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
"Unexpected buffer length (%" G_GSIZE_FORMAT
"instead of %d)",
transfer->actual_length, CR_LENGTH);
fpi_ssm_mark_failed (ssm, g_steal_pointer (&error));
return;
}
/* submit response */ /* submit response */
/* produce response from challenge */ /* produce response from challenge */
ctx = PK11_CreateContextBySymKey (self->cipher, CKA_ENCRYPT, if (!EVP_EncryptUpdate (self->cipher_ctx, respdata, &outlen, transfer->buffer, CR_LENGTH))
self->symkey, self->param);
if (PK11_CipherOp (ctx, respdata, &outlen, CR_LENGTH, transfer->buffer, CR_LENGTH) != SECSuccess ||
PK11_Finalize (ctx) != SECSuccess)
{ {
fp_err ("Failed to encrypt challenge data"); fpi_ssm_mark_failed (ssm, openssl_device_error ());
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "Failed to encrypt challenge data"); return;
}
if (outlen != CR_LENGTH)
{
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
"Unexpected encrypted buffer length (%d"
"instead of %d)",
outlen, CR_LENGTH);
fpi_ssm_mark_failed (ssm, g_steal_pointer (&error));
return;
}
if (!EVP_EncryptFinal_ex (self->cipher_ctx, respdata + outlen, &outlen))
{
fpi_ssm_mark_failed (ssm, openssl_device_error ());
return;
} }
PK11_DestroyContext (ctx, PR_TRUE);
if (!error) if (!error)
write_regs (FP_IMAGE_DEVICE (dev), REG_RESPONSE, CR_LENGTH, respdata, response_cb, ssm); write_regs (FP_IMAGE_DEVICE (dev), REG_RESPONSE, CR_LENGTH, respdata, response_cb, ssm);
@@ -703,9 +738,9 @@ imaging_run_state (FpiSsm *ssm, FpDevice *_dev)
case IMAGING_DECODE: case IMAGING_DECODE:
key = self->last_reg_rd[0]; key = self->last_reg_rd[0];
key |= self->last_reg_rd[1] << 8; key |= (uint32_t) self->last_reg_rd[1] << 8;
key |= self->last_reg_rd[2] << 16; key |= (uint32_t) self->last_reg_rd[2] << 16;
key |= self->last_reg_rd[3] << 24; key |= (uint32_t) self->last_reg_rd[3] << 24;
key ^= self->img_enc_seed; key ^= self->img_enc_seed;
fp_dbg ("encryption id %02x -> key %08x", img->key_number, key); fp_dbg ("encryption id %02x -> key %08x", img->key_number, key);
@@ -1270,8 +1305,6 @@ dev_init (FpImageDevice *dev)
g_autoptr(GPtrArray) interfaces = NULL; g_autoptr(GPtrArray) interfaces = NULL;
GUsbInterface *iface = NULL; GUsbInterface *iface = NULL;
guint64 driver_data; guint64 driver_data;
SECStatus rv;
SECItem item;
int i; int i;
interfaces = g_usb_device_get_interfaces (fpi_device_get_usb_device (FP_DEVICE (dev)), &error); interfaces = g_usb_device_get_interfaces (fpi_device_get_usb_device (FP_DEVICE (dev)), &error);
@@ -1343,20 +1376,6 @@ dev_init (FpImageDevice *dev)
return; return;
} }
/* Disable loading p11-kit's user configuration */
g_setenv ("P11_KIT_NO_USER_CONFIG", "1", TRUE);
/* Initialise NSS early */
rv = NSS_NoDB_Init (".");
if (rv != SECSuccess)
{
fp_err ("could not initialise NSS");
fpi_image_device_open_complete (dev,
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
"Could not initialise NSS"));
return;
}
self = FPI_DEVICE_URU4000 (dev); self = FPI_DEVICE_URU4000 (dev);
g_clear_pointer (&self->rand, g_rand_free); g_clear_pointer (&self->rand, g_rand_free);
@@ -1369,35 +1388,17 @@ dev_init (FpImageDevice *dev)
self->interface = g_usb_interface_get_number (iface); self->interface = g_usb_interface_get_number (iface);
/* Set up encryption */ /* Set up encryption */
self->cipher = CKM_AES_ECB; if (!(self->cipher_ctx = EVP_CIPHER_CTX_new ()))
self->slot = PK11_GetBestSlot (self->cipher, NULL);
if (self->slot == NULL)
{ {
fp_err ("could not get encryption slot"); fpi_image_device_open_complete (dev, openssl_device_error ());
fpi_image_device_open_complete (dev,
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
"Could not get encryption slot"));
return; return;
} }
item.type = siBuffer;
item.data = (unsigned char *) crkey; if (!EVP_EncryptInit_ex (self->cipher_ctx, EVP_aes_128_ecb (), NULL, crkey, NULL))
item.len = sizeof (crkey);
self->symkey = PK11_ImportSymKey (self->slot,
self->cipher,
PK11_OriginUnwrap,
CKA_ENCRYPT,
&item, NULL);
if (self->symkey == NULL)
{ {
fp_err ("failed to import key into NSS"); fpi_image_device_open_complete (dev, openssl_device_error ());
PK11_FreeSlot (self->slot);
self->slot = NULL;
fpi_image_device_open_complete (dev,
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
"Failed to import key into NSS"));
return; return;
} }
self->param = PK11_ParamFromIV (self->cipher, NULL);
fpi_image_device_open_complete (dev, NULL); fpi_image_device_open_complete (dev, NULL);
} }
@@ -1408,14 +1409,7 @@ dev_deinit (FpImageDevice *dev)
GError *error = NULL; GError *error = NULL;
FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev); FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev);
if (self->symkey) g_clear_pointer (&self->cipher_ctx, EVP_CIPHER_CTX_free);
PK11_FreeSymKey (self->symkey);
if (self->param)
SECITEM_FreeItem (self->param, PR_TRUE);
if (self->slot)
PK11_FreeSlot (self->slot);
NSS_Shutdown ();
g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)), g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)),
self->interface, 0, &error); self->interface, 0, &error);
+3 -3
View File
@@ -162,9 +162,9 @@ enum {
/* Dump buffer for debug */ /* Dump buffer for debug */
#define dump_buffer(buf) \ #define dump_buffer(buf) \
fp_dbg ("%02x %02x %02x %02x %02x %02x %02x %02x", \ fp_dbg ("%02x %02x %02x %02x %02x %02x %02x %02x", \
buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13] \ buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13] \
) )
/* Callback of asynchronous send */ /* Callback of asynchronous send */
static void static void
+15 -15
View File
@@ -157,7 +157,7 @@ vfs301_proto_generate_0B (int subtype, gssize *len)
} }
#define HEX_TO_INT(c) \ #define HEX_TO_INT(c) \
(((c) >= '0' && (c) <= '9') ? ((c) - '0') : ((c) - 'A' + 10)) (((c) >= '0' && (c) <= '9') ? ((c) - '0') : ((c) - 'A' + 10))
static guint8 * static guint8 *
translate_str (const char **srcL, gssize *len) translate_str (const char **srcL, gssize *len)
@@ -422,15 +422,15 @@ img_process_data (int first_block, FpDeviceVfs301 *dev, const guint8 *buf, int l
/************************** PROTOCOL STUFF ************************************/ /************************** PROTOCOL STUFF ************************************/
#define USB_RECV(from, len) \ #define USB_RECV(from, len) \
usb_recv (dev, from, len, NULL, NULL) usb_recv (dev, from, len, NULL, NULL)
#define USB_SEND(type, subtype) \ #define USB_SEND(type, subtype) \
{ \ { \
const guint8 *data; \ const guint8 *data; \
gssize len; \ gssize len; \
data = vfs301_proto_generate (type, subtype, &len); \ data = vfs301_proto_generate (type, subtype, &len); \
usb_send (dev, data, len, NULL); \ usb_send (dev, data, len, NULL); \
} }
#define RAW_DATA(x) g_memdup2 (x, sizeof (x)), sizeof (x) #define RAW_DATA(x) g_memdup2 (x, sizeof (x)), sizeof (x)
@@ -489,13 +489,13 @@ vfs301_proto_peek_event (FpDeviceVfs301 *dev)
* we will run into timeouts randomly and need to then try again. * we will run into timeouts randomly and need to then try again.
*/ */
#define PARALLEL_RECEIVE(e1, l1, e2, l2) \ #define PARALLEL_RECEIVE(e1, l1, e2, l2) \
{ \ { \
g_autoptr(GError) error = NULL; \ g_autoptr(GError) error = NULL; \
usb_recv (dev, e1, l1, NULL, &error); \ usb_recv (dev, e1, l1, NULL, &error); \
usb_recv (dev, e2, l2, NULL, NULL); \ usb_recv (dev, e2, l2, NULL, NULL); \
if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) \ if (g_error_matches (error, G_USB_DEVICE_ERROR, G_USB_DEVICE_ERROR_TIMED_OUT)) \
usb_recv (dev, e1, l1, NULL, NULL); \ usb_recv (dev, e1, l1, NULL, NULL); \
} }
static void static void
vfs301_proto_process_event_cb (FpiUsbTransfer *transfer, vfs301_proto_process_event_cb (FpiUsbTransfer *transfer,
+20 -20
View File
@@ -41,30 +41,30 @@ struct usb_action
}; };
#define SEND(ENDPOINT, COMMAND) \ #define SEND(ENDPOINT, COMMAND) \
{ \ { \
.type = ACTION_SEND, \ .type = ACTION_SEND, \
.endpoint = ENDPOINT, \ .endpoint = ENDPOINT, \
.name = #COMMAND, \ .name = #COMMAND, \
.size = sizeof (COMMAND), \ .size = sizeof (COMMAND), \
.data = COMMAND \ .data = COMMAND \
}, },
#define RECV(ENDPOINT, SIZE) \ #define RECV(ENDPOINT, SIZE) \
{ \ { \
.type = ACTION_RECEIVE, \ .type = ACTION_RECEIVE, \
.endpoint = ENDPOINT, \ .endpoint = ENDPOINT, \
.size = SIZE, \ .size = SIZE, \
.data = NULL \ .data = NULL \
}, },
#define RECV_CHECK(ENDPOINT, SIZE, EXPECTED) \ #define RECV_CHECK(ENDPOINT, SIZE, EXPECTED) \
{ \ { \
.type = ACTION_RECEIVE, \ .type = ACTION_RECEIVE, \
.endpoint = ENDPOINT, \ .endpoint = ENDPOINT, \
.size = SIZE, \ .size = SIZE, \
.data = EXPECTED, \ .data = EXPECTED, \
.correct_reply_size = sizeof (EXPECTED) \ .correct_reply_size = sizeof (EXPECTED) \
}, },
struct usbexchange_data struct usbexchange_data
{ {
+27 -27
View File
@@ -51,39 +51,39 @@ struct usb_action
}; };
#define SEND(ENDPOINT, COMMAND) \ #define SEND(ENDPOINT, COMMAND) \
{ \ { \
.type = ACTION_SEND, \ .type = ACTION_SEND, \
.endpoint = ENDPOINT, \ .endpoint = ENDPOINT, \
.name = #COMMAND, \ .name = #COMMAND, \
.size = sizeof (COMMAND), \ .size = sizeof (COMMAND), \
.data = COMMAND \ .data = COMMAND \
}, },
#define RECV(ENDPOINT, SIZE) \ #define RECV(ENDPOINT, SIZE) \
{ \ { \
.type = ACTION_RECEIVE, \ .type = ACTION_RECEIVE, \
.endpoint = ENDPOINT, \ .endpoint = ENDPOINT, \
.size = SIZE, \ .size = SIZE, \
.data = NULL \ .data = NULL \
}, },
#define RECV_CHECK(ENDPOINT, SIZE, EXPECTED) \ #define RECV_CHECK(ENDPOINT, SIZE, EXPECTED) \
{ \ { \
.type = ACTION_RECEIVE, \ .type = ACTION_RECEIVE, \
.endpoint = ENDPOINT, \ .endpoint = ENDPOINT, \
.size = SIZE, \ .size = SIZE, \
.data = EXPECTED, \ .data = EXPECTED, \
.correct_reply_size = sizeof (EXPECTED) \ .correct_reply_size = sizeof (EXPECTED) \
}, },
#define RECV_CHECK_SIZE(ENDPOINT, SIZE, EXPECTED) \ #define RECV_CHECK_SIZE(ENDPOINT, SIZE, EXPECTED) \
{ \ { \
.type = ACTION_RECEIVE, \ .type = ACTION_RECEIVE, \
.endpoint = ENDPOINT, \ .endpoint = ENDPOINT, \
.size = SIZE, \ .size = SIZE, \
.data = NULL, \ .data = NULL, \
.correct_reply_size = sizeof (EXPECTED) \ .correct_reply_size = sizeof (EXPECTED) \
}, },
struct usbexchange_data struct usbexchange_data
{ {
+14
View File
@@ -772,6 +772,7 @@ fpi_device_virtual_device_class_init (FpDeviceVirtualDeviceClass *klass)
{ {
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
const char *hot_seconds;
object_class->finalize = fpi_device_virtual_device_finalize; object_class->finalize = fpi_device_virtual_device_finalize;
@@ -787,5 +788,18 @@ fpi_device_virtual_device_class_init (FpDeviceVirtualDeviceClass *klass)
dev_class->enroll = dev_enroll; dev_class->enroll = dev_enroll;
dev_class->cancel = dev_cancel; dev_class->cancel = dev_cancel;
if ((hot_seconds = g_getenv ("FP_VIRTUAL_DEVICE_HOT_SECONDS")) &&
*hot_seconds != '\0')
{
gint64 hot_seconds_value;
hot_seconds_value = g_ascii_strtoll (hot_seconds, NULL, 10);
if (hot_seconds_value >= G_MAXINT32 || hot_seconds_value < 0)
hot_seconds_value = -1;
dev_class->temp_hot_seconds = hot_seconds_value;
g_debug ("device hot seconds set to %d", dev_class->temp_hot_seconds);
}
fpi_device_class_auto_initialize_features (dev_class); fpi_device_class_auto_initialize_features (dev_class);
} }
+16 -2
View File
@@ -191,12 +191,12 @@ on_listener_connected (FpiDeviceVirtualListener *listener,
switch (state) switch (state)
{ {
case FPI_IMAGE_DEVICE_STATE_IDLE:
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON: case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON:
case FPI_IMAGE_DEVICE_STATE_CAPTURE: case FPI_IMAGE_DEVICE_STATE_CAPTURE:
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF:
recv_image (self); recv_image (self);
case FPI_IMAGE_DEVICE_STATE_IDLE:
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF:
case FPI_IMAGE_DEVICE_STATE_INACTIVE: case FPI_IMAGE_DEVICE_STATE_INACTIVE:
case FPI_IMAGE_DEVICE_STATE_ACTIVATING: case FPI_IMAGE_DEVICE_STATE_ACTIVATING:
case FPI_IMAGE_DEVICE_STATE_DEACTIVATING: case FPI_IMAGE_DEVICE_STATE_DEACTIVATING:
@@ -310,6 +310,7 @@ fpi_device_virtual_image_class_init (FpDeviceVirtualImageClass *klass)
{ {
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass); FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass); FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass);
const char *hot_seconds;
dev_class->id = FP_COMPONENT; dev_class->id = FP_COMPONENT;
dev_class->full_name = "Virtual image device for debugging"; dev_class->full_name = "Virtual image device for debugging";
@@ -321,4 +322,17 @@ fpi_device_virtual_image_class_init (FpDeviceVirtualImageClass *klass)
img_class->activate = dev_activate; img_class->activate = dev_activate;
img_class->deactivate = dev_deactivate; img_class->deactivate = dev_deactivate;
if ((hot_seconds = g_getenv ("FP_VIRTUAL_IMAGE_HOT_SECONDS")) &&
*hot_seconds != '\0')
{
gint64 hot_seconds_value;
hot_seconds_value = g_ascii_strtoll (hot_seconds, NULL, 10);
if (hot_seconds_value >= G_MAXINT32 || hot_seconds_value < 0)
hot_seconds_value = -1;
dev_class->temp_hot_seconds = hot_seconds_value;
g_debug ("device hot seconds set to %d", dev_class->temp_hot_seconds);
}
} }
-11
View File
@@ -27,10 +27,6 @@
#include <config.h> #include <config.h>
#ifdef HAVE_LIBFPRINT_TOD
#include "tod/tod-shared-loader.h"
#endif
#ifdef HAVE_UDEV #ifdef HAVE_UDEV
#include <gudev/gudev.h> #include <gudev/gudev.h>
#endif #endif
@@ -300,8 +296,6 @@ fp_context_finalize (GObject *object)
g_object_run_dispose (G_OBJECT (priv->usb_ctx)); g_object_run_dispose (G_OBJECT (priv->usb_ctx));
g_clear_object (&priv->usb_ctx); g_clear_object (&priv->usb_ctx);
tod_shared_drivers_unregister ();
G_OBJECT_CLASS (fp_context_parent_class)->finalize (object); G_OBJECT_CLASS (fp_context_parent_class)->finalize (object);
} }
@@ -357,7 +351,6 @@ static void
fp_context_init (FpContext *self) fp_context_init (FpContext *self)
{ {
g_autoptr(GError) error = NULL; g_autoptr(GError) error = NULL;
g_autoptr(GArray) shared_drivers = NULL;
FpContextPrivate *priv = fp_context_get_instance_private (self); FpContextPrivate *priv = fp_context_get_instance_private (self);
guint i; guint i;
@@ -365,10 +358,6 @@ fp_context_init (FpContext *self)
priv->drivers = fpi_get_driver_types (); priv->drivers = fpi_get_driver_types ();
tod_shared_drivers_register ();
shared_drivers = tod_shared_drivers_get ();
g_array_prepend_vals (priv->drivers, shared_drivers->data, shared_drivers->len);
if (get_drivers_allowlist_env ()) if (get_drivers_allowlist_env ())
{ {
for (i = 0; i < priv->drivers->len;) for (i = 0; i < priv->drivers->len;)
+15 -12
View File
@@ -292,14 +292,14 @@ fp_device_get_property (GObject *object,
case PROP_FPI_UDEV_DATA_SPIDEV: case PROP_FPI_UDEV_DATA_SPIDEV:
if (cls->type == FP_DEVICE_TYPE_UDEV) 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 else
g_value_set_string (value, NULL); g_value_set_string (value, NULL);
break; break;
case PROP_FPI_UDEV_DATA_HIDRAW: case PROP_FPI_UDEV_DATA_HIDRAW:
if (cls->type == FP_DEVICE_TYPE_UDEV) 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 else
g_value_set_string (value, NULL); g_value_set_string (value, NULL);
break; break;
@@ -483,6 +483,9 @@ fp_device_class_init (FpDeviceClass *klass)
NULL, NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READABLE); G_PARAM_STATIC_STRINGS | G_PARAM_READABLE);
/**
* FpDevice:open: (getter is_open):
*/
properties[PROP_OPEN] = properties[PROP_OPEN] =
g_param_spec_boolean ("open", g_param_spec_boolean ("open",
"Opened", "Opened",
@@ -1103,8 +1106,8 @@ enroll_data_free (FpEnrollData *data)
* @device: a #FpDevice * @device: a #FpDevice
* @template_print: (transfer floating): a #FpPrint * @template_print: (transfer floating): a #FpPrint
* @cancellable: (nullable): a #GCancellable, or %NULL * @cancellable: (nullable): a #GCancellable, or %NULL
* @progress_cb: (nullable) (scope notified): progress reporting callback * @progress_cb: (nullable) (closure progress_data) (scope notified): progress reporting callback
* @progress_data: (closure progress_cb): user data for @progress_cb * @progress_data: user data for @progress_cb
* @progress_destroy: (destroy progress_data): Destroy notify for @progress_data * @progress_destroy: (destroy progress_data): Destroy notify for @progress_data
* @callback: (scope async): the function to call on completion * @callback: (scope async): the function to call on completion
* @user_data: the data to pass to @callback * @user_data: the data to pass to @callback
@@ -1248,8 +1251,8 @@ match_data_free (FpMatchData *data)
* @device: a #FpDevice * @device: a #FpDevice
* @enrolled_print: a #FpPrint to verify * @enrolled_print: a #FpPrint to verify
* @cancellable: (nullable): a #GCancellable, or %NULL * @cancellable: (nullable): a #GCancellable, or %NULL
* @match_cb: (nullable) (scope notified): match reporting callback * @match_cb: (nullable) (scope notified) (closure match_data): match reporting callback
* @match_data: (closure match_cb): user data for @match_cb * @match_data: user data for @match_cb
* @match_destroy: (destroy match_data): Destroy notify for @match_data * @match_destroy: (destroy match_data): Destroy notify for @match_data
* @callback: the function to call on completion * @callback: the function to call on completion
* @user_data: the data to pass to @callback * @user_data: the data to pass to @callback
@@ -1374,8 +1377,8 @@ fp_device_verify_finish (FpDevice *device,
* @device: a #FpDevice * @device: a #FpDevice
* @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint * @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint
* @cancellable: (nullable): a #GCancellable, or %NULL * @cancellable: (nullable): a #GCancellable, or %NULL
* @match_cb: (nullable) (scope notified): match reporting callback * @match_cb: (nullable) (scope notified) (closure match_data): match reporting callback
* @match_data: (closure match_cb): user data for @match_cb * @match_data: user data for @match_cb
* @match_destroy: (destroy match_data): Destroy notify for @match_data * @match_destroy: (destroy match_data): Destroy notify for @match_data
* @callback: the function to call on completion * @callback: the function to call on completion
* @user_data: the data to pass to @callback * @user_data: the data to pass to @callback
@@ -1943,8 +1946,8 @@ fp_device_enroll_sync (FpDevice *device,
* @device: a #FpDevice * @device: a #FpDevice
* @enrolled_print: a #FpPrint to verify * @enrolled_print: a #FpPrint to verify
* @cancellable: (nullable): a #GCancellable, or %NULL * @cancellable: (nullable): a #GCancellable, or %NULL
* @match_cb: (nullable) (scope call): match reporting callback * @match_cb: (nullable) (scope call) (closure match_data): match reporting callback
* @match_data: (closure match_cb): user data for @match_cb * @match_data: user data for @match_cb
* @match: (out): Whether the user presented the correct finger * @match: (out): Whether the user presented the correct finger
* @print: (out) (transfer full) (nullable): Location to store the scanned print, or %NULL to ignore * @print: (out) (transfer full) (nullable): Location to store the scanned print, or %NULL to ignore
* @error: Return location for errors, or %NULL to ignore * @error: Return location for errors, or %NULL to ignore
@@ -1983,8 +1986,8 @@ fp_device_verify_sync (FpDevice *device,
* @device: a #FpDevice * @device: a #FpDevice
* @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint * @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint
* @cancellable: (nullable): a #GCancellable, or %NULL * @cancellable: (nullable): a #GCancellable, or %NULL
* @match_cb: (nullable) (scope call): match reporting callback * @match_cb: (nullable) (scope call) (closure match_data): match reporting callback
* @match_data: (closure match_cb): user data for @match_cb * @match_data: user data for @match_cb
* @match: (out) (transfer full) (nullable): Location for the matched #FpPrint, or %NULL * @match: (out) (transfer full) (nullable): Location for the matched #FpPrint, or %NULL
* @print: (out) (transfer full) (nullable): Location for the new #FpPrint, or %NULL * @print: (out) (transfer full) (nullable): Location for the new #FpPrint, or %NULL
* @error: Return location for errors, or %NULL to ignore * @error: Return location for errors, or %NULL to ignore
+4 -1
View File
@@ -43,8 +43,8 @@ G_DECLARE_DERIVABLE_TYPE (FpDevice, fp_device, FP, DEVICE, GObject)
*/ */
typedef enum { typedef enum {
FP_DEVICE_TYPE_VIRTUAL, FP_DEVICE_TYPE_VIRTUAL,
FP_DEVICE_TYPE_USB,
FP_DEVICE_TYPE_UDEV, FP_DEVICE_TYPE_UDEV,
FP_DEVICE_TYPE_USB,
} FpDeviceType; } FpDeviceType;
/** /**
@@ -113,6 +113,8 @@ typedef enum {
* @FP_DEVICE_RETRY_REMOVE_FINGER: The scan did not succeed due to quality or * @FP_DEVICE_RETRY_REMOVE_FINGER: The scan did not succeed due to quality or
* pressure problems; the user should remove their finger from the scanner * pressure problems; the user should remove their finger from the scanner
* before retrying. * before retrying.
* @FP_DEVICE_RETRY_TOO_FAST: The scan did not succeed because the finger
* swipe or touch was too fast.
* *
* Error codes representing scan failures resulting in the user needing to * Error codes representing scan failures resulting in the user needing to
* retry. * retry.
@@ -122,6 +124,7 @@ typedef enum {
FP_DEVICE_RETRY_TOO_SHORT, FP_DEVICE_RETRY_TOO_SHORT,
FP_DEVICE_RETRY_CENTER_FINGER, FP_DEVICE_RETRY_CENTER_FINGER,
FP_DEVICE_RETRY_REMOVE_FINGER, FP_DEVICE_RETRY_REMOVE_FINGER,
FP_DEVICE_RETRY_TOO_FAST,
} FpDeviceRetry; } FpDeviceRetry;
/** /**
+1 -1
View File
@@ -29,7 +29,7 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (FpPrint, fp_print, FP, PRINT, GInitiallyUnowned) G_DECLARE_FINAL_TYPE (FpPrint, fp_print, FP, PRINT, GInitiallyUnowned)
#define FP_FINGER_IS_VALID(finger) \ #define FP_FINGER_IS_VALID(finger) \
((finger) >= FP_FINGER_FIRST && (finger) <= FP_FINGER_LAST) ((finger) >= FP_FINGER_FIRST && (finger) <= FP_FINGER_LAST)
#include "fp-device.h" #include "fp-device.h"
-4
View File
@@ -20,7 +20,6 @@
#pragma once #pragma once
#include "fp-image.h" #include "fp-image.h"
#include "tod/tod-macros.h"
/** /**
* fpi_frame: * fpi_frame:
@@ -111,9 +110,6 @@ struct fpi_line_asmbl_ctx
unsigned char (*get_pixel)(struct fpi_line_asmbl_ctx *ctx, unsigned char (*get_pixel)(struct fpi_line_asmbl_ctx *ctx,
GSList *line, GSList *line,
unsigned int x); unsigned int x);
/*< private >*/
TOD_PADDING (32, 0);
}; };
FpImage *fpi_assemble_lines (struct fpi_line_asmbl_ctx *ctx, FpImage *fpi_assemble_lines (struct fpi_line_asmbl_ctx *ctx,
+2
View File
@@ -675,4 +675,6 @@ fpi_byte_reader_skip_inline (FpiByteReader * reader, guint nbytes)
#endif /* FPI_BYTE_READER_DISABLE_INLINES */ #endif /* FPI_BYTE_READER_DISABLE_INLINES */
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpiByteReader, fpi_byte_reader_free);
G_END_DECLS G_END_DECLS
+5 -4
View File
@@ -75,7 +75,8 @@ fpi_byte_writer_new_with_size (guint size, gboolean fixed)
FpiByteWriter *ret = fpi_byte_writer_new (); FpiByteWriter *ret = fpi_byte_writer_new ();
ret->alloc_size = size; 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->fixed = fixed;
ret->owned = TRUE; ret->owned = TRUE;
@@ -142,7 +143,8 @@ fpi_byte_writer_init_with_size (FpiByteWriter * writer, guint size,
fpi_byte_writer_init (writer); 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->alloc_size = size;
writer->fixed = fixed; writer->fixed = fixed;
writer->owned = TRUE; writer->owned = TRUE;
@@ -209,10 +211,9 @@ fpi_byte_writer_reset_and_get_data (FpiByteWriter * writer)
g_return_val_if_fail (writer != NULL, NULL); g_return_val_if_fail (writer != NULL, NULL);
data = (guint8 *) writer->parent.data; data = (guint8 *) g_steal_pointer (&writer->parent.data);
if (!writer->owned) if (!writer->owned)
data = g_memdup2 (data, writer->parent.size); data = g_memdup2 (data, writer->parent.size);
writer->parent.data = NULL;
fpi_byte_writer_reset (writer); fpi_byte_writer_reset (writer);
return data; return data;
+14
View File
@@ -111,6 +111,17 @@ fpi_byte_writer_set_pos (FpiByteWriter *writer, guint pos)
return fpi_byte_reader_set_pos (FPI_BYTE_READER (writer), 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 static inline guint
fpi_byte_writer_get_size (const FpiByteWriter *writer) fpi_byte_writer_get_size (const FpiByteWriter *writer)
{ {
@@ -407,4 +418,7 @@ fpi_byte_writer_fill_inline (FpiByteWriter * writer, guint8 value, guint size)
#endif #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 G_END_DECLS
+41 -30
View File
@@ -117,6 +117,10 @@ fpi_device_retry_new (FpDeviceRetry error)
msg = "Please try again after removing the finger first."; msg = "Please try again after removing the finger first.";
break; break;
case FP_DEVICE_RETRY_TOO_FAST:
msg = "The swipe was too fast, please try again.";
break;
default: default:
g_warning ("Unsupported error, returning general error instead!"); g_warning ("Unsupported error, returning general error instead!");
error = FP_DEVICE_RETRY_GENERAL; error = FP_DEVICE_RETRY_GENERAL;
@@ -1042,34 +1046,41 @@ fp_device_task_return_in_idle_cb (gpointer user_data)
static void static void
fpi_device_task_return_data_free (FpDeviceTaskReturnData *data) fpi_device_task_return_data_free (FpDeviceTaskReturnData *data)
{ {
if (data->result) switch (data->type)
{ {
switch (data->type) case FP_DEVICE_TASK_RETURN_INT:
{ case FP_DEVICE_TASK_RETURN_BOOL:
case FP_DEVICE_TASK_RETURN_INT: break;
case FP_DEVICE_TASK_RETURN_BOOL:
break;
case FP_DEVICE_TASK_RETURN_OBJECT: case FP_DEVICE_TASK_RETURN_OBJECT:
g_clear_object ((GObject **) &data->result); g_clear_object ((GObject **) &data->result);
break; break;
case FP_DEVICE_TASK_RETURN_PTR_ARRAY: case FP_DEVICE_TASK_RETURN_PTR_ARRAY:
g_clear_pointer ((GPtrArray **) &data->result, g_ptr_array_unref); g_clear_pointer ((GPtrArray **) &data->result, g_ptr_array_unref);
break; break;
case FP_DEVICE_TASK_RETURN_ERROR: case FP_DEVICE_TASK_RETURN_ERROR:
g_clear_error ((GError **) &data->result); g_clear_error ((GError **) &data->result);
break; break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
}
} }
g_object_unref (data->device); g_object_unref (data->device);
g_free (data); 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 static void
fpi_device_return_task_in_idle (FpDevice *device, fpi_device_return_task_in_idle (FpDevice *device,
FpDeviceTaskReturnType return_type, FpDeviceTaskReturnType return_type,
@@ -1101,7 +1112,7 @@ fpi_device_return_task_in_idle (FpDevice *device,
* @device: The #FpDevice * @device: The #FpDevice
* @device_id: Unique ID for the device or %NULL * @device_id: Unique ID for the device or %NULL
* @device_name: Human readable name or %NULL for driver name * @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. * Finish an ongoing probe operation. If error is %NULL success is assumed.
*/ */
@@ -1147,7 +1158,7 @@ fpi_device_probe_complete (FpDevice *device,
/** /**
* fpi_device_open_complete: * fpi_device_open_complete:
* @device: The #FpDevice * @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. * Finish an ongoing open operation. If error is %NULL success is assumed.
*/ */
@@ -1174,7 +1185,7 @@ fpi_device_open_complete (FpDevice *device, GError *error)
/** /**
* fpi_device_close_complete: * fpi_device_close_complete:
* @device: The #FpDevice * @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. * Finish an ongoing close operation. If error is %NULL success is assumed.
*/ */
@@ -1226,7 +1237,7 @@ fpi_device_close_complete (FpDevice *device, GError *error)
* fpi_device_enroll_complete: * fpi_device_enroll_complete:
* @device: The #FpDevice * @device: The #FpDevice
* @print: (nullable) (transfer full): The #FpPrint or %NULL on failure * @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 * Finish an ongoing enroll operation. The #FpPrint can be stored by the
* caller for later verification. * caller for later verification.
@@ -1355,7 +1366,7 @@ fpi_device_verify_complete (FpDevice *device,
/** /**
* fpi_device_identify_complete: * fpi_device_identify_complete:
* @device: The #FpDevice * @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. * Finish an ongoing identify operation.
* *
@@ -1421,7 +1432,7 @@ fpi_device_identify_complete (FpDevice *device,
* fpi_device_capture_complete: * fpi_device_capture_complete:
* @device: The #FpDevice * @device: The #FpDevice
* @image: The #FpImage, or %NULL on error * @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. * Finish an ongoing capture operation.
*/ */
@@ -1468,7 +1479,7 @@ fpi_device_capture_complete (FpDevice *device,
/** /**
* fpi_device_delete_complete: * fpi_device_delete_complete:
* @device: The #FpDevice * @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. * Finish an ongoing delete operation.
*/ */
@@ -1497,7 +1508,7 @@ fpi_device_delete_complete (FpDevice *device,
* fpi_device_list_complete: * fpi_device_list_complete:
* @device: The #FpDevice * @device: The #FpDevice
* @prints: (element-type FpPrint) (transfer container): Possibly empty array of prints or %NULL on error * @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. * Finish an ongoing list operation.
* *
@@ -1775,7 +1786,7 @@ fpi_device_suspend_completed (FpDevice *device)
/** /**
* fpi_device_suspend_complete: * fpi_device_suspend_complete:
* @device: The #FpDevice * @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 * Finish a suspend request. Only return a %NULL error if suspend has been
* correctly configured and the current action as returned by * correctly configured and the current action as returned by
@@ -1826,7 +1837,7 @@ fpi_device_suspend_complete (FpDevice *device,
/** /**
* fpi_device_resume_complete: * fpi_device_resume_complete:
* @device: The #FpDevice * @device: The #FpDevice
* @error: The #GError or %NULL on success * @error: (nullable) (transfer full): The #GError or %NULL on success
* *
* Finish a resume request. * Finish a resume request.
*/ */
@@ -1854,7 +1865,7 @@ fpi_device_resume_complete (FpDevice *device,
/** /**
* fpi_device_clear_storage_complete: * fpi_device_clear_storage_complete:
* @device: The #FpDevice * @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. * Finish an ongoing clear_storage operation.
*/ */
@@ -1885,7 +1896,7 @@ fpi_device_clear_storage_complete (FpDevice *device,
* @device: The #FpDevice * @device: The #FpDevice
* @completed_stages: The number of stages that are completed at this point * @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 * @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. * 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(). * The passed error may be used if a scan needs to be retried, use fpi_device_retry_new().
+9 -32
View File
@@ -23,7 +23,6 @@
#include "fp-device.h" #include "fp-device.h"
#include "fp-image.h" #include "fp-image.h"
#include "fpi-print.h" #include "fpi-print.h"
#include "tod/tod-macros.h"
/** /**
* FpiDeviceUdevSubtypeFlags: * FpiDeviceUdevSubtypeFlags:
@@ -56,12 +55,6 @@ struct _FpIdEntry
guint vid; guint vid;
}; };
const gchar *virtual_envvar; const gchar *virtual_envvar;
};
guint64 driver_data;
/* Elements added after TODv1 */
union
{
struct struct
{ {
FpiDeviceUdevSubtypeFlags udev_types; FpiDeviceUdevSubtypeFlags udev_types;
@@ -73,13 +66,7 @@ struct _FpIdEntry
} hid_id; } hid_id;
}; };
}; };
guint64 driver_data;
/*< private >*/
/* padding for future expansion */
TOD_PADDING_ALIGNED (16,
sizeof (guint) * 2 +
sizeof (FpiDeviceUdevSubtypeFlags) +
sizeof (gpointer));
}; };
/** /**
@@ -160,11 +147,16 @@ struct _FpDeviceClass
const gchar *full_name; const gchar *full_name;
FpDeviceType type; FpDeviceType type;
const FpIdEntry *id_table; const FpIdEntry *id_table;
FpDeviceFeature features;
/* Defaults for device properties */ /* Defaults for device properties */
gint nr_enroll_stages; gint nr_enroll_stages;
FpScanType scan_type; FpScanType scan_type;
/* Simple device temperature model constants */
gint32 temp_hot_seconds;
gint32 temp_cold_seconds;
/* Callbacks */ /* Callbacks */
gint (*usb_discover) (GUsbDevice *usb_device); gint (*usb_discover) (GUsbDevice *usb_device);
void (*probe) (FpDevice *device); void (*probe) (FpDevice *device);
@@ -176,26 +168,11 @@ struct _FpDeviceClass
void (*capture) (FpDevice *device); void (*capture) (FpDevice *device);
void (*list) (FpDevice *device); void (*list) (FpDevice *device);
void (*delete) (FpDevice * device); void (*delete) (FpDevice * device);
void (*clear_storage) (FpDevice * device);
void (*cancel) (FpDevice *device); void (*cancel) (FpDevice *device);
void (*suspend) (FpDevice *device);
/* Class elements added after tod-v1 */ void (*resume) (FpDevice *device);
FpDeviceFeature features;
/* Simple device temperature model constants */
gint32 temp_hot_seconds;
gint32 temp_cold_seconds;
void (*clear_storage) (FpDevice * device);
void (*suspend) (FpDevice *device);
void (*resume) (FpDevice *device);
/*< private >*/
/* padding for future expansion */
TOD_PADDING_ALIGNED8 (32,
sizeof (FpDeviceFeature) +
sizeof (gint32) * 2 +
sizeof (gpointer) * 3);
}; };
void fpi_device_class_auto_initialize_features (FpDeviceClass *device_class); void fpi_device_class_auto_initialize_features (FpDeviceClass *device_class);
+5 -5
View File
@@ -565,7 +565,7 @@ fpi_image_device_retry_scan (FpImageDevice *self, FpDeviceRetry retry)
/** /**
* fpi_image_device_session_error: * fpi_image_device_session_error:
* @self: a #FpImageDevice imaging fingerprint device * @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 * Report an error while interacting with the device. This effectively
* aborts the current ongoing action. Note that doing so will result in * 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: * fpi_image_device_activate_complete:
* @self: a #FpImageDevice imaging fingerprint device * @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. * Reports completion of device activation.
*/ */
@@ -663,7 +663,7 @@ fpi_image_device_activate_complete (FpImageDevice *self, GError *error)
/** /**
* fpi_image_device_deactivate_complete: * fpi_image_device_deactivate_complete:
* @self: a #FpImageDevice imaging fingerprint device * @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. * Reports completion of device deactivation.
*/ */
@@ -690,7 +690,7 @@ fpi_image_device_deactivate_complete (FpImageDevice *self, GError *error)
/** /**
* fpi_image_device_open_complete: * fpi_image_device_open_complete:
* @self: a #FpImageDevice imaging fingerprint device * @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. * Reports completion of open operation.
*/ */
@@ -718,7 +718,7 @@ fpi_image_device_open_complete (FpImageDevice *self, GError *error)
/** /**
* fpi_image_device_close_complete: * fpi_image_device_close_complete:
* @self: a #FpImageDevice imaging fingerprint device * @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. * Reports completion of close operation.
*/ */
+3 -7
View File
@@ -62,12 +62,12 @@
*/ */
typedef enum { typedef enum {
FPI_IMAGE_DEVICE_STATE_INACTIVE, FPI_IMAGE_DEVICE_STATE_INACTIVE,
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON,
FPI_IMAGE_DEVICE_STATE_CAPTURE,
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF,
FPI_IMAGE_DEVICE_STATE_ACTIVATING, FPI_IMAGE_DEVICE_STATE_ACTIVATING,
FPI_IMAGE_DEVICE_STATE_DEACTIVATING, FPI_IMAGE_DEVICE_STATE_DEACTIVATING,
FPI_IMAGE_DEVICE_STATE_IDLE, FPI_IMAGE_DEVICE_STATE_IDLE,
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON,
FPI_IMAGE_DEVICE_STATE_CAPTURE,
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF,
} FpiImageDeviceState; } FpiImageDeviceState;
/** /**
@@ -114,10 +114,6 @@ struct _FpImageDeviceClass
void (*change_state) (FpImageDevice *dev, void (*change_state) (FpImageDevice *dev,
FpiImageDeviceState state); FpiImageDeviceState state);
void (*deactivate) (FpImageDevice *dev); void (*deactivate) (FpImageDevice *dev);
/*< private >*/
/* padding for future expansion */
TOD_PADDING (32, 0);
}; };
void fpi_image_device_set_bz3_threshold (FpImageDevice *self, void fpi_image_device_set_bz3_threshold (FpImageDevice *self,
-6
View File
@@ -21,11 +21,9 @@
#pragma once #pragma once
#include "fp-image.h" #include "fp-image.h"
#include "tod/tod-macros.h"
/** /**
* FpiImageFlags: * FpiImageFlags:
* @FPI_IMAGE_NONE: no flag set
* @FPI_IMAGE_V_FLIPPED: the image is vertically flipped * @FPI_IMAGE_V_FLIPPED: the image is vertically flipped
* @FPI_IMAGE_H_FLIPPED: the image is horizontally flipped * @FPI_IMAGE_H_FLIPPED: the image is horizontally flipped
* @FPI_IMAGE_COLORS_INVERTED: the colours are inverted * @FPI_IMAGE_COLORS_INVERTED: the colours are inverted
@@ -70,12 +68,8 @@ struct _FpImage
guint8 *binarized; guint8 *binarized;
GPtrArray *minutiae; GPtrArray *minutiae;
/* Unused */
guint ref_count;
gboolean detection_in_progress; gboolean detection_in_progress;
TOD_PADDING (32, sizeof (gboolean));
}; };
gint fpi_std_sq_dev (const guint8 *buf, gint fpi_std_sq_dev (const guint8 *buf,
+10 -7
View File
@@ -79,13 +79,16 @@
* *
* Uses fp_err() to print an error if the @condition is true. * Uses fp_err() to print an error if the @condition is true.
*/ */
#define BUG_ON(condition) G_STMT_START \ #define BUG_ON(condition) \
if (condition) { \ G_STMT_START \
char *s; \ if (condition) \
s = g_strconcat ("BUG: (", #condition, ")", NULL); \ { \
fp_err ("%s: %s() %s:%d", s, G_STRFUNC, __FILE__, __LINE__); \ char *s; \
g_free (s); \ s = g_strconcat ("BUG: (", #condition, ")", NULL); \
} G_STMT_END fp_err ("%s: %s() %s:%d", s, G_STRFUNC, __FILE__, __LINE__); \
g_free (s); \
} \
G_STMT_END
/** /**
* BUG: * BUG:
-3
View File
@@ -73,9 +73,6 @@ struct _FpiSpiTransfer
/* Data free function */ /* Data free function */
GDestroyNotify free_buffer_wr; GDestroyNotify free_buffer_wr;
GDestroyNotify free_buffer_rd; GDestroyNotify free_buffer_rd;
/* padding for future expansion */
TOD_PADDING (32, 0);
}; };
GType fpi_spi_transfer_get_type (void) G_GNUC_CONST; GType fpi_spi_transfer_get_type (void) G_GNUC_CONST;
-4
View File
@@ -765,7 +765,3 @@ fpi_ssm_spi_transfer_with_weak_pointer_cb (FpiSpiTransfer *transfer,
fpi_ssm_spi_transfer_cb (transfer, device, weak_ptr, error); fpi_ssm_spi_transfer_cb (transfer, device, weak_ptr, error);
} }
#ifdef TOD_LIBRARY
#include "tod/tod-fpi-ssm.c"
#endif
+1 -1
View File
@@ -60,7 +60,7 @@ typedef void (*FpiSsmHandlerCallback)(FpiSsm *ssm,
/* for library and drivers */ /* for library and drivers */
#define fpi_ssm_new(dev, handler, nr_states) \ #define fpi_ssm_new(dev, handler, nr_states) \
fpi_ssm_new_full (dev, handler, nr_states, nr_states, #nr_states) fpi_ssm_new_full (dev, handler, nr_states, nr_states, #nr_states)
FpiSsm *fpi_ssm_new_full (FpDevice *dev, FpiSsm *fpi_ssm_new_full (FpDevice *dev,
FpiSsmHandlerCallback handler, FpiSsmHandlerCallback handler,
int nr_states, int nr_states,
-3
View File
@@ -102,9 +102,6 @@ struct _FpiUsbTransfer
/* Data free function */ /* Data free function */
GDestroyNotify free_buffer; GDestroyNotify free_buffer;
/* padding for future expansion */
TOD_PADDING (32, 0);
}; };
GType fpi_usb_transfer_get_type (void) G_GNUC_CONST; GType fpi_usb_transfer_get_type (void) G_GNUC_CONST;
+107
View File
@@ -0,0 +1,107 @@
/*
* Copyright (C) 2025 Marco Trevisan <marco.trevisan@canonical.com>
*
* 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
*/
#include "glib.h"
#include "fpi-context.h"
#include "fpi-device.h"
#define METAINFO_BASE \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" \
"<component>\n" \
" <id>org.freedesktop.libfprint</id>\n" \
" <name>libfprint</name>\n" \
" <metadata_license>CC0-1.0</metadata_license>\n" \
" <project_license>LGPL-2.1-or-later</project_license>\n" \
" <url type=\"homepage\">https://fprint.freedesktop.org</url>\n" \
" <url type=\"vcs-browser\">https://gitlab.freedesktop.org/libfprint/libfprint</url>\n" \
" <url type=\"help\">https://fprint.freedesktop.org/libfprint-dev</url>\n" \
" <url type=\"bugtracker\">https://gitlab.freedesktop.org/libfprint/libfprint/-/issues</url>\n" \
" <summary>Async fingerprint readers library</summary>\n" \
" <description>\n" \
" <p>\n" \
" The fprint project aims to support for consumer fingerprint reader devices.\n" \
" </p>\n" \
" </description>\n" \
" <provides>\n" \
"%s\n" \
" </provides>\n" \
"</component>\n"
static int
driver_compare (gconstpointer p1, gconstpointer p2)
{
g_autoptr(FpDeviceClass) cls1 = g_type_class_ref (*(GType *) p1);
g_autoptr(FpDeviceClass) cls2 = g_type_class_ref (*(GType *) p2);
return g_strcmp0 (cls1->id, cls2->id);
}
static void
usb_driver_devices_append (GPtrArray *devices_list,
const FpDeviceClass *cls)
{
const FpIdEntry *entry;
if (cls->type != FP_DEVICE_TYPE_USB)
return;
for (entry = cls->id_table; entry->vid != 0; entry++)
{
if (entry->vid == 0 || entry->pid == 0)
continue;
g_ptr_array_add (devices_list,
g_strdup_printf ("v%04xp%04x", entry->vid, entry->pid));
}
}
int
main (void)
{
g_autoptr(GPtrArray) devices_list = g_ptr_array_new_with_free_func (g_free);
g_autoptr(GArray) drivers = fpi_get_driver_types ();
g_autoptr(GString) provided_modules = g_string_new (NULL);
g_autoptr(GError) error = NULL;
g_array_sort (drivers, driver_compare);
for (guint i = 0; i < drivers->len; ++i)
{
GType driver = g_array_index (drivers, GType, i);
g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver);
if (cls->type != FP_DEVICE_TYPE_USB)
continue;
usb_driver_devices_append (devices_list, cls);
}
for (guint i = 0; i < devices_list->len; ++i)
{
const char *device_id = g_ptr_array_index (devices_list, i);
g_string_append (provided_modules, " ");
g_string_append_printf (provided_modules, "<modalias>usb:%s*</modalias>",
device_id);
if (i < devices_list->len - 1)
g_string_append_c (provided_modules, '\n');
}
g_print (METAINFO_BASE, provided_modules->str);
}
+30 -2
View File
@@ -29,7 +29,10 @@ static const FpIdEntry allowlist_id_table[] = {
* You can generate this list from the wiki page using e.g.: * 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' * 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 = 0x0a5c, .pid = 0x5802 },
{ .vid = 0x047d, .pid = 0x00f2 }, { .vid = 0x047d, .pid = 0x00f2 },
{ .vid = 0x047d, .pid = 0x8054 },
{ .vid = 0x047d, .pid = 0x8055 },
{ .vid = 0x04e8, .pid = 0x730b }, { .vid = 0x04e8, .pid = 0x730b },
{ .vid = 0x04f3, .pid = 0x036b }, { .vid = 0x04f3, .pid = 0x036b },
{ .vid = 0x04f3, .pid = 0x0c00 }, { .vid = 0x04f3, .pid = 0x0c00 },
@@ -37,16 +40,25 @@ static const FpIdEntry allowlist_id_table[] = {
{ .vid = 0x04f3, .pid = 0x0c57 }, { .vid = 0x04f3, .pid = 0x0c57 },
{ .vid = 0x04f3, .pid = 0x0c5e }, { .vid = 0x04f3, .pid = 0x0c5e },
{ .vid = 0x04f3, .pid = 0x0c5a }, { .vid = 0x04f3, .pid = 0x0c5a },
{ .vid = 0x04f3, .pid = 0x0c60 },
{ .vid = 0x04f3, .pid = 0x0c6c }, { .vid = 0x04f3, .pid = 0x0c6c },
{ .vid = 0x04f3, .pid = 0x0c70 }, { .vid = 0x04f3, .pid = 0x0c70 },
{ .vid = 0x04f3, .pid = 0x0c72 }, { .vid = 0x04f3, .pid = 0x0c72 },
{ .vid = 0x04f3, .pid = 0x0c77 }, { .vid = 0x04f3, .pid = 0x0c77 },
{ .vid = 0x04f3, .pid = 0x0c7c },
{ .vid = 0x04f3, .pid = 0x0c7f },
{ .vid = 0x04f3, .pid = 0x0c80 },
{ .vid = 0x04f3, .pid = 0x0c85 },
{ .vid = 0x04f3, .pid = 0x0c90 },
{ .vid = 0x04f3, .pid = 0x2706 }, { .vid = 0x04f3, .pid = 0x2706 },
{ .vid = 0x04f3, .pid = 0x3032 }, { .vid = 0x04f3, .pid = 0x3032 },
{ .vid = 0x04f3, .pid = 0x3057 }, { .vid = 0x04f3, .pid = 0x3057 },
{ .vid = 0x04f3, .pid = 0x3104 }, { .vid = 0x04f3, .pid = 0x3104 },
{ .vid = 0x04f3, .pid = 0x310d }, { .vid = 0x04f3, .pid = 0x310d },
{ .vid = 0x04f3, .pid = 0x3128 }, { .vid = 0x04f3, .pid = 0x3128 },
{ .vid = 0x04f3, .pid = 0x0c8a },
{ .vid = 0x05ba, .pid = 0x000e },
{ .vid = 0x06cb, .pid = 0x0051 },
{ .vid = 0x06cb, .pid = 0x0081 }, { .vid = 0x06cb, .pid = 0x0081 },
{ .vid = 0x06cb, .pid = 0x0088 }, { .vid = 0x06cb, .pid = 0x0088 },
{ .vid = 0x06cb, .pid = 0x008a }, { .vid = 0x06cb, .pid = 0x008a },
@@ -57,7 +69,6 @@ static const FpIdEntry allowlist_id_table[] = {
{ .vid = 0x06cb, .pid = 0x00b7 }, { .vid = 0x06cb, .pid = 0x00b7 },
{ .vid = 0x06cb, .pid = 0x00bb }, { .vid = 0x06cb, .pid = 0x00bb },
{ .vid = 0x06cb, .pid = 0x00be }, { .vid = 0x06cb, .pid = 0x00be },
{ .vid = 0x06cb, .pid = 0x00c4 },
{ .vid = 0x06cb, .pid = 0x00cb }, { .vid = 0x06cb, .pid = 0x00cb },
{ .vid = 0x06cb, .pid = 0x00c9 }, { .vid = 0x06cb, .pid = 0x00c9 },
{ .vid = 0x06cb, .pid = 0x00d8 }, { .vid = 0x06cb, .pid = 0x00d8 },
@@ -65,8 +76,8 @@ static const FpIdEntry allowlist_id_table[] = {
{ .vid = 0x06cb, .pid = 0x00dc }, { .vid = 0x06cb, .pid = 0x00dc },
{ .vid = 0x06cb, .pid = 0x00e4 }, { .vid = 0x06cb, .pid = 0x00e4 },
{ .vid = 0x06cb, .pid = 0x00e7 }, { .vid = 0x06cb, .pid = 0x00e7 },
{ .vid = 0x06cb, .pid = 0x00e9 },
{ .vid = 0x06cb, .pid = 0x00fd }, { .vid = 0x06cb, .pid = 0x00fd },
{ .vid = 0x06cb, .pid = 0x00ff },
{ .vid = 0x0a5c, .pid = 0x5801 }, { .vid = 0x0a5c, .pid = 0x5801 },
{ .vid = 0x0a5c, .pid = 0x5805 }, { .vid = 0x0a5c, .pid = 0x5805 },
{ .vid = 0x0a5c, .pid = 0x5834 }, { .vid = 0x0a5c, .pid = 0x5834 },
@@ -76,10 +87,18 @@ static const FpIdEntry allowlist_id_table[] = {
{ .vid = 0x0a5c, .pid = 0x5843 }, { .vid = 0x0a5c, .pid = 0x5843 },
{ .vid = 0x0a5c, .pid = 0x5844 }, { .vid = 0x0a5c, .pid = 0x5844 },
{ .vid = 0x0a5c, .pid = 0x5845 }, { .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 = 0x0bda, .pid = 0x5812 },
{ .vid = 0x10a5, .pid = 0x0007 }, { .vid = 0x10a5, .pid = 0x0007 },
{ .vid = 0x10a5, .pid = 0x9200 }, { .vid = 0x10a5, .pid = 0x9200 },
{ .vid = 0x10a5, .pid = 0x9800 }, { .vid = 0x10a5, .pid = 0x9800 },
{ .vid = 0x10a5, .pid = 0xa120 },
{ .vid = 0x10a5, .pid = 0xa900 },
{ .vid = 0x10a5, .pid = 0xe340 }, { .vid = 0x10a5, .pid = 0xe340 },
{ .vid = 0x1188, .pid = 0x9545 }, { .vid = 0x1188, .pid = 0x9545 },
{ .vid = 0x138a, .pid = 0x0007 }, { .vid = 0x138a, .pid = 0x0007 },
@@ -101,6 +120,9 @@ static const FpIdEntry allowlist_id_table[] = {
{ .vid = 0x1c7a, .pid = 0x0575 }, { .vid = 0x1c7a, .pid = 0x0575 },
{ .vid = 0x1c7a, .pid = 0x0576 }, { .vid = 0x1c7a, .pid = 0x0576 },
{ .vid = 0x1c7a, .pid = 0x0577 }, { .vid = 0x1c7a, .pid = 0x0577 },
{ .vid = 0x1c7a, .pid = 0x057e },
{ .vid = 0x2541, .pid = 0x0236 },
{ .vid = 0x2541, .pid = 0x9711 },
{ .vid = 0x27c6, .pid = 0x5042 }, { .vid = 0x27c6, .pid = 0x5042 },
{ .vid = 0x27c6, .pid = 0x5110 }, { .vid = 0x27c6, .pid = 0x5110 },
{ .vid = 0x27c6, .pid = 0x5117 }, { .vid = 0x27c6, .pid = 0x5117 },
@@ -129,11 +151,17 @@ static const FpIdEntry allowlist_id_table[] = {
{ .vid = 0x27c6, .pid = 0x5e0a }, { .vid = 0x27c6, .pid = 0x5e0a },
{ .vid = 0x27c6, .pid = 0x581a }, { .vid = 0x27c6, .pid = 0x581a },
{ .vid = 0x27c6, .pid = 0x589a }, { .vid = 0x27c6, .pid = 0x589a },
{ .vid = 0x27c6, .pid = 0x5f10 },
{ .vid = 0x27c6, .pid = 0x6382 }, { .vid = 0x27c6, .pid = 0x6382 },
{ .vid = 0x2808, .pid = 0x9338 }, { .vid = 0x2808, .pid = 0x9338 },
{ .vid = 0x2808, .pid = 0x9348 },
{ .vid = 0x2808, .pid = 0x93a9 }, { .vid = 0x2808, .pid = 0x93a9 },
{ .vid = 0x2808, .pid = 0xa658 },
{ .vid = 0x2808, .pid = 0xc652 },
{ .vid = 0x298d, .pid = 0x2020 }, { .vid = 0x298d, .pid = 0x2020 },
{ .vid = 0x298d, .pid = 0x2033 }, { .vid = 0x298d, .pid = 0x2033 },
{ .vid = 0x2df0, .pid = 0x0003 },
{ .vid = 0x3274, .pid = 0x8012 },
{ .vid = 0x3538, .pid = 0x0930 }, { .vid = 0x3538, .pid = 0x0930 },
{ .vid = 0 }, { .vid = 0 },
}; };
+34 -11
View File
@@ -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 = [ libfprint_sources = [
'fp-context.c', 'fp-context.c',
'fp-device.c', 'fp-device.c',
@@ -16,8 +24,7 @@ libfprint_private_sources = [
'fpi-print.c', 'fpi-print.c',
'fpi-ssm.c', 'fpi-ssm.c',
'fpi-usb-transfer.c', 'fpi-usb-transfer.c',
'fpi-spi-transfer.c', ] + spi_sources
]
libfprint_public_headers = [ libfprint_public_headers = [
'fp-context.h', 'fp-context.h',
@@ -41,9 +48,8 @@ libfprint_private_headers = [
'fpi-minutiae.h', 'fpi-minutiae.h',
'fpi-print.h', 'fpi-print.h',
'fpi-usb-transfer.h', 'fpi-usb-transfer.h',
'fpi-spi-transfer.h',
'fpi-ssm.h', 'fpi-ssm.h',
] ] + spi_headers
nbis_sources = [ nbis_sources = [
'nbis/bozorth3/bozorth3.c', 'nbis/bozorth3/bozorth3.c',
@@ -156,7 +162,7 @@ helper_sources = {
[ 'drivers/aesx660.c' ], [ 'drivers/aesx660.c' ],
'aes3k' : 'aes3k' :
[ 'drivers/aes3k.c' ], [ 'drivers/aes3k.c' ],
'nss' : 'openssl' :
[ ], [ ],
'udev' : 'udev' :
[ ], [ ],
@@ -261,10 +267,6 @@ libfprint_private = static_library('fprint-private',
link_with: libnbis, link_with: libnbis,
install: false) install: false)
if get_option('tod')
subdir('tod')
endif
libfprint_drivers = static_library('fprint-drivers', libfprint_drivers = static_library('fprint-drivers',
sources: drivers_sources, sources: drivers_sources,
c_args: drivers_cflags, c_args: drivers_cflags,
@@ -272,8 +274,13 @@ libfprint_drivers = static_library('fprint-drivers',
link_with: libfprint_private, link_with: libfprint_private,
install: false) install: false)
mapfile = files('libfprint.ver') mapfile = files('libfprint.ver')[0]
vflag = '-Wl,--version-script,@0@/@1@'.format(meson.project_source_root(), mapfile[0]) if meson.version().version_compare('>=1.4')
mapfile_path = mapfile.full_path()
else
mapfile_path = meson.project_source_root() / '@0@'.format(mapfile)
endif
vflag = '-Wl,--version-script,@0@'.format(mapfile_path)
libfprint = shared_library(versioned_libname.split('lib')[1], libfprint = shared_library(versioned_libname.split('lib')[1],
sources: [ sources: [
@@ -325,6 +332,21 @@ udev_hwdb_generator = custom_target('udev-hwdb',
install: false, install: false,
) )
metainfo = executable('fprint-list-metainfo',
'fprint-list-metainfo.c',
dependencies: libfprint_private_dep,
link_with: libfprint_drivers,
install: false)
metainfo_generator = custom_target('metainfo',
output: 'org.freedesktop.libfprint.metainfo.xml',
depend_files: drivers_sources,
capture: true,
command: [ metainfo ],
install: true,
install_dir: datadir / 'metainfo'
)
if install_udev_rules if install_udev_rules
udev_rules = executable('fprint-list-udev-rules', udev_rules = executable('fprint-list-udev-rules',
'fprint-list-udev-rules.c', 'fprint-list-udev-rules.c',
@@ -388,6 +410,7 @@ if get_option('introspection')
'GObject-2.0', 'GObject-2.0',
'GUsb-1.0', 'GUsb-1.0',
], ],
fatal_warnings: true,
install : true) install : true)
libfprint_gir = libfprint_girtarget[0] libfprint_gir = libfprint_girtarget[0]
libfprint_typelib = libfprint_girtarget[1] libfprint_typelib = libfprint_girtarget[1]
-251
View File
@@ -1,251 +0,0 @@
LIBFPRINT_TOD_@tod_soversion@.0.0 {
global:
fpi_assemble_frames;
fpi_assemble_lines;
fpi_byte_reader_dup_data;
fpi_byte_reader_dup_string_utf16;
fpi_byte_reader_dup_string_utf32;
fpi_byte_reader_dup_string_utf8;
fpi_byte_reader_free;
fpi_byte_reader_get_data;
fpi_byte_reader_get_float32_be;
fpi_byte_reader_get_float32_le;
fpi_byte_reader_get_float64_be;
fpi_byte_reader_get_float64_le;
fpi_byte_reader_get_int16_be;
fpi_byte_reader_get_int16_le;
fpi_byte_reader_get_int24_be;
fpi_byte_reader_get_int24_le;
fpi_byte_reader_get_int32_be;
fpi_byte_reader_get_int32_le;
fpi_byte_reader_get_int64_be;
fpi_byte_reader_get_int64_le;
fpi_byte_reader_get_int8;
fpi_byte_reader_get_pos;
fpi_byte_reader_get_remaining;
fpi_byte_reader_get_size;
fpi_byte_reader_get_string_utf8;
fpi_byte_reader_get_sub_reader;
fpi_byte_reader_get_uint16_be;
fpi_byte_reader_get_uint16_le;
fpi_byte_reader_get_uint24_be;
fpi_byte_reader_get_uint24_le;
fpi_byte_reader_get_uint32_be;
fpi_byte_reader_get_uint32_le;
fpi_byte_reader_get_uint64_be;
fpi_byte_reader_get_uint64_le;
fpi_byte_reader_get_uint8;
fpi_byte_reader_init;
fpi_byte_reader_masked_scan_uint32;
fpi_byte_reader_masked_scan_uint32_peek;
fpi_byte_reader_new;
fpi_byte_reader_peek_data;
fpi_byte_reader_peek_float32_be;
fpi_byte_reader_peek_float32_le;
fpi_byte_reader_peek_float64_be;
fpi_byte_reader_peek_float64_le;
fpi_byte_reader_peek_int16_be;
fpi_byte_reader_peek_int16_le;
fpi_byte_reader_peek_int24_be;
fpi_byte_reader_peek_int24_le;
fpi_byte_reader_peek_int32_be;
fpi_byte_reader_peek_int32_le;
fpi_byte_reader_peek_int64_be;
fpi_byte_reader_peek_int64_le;
fpi_byte_reader_peek_int8;
fpi_byte_reader_peek_string_utf8;
fpi_byte_reader_peek_sub_reader;
fpi_byte_reader_peek_uint16_be;
fpi_byte_reader_peek_uint16_le;
fpi_byte_reader_peek_uint24_be;
fpi_byte_reader_peek_uint24_le;
fpi_byte_reader_peek_uint32_be;
fpi_byte_reader_peek_uint32_le;
fpi_byte_reader_peek_uint64_be;
fpi_byte_reader_peek_uint64_le;
fpi_byte_reader_peek_uint8;
fpi_byte_reader_set_pos;
fpi_byte_reader_skip;
fpi_byte_reader_skip_string_utf16;
fpi_byte_reader_skip_string_utf32;
fpi_byte_reader_skip_string_utf8;
fpi_byte_writer_ensure_free_space;
fpi_byte_writer_fill;
fpi_byte_writer_free;
fpi_byte_writer_free_and_get_data;
fpi_byte_writer_get_remaining;
fpi_byte_writer_init;
fpi_byte_writer_init_with_data;
fpi_byte_writer_init_with_size;
fpi_byte_writer_new;
fpi_byte_writer_new_with_data;
fpi_byte_writer_new_with_size;
fpi_byte_writer_put_data;
fpi_byte_writer_put_float32_be;
fpi_byte_writer_put_float32_le;
fpi_byte_writer_put_float64_be;
fpi_byte_writer_put_float64_le;
fpi_byte_writer_put_int16_be;
fpi_byte_writer_put_int16_le;
fpi_byte_writer_put_int24_be;
fpi_byte_writer_put_int24_le;
fpi_byte_writer_put_int32_be;
fpi_byte_writer_put_int32_le;
fpi_byte_writer_put_int64_be;
fpi_byte_writer_put_int64_le;
fpi_byte_writer_put_int8;
fpi_byte_writer_put_string_utf16;
fpi_byte_writer_put_string_utf32;
fpi_byte_writer_put_string_utf8;
fpi_byte_writer_put_uint16_be;
fpi_byte_writer_put_uint16_le;
fpi_byte_writer_put_uint24_be;
fpi_byte_writer_put_uint24_le;
fpi_byte_writer_put_uint32_be;
fpi_byte_writer_put_uint32_le;
fpi_byte_writer_put_uint64_be;
fpi_byte_writer_put_uint64_le;
fpi_byte_writer_put_uint8;
fpi_byte_writer_reset;
fpi_byte_writer_reset_and_get_data;
fpi_device_action_error;
fpi_device_action_get_type;
fpi_device_action_is_cancelled;
fpi_device_add_timeout;
fpi_device_capture_complete;
fpi_device_close_complete;
fpi_device_configure_wakeup;
fpi_device_delete_complete;
fpi_device_enroll_complete;
fpi_device_enroll_progress;
fpi_device_error_new;
fpi_device_error_new_msg;
fpi_device_get_cancellable;
fpi_device_get_capture_data;
fpi_device_get_current_action;
fpi_device_get_delete_data;
fpi_device_get_driver_data;
fpi_device_get_enroll_data;
fpi_device_get_identify_data;
fpi_device_get_usb_device;
fpi_device_get_verify_data;
fpi_device_get_virtual_env;
fpi_device_identify_complete;
fpi_device_identify_report;
fpi_device_list_complete;
fpi_device_open_complete;
fpi_device_probe_complete;
fpi_device_remove;
fpi_device_report_finger_status;
fpi_device_report_finger_status_changes;
fpi_device_retry_new;
fpi_device_retry_new_msg;
fpi_device_set_nr_enroll_stages;
fpi_device_set_scan_type;
fpi_device_udev_subtype_flags_get_type;
fpi_device_update_temp;
fpi_device_verify_complete;
fpi_device_verify_report;
fpi_do_movement_estimation;
fpi_image_device_activate;
fpi_image_device_activate_complete;
fpi_image_device_close_complete;
fpi_image_device_deactivate;
fpi_image_device_deactivate_complete;
fpi_image_device_image_captured;
fpi_image_device_open_complete;
fpi_image_device_report_finger_status;
fpi_image_device_retry_scan;
fpi_image_device_session_error;
fpi_image_device_set_bz3_threshold;
fpi_image_device_state_get_type;
fpi_image_flags_get_type;
fpi_image_resize;
fpi_match_result_get_type;
fpi_mean_sq_diff_norm;
fpi_print_add_from_image;
fpi_print_add_print;
fpi_print_bz3_match;
fpi_print_fill_from_user_id;
fpi_print_generate_user_id;
fpi_print_set_device_stored;
fpi_print_set_type;
fpi_print_type_get_type;
fpi_ssm_cancel_delayed_state_change;
fpi_ssm_dup_error;
fpi_ssm_free;
fpi_ssm_get_cur_state;
fpi_ssm_get_data;
fpi_ssm_get_error;
fpi_ssm_jump_to_state;
fpi_ssm_jump_to_state_delayed;
fpi_ssm_jump_to_state_delayed_1_90;
fpi_ssm_mark_completed;
fpi_ssm_mark_completed_delayed;
fpi_ssm_mark_completed_delayed_1_90;
fpi_ssm_mark_failed;
fpi_ssm_new_full;
fpi_ssm_new_full_1_90;
fpi_ssm_next_state;
fpi_ssm_next_state_delayed;
fpi_ssm_next_state_delayed_1_90;
fpi_ssm_set_data;
fpi_ssm_start;
fpi_ssm_start_subsm;
fpi_ssm_usb_transfer_cb;
fpi_ssm_usb_transfer_with_weak_pointer_cb;
fpi_std_sq_dev;
fpi_transfer_type_get_type;
fpi_usb_transfer_fill_bulk;
fpi_usb_transfer_fill_bulk_full;
fpi_usb_transfer_fill_control;
fpi_usb_transfer_fill_interrupt;
fpi_usb_transfer_fill_interrupt_full;
fpi_usb_transfer_get_type;
fpi_usb_transfer_new;
fpi_usb_transfer_ref;
fpi_usb_transfer_submit;
fpi_usb_transfer_submit_sync;
fpi_usb_transfer_unref;
local:
*;
};
LIBFPRINT_TOD_@tod_soversion@_1.92 {
global:
fpi_device_class_auto_initialize_features;
fpi_device_clear_storage_complete;
fpi_device_get_udev_data;
fpi_device_update_features;
fpi_spi_transfer_get_type;
fpi_spi_transfer_new;
fpi_spi_transfer_read;
fpi_spi_transfer_read_full;
fpi_spi_transfer_ref;
fpi_spi_transfer_submit;
fpi_spi_transfer_submit_sync;
fpi_spi_transfer_unref;
fpi_spi_transfer_write;
fpi_spi_transfer_write_full;
fpi_ssm_get_device;
fpi_ssm_jump_to_state_delayed;
fpi_ssm_mark_completed_delayed;
fpi_ssm_new_full;
fpi_ssm_next_state_delayed;
fpi_ssm_spi_transfer_cb;
fpi_ssm_spi_transfer_with_weak_pointer_cb;
} LIBFPRINT_TOD_@tod_soversion@.0.0;
LIBFPRINT_TOD_@tod_soversion@_1.94 {
global:
fpi_device_critical_enter;
fpi_device_critical_leave;
fpi_device_resume;
fpi_device_resume_complete;
fpi_device_suspend;
fpi_device_suspend_complete;
fpi_ssm_silence_debug;
/* Keep this always in the current development version */
fpi_*;
} LIBFPRINT_TOD_@tod_soversion@_1.92;
-111
View File
@@ -1,111 +0,0 @@
tod_soversion = 1
tod_subpath = versioned_libname / 'tod-@0@'.format(tod_soversion)
tod_modules_prefix = get_option('libdir') / tod_subpath
tod_conf = configuration_data()
tod_conf.set_quoted('TOD_DRIVERS_DIR',
get_option('prefix') / get_option('libdir') / tod_subpath)
configure_file(output: 'tod-config.h', configuration: tod_conf)
gmodule_dep = dependency('gmodule-2.0', version: '>=' + glib_min_version)
deps += gmodule_dep
mapfile = configure_file(input: 'libfprint-tod.ver.in',
output: 'libfprint-tod.ver',
configuration: {
'tod_soversion' : tod_soversion,
})
libfprint_tod_private = static_library('fprint-tod-private',
sources: [
'tod-shared-loader.c',
'tod-goodix-wrapper.c',
],
include_directories: include_directories('..'),
link_with: libfprint_private,
dependencies: deps,
install: false,
)
tod_sources = [
'tod-wrappers.c',
'tod-symbols.h',
]
foreach source: libfprint_private_sources
tod_sources += '..' / source
endforeach
libfprint_tod = shared_library(versioned_libname.split('lib')[1] + '-tod',
c_args: [
'-DTOD_LIBRARY=1',
'-include', '@0@'.format(files('tod-symbols.h')[0]),
],
sources: [
tod_sources,
],
soversion: tod_soversion,
include_directories: include_directories('..'),
link_args: [
'-Wl,--version-script,@0@'.format(mapfile),
'-Wl,--unresolved-symbols=ignore-in-object-files'
],
link_depends: mapfile,
link_whole: [libfprint_tod_private],
dependencies: deps,
install: true)
tod_dep = declare_dependency(
link_with: [
libfprint_tod,
libfprint_tod_private,
])
deps += tod_dep
pkgconfig = import('pkgconfig')
pkgconfig.generate(libfprint_tod,
name: versioned_libname + '-tod',
filebase: '@0@-tod-@1@'.format(versioned_libname, tod_soversion),
description: 'Private Libfprint Touch Drivers API',
version: meson.project_version() + '+tod@0@'.format(tod_soversion),
subdirs: tod_subpath,
requires_private: [
versioned_libname,
gusb_dep,
],
variables: [
'tod_driversdir=${libdir}/@0@'.format(tod_subpath)
]
)
tod_local_headers = [
'tod-macros.h',
]
tod_headers = []
extra_libfprint_headers = [
'drivers_api.h',
]
foreach header: libfprint_private_headers + extra_libfprint_headers
tod_headers += '..' / header
endforeach
custom_target('tod_fpi_enums_headers',
depends: fpi_enums,
input: fpi_enums_h,
output: 'fpi-enums.h',
command: ['cp', '@INPUT@', '-v', '@OUTPUT@'],
install: true,
install_dir: get_option('includedir') / tod_subpath)
install_headers(tod_headers,
subdir: tod_subpath
)
install_headers(tod_local_headers,
subdir: tod_subpath / 'tod',
)
# Replace the libfprint private instance with the TOD one in this case as we
# contain already all the symbols.
libfprint_private = libfprint_tod
@@ -1,65 +0,0 @@
#!/bin/bash
library1=$1
library2=$2
function cleanup_results() {
grep -F -w '.text' | cut -s -f2 | awk '{print $(NF)}'
}
function dump_exported_symbols() {
objdump -TC "$1" | cleanup_results
}
function dump_defined_symbols() {
objdump -t "$1" | cleanup_results
}
function in_array() {
local target=$1
shift
local i;
for i in "$@"; do
if [[ "$i" == "$target" ]]; then
return 0
fi
done
return 1
}
function is_fatal() {
if [[ "$1" == "fp_"* ]] || [[ "$1" == "fpi_"* ]]; then
return 0
fi
return 1
}
lib1_exported=($(dump_exported_symbols "$library1"))
lib2_exported=($(dump_exported_symbols "$library2"))
lib1_defined=("$(dump_defined_symbols "$library1")")
lib2_defined=("$(dump_defined_symbols "$library2")")
valid=true
for f in ${lib1_exported[*]}; do
if in_array "$f" ${lib2_exported[*]}; then
echo "$f function exported in both $library1 and $library2"
if is_fatal "$f"; then
valid=false
fi
fi
done
for f in ${lib1_defined[*]}; do
if in_array "$f" ${lib2_defined[*]}; then
echo "$f function defined in both $library1 and $library2"
if is_fatal "$f"; then
valid=false
fi
fi
done
[[ "$valid" == true ]] && exit 0
-67
View File
@@ -1,67 +0,0 @@
/*
* Shared library loader for libfprint
* Copyright (C) 2021 Marco Trevisan <marco.trevisan@canonical.com>
*
* 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
*/
#include "tod-wrappers.h"
#include "fpi-ssm.h"
static gboolean
check_delayed_cancellable (FpiSsm *machine,
GCancellable *cancellable)
{
if (g_cancellable_is_cancelled (cancellable))
{
fpi_ssm_mark_failed (machine, g_error_new (G_IO_ERROR,
G_IO_ERROR_CANCELLED,
"Action cancelled"));
return FALSE;
}
if (cancellable)
fp_err ("GCancellable in SSM Delayed actions is ignored as per libfprint 1.92");
return TRUE;
}
void
fpi_ssm_next_state_delayed_1_90 (FpiSsm *machine,
int delay,
GCancellable *cancellable)
{
if (check_delayed_cancellable (machine, cancellable))
fpi_ssm_next_state_delayed (machine, delay);
}
void
fpi_ssm_jump_to_state_delayed_1_90 (FpiSsm *machine,
int state,
int delay,
GCancellable *cancellable)
{
if (check_delayed_cancellable (machine, cancellable))
fpi_ssm_jump_to_state_delayed (machine, state, delay);
}
void
fpi_ssm_mark_completed_delayed_1_90 (FpiSsm *machine,
int delay,
GCancellable *cancellable)
{
if (check_delayed_cancellable (machine, cancellable))
fpi_ssm_mark_completed_delayed (machine, delay);
}
-56
View File
@@ -1,56 +0,0 @@
/*
* Shared library loader for libfprint
* Copyright (C) 2022 Marco Trevisan <marco.trevisan@canonical.com>
*
* 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
*/
#include "fp-device-private.h"
#include "fpi-device.h"
#define FP_COMPONENT "tod"
#include "tod-goodix-wrapper.h"
static void (*goodix_moc_identify)(FpDevice *) = NULL;
static void
goodix_tod_identify_wrapper (FpDevice *device)
{
GPtrArray *prints;
fpi_device_get_identify_data (device, &prints);
if (prints->len)
return goodix_moc_identify (device);
g_warning ("%s does not support identify with empty gallery, let's skip it",
fp_device_get_name (device));
fpi_device_identify_report (device, NULL, NULL, NULL);
fpi_device_identify_complete (device, NULL);
}
void
goodix_tod_wrapper_init (FpDeviceClass *device_class)
{
g_assert (g_strcmp0 (device_class->id, "goodix-tod") == 0);
g_assert (goodix_moc_identify == NULL);
g_message ("Creating TOD wrapper for %s (%s) driver",
device_class->id, device_class->full_name);
goodix_moc_identify = device_class->identify;
device_class->identify = goodix_tod_identify_wrapper;
}

Some files were not shown because too many files have changed in this diff Show More