From c45781cf1799bc9420c524de3e9a1fedaed1f894 Mon Sep 17 00:00:00 2001 From: Jason Huang Date: Thu, 18 Jun 2026 17:00:58 +0800 Subject: [PATCH] egis_etu905: support template update after identify/verify Add IDENTIFY_SEND_CANCEL_RESULT state to send cancel command after identify/verify completes, triggering firmware template update. Implement cancel() callback for enroll and identify/verify cancellation. Updated umockdev test data to cover the new flow. --- libfprint/drivers/egismoc/egis_etu905.c | 54 +++++++++++++++++ libfprint/drivers/egismoc/egis_etu905.h | 6 ++ tests/egis_etu905/custom.pcapng | Bin 33644 -> 34732 bytes tests/egis_etu905/custom.py | 30 +++++++++- tests/egis_etu905/device | 76 ++++++++++++------------ 5 files changed, 127 insertions(+), 39 deletions(-) diff --git a/libfprint/drivers/egismoc/egis_etu905.c b/libfprint/drivers/egismoc/egis_etu905.c index 44aa95a5..8250dc4c 100644 --- a/libfprint/drivers/egismoc/egis_etu905.c +++ b/libfprint/drivers/egismoc/egis_etu905.c @@ -70,6 +70,11 @@ typedef struct egis_etu905_enroll_print int stage; } EnrollPrint; +static void egis_etu905_identify_send_cancel_result_cb (FpDevice *device, + guchar *buffer_in, + gsize length_in, + GError *error); + static void egis_etu905_finger_on_sensor_cb (FpiUsbTransfer *transfer, FpDevice *device, @@ -1277,6 +1282,24 @@ egis_etu905_identify_check_cb (FpDevice *device, fpi_ssm_next_state (self->task_ssm); } +static void +egis_etu905_identify_send_cancel_result_cb (FpDevice *device, + guchar *buffer_in, + gsize length_in, + GError *error) +{ + FpiDeviceEgisEtu905 *self = FPI_DEVICE_EGIS_ETU905 (device); + + if (error) + { + fpi_ssm_mark_failed (self->task_ssm, error); + return; + } + + /* Advance to complete state */ + fpi_ssm_next_state (self->task_ssm); +} + static void egis_etu905_identify_run_state (FpiSsm *ssm, FpDevice *device) @@ -1328,6 +1351,13 @@ egis_etu905_identify_run_state (FpiSsm *ssm, egis_etu905_identify_check_cb); break; + case IDENTIFY_SEND_CANCEL_RESULT: + egis_etu905_exec_cmd (device, + cmd_identify_cancel_result, + G_N_ELEMENTS (cmd_identify_cancel_result), + egis_etu905_identify_send_cancel_result_cb); + break; + case IDENTIFY_COMPLETE_SENSOR_RESET: egis_etu905_exec_cmd (device, cmd_sensor_reset, G_N_ELEMENTS (cmd_sensor_reset), egis_etu905_task_ssm_next_state_cb); @@ -1599,6 +1629,29 @@ egis_etu905_close (FpDevice *device) fpi_device_close_complete (device, g_steal_pointer (&error)); } +static void +egis_etu905_cancel (FpDevice *device) +{ + FpiDeviceAction action = fpi_device_get_current_action (device); + + fp_dbg ("Cancelling action %d", action); + + if (action == FPI_DEVICE_ACTION_ENROLL) + { + egis_etu905_exec_cmd (device, + cmd_enroll_discard, + G_N_ELEMENTS (cmd_enroll_discard), + NULL); + } + else if (action == FPI_DEVICE_ACTION_IDENTIFY) + { + egis_etu905_exec_cmd (device, + cmd_identify_cancel, + G_N_ELEMENTS (cmd_identify_cancel), + NULL); + } +} + static void fpi_device_egis_etu905_init (FpiDeviceEgisEtu905 *self) { @@ -1622,6 +1675,7 @@ fpi_device_egis_etu905_class_init (FpiDeviceEgisEtu905Class *klass) dev_class->probe = egis_etu905_probe; dev_class->open = egis_etu905_open; dev_class->close = egis_etu905_close; + dev_class->cancel = egis_etu905_cancel; dev_class->identify = egis_etu905_identify; dev_class->enroll = egis_etu905_enroll; dev_class->delete = egis_etu905_delete; diff --git a/libfprint/drivers/egismoc/egis_etu905.h b/libfprint/drivers/egismoc/egis_etu905.h index 4a73757c..c4403478 100644 --- a/libfprint/drivers/egismoc/egis_etu905.h +++ b/libfprint/drivers/egismoc/egis_etu905.h @@ -82,6 +82,8 @@ static const guchar rsp_identify_match_suffix[] = {0x90, 0x00}; static const guchar rsp_identify_notmatch_suffix[] = {0x90, 0x04}; static const guchar cmd_enroll_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x01, 0x00, 0x00, 0x00, 0x20}; +static const guchar cmd_enroll_discard[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x04, 0x00, 0x00, 0x00, 0x20}; + static const guchar cmd_sensor_start_capture[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x16, 0x02, 0x01}; @@ -97,6 +99,9 @@ static const guchar rsp_read_dirty_prefix[] = {0x00, 0x00, 0x00, 0x02, 0x64}; static const guchar cmd_commit_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x05, 0x00, 0x00, 0x00, 0x20}; +static const guchar cmd_identify_cancel[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x04, 0x01, 0x00}; +static const guchar cmd_identify_cancel_result[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x04, 0x02, 0x00}; + /* prefixes/suffixes and other things for dynamically created command payloads */ #define EGIS_ETU905_CHECK_BYTES_LENGTH 2 @@ -136,6 +141,7 @@ typedef enum { IDENTIFY_WAIT_FINGER, IDENTIFY_SENSOR_CHECK, IDENTIFY_CHECK, + IDENTIFY_SEND_CANCEL_RESULT, IDENTIFY_COMPLETE_SENSOR_RESET, IDENTIFY_COMPLETE, IDENTIFY_STATES, diff --git a/tests/egis_etu905/custom.pcapng b/tests/egis_etu905/custom.pcapng index b21c4622a1b5b44f25065882cff3d3e2687d76d1..19541d59a6c6010f5a56e2009589fb2305681ec3 100644 GIT binary patch literal 34732 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 diff --git a/tests/egis_etu905/custom.py b/tests/egis_etu905/custom.py index a842f26e..39f83b8d 100644 --- a/tests/egis_etu905/custom.py +++ b/tests/egis_etu905/custom.py @@ -5,7 +5,7 @@ import sys import gi gi.require_version('FPrint', '2.0') -from gi.repository import FPrint, GLib +from gi.repository import FPrint, GLib, Gio # Exit with error on any exception, included those happening in async callbacks sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1)) @@ -64,6 +64,34 @@ prints2 = len(stored) print(f"--- LIST DONE: Found {prints2} prints after enroll---") assert (prints2 - prints1) == 1 +# Cancel test - start async identify and cancel it +print("--- TESTING CANCELLATION ---") +deserialized_prints = [] +for sp in stored: + deserialized_prints.append(FPrint.Print.deserialize(sp.serialize())) + +cancellable = Gio.Cancellable() +identify_cancelled = False +cancel_result = None + +def identify_cancelled_cb(dev, res): + global identify_cancelled, cancel_result + identify_cancelled = True + try: + result = dev.identify_finish(res) + cancel_result = result + except Exception as e: + cancel_result = e + print(f"Identify cancelled with error: {e}") + +d.identify(deserialized_prints, cancellable=cancellable, callback=identify_cancelled_cb) +cancellable.cancel() + +while not identify_cancelled: + ctx.iteration(True) +print(f"--- CANCELLATION TEST DONE, result: {cancel_result} ---") +del deserialized_prints + # Verify print("--- VERIFYING ---") assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE diff --git a/tests/egis_etu905/device b/tests/egis_etu905/device index 4b750a79..8cc1d7f2 100644 --- a/tests/egis_etu905/device +++ b/tests/egis_etu905/device @@ -1,8 +1,8 @@ P: /devices/pci0000:00/0000:00:08.1/0000:05:00.4/usb3/3-3 -N: bus/usb/003/002=12010002FF0000407A1CAE0542530102030109022700010100A0320904000003FFFFFF00070581024000000705020240000007058303400001 +N: bus/usb/003/005=12010002FF0000407A1CAE0545530102030109022700010100A0320904000003FFFFFF00070581024000000705020240000007058303400001 E: BUSNUM=003 -E: DEVNAME=/dev/bus/usb/003/002 -E: DEVNUM=002 +E: DEVNAME=/dev/bus/usb/003/005 +E: DEVNUM=005 E: DEVTYPE=usb_device E: DRIVER=usb E: ID_BUS=usb @@ -12,14 +12,14 @@ E: ID_MODEL_ID=05ae E: ID_PATH=pci-0000:05:00.4-usb-0:3 E: ID_PATH_TAG=pci-0000_05_00_4-usb-0_3 E: ID_PATH_WITH_USB_REVISION=pci-0000:05:00.4-usbv2-0:3 -E: ID_REVISION=5342 +E: ID_REVISION=5345 E: ID_SERIAL=EGIS_ETU905Axx-E_0A8606PNA357 E: ID_SERIAL_SHORT=0A8606PNA357 E: ID_USB_INTERFACES=:ffffff: E: ID_USB_MODEL=ETU905Axx-E E: ID_USB_MODEL_ENC=ETU905Axx-E E: ID_USB_MODEL_ID=05ae -E: ID_USB_REVISION=5342 +E: ID_USB_REVISION=5345 E: ID_USB_SERIAL=EGIS_ETU905Axx-E_0A8606PNA357 E: ID_USB_SERIAL_SHORT=0A8606PNA357 E: ID_USB_VENDOR=EGIS @@ -30,8 +30,8 @@ E: ID_VENDOR_ENC=EGIS E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc. E: ID_VENDOR_ID=1c7a E: MAJOR=189 -E: MINOR=257 -E: PRODUCT=1c7a/5ae/5342 +E: MINOR=260 +E: PRODUCT=1c7a/5ae/5345 E: SUBSYSTEM=usb E: TYPE=255/0/0 A: authorized=1\n @@ -44,13 +44,13 @@ A: bMaxPacketSize0=64\n A: bMaxPower=100mA\n A: bNumConfigurations=1\n A: bNumInterfaces= 1\n -A: bcdDevice=5342\n +A: bcdDevice=5345\n A: bmAttributes=a0\n A: busnum=3\n A: configuration= -H: descriptors=12010002FF0000407A1CAE0542530102030109022700010100A0320904000003FFFFFF00070581024000000705020240000007058303400001 -A: dev=189:257\n -A: devnum=2\n +H: descriptors=12010002FF0000407A1CAE0545530102030109022700010100A0320904000003FFFFFF00070581024000000705020240000007058303400001 +A: dev=189:260\n +A: devnum=5\n A: devpath=3\n L: driver=../../../../../../bus/usb/drivers/usb L: firmware_node=../../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0c/device:1b/device:1c/device:1f @@ -65,16 +65,16 @@ A: physical_location/lid=no\n A: physical_location/panel=top\n A: physical_location/vertical_position=upper\n L: port=../3-0:1.0/usb3-port3 -A: power/active_duration=93136758\n +A: power/active_duration=3828402\n A: power/async=enabled\n A: power/autosuspend=2\n A: power/autosuspend_delay_ms=2000\n -A: power/connected_duration=93139621\n +A: power/connected_duration=3828402\n A: power/control=on\n A: power/level=on\n A: power/persist=1\n A: power/runtime_active_kids=0\n -A: power/runtime_active_time=93138826\n +A: power/runtime_active_time=3828158\n A: power/runtime_enabled=forbidden\n A: power/runtime_status=active\n A: power/runtime_suspended_time=0\n @@ -95,11 +95,11 @@ A: rx_lanes=1\n A: serial=0A8606PNA357\n A: speed=12\n A: tx_lanes=1\n -A: urbnum=5855\n +A: urbnum=1021\n A: version= 2.00\n P: /devices/pci0000:00/0000:00:08.1/0000:05:00.4/usb3 -N: bus/usb/003/001=12010002090001406B1D020014060302010109021900010100E0000904000001090000000705810304000C +N: bus/usb/003/001=12010002090001406B1D020017060302010109021900010100E0000904000001090000000705810304000C E: BUSNUM=003 E: CURRENT_TAGS=:seat: E: DEVNAME=/dev/bus/usb/003/001 @@ -115,26 +115,26 @@ E: ID_MODEL_FROM_DATABASE=2.0 root hub E: ID_MODEL_ID=0002 E: ID_PATH=pci-0000:05:00.4 E: ID_PATH_TAG=pci-0000_05_00_4 -E: ID_REVISION=0614 -E: ID_SERIAL=Linux_6.14.0-37-generic_xhci-hcd_xHCI_Host_Controller_0000:05:00.4 +E: ID_REVISION=0617 +E: ID_SERIAL=Linux_6.17.0-35-generic_xhci-hcd_xHCI_Host_Controller_0000:05:00.4 E: ID_SERIAL_SHORT=0000:05:00.4 E: ID_USB_INTERFACES=:090000: E: ID_USB_MODEL=xHCI_Host_Controller E: ID_USB_MODEL_ENC=xHCI\x20Host\x20Controller E: ID_USB_MODEL_ID=0002 -E: ID_USB_REVISION=0614 -E: ID_USB_SERIAL=Linux_6.14.0-37-generic_xhci-hcd_xHCI_Host_Controller_0000:05:00.4 +E: ID_USB_REVISION=0617 +E: ID_USB_SERIAL=Linux_6.17.0-35-generic_xhci-hcd_xHCI_Host_Controller_0000:05:00.4 E: ID_USB_SERIAL_SHORT=0000:05:00.4 -E: ID_USB_VENDOR=Linux_6.14.0-37-generic_xhci-hcd -E: ID_USB_VENDOR_ENC=Linux\x206.14.0-37-generic\x20xhci-hcd +E: ID_USB_VENDOR=Linux_6.17.0-35-generic_xhci-hcd +E: ID_USB_VENDOR_ENC=Linux\x206.17.0-35-generic\x20xhci-hcd E: ID_USB_VENDOR_ID=1d6b -E: ID_VENDOR=Linux_6.14.0-37-generic_xhci-hcd -E: ID_VENDOR_ENC=Linux\x206.14.0-37-generic\x20xhci-hcd +E: ID_VENDOR=Linux_6.17.0-35-generic_xhci-hcd +E: ID_VENDOR_ENC=Linux\x206.17.0-35-generic\x20xhci-hcd E: ID_VENDOR_FROM_DATABASE=Linux Foundation E: ID_VENDOR_ID=1d6b E: MAJOR=189 E: MINOR=256 -E: PRODUCT=1d6b/2/614 +E: PRODUCT=1d6b/2/617 E: SUBSYSTEM=usb E: TAGS=:seat: E: TYPE=9/0/1 @@ -149,11 +149,11 @@ A: bMaxPacketSize0=64\n A: bMaxPower=0mA\n A: bNumConfigurations=1\n A: bNumInterfaces= 1\n -A: bcdDevice=0614\n +A: bcdDevice=0617\n A: bmAttributes=e0\n A: busnum=3\n A: configuration= -H: descriptors=12010002090001406B1D020014060302010109021900010100E0000904000001090000000705810304000C +H: descriptors=12010002090001406B1D020017060302010109021900010100E0000904000001090000000705810304000C A: dev=189:256\n A: devnum=1\n A: devpath=0\n @@ -163,20 +163,20 @@ A: idProduct=0002\n A: idVendor=1d6b\n A: interface_authorized_default=1\n A: ltm_capable=no\n -A: manufacturer=Linux 6.14.0-37-generic xhci-hcd\n +A: manufacturer=Linux 6.17.0-35-generic xhci-hcd\n A: maxchild=4\n -A: power/active_duration=93137993\n +A: power/active_duration=40424267\n A: power/async=enabled\n A: power/autosuspend=0\n A: power/autosuspend_delay_ms=0\n -A: power/connected_duration=93139758\n +A: power/connected_duration=40424455\n A: power/control=auto\n A: power/level=auto\n A: power/runtime_active_kids=1\n -A: power/runtime_active_time=93139206\n +A: power/runtime_active_time=40424257\n A: power/runtime_enabled=enabled\n A: power/runtime_status=active\n -A: power/runtime_suspended_time=0\n +A: power/runtime_suspended_time=50\n A: power/runtime_usage=0\n A: power/wakeup=disabled\n A: power/wakeup_abort_count=\n @@ -194,7 +194,7 @@ A: rx_lanes=1\n A: serial=0000:05:00.4\n A: speed=480\n A: tx_lanes=1\n -A: urbnum=989\n +A: urbnum=421\n A: version= 2.00\n P: /devices/pci0000:00/0000:00:08.1/0000:05:00.4 @@ -233,7 +233,7 @@ A: driver_override=(null)\n A: enable=1\n L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0c/device:1b L: iommu=../../0000:00:00.2/iommu/ivhd0 -L: iommu_group=../../../../kernel/iommu_groups/20 +L: iommu_group=../../../../kernel/iommu_groups/19 A: irq=44\n A: link/l0s_aspm=0\n A: link/l1_aspm=0\n @@ -252,11 +252,11 @@ A: msi_irqs/50=msix\n A: msi_irqs/51=msix\n A: msi_irqs/52=msix\n A: numa_node=-1\n -A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 4 5 2112 5\nxHCI ring segments 23 23 4096 23\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\n +A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 256 port bw ctx arrays 0 0 256 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 4 5 2112 5\nxHCI ring segments 23 23 4096 23\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\n A: power/async=enabled\n A: power/control=on\n A: power/runtime_active_kids=1\n -A: power/runtime_active_time=93139523\n +A: power/runtime_active_time=40424587\n A: power/runtime_enabled=forbidden\n A: power/runtime_status=active\n A: power/runtime_suspended_time=0\n @@ -308,7 +308,7 @@ A: driver_override=(null)\n A: enable=2\n L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0c L: iommu=../0000:00:00.2/iommu/ivhd0 -L: iommu_group=../../../kernel/iommu_groups/8 +L: iommu_group=../../../kernel/iommu_groups/7 A: irq=33\n A: local_cpulist=0-11\n A: local_cpus=fff\n @@ -322,7 +322,7 @@ A: power/async=enabled\n A: power/autosuspend_delay_ms=100\n A: power/control=auto\n A: power/runtime_active_kids=5\n -A: power/runtime_active_time=93139537\n +A: power/runtime_active_time=40424606\n A: power/runtime_enabled=enabled\n A: power/runtime_status=active\n A: power/runtime_suspended_time=0\n