Compare commits

...

16 Commits

Author SHA1 Message Date
Benjamin Berg
664126b431 elanspi: Do not allow image captures to be interrupted
Avoid unexpected state changes during image capture. This also means
that the old line handler does not need to check for cancellation.
2021-12-27 12:19:10 +01:00
Benjamin Berg
7b1fe6ec19 ssm: Allow marking an SSM as being critical
This way the SSM cannot be interrupted while it is running.
2021-12-27 12:13:12 +01:00
Dmitrii Shcherbakov
999bca076c Allow FpPrint data to be extended on enrollment.
* Allow FPI_PRINT_NBIS to be extended rather than overridden if a user
  supplies an existing FpPrint template with data;
* Prints will only be extended if a device has the required feature.
  For image-based devices this feature is added by default since they
  typically do not have storage (this can be overridden at the child
  class level).

Extending an existing FpPrint requires passing a template print with
existing data during the enrollment process. This is done because the
caller is responsible for maintaining the fingerprint database and doing
the necessary deserialization operations if needed. The existing
example program is updated to show how to do that.
2021-12-16 12:53:41 +01:00
Benjamin Berg
e198b04222 elanspi: Silence some SSMs that may log excessively otherwise 2021-12-02 13:54:59 +01:00
Benjamin Berg
3981c42d3e ssm: Add API to silence most state change debug messages
Otherwise tightly looping SSMs (primarily SPI transfers), will flood the
logs in inappropriate ways.
2021-12-02 13:54:59 +01:00
Benjamin Berg
31afd3ba5c elanspi: Move debug print so that it contains all information
Two of the printed variables were only calculated after the message was
printed, making the logged information less useful than it could be.
2021-12-02 13:53:54 +01:00
Benjamin Berg
05fd2c58cb context: Ensure mainloop is idle before enumeration completes
This ensures that we have processed all hotplug events before
considering enumeration to be complete. This is important due to USB
persist being turned off. At resume time, devices will disappear and
immediately re-appear. In this situatoin, enumerate could first see the
old state with a removed device resulting in it to not be discovered.

As a hotplug event is semingly emitted by the kernel immediately, we
can simply make sure to process this hotplug event before returning
from enumerate.

Closes: fprintd#119
2021-12-01 15:29:18 +00:00
Matthew Mirvish
a033154b2e doc: Fix broken documentation for FpiDeviceUdevSubtypeFlags enum
Added description and fixed incorrect name in comment, so now gtkdoc
actually shows useful information.
2021-11-15 17:10:44 -05:00
Benjamin Berg
5e4bb26801 Release 1.94.2 2021-11-02 16:28:13 +01:00
Benjamin Berg
2cfff27729 udev-hwdb: Update unsupported device list 2021-11-02 16:28:13 +01:00
Marco Trevisan (Treviño)
378fae0ea2 doc: Add missing Drivers API SSM functions 2021-10-28 16:56:11 +02:00
Marco Trevisan (Treviño)
01b0f7aba0 doc: Include missing types (SPI) and functions to the Drivers API 2021-10-28 16:39:35 +02:00
Benjamin Berg
17ff49f85c goodixmoc: Fix template struct for required length calculation
The length is only a single byte in the transfer. However, the struct
had a uint32_t in that place, breaking the sizeof() calculation and
seemingly creating issues for certain lengths of user id strings (which
depend on the username).

Fix this by changing the type to uint8_t. Also add the initial 0x43
prefix byte and a byte of apparent padding that the struct contains.
Leave the two reserved bytes at the end, as they seem to actually have a
meaning (i.e. they are seemingly send in listings).

This effectively makes the struct one byte smaller, bringing it down to
127 bytes from 128 bytes.

Closes: #428, #404
2021-10-27 06:54:47 +00:00
Marco Trevisan (Treviño)
de46e1e4b8 tests: Add missing trailing new lines on devices attributes
This as per the same reasons of commit 63bfaf4, and without trailing new
lines such attributes aren't picked by umockdev in ubuntu and debian.
2021-10-27 02:01:50 +02:00
boger
5e934a4fa0 goodixmoc: add PID 63CC
63CC: Dell Latitude series fingerprint sensor
2021-10-20 20:11:05 +08:00
hermanlin
5d0a3eab5c elanmoc: add PID 0x0c7d
Signed-off-by: hermanlin <herman.lin@emc.com.tw>
2021-10-12 14:02:48 +08:00
26 changed files with 870 additions and 518 deletions

7
NEWS
View File

@@ -1,6 +1,13 @@
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.
2021-11-02: v1.94.2 release
Highlights:
* goodixmoc: Fix protocol error with certain username lengths
* elanmoc: New PID 0x0c7d
* goodixmoc: New PID 0x63cc
2021-09-24: v1.94.1 release 2021-09-24: v1.94.1 release
Highlights: Highlights:

View File

@@ -142,6 +142,7 @@ usb:v04F3p0C58*
ID_PERSIST=0 ID_PERSIST=0
# Supported by libfprint driver elanmoc # Supported by libfprint driver elanmoc
usb:v04F3p0C7D*
usb:v04F3p0C7E* usb:v04F3p0C7E*
ID_AUTOSUSPEND=1 ID_AUTOSUSPEND=1
ID_PERSIST=0 ID_PERSIST=0
@@ -158,6 +159,7 @@ usb:v27C6p60A2*
usb:v27C6p639C* usb:v27C6p639C*
usb:v27C6p63AC* usb:v27C6p63AC*
usb:v27C6p63BC* usb:v27C6p63BC*
usb:v27C6p63CC*
usb:v27C6p6496* usb:v27C6p6496*
usb:v27C6p6584* usb:v27C6p6584*
usb:v27C6p658C* usb:v27C6p658C*
@@ -284,6 +286,7 @@ usb:v0A5Cp5842*
usb:v0A5Cp5843* usb:v0A5Cp5843*
usb:v0A5Cp5844* usb:v0A5Cp5844*
usb:v0A5Cp5845* usb:v0A5Cp5845*
usb:v0BDAp5812*
usb:v10A5p0007* usb:v10A5p0007*
usb:v1188p9545* usb:v1188p9545*
usb:v138Ap0007* usb:v138Ap0007*

View File

@@ -179,6 +179,7 @@ fpi_device_enroll_complete
fpi_device_verify_complete fpi_device_verify_complete
fpi_device_identify_complete fpi_device_identify_complete
fpi_device_capture_complete fpi_device_capture_complete
fpi_device_clear_storage_complete
fpi_device_delete_complete fpi_device_delete_complete
fpi_device_list_complete fpi_device_list_complete
fpi_device_suspend_complete fpi_device_suspend_complete
@@ -246,6 +247,7 @@ fpi_ssm_new_full
fpi_ssm_free fpi_ssm_free
fpi_ssm_start fpi_ssm_start
fpi_ssm_start_subsm fpi_ssm_start_subsm
fpi_ssm_set_critical
fpi_ssm_next_state fpi_ssm_next_state
fpi_ssm_next_state_delayed fpi_ssm_next_state_delayed
fpi_ssm_jump_to_state fpi_ssm_jump_to_state
@@ -259,7 +261,11 @@ fpi_ssm_get_device
fpi_ssm_get_error fpi_ssm_get_error
fpi_ssm_dup_error fpi_ssm_dup_error
fpi_ssm_get_cur_state fpi_ssm_get_cur_state
fpi_ssm_silence_debug
fpi_ssm_spi_transfer_cb
fpi_ssm_spi_transfer_with_weak_pointer_cb
fpi_ssm_usb_transfer_cb fpi_ssm_usb_transfer_cb
fpi_ssm_usb_transfer_with_weak_pointer_cb
FpiSsm FpiSsm
</SECTION> </SECTION>
@@ -286,3 +292,20 @@ FPI_TYPE_USB_TRANSFER
fpi_usb_transfer_get_type fpi_usb_transfer_get_type
</SECTION> </SECTION>
<SECTION>
<FILE>fpi-spi-transfer</FILE>
FpiSpiTransferCallback
FpiSpiTransfer
fpi_spi_transfer_new
fpi_spi_transfer_ref
fpi_spi_transfer_unref
fpi_spi_transfer_write
fpi_spi_transfer_write_full
fpi_spi_transfer_read
fpi_spi_transfer_read_full
fpi_spi_transfer_submit
fpi_spi_transfer_submit_sync
<SUBSECTION Standard>
FPI_TYPE_SPI_TRANSFER
fpi_spi_transfer_get_type
</SECTION>

View File

@@ -41,7 +41,8 @@
</chapter> </chapter>
<chapter id="driver-helpers"> <chapter id="driver-helpers">
<title>USB and State Machine helpers</title> <title>USB, SPI and State Machine helpers</title>
<xi:include href="xml/fpi-spi-transfer.xml"/>
<xi:include href="xml/fpi-usb-transfer.xml"/> <xi:include href="xml/fpi-usb-transfer.xml"/>
<xi:include href="xml/fpi-ssm.xml"/> <xi:include href="xml/fpi-ssm.xml"/>
<xi:include href="xml/fpi-log.xml"/> <xi:include href="xml/fpi-log.xml"/>

View File

@@ -35,6 +35,7 @@ typedef struct _EnrollData
unsigned int sigint_handler; unsigned int sigint_handler;
FpFinger finger; FpFinger finger;
int ret_value; int ret_value;
gboolean update_fingerprint;
} EnrollData; } EnrollData;
static void static void
@@ -84,7 +85,8 @@ on_enroll_completed (FpDevice *dev, GAsyncResult *res, void *user_data)
/* Even if the device has storage, it may not be able to save all the /* Even if the device has storage, it may not be able to save all the
* metadata that the print contains, so we can always save a local copy * metadata that the print contains, so we can always save a local copy
* containing the handle to the device print */ * containing the handle to the device print */
int r = print_data_save (print, enroll_data->finger); int r = print_data_save (print, enroll_data->finger,
enroll_data->update_fingerprint);
if (r < 0) if (r < 0)
{ {
g_warning ("Data save failed, code %d", r); g_warning ("Data save failed, code %d", r);
@@ -124,6 +126,40 @@ on_enroll_progress (FpDevice *device,
fp_device_get_nr_enroll_stages (device)); fp_device_get_nr_enroll_stages (device));
} }
static gboolean
should_update_fingerprint (void)
{
int update_choice;
gboolean update_fingerprint = FALSE;
printf ("Should an existing fingerprint be updated instead of being replaced (if present)? "
"Enter Y/y or N/n to make a choice.\n");
update_choice = getchar ();
if (update_choice == EOF)
{
g_warning ("EOF encountered while reading a character");
return EXIT_FAILURE;
}
switch (update_choice)
{
case 'y':
case 'Y':
update_fingerprint = TRUE;
break;
case 'n':
case 'N':
update_fingerprint = FALSE;
break;
default:
g_warning ("Invalid choice %c, should be Y/y or N/n.", update_choice);
return EXIT_FAILURE;
}
return update_fingerprint;
}
static void static void
on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data) on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
{ {
@@ -139,13 +175,26 @@ on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
return; return;
} }
printf ("Opened device. It's now time to enroll your finger.\n\n"); printf ("Opened device.\n");
if (fp_device_has_feature (dev, FP_DEVICE_FEATURE_UPDATE_PRINT))
{
printf ("The device supports fingerprint updates.\n");
enroll_data->update_fingerprint = should_update_fingerprint ();
}
else
{
printf ("The device doesn't support fingerprint updates. Old prints will be erased.\n");
enroll_data->update_fingerprint = FALSE;
}
printf ("It's now time to enroll your finger.\n\n");
printf ("You will need to successfully scan your %s finger %d times to " printf ("You will need to successfully scan your %s finger %d times to "
"complete the process.\n\n", finger_to_string (enroll_data->finger), "complete the process.\n\n", finger_to_string (enroll_data->finger),
fp_device_get_nr_enroll_stages (dev)); fp_device_get_nr_enroll_stages (dev));
printf ("Scan your finger now.\n"); printf ("Scan your finger now.\n");
print_template = print_create_template (dev, enroll_data->finger); print_template = print_create_template (dev, enroll_data->finger, enroll_data->update_fingerprint);
fp_device_enroll (dev, print_template, enroll_data->cancellable, fp_device_enroll (dev, print_template, enroll_data->cancellable,
on_enroll_progress, NULL, NULL, on_enroll_progress, NULL, NULL,
(GAsyncReadyCallback) on_enroll_completed, (GAsyncReadyCallback) on_enroll_completed,
@@ -171,11 +220,9 @@ main (void)
FpDevice *dev; FpDevice *dev;
FpFinger finger; FpFinger finger;
g_print ("This program will enroll the selected finger, unconditionally " g_print ("This program will enroll the selected finger overwriting any print for the same"
"overwriting any print for the same finger that was enrolled " " finger that was enrolled previously. Fingerprint updates without erasing old data"
"previously. If you want to continue, press enter, otherwise hit " " are possible on devices supporting that. Ctrl+C interrupts program execution.\n");
"Ctrl+C\n");
getchar ();
g_print ("Choose the finger to enroll:\n"); g_print ("Choose the finger to enroll:\n");
finger = finger_chooser (); finger = finger_chooser ();

View File

@@ -102,8 +102,23 @@ save_data (GVariant *data)
return 0; return 0;
} }
static FpPrint *
load_print_from_data (GVariant *data)
{
const guchar *stored_data = NULL;
gsize stored_len;
FpPrint *print;
g_autoptr(GError) error = NULL;
stored_data = (const guchar *) g_variant_get_fixed_array (data, &stored_len, 1);
print = fp_print_deserialize (stored_data, stored_len, &error);
if (error)
g_warning ("Error deserializing data: %s", error->message);
return print;
}
int int
print_data_save (FpPrint *print, FpFinger finger) print_data_save (FpPrint *print, FpFinger finger, gboolean update_fingerprint)
{ {
g_autofree gchar *descr = get_print_data_descriptor (print, NULL, finger); g_autofree gchar *descr = get_print_data_descriptor (print, NULL, finger);
@@ -137,25 +152,12 @@ print_data_load (FpDevice *dev, FpFinger finger)
g_autoptr(GVariant) val = NULL; g_autoptr(GVariant) val = NULL;
g_autoptr(GVariantDict) dict = NULL; g_autoptr(GVariantDict) dict = NULL;
const guchar *stored_data = NULL;
gsize stored_len;
dict = load_data (); dict = load_data ();
val = g_variant_dict_lookup_value (dict, descr, G_VARIANT_TYPE ("ay")); val = g_variant_dict_lookup_value (dict, descr, G_VARIANT_TYPE ("ay"));
if (val) if (val)
{ return load_print_from_data (val);
FpPrint *print;
g_autoptr(GError) error = NULL;
stored_data = (const guchar *) g_variant_get_fixed_array (val, &stored_len, 1);
print = fp_print_deserialize (stored_data, stored_len, &error);
if (error)
g_warning ("Error deserializing data: %s", error->message);
return print;
}
return NULL; return NULL;
} }
@@ -207,16 +209,30 @@ gallery_data_load (FpDevice *dev)
} }
FpPrint * FpPrint *
print_create_template (FpDevice *dev, FpFinger finger) print_create_template (FpDevice *dev, FpFinger finger, gboolean load_existing)
{ {
g_autoptr(GVariantDict) dict = NULL;
g_autoptr(GDateTime) datetime = NULL; g_autoptr(GDateTime) datetime = NULL;
g_autoptr(GDate) date = NULL; g_autoptr(GDate) date = NULL;
g_autoptr(GVariant) existing_val = NULL;
g_autofree gchar *descr = get_print_data_descriptor (NULL, dev, finger);
FpPrint *template = NULL; FpPrint *template = NULL;
gint year, month, day; gint year, month, day;
template = fp_print_new (dev); if (load_existing)
fp_print_set_finger (template, finger); {
fp_print_set_username (template, g_get_user_name ()); dict = load_data ();
existing_val = g_variant_dict_lookup_value (dict, descr, G_VARIANT_TYPE ("ay"));
if (existing_val != NULL)
template = load_print_from_data (existing_val);
}
if (template == NULL)
{
template = fp_print_new (dev);
fp_print_set_finger (template, finger);
fp_print_set_username (template, g_get_user_name ());
}
datetime = g_date_time_new_now_local (); datetime = g_date_time_new_now_local ();
g_date_time_get_ymd (datetime, &year, &month, &day); g_date_time_get_ymd (datetime, &year, &month, &day);
date = g_date_new_dmy (day, month, year); date = g_date_new_dmy (day, month, year);

View File

@@ -21,12 +21,14 @@
#pragma once #pragma once
int print_data_save (FpPrint *print, int print_data_save (FpPrint *print,
FpFinger finger); FpFinger finger,
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);
FpPrint * print_create_template (FpDevice *dev, FpPrint * print_create_template (FpDevice *dev,
FpFinger finger); FpFinger finger,
const gboolean load_existing);
gboolean print_image_save (FpPrint *print, gboolean print_image_save (FpPrint *print,
const char *path); const char *path);
gboolean save_image_to_pgm (FpImage *img, gboolean save_image_to_pgm (FpImage *img,

View File

@@ -25,6 +25,7 @@
G_DEFINE_TYPE (FpiDeviceElanmoc, fpi_device_elanmoc, FP_TYPE_DEVICE) G_DEFINE_TYPE (FpiDeviceElanmoc, fpi_device_elanmoc, FP_TYPE_DEVICE)
static const FpIdEntry id_table[] = { static const FpIdEntry id_table[] = {
{ .vid = 0x04f3, .pid = 0x0c7d, },
{ .vid = 0x04f3, .pid = 0x0c7e, }, { .vid = 0x04f3, .pid = 0x0c7e, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */ { .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
}; };

View File

@@ -434,21 +434,9 @@ elanspi_capture_old_line_handler (FpiSpiTransfer *transfer, FpDevice *dev, gpoin
self->old_data.line_ptr += 1; self->old_data.line_ptr += 1;
/* if there is still data, continue from check lineready */ /* if there is still data, continue from check lineready */
if (self->old_data.line_ptr < self->sensor_height) if (self->old_data.line_ptr < self->sensor_height)
{ fpi_ssm_jump_to_state (transfer->ssm, ELANSPI_CAPTOLD_CHECK_LINEREADY);
fpi_ssm_jump_to_state (transfer->ssm, ELANSPI_CAPTOLD_CHECK_LINEREADY);
}
else else
{ fpi_ssm_mark_completed (transfer->ssm);
/* check for cancellation */
if (fpi_device_action_is_cancelled (dev))
{
g_cancellable_set_error_if_cancelled (fpi_device_get_cancellable (dev), &error);
fpi_ssm_mark_failed (transfer->ssm, error);
return;
}
/* otherwise finish succesfully */
fpi_ssm_mark_completed (transfer->ssm);
}
} }
static void static void
@@ -606,6 +594,8 @@ elanspi_calibrate_old_handler (FpiSsm *ssm, FpDevice *dev)
case ELANSPI_CALIBOLD_CHECKFIN_CAPTURE: case ELANSPI_CALIBOLD_CHECKFIN_CAPTURE:
case ELANSPI_CALIBOLD_DACFINE_CAPTURE: case ELANSPI_CALIBOLD_DACFINE_CAPTURE:
chld = fpi_ssm_new (dev, elanspi_capture_old_handler, ELANSPI_CAPTOLD_NSTATES); chld = fpi_ssm_new (dev, elanspi_capture_old_handler, ELANSPI_CAPTOLD_NSTATES);
fpi_ssm_silence_debug (chld);
fpi_ssm_set_critical (chld);
fpi_ssm_start_subsm (ssm, chld); fpi_ssm_start_subsm (ssm, chld);
return; return;
@@ -860,6 +850,8 @@ elanspi_calibrate_hv_handler (FpiSsm *ssm, FpDevice *dev)
case ELANSPI_CALIBHV_CAPTURE: case ELANSPI_CALIBHV_CAPTURE:
chld = fpi_ssm_new (dev, elanspi_capture_hv_handler, ELANSPI_CAPTHV_NSTATES); chld = fpi_ssm_new (dev, elanspi_capture_hv_handler, ELANSPI_CAPTHV_NSTATES);
fpi_ssm_silence_debug (chld);
fpi_ssm_set_critical (chld);
fpi_ssm_start_subsm (ssm, chld); fpi_ssm_start_subsm (ssm, chld);
return; return;
@@ -1115,6 +1107,8 @@ do_sw_reset:
chld = fpi_ssm_new_full (dev, elanspi_calibrate_hv_handler, ELANSPI_CALIBHV_NSTATES, ELANSPI_CALIBHV_PROTECT, "HV calibrate"); chld = fpi_ssm_new_full (dev, elanspi_calibrate_hv_handler, ELANSPI_CALIBHV_NSTATES, ELANSPI_CALIBHV_PROTECT, "HV calibrate");
else else
chld = fpi_ssm_new_full (dev, elanspi_calibrate_old_handler, ELANSPI_CALIBOLD_NSTATES, ELANSPI_CALIBOLD_PROTECT, "old calibrate"); chld = fpi_ssm_new_full (dev, elanspi_calibrate_old_handler, ELANSPI_CALIBOLD_NSTATES, ELANSPI_CALIBOLD_PROTECT, "old calibrate");
fpi_ssm_silence_debug (chld);
fpi_ssm_set_critical (chld);
fpi_ssm_start_subsm (ssm, chld); fpi_ssm_start_subsm (ssm, chld);
return; return;
@@ -1123,6 +1117,8 @@ do_sw_reset:
chld = fpi_ssm_new (dev, elanspi_capture_hv_handler, ELANSPI_CAPTHV_NSTATES); chld = fpi_ssm_new (dev, elanspi_capture_hv_handler, ELANSPI_CAPTHV_NSTATES);
else else
chld = fpi_ssm_new (dev, elanspi_capture_old_handler, ELANSPI_CAPTOLD_NSTATES); chld = fpi_ssm_new (dev, elanspi_capture_old_handler, ELANSPI_CAPTOLD_NSTATES);
fpi_ssm_silence_debug (chld);
fpi_ssm_set_critical (chld);
fpi_ssm_start_subsm (ssm, chld); fpi_ssm_start_subsm (ssm, chld);
return; return;
@@ -1219,8 +1215,6 @@ elanspi_guess_image (FpiDeviceElanSpi *self, guint16 *raw_image)
sq_stddev /= (frame_width * frame_height); sq_stddev /= (frame_width * frame_height);
fp_dbg ("<guess> stddev=%" G_GUINT64_FORMAT "d, ip=%d, is_fp=%d, is_empty=%d", sq_stddev, invalid_percent, is_fp, is_empty);
if (invalid_percent < ELANSPI_MAX_REAL_INVALID_PERCENT) if (invalid_percent < ELANSPI_MAX_REAL_INVALID_PERCENT)
is_fp += 1; is_fp += 1;
if (invalid_percent > ELANSPI_MIN_EMPTY_INVALID_PERCENT) if (invalid_percent > ELANSPI_MIN_EMPTY_INVALID_PERCENT)
@@ -1231,6 +1225,8 @@ elanspi_guess_image (FpiDeviceElanSpi *self, guint16 *raw_image)
if (sq_stddev < ELANSPI_MAX_EMPTY_STDDEV) if (sq_stddev < ELANSPI_MAX_EMPTY_STDDEV)
is_empty += 1; is_empty += 1;
fp_dbg ("<guess> stddev=%" G_GUINT64_FORMAT "d, ip=%d, is_fp=%d, is_empty=%d", sq_stddev, invalid_percent, is_fp, is_empty);
if (is_fp > is_empty) if (is_fp > is_empty)
return ELANSPI_GUESS_FINGERPRINT; return ELANSPI_GUESS_FINGERPRINT;
else if (is_empty > is_fp) else if (is_empty > is_fp)
@@ -1495,6 +1491,8 @@ elanspi_fp_capture_ssm_handler (FpiSsm *ssm, FpDevice *dev)
chld = fpi_ssm_new (dev, elanspi_capture_hv_handler, ELANSPI_CAPTHV_NSTATES); chld = fpi_ssm_new (dev, elanspi_capture_hv_handler, ELANSPI_CAPTHV_NSTATES);
else else
chld = fpi_ssm_new (dev, elanspi_capture_old_handler, ELANSPI_CAPTOLD_NSTATES); chld = fpi_ssm_new (dev, elanspi_capture_old_handler, ELANSPI_CAPTOLD_NSTATES);
fpi_ssm_silence_debug (chld);
fpi_ssm_set_critical (chld);
fpi_ssm_start_subsm (ssm, chld); fpi_ssm_start_subsm (ssm, chld);
return; return;

View File

@@ -1282,6 +1282,7 @@ gx_fp_probe (FpDevice *device)
case 0x639C: case 0x639C:
case 0x63AC: case 0x63AC:
case 0x63BC: case 0x63BC:
case 0x63CC:
case 0x6A94: case 0x6A94:
self->max_enroll_stage = 12; self->max_enroll_stage = 12;
break; break;
@@ -1505,6 +1506,7 @@ static const FpIdEntry id_table[] = {
{ .vid = 0x27c6, .pid = 0x639C, }, { .vid = 0x27c6, .pid = 0x639C, },
{ .vid = 0x27c6, .pid = 0x63AC, }, { .vid = 0x27c6, .pid = 0x63AC, },
{ .vid = 0x27c6, .pid = 0x63BC, }, { .vid = 0x27c6, .pid = 0x63BC, },
{ .vid = 0x27c6, .pid = 0x63CC, },
{ .vid = 0x27c6, .pid = 0x6496, }, { .vid = 0x27c6, .pid = 0x6496, },
{ .vid = 0x27c6, .pid = 0x6584, }, { .vid = 0x27c6, .pid = 0x6584, },
{ .vid = 0x27c6, .pid = 0x658C, }, { .vid = 0x27c6, .pid = 0x658C, },

View File

@@ -113,14 +113,16 @@ typedef struct _gxfp_enroll_init
#pragma pack(push, 1) #pragma pack(push, 1)
typedef struct _template_format typedef struct _template_format
{ {
uint8_t _0x43_byte;
uint8_t type; uint8_t type;
uint8_t finger_index; uint8_t finger_index;
uint8_t pad0;
uint8_t accountid[32]; uint8_t accountid[32];
uint8_t tid[32]; uint8_t tid[32];
struct struct
{ {
uint32_t size; uint8_t size;
uint8_t data[56]; uint8_t data[56];
} payload; } payload;
uint8_t reserve[2]; uint8_t reserve[2];
} template_format_t, *ptemplate_format_t; } template_format_t, *ptemplate_format_t;

View File

@@ -426,6 +426,7 @@ void
fp_context_enumerate (FpContext *context) fp_context_enumerate (FpContext *context)
{ {
FpContextPrivate *priv = fp_context_get_instance_private (context); FpContextPrivate *priv = fp_context_get_instance_private (context);
gboolean dispatched;
gint i; gint i;
g_return_if_fail (FP_IS_CONTEXT (context)); g_return_if_fail (FP_IS_CONTEXT (context));
@@ -564,8 +565,19 @@ fp_context_enumerate (FpContext *context)
} }
#endif #endif
while (priv->pending_devices) /* Iterate until 1. we have no pending devices, and 2. the mainloop is idle
g_main_context_iteration (NULL, TRUE); * This takes care of processing hotplug events that happened during
* enumeration.
* This is important due to USB `persist` being turned off. At resume time,
* devices will disappear and immediately re-appear. In this situation,
* enumerate could first see the old state with a removed device resulting
* in it to not be discovered.
* As a hotplug event is seemingly emitted by the kernel immediately, we can
* simply make sure to process all events before returning from enumerate.
*/
dispatched = TRUE;
while (priv->pending_devices || dispatched)
dispatched = g_main_context_iteration (NULL, !!priv->pending_devices);
} }
/** /**

View File

@@ -1189,10 +1189,11 @@ fp_device_resume_finish (FpDevice *device,
* fp_device_enroll_finish(). * fp_device_enroll_finish().
* *
* The @template_print parameter is a #FpPrint with available metadata filled * The @template_print parameter is a #FpPrint with available metadata filled
* in. The driver may make use of this metadata, when e.g. storing the print on * in and, optionally, with existing fingerprint data to be updated with newly
* device memory. It is undefined whether this print is filled in by the driver * enrolled fingerprints if a device driver supports it. The driver may make use
* and returned, or whether the driver will return a newly created print after * of the metadata, when e.g. storing the print on device memory. It is undefined
* enrollment succeeded. * whether this print is filled in by the driver and returned, or whether the
* driver will return a newly created print after enrollment succeeded.
*/ */
void void
fp_device_enroll (FpDevice *device, fp_device_enroll (FpDevice *device,
@@ -1229,19 +1230,30 @@ fp_device_enroll (FpDevice *device,
if (!FP_IS_PRINT (template_print)) if (!FP_IS_PRINT (template_print))
{ {
g_warning ("User did not pass a print template!");
g_task_return_error (task, g_task_return_error (task,
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
"User did not pass a print template!"));
return; return;
} }
g_object_get (template_print, "fpi-type", &print_type, NULL); g_object_get (template_print, "fpi-type", &print_type, NULL);
if (print_type != FPI_PRINT_UNDEFINED) if (print_type != FPI_PRINT_UNDEFINED)
{ {
g_warning ("Passed print template must be newly created and blank!"); if (!fp_device_has_feature (device, FP_DEVICE_FEATURE_UPDATE_PRINT))
g_task_return_error (task, {
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID)); g_task_return_error (task,
return; fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
"A device does not support print updates!"));
return;
}
if (!fp_print_compatible (template_print, device))
{
g_task_return_error (task,
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_INVALID,
"The print and device must have a matching driver and device id"
" for a fingerprint update to succeed"));
return;
}
} }
priv->current_action = FPI_DEVICE_ACTION_ENROLL; priv->current_action = FPI_DEVICE_ACTION_ENROLL;

View File

@@ -59,6 +59,7 @@ typedef enum {
* @FP_DEVICE_FEATURE_STORAGE_CLEAR: Supports clearing the whole storage * @FP_DEVICE_FEATURE_STORAGE_CLEAR: Supports clearing the whole storage
* @FP_DEVICE_FEATURE_DUPLICATES_CHECK: Natively supports duplicates detection * @FP_DEVICE_FEATURE_DUPLICATES_CHECK: Natively supports duplicates detection
* @FP_DEVICE_FEATURE_ALWAYS_ON: Whether the device can run continuously * @FP_DEVICE_FEATURE_ALWAYS_ON: Whether the device can run continuously
* @FP_DEVICE_FEATURE_UPDATE_PRINT: Supports updating an existing print record using new scans
*/ */
typedef enum /*< flags >*/ { typedef enum /*< flags >*/ {
FP_DEVICE_FEATURE_NONE = 0, FP_DEVICE_FEATURE_NONE = 0,
@@ -71,6 +72,7 @@ typedef enum /*< flags >*/ {
FP_DEVICE_FEATURE_STORAGE_CLEAR = 1 << 6, FP_DEVICE_FEATURE_STORAGE_CLEAR = 1 << 6,
FP_DEVICE_FEATURE_DUPLICATES_CHECK = 1 << 7, FP_DEVICE_FEATURE_DUPLICATES_CHECK = 1 << 7,
FP_DEVICE_FEATURE_ALWAYS_ON = 1 << 8, FP_DEVICE_FEATURE_ALWAYS_ON = 1 << 8,
FP_DEVICE_FEATURE_UPDATE_PRINT = 1 << 9,
} FpDeviceFeature; } FpDeviceFeature;
/** /**

View File

@@ -101,6 +101,7 @@ fp_image_device_start_capture_action (FpDevice *device)
FpImageDevice *self = FP_IMAGE_DEVICE (device); FpImageDevice *self = FP_IMAGE_DEVICE (device);
FpImageDevicePrivate *priv = fp_image_device_get_instance_private (self); FpImageDevicePrivate *priv = fp_image_device_get_instance_private (self);
FpiDeviceAction action; FpiDeviceAction action;
FpiPrintType print_type;
/* There is just one action that we cannot support out /* There is just one action that we cannot support out
* of the box, which is a capture without first waiting * of the box, which is a capture without first waiting
@@ -124,7 +125,9 @@ fp_image_device_start_capture_action (FpDevice *device)
FpPrint *enroll_print = NULL; FpPrint *enroll_print = NULL;
fpi_device_get_enroll_data (device, &enroll_print); fpi_device_get_enroll_data (device, &enroll_print);
fpi_print_set_type (enroll_print, FPI_PRINT_NBIS); g_object_get (enroll_print, "fpi-type", &print_type, NULL);
if (print_type != FPI_PRINT_NBIS)
fpi_print_set_type (enroll_print, FPI_PRINT_NBIS);
} }
priv->enroll_stage = 0; priv->enroll_stage = 0;
@@ -221,6 +224,7 @@ fp_image_device_class_init (FpImageDeviceClass *klass)
fp_device_class->cancel = fp_image_device_cancel_action; fp_device_class->cancel = fp_image_device_cancel_action;
fpi_device_class_auto_initialize_features (fp_device_class); fpi_device_class_auto_initialize_features (fp_device_class);
fp_device_class->features |= FP_DEVICE_FEATURE_UPDATE_PRINT;
/* Default implementations */ /* Default implementations */
klass->activate = fp_image_device_default_activate; klass->activate = fp_image_device_default_activate;

View File

@@ -61,6 +61,7 @@ enum {
/* Private property*/ /* Private property*/
PROP_FPI_TYPE, PROP_FPI_TYPE,
PROP_FPI_DATA, PROP_FPI_DATA,
PROP_FPI_PRINTS,
N_PROPS N_PROPS
}; };
@@ -133,6 +134,10 @@ fp_print_get_property (GObject *object,
g_value_set_variant (value, self->data); g_value_set_variant (value, self->data);
break; break;
case PROP_FPI_PRINTS:
g_value_set_pointer (value, self->prints);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
@@ -188,6 +193,11 @@ fp_print_set_property (GObject *object,
self->data = g_value_dup_variant (value); self->data = g_value_dup_variant (value);
break; break;
case PROP_FPI_PRINTS:
g_clear_pointer (&self->prints, g_ptr_array_unref);
self->prints = g_value_get_pointer (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
@@ -299,6 +309,19 @@ fp_print_class_init (FpPrintClass *klass)
NULL, NULL,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE); G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
/**
* FpPrint::fpi-prints: (skip)
*
* This property is only for internal purposes.
*
* Stability: private
*/
properties[PROP_FPI_PRINTS] =
g_param_spec_pointer ("fpi-prints",
"Prints",
"Prints for internal use only",
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
g_object_class_install_properties (object_class, N_PROPS, properties); g_object_class_install_properties (object_class, N_PROPS, properties);
} }

View File

@@ -25,9 +25,11 @@
#include "fpi-print.h" #include "fpi-print.h"
/** /**
* FpiDeviceUdevSubtype: * FpiDeviceUdevSubtypeFlags:
* @FPI_DEVICE_UDEV_SUBTYPE_SPIDEV: The device requires an spidev node * @FPI_DEVICE_UDEV_SUBTYPE_SPIDEV: The device requires an spidev node
* @FPI_DEVICE_UDEV_SUBTYPE_HIDRAW: The device requires a hidraw node * @FPI_DEVICE_UDEV_SUBTYPE_HIDRAW: The device requires a hidraw node
*
* Bitfield of required hardware resources for a udev-backed device.
*/ */
typedef enum { typedef enum {
FPI_DEVICE_UDEV_SUBTYPE_SPIDEV = 1 << 0, FPI_DEVICE_UDEV_SUBTYPE_SPIDEV = 1 << 0,

View File

@@ -81,6 +81,8 @@ struct _FpiSsm
int start_cleanup; int start_cleanup;
int cur_state; int cur_state;
gboolean completed; gboolean completed;
gboolean critical;
gboolean silence;
GSource *timeout; GSource *timeout;
GError *error; GError *error;
FpiSsmCompletedCallback callback; FpiSsmCompletedCallback callback;
@@ -245,10 +247,11 @@ fpi_ssm_free (FpiSsm *machine)
/* Invoke the state handler */ /* Invoke the state handler */
static void static void
__ssm_call_handler (FpiSsm *machine) __ssm_call_handler (FpiSsm *machine, gboolean force_msg)
{ {
fp_dbg ("[%s] %s entering state %d", fp_device_get_driver (machine->dev), if (force_msg || !machine->silence)
machine->name, machine->cur_state); fp_dbg ("[%s] %s entering state %d", fp_device_get_driver (machine->dev),
machine->name, machine->cur_state);
machine->handler (machine, machine->dev); machine->handler (machine, machine->dev);
} }
@@ -275,7 +278,11 @@ fpi_ssm_start (FpiSsm *ssm, FpiSsmCompletedCallback callback)
ssm->cur_state = 0; ssm->cur_state = 0;
ssm->completed = FALSE; ssm->completed = FALSE;
ssm->error = NULL; ssm->error = NULL;
__ssm_call_handler (ssm);
if (ssm->critical)
fpi_device_critical_enter (ssm->dev);
__ssm_call_handler (ssm, TRUE);
} }
static void static void
@@ -346,7 +353,7 @@ fpi_ssm_mark_completed (FpiSsm *machine)
if (next_state < machine->nr_states) if (next_state < machine->nr_states)
{ {
machine->cur_state = next_state; machine->cur_state = next_state;
__ssm_call_handler (machine); __ssm_call_handler (machine, TRUE);
return; return;
} }
@@ -364,6 +371,10 @@ fpi_ssm_mark_completed (FpiSsm *machine)
machine->callback (machine, machine->dev, error); machine->callback (machine, machine->dev, error);
} }
if (machine->critical)
fpi_device_critical_leave (machine->dev);
fpi_ssm_free (machine); fpi_ssm_free (machine);
} }
@@ -460,7 +471,7 @@ fpi_ssm_next_state (FpiSsm *machine)
if (machine->cur_state == machine->nr_states) if (machine->cur_state == machine->nr_states)
fpi_ssm_mark_completed (machine); fpi_ssm_mark_completed (machine);
else else
__ssm_call_handler (machine); __ssm_call_handler (machine, FALSE);
} }
void void
@@ -537,7 +548,7 @@ fpi_ssm_jump_to_state (FpiSsm *machine, int state)
if (machine->cur_state == machine->nr_states) if (machine->cur_state == machine->nr_states)
fpi_ssm_mark_completed (machine); fpi_ssm_mark_completed (machine);
else else
__ssm_call_handler (machine); __ssm_call_handler (machine, FALSE);
} }
typedef struct typedef struct
@@ -642,6 +653,39 @@ fpi_ssm_dup_error (FpiSsm *machine)
return NULL; return NULL;
} }
/**
* fpi_ssm_silence_debug:
* @machine: an #FpiSsm state machine
*
* Turn off state change debug messages from this SSM. This does not disable
* all messages, as e.g. the initial state, SSM completion and cleanup states
* are still printed out.
*
* Use if the SSM loops and would flood the debug log otherwise.
*/
void
fpi_ssm_silence_debug (FpiSsm *machine)
{
machine->silence = TRUE;
}
/**
* fpi_ssm_set_critical:
* @machine: an #FpiSsm state machine
*
* Sets up the SSM to hold a critical section in the driver code. See
* fpi_device_critical_enter() for more details. This is useful if the SSM must
* not be interrupted in order to keep the device in a good state. You can e.g.
* guarantee that an image transfer is completed.
*
* This function must be called before starting the SSM.
*/
void
fpi_ssm_set_critical (FpiSsm *machine)
{
machine->critical = TRUE;
}
/** /**
* fpi_ssm_usb_transfer_cb: * fpi_ssm_usb_transfer_cb:
* @transfer: a #FpiUsbTransfer * @transfer: a #FpiUsbTransfer

View File

@@ -96,6 +96,9 @@ GError * fpi_ssm_get_error (FpiSsm *machine);
GError * fpi_ssm_dup_error (FpiSsm *machine); GError * fpi_ssm_dup_error (FpiSsm *machine);
int fpi_ssm_get_cur_state (FpiSsm *machine); int fpi_ssm_get_cur_state (FpiSsm *machine);
void fpi_ssm_silence_debug (FpiSsm *machine);
void fpi_ssm_set_critical (FpiSsm *machine);
/* Callbacks to be used by the driver instead of implementing their own /* Callbacks to be used by the driver instead of implementing their own
* logic. * logic.
*/ */

View File

@@ -60,6 +60,7 @@ static const FpIdEntry whitelist_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 = 0x0bda, .pid = 0x5812 },
{ .vid = 0x10a5, .pid = 0x0007 }, { .vid = 0x10a5, .pid = 0x0007 },
{ .vid = 0x1188, .pid = 0x9545 }, { .vid = 0x1188, .pid = 0x9545 },
{ .vid = 0x138a, .pid = 0x0007 }, { .vid = 0x138a, .pid = 0x0007 },

View File

@@ -1,5 +1,5 @@
project('libfprint', [ 'c', 'cpp' ], project('libfprint', [ 'c', 'cpp' ],
version: '1.94.1', version: '1.94.2',
license: 'LGPLv2.1+', license: 'LGPLv2.1+',
default_options: [ default_options: [
'buildtype=debugoptimized', 'buildtype=debugoptimized',

View File

@@ -25,63 +25,63 @@ E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc.
E: ID_PATH=pci-0000:00:14.0-usb-0:9 E: ID_PATH=pci-0000:00:14.0-usb-0:9
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9
E: LIBFPRINT_DRIVER=Hardcoded whitelist E: LIBFPRINT_DRIVER=Hardcoded whitelist
A: authorized=1 A: authorized=1\n
A: avoid_reset_quirk=0 A: avoid_reset_quirk=0\n
A: bConfigurationValue=1 A: bConfigurationValue=1\n
A: bDeviceClass=00 A: bDeviceClass=00\n
A: bDeviceProtocol=00 A: bDeviceProtocol=00\n
A: bDeviceSubClass=00 A: bDeviceSubClass=00\n
A: bMaxPacketSize0=8 A: bMaxPacketSize0=8\n
A: bMaxPower=100mA A: bMaxPower=100mA\n
A: bNumConfigurations=1 A: bNumConfigurations=1\n
A: bNumInterfaces= 1 A: bNumInterfaces= 1\n
A: bcdDevice=1041 A: bcdDevice=1041\n
A: bmAttributes=a0 A: bmAttributes=a0\n
A: busnum=1 A: busnum=1\n
A: configuration= A: configuration=\n
H: descriptors=12011001000000087A1C700541100102030109022000010100A0320904000002FF0000000705830240000007050402400003 H: descriptors=12011001000000087A1C700541100102030109022000010100A0320904000002FF0000000705830240000007050402400003
A: dev=189:4 A: dev=189:4\n
A: devnum=5 A: devnum=5\n
A: devpath=9 A: devpath=9\n
L: driver=../../../../../bus/usb/drivers/usb L: driver=../../../../../bus/usb/drivers/usb
A: idProduct=0570 A: idProduct=0570\n
A: idVendor=1c7a A: idVendor=1c7a\n
A: ltm_capable=no A: ltm_capable=no\n
A: manufacturer=EgisTec A: manufacturer=EgisTec\n
A: maxchild=0 A: maxchild=0\n
L: port=../1-0:1.0/usb1-port9 L: port=../1-0:1.0/usb1-port9
A: power/active_duration=362352 A: power/active_duration=362352\n
A: power/async=enabled A: power/async=enabled\n
A: power/autosuspend=2 A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000 A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=5526124 A: power/connected_duration=5526124\n
A: power/control=auto A: power/control=auto\n
A: power/level=auto A: power/level=auto\n
A: power/persist=1 A: power/persist=1\n
A: power/runtime_active_kids=0 A: power/runtime_active_kids=0\n
A: power/runtime_active_time=365097 A: power/runtime_active_time=365097\n
A: power/runtime_enabled=enabled A: power/runtime_enabled=enabled\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=5160752 A: power/runtime_suspended_time=5160752\n
A: power/runtime_usage=0 A: power/runtime_usage=0\n
A: power/wakeup=disabled A: power/wakeup=disabled\n
A: power/wakeup_abort_count= A: power/wakeup_abort_count=\n
A: power/wakeup_active= A: power/wakeup_active=\n
A: power/wakeup_active_count= A: power/wakeup_active_count=\n
A: power/wakeup_count= A: power/wakeup_count=\n
A: power/wakeup_expire_count= A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms= A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms= A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms= A: power/wakeup_total_time_ms=\n
A: product=EgisTec Touch Fingerprint Sensor A: product=EgisTec Touch Fingerprint Sensor\n
A: quirks=0x0 A: quirks=0x0\n
A: removable=fixed A: removable=fixed\n
A: rx_lanes=1 A: rx_lanes=1\n
A: serial=W700B41B A: serial=W700B41B\n
A: speed=12 A: speed=12\n
A: tx_lanes=1 A: tx_lanes=1\n
A: urbnum=8040 A: urbnum=8040\n
A: version= 1.10 A: version= 1.10\n
P: /devices/pci0000:00/0000:00:14.0/usb1 P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C N: bus/usb/001/001=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C
@@ -112,63 +112,63 @@ E: ID_PATH=pci-0000:00:14.0
E: ID_PATH_TAG=pci-0000_00_14_0 E: ID_PATH_TAG=pci-0000_00_14_0
E: ID_FOR_SEAT=usb-pci-0000_00_14_0 E: ID_FOR_SEAT=usb-pci-0000_00_14_0
E: TAGS=:seat: E: TAGS=:seat:
A: authorized=1 A: authorized=1\n
A: authorized_default=1 A: authorized_default=1\n
A: avoid_reset_quirk=0 A: avoid_reset_quirk=0\n
A: bConfigurationValue=1 A: bConfigurationValue=1\n
A: bDeviceClass=09 A: bDeviceClass=09\n
A: bDeviceProtocol=01 A: bDeviceProtocol=01\n
A: bDeviceSubClass=00 A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64 A: bMaxPacketSize0=64\n
A: bMaxPower=0mA A: bMaxPower=0mA\n
A: bNumConfigurations=1 A: bNumConfigurations=1\n
A: bNumInterfaces= 1 A: bNumInterfaces= 1\n
A: bcdDevice=0508 A: bcdDevice=0508\n
A: bmAttributes=e0 A: bmAttributes=e0\n
A: busnum=1 A: busnum=1\n
A: configuration= A: configuration=\n
H: descriptors=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C H: descriptors=12010002090001406B1D020008050302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0 A: dev=189:0\n
A: devnum=1 A: devnum=1\n
A: devpath=0 A: devpath=0\n
L: driver=../../../../bus/usb/drivers/usb L: driver=../../../../bus/usb/drivers/usb
A: idProduct=0002 A: idProduct=0002\n
A: idVendor=1d6b A: idVendor=1d6b\n
A: interface_authorized_default=1 A: interface_authorized_default=1\n
A: ltm_capable=no A: ltm_capable=no\n
A: manufacturer=Linux 5.8.0-59-generic xhci-hcd A: manufacturer=Linux 5.8.0-59-generic xhci-hcd\n
A: maxchild=12 A: maxchild=12\n
A: power/active_duration=378024 A: power/active_duration=378024\n
A: power/async=enabled A: power/async=enabled\n
A: power/autosuspend=0 A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0 A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=5527220 A: power/connected_duration=5527220\n
A: power/control=auto A: power/control=auto\n
A: power/level=auto A: power/level=auto\n
A: power/runtime_active_kids=1 A: power/runtime_active_kids=1\n
A: power/runtime_active_time=377962 A: power/runtime_active_time=377962\n
A: power/runtime_enabled=enabled A: power/runtime_enabled=enabled\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=5149253 A: power/runtime_suspended_time=5149253\n
A: power/runtime_usage=0 A: power/runtime_usage=0\n
A: power/wakeup=disabled A: power/wakeup=disabled\n
A: power/wakeup_abort_count= A: power/wakeup_abort_count=\n
A: power/wakeup_active= A: power/wakeup_active=\n
A: power/wakeup_active_count= A: power/wakeup_active_count=\n
A: power/wakeup_count= A: power/wakeup_count=\n
A: power/wakeup_expire_count= A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms= A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms= A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms= A: power/wakeup_total_time_ms=\n
A: product=xHCI Host Controller A: product=xHCI Host Controller\n
A: quirks=0x0 A: quirks=0x0\n
A: removable=unknown A: removable=unknown\n
A: rx_lanes=1 A: rx_lanes=1\n
A: serial=0000:00:14.0 A: serial=0000:00:14.0\n
A: speed=480 A: speed=480\n
A: tx_lanes=1 A: tx_lanes=1\n
A: urbnum=956 A: urbnum=956\n
A: version= 2.00 A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0 P: /devices/pci0000:00/0000:00:14.0
E: DRIVER=xhci_hcd E: DRIVER=xhci_hcd
@@ -183,46 +183,46 @@ E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller E: ID_MODEL_FROM_DATABASE=Sunrise Point-LP USB 3.0 xHCI Controller
A: ari_enabled=0 A: ari_enabled=0\n
A: broken_parity_status=0 A: broken_parity_status=0\n
A: class=0x0c0330 A: class=0x0c0330\n
H: config=86802F9D060490022130030C00008000040021A400000000000000000000000000000000000000000000000025108E11000000007000000000000000FF010000 H: config=86802F9D060490022130030C00008000040021A400000000000000000000000000000000000000000000000025108E11000000007000000000000000FF010000
A: consistent_dma_mask_bits=64 A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1 A: d3cold_allowed=1\n
A: dbc=disabled A: dbc=disabled\n
A: device=0x9d2f A: device=0x9d2f\n
A: dma_mask_bits=64 A: dma_mask_bits=64\n
L: driver=../../../bus/pci/drivers/xhci_hcd L: driver=../../../bus/pci/drivers/xhci_hcd
A: driver_override=(null) A: driver_override=(null)\n
A: enable=1 A: enable=1\n
A: irq=127 A: irq=127\n
A: local_cpulist=0-7 A: local_cpulist=0-7\n
A: local_cpus=ff A: local_cpus=ff\n
A: modalias=pci:v00008086d00009D2Fsv00001025sd0000118Ebc0Csc03i30 A: modalias=pci:v00008086d00009D2Fsv00001025sd0000118Ebc0Csc03i30\n
A: msi_bus=1 A: msi_bus=1\n
A: msi_irqs/127=msi A: msi_irqs/127=msi\n
A: numa_node=-1 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 9 10 2112 10\nxHCI ring segments 32 36 4096 36\nbuffer-2048 1 2 2048 1\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0 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 9 10 2112 10\nxHCI ring segments 32 36 4096 36\nbuffer-2048 1 2 2048 1\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\n
A: power/async=enabled A: power/async=enabled\n
A: power/control=on A: power/control=on\n
A: power/runtime_active_kids=1 A: power/runtime_active_kids=1\n
A: power/runtime_active_time=5524703 A: power/runtime_active_time=5524703\n
A: power/runtime_enabled=forbidden A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=3373 A: power/runtime_suspended_time=3373\n
A: power/runtime_usage=1 A: power/runtime_usage=1\n
A: power/wakeup=enabled A: power/wakeup=enabled\n
A: power/wakeup_abort_count=0 A: power/wakeup_abort_count=0\n
A: power/wakeup_active=0 A: power/wakeup_active=0\n
A: power/wakeup_active_count=0 A: power/wakeup_active_count=0\n
A: power/wakeup_count=0 A: power/wakeup_count=0\n
A: power/wakeup_expire_count=0 A: power/wakeup_expire_count=0\n
A: power/wakeup_last_time_ms=0 A: power/wakeup_last_time_ms=0\n
A: power/wakeup_max_time_ms=0 A: power/wakeup_max_time_ms=0\n
A: power/wakeup_total_time_ms=0 A: power/wakeup_total_time_ms=0\n
A: resource=0x00000000a4210000 0x00000000a421ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000 A: resource=0x00000000a4210000 0x00000000a421ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
A: revision=0x21 A: revision=0x21\n
A: subsystem_device=0x118e A: subsystem_device=0x118e\n
A: subsystem_vendor=0x1025 A: subsystem_vendor=0x1025\n
A: vendor=0x8086 A: vendor=0x8086\n

View File

@@ -23,62 +23,62 @@ E: ID_USB_INTERFACES=:ff0000:
E: ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp. E: ID_VENDOR_FROM_DATABASE=Elan Microelectronics Corp.
E: ID_PATH=pci-0000:00:14.0-usb-0:1 E: ID_PATH=pci-0000:00:14.0-usb-0:1
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_1 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_1
A: authorized=1 A: authorized=1\n
A: avoid_reset_quirk=0 A: avoid_reset_quirk=0\n
A: bConfigurationValue=1 A: bConfigurationValue=1\n
A: bDeviceClass=00 A: bDeviceClass=00\n
A: bDeviceProtocol=00 A: bDeviceProtocol=00\n
A: bDeviceSubClass=00 A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64 A: bMaxPacketSize0=64\n
A: bMaxPower=100mA A: bMaxPower=100mA\n
A: bNumConfigurations=1 A: bNumConfigurations=1\n
A: bNumInterfaces= 1 A: bNumInterfaces= 1\n
A: bcdDevice=0305 A: bcdDevice=0305\n
A: bmAttributes=a0 A: bmAttributes=a0\n
A: busnum=1 A: busnum=1\n
A: configuration=add909c9-e67e-4126-a6f7-1e31179e27d9 A: configuration=add909c9-e67e-4126-a6f7-1e31179e27d9\n
H: descriptors=1201000200000040F3047E0C05030102000109025300010103A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001 H: descriptors=1201000200000040F3047E0C05030102000109025300010103A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
A: dev=189:9 A: dev=189:9\n
A: devnum=10 A: devnum=10\n
A: devpath=1 A: devpath=1\n
L: driver=../../../../../bus/usb/drivers/usb L: driver=../../../../../bus/usb/drivers/usb
A: idProduct=0c7e A: idProduct=0c7e\n
A: idVendor=04f3 A: idVendor=04f3\n
A: ltm_capable=no A: ltm_capable=no\n
A: manufacturer=ELAN A: manufacturer=ELAN\n
A: maxchild=0 A: maxchild=0\n
L: port=../1-0:1.0/usb1-port1 L: port=../1-0:1.0/usb1-port1
A: power/active_duration=94712 A: power/active_duration=94712\n
A: power/async=enabled A: power/async=enabled\n
A: power/autosuspend=2 A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000 A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=94712 A: power/connected_duration=94712\n
A: power/control=on A: power/control=on\n
A: power/level=on A: power/level=on\n
A: power/persist=1 A: power/persist=1\n
A: power/runtime_active_kids=0 A: power/runtime_active_kids=0\n
A: power/runtime_active_time=94436 A: power/runtime_active_time=94436\n
A: power/runtime_enabled=forbidden A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=0 A: power/runtime_suspended_time=0\n
A: power/runtime_usage=1 A: power/runtime_usage=1\n
A: power/wakeup=disabled A: power/wakeup=disabled\n
A: power/wakeup_abort_count= A: power/wakeup_abort_count=\n
A: power/wakeup_active= A: power/wakeup_active=\n
A: power/wakeup_active_count= A: power/wakeup_active_count=\n
A: power/wakeup_count= A: power/wakeup_count=\n
A: power/wakeup_expire_count= A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms= A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms= A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms= A: power/wakeup_total_time_ms=\n
A: product=ELAN:ARM-M4 A: product=ELAN:ARM-M4\n
A: quirks=0x0 A: quirks=0x0\n
A: removable=removable A: removable=removable\n
A: rx_lanes=1 A: rx_lanes=1\n
A: speed=12 A: speed=12\n
A: tx_lanes=1 A: tx_lanes=1\n
A: urbnum=12 A: urbnum=12\n
A: version= 2.00 A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0/usb1 P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C N: bus/usb/001/001=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C
@@ -109,63 +109,63 @@ E: ID_PATH=pci-0000:00:14.0
E: ID_PATH_TAG=pci-0000_00_14_0 E: ID_PATH_TAG=pci-0000_00_14_0
E: ID_FOR_SEAT=usb-pci-0000_00_14_0 E: ID_FOR_SEAT=usb-pci-0000_00_14_0
E: TAGS=:seat: E: TAGS=:seat:
A: authorized=1 A: authorized=1\n
A: authorized_default=1 A: authorized_default=1\n
A: avoid_reset_quirk=0 A: avoid_reset_quirk=0\n
A: bConfigurationValue=1 A: bConfigurationValue=1\n
A: bDeviceClass=09 A: bDeviceClass=09\n
A: bDeviceProtocol=01 A: bDeviceProtocol=01\n
A: bDeviceSubClass=00 A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64 A: bMaxPacketSize0=64\n
A: bMaxPower=0mA A: bMaxPower=0mA\n
A: bNumConfigurations=1 A: bNumConfigurations=1\n
A: bNumInterfaces= 1 A: bNumInterfaces= 1\n
A: bcdDevice=0504 A: bcdDevice=0504\n
A: bmAttributes=e0 A: bmAttributes=e0\n
A: busnum=1 A: busnum=1\n
A: configuration= A: configuration=\n
H: descriptors=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C H: descriptors=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0 A: dev=189:0\n
A: devnum=1 A: devnum=1\n
A: devpath=0 A: devpath=0\n
L: driver=../../../../bus/usb/drivers/usb L: driver=../../../../bus/usb/drivers/usb
A: idProduct=0002 A: idProduct=0002\n
A: idVendor=1d6b A: idVendor=1d6b\n
A: interface_authorized_default=1 A: interface_authorized_default=1\n
A: ltm_capable=no A: ltm_capable=no\n
A: manufacturer=Linux 5.4.0-42-generic xhci-hcd A: manufacturer=Linux 5.4.0-42-generic xhci-hcd\n
A: maxchild=12 A: maxchild=12\n
A: power/active_duration=74604360 A: power/active_duration=74604360\n
A: power/async=enabled A: power/async=enabled\n
A: power/autosuspend=0 A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0 A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=74606456 A: power/connected_duration=74606456\n
A: power/control=auto A: power/control=auto\n
A: power/level=auto A: power/level=auto\n
A: power/runtime_active_kids=4 A: power/runtime_active_kids=4\n
A: power/runtime_active_time=74605838 A: power/runtime_active_time=74605838\n
A: power/runtime_enabled=enabled A: power/runtime_enabled=enabled\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=0 A: power/runtime_suspended_time=0\n
A: power/runtime_usage=0 A: power/runtime_usage=0\n
A: power/wakeup=disabled A: power/wakeup=disabled\n
A: power/wakeup_abort_count= A: power/wakeup_abort_count=\n
A: power/wakeup_active= A: power/wakeup_active=\n
A: power/wakeup_active_count= A: power/wakeup_active_count=\n
A: power/wakeup_count= A: power/wakeup_count=\n
A: power/wakeup_expire_count= A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms= A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms= A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms= A: power/wakeup_total_time_ms=\n
A: product=xHCI Host Controller A: product=xHCI Host Controller\n
A: quirks=0x0 A: quirks=0x0\n
A: removable=unknown A: removable=unknown\n
A: rx_lanes=1 A: rx_lanes=1\n
A: serial=0000:00:14.0 A: serial=0000:00:14.0\n
A: speed=480 A: speed=480\n
A: tx_lanes=1 A: tx_lanes=1\n
A: urbnum=490 A: urbnum=490\n
A: version= 2.00 A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0 P: /devices/pci0000:00/0000:00:14.0
E: DRIVER=xhci_hcd E: DRIVER=xhci_hcd
@@ -180,46 +180,46 @@ E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller
A: ari_enabled=0 A: ari_enabled=0\n
A: broken_parity_status=0 A: broken_parity_status=0\n
A: class=0x0c0330 A: class=0x0c0330\n
H: config=8680ED9D060490023030030C00008000040030A10000000000000000000000000000000000000000000000003C10EF85000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F00000000181C030400000000316000000000000000000000000000000180C2C1080000000000000000000000059087007802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000B50F300112000000 H: config=8680ED9D060490023030030C00008000040030A10000000000000000000000000000000000000000000000003C10EF85000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F00000000181C030400000000316000000000000000000000000000000180C2C1080000000000000000000000059087007802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000B50F300112000000
A: consistent_dma_mask_bits=64 A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1 A: d3cold_allowed=1\n
A: dbc=disabled A: dbc=disabled\n
A: device=0x9ded A: device=0x9ded\n
A: dma_mask_bits=64 A: dma_mask_bits=64\n
L: driver=../../../bus/pci/drivers/xhci_hcd L: driver=../../../bus/pci/drivers/xhci_hcd
A: driver_override=(null) A: driver_override=(null)\n
A: enable=1 A: enable=1\n
A: irq=124 A: irq=124\n
A: local_cpulist=0-3 A: local_cpulist=0-3\n
A: local_cpus=f A: local_cpus=f\n
A: modalias=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30 A: modalias=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30\n
A: msi_bus=1 A: msi_bus=1\n
A: msi_irqs/124=msi A: msi_irqs/124=msi\n
A: numa_node=-1 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 32 128 1\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 54 54 4096 54\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 9 32 128 1\nbuffer-32 0 0 32 0 A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 32 128 1\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 11 12 2112 12\nxHCI ring segments 54 54 4096 54\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 9 32 128 1\nbuffer-32 0 0 32 0\n
A: power/async=enabled A: power/async=enabled\n
A: power/control=auto A: power/control=auto\n
A: power/runtime_active_kids=1 A: power/runtime_active_kids=1\n
A: power/runtime_active_time=74606194 A: power/runtime_active_time=74606194\n
A: power/runtime_enabled=enabled A: power/runtime_enabled=enabled\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=0 A: power/runtime_suspended_time=0\n
A: power/runtime_usage=0 A: power/runtime_usage=0\n
A: power/wakeup=enabled A: power/wakeup=enabled\n
A: power/wakeup_abort_count=0 A: power/wakeup_abort_count=0\n
A: power/wakeup_active=0 A: power/wakeup_active=0\n
A: power/wakeup_active_count=0 A: power/wakeup_active_count=0\n
A: power/wakeup_count=0 A: power/wakeup_count=0\n
A: power/wakeup_expire_count=0 A: power/wakeup_expire_count=0\n
A: power/wakeup_last_time_ms=0 A: power/wakeup_last_time_ms=0\n
A: power/wakeup_max_time_ms=0 A: power/wakeup_max_time_ms=0\n
A: power/wakeup_total_time_ms=0 A: power/wakeup_total_time_ms=0\n
A: resource=0x00000000a1300000 0x00000000a130ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000 A: resource=0x00000000a1300000 0x00000000a130ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
A: revision=0x30 A: revision=0x30\n
A: subsystem_device=0x85ef A: subsystem_device=0x85ef\n
A: subsystem_vendor=0x103c A: subsystem_vendor=0x103c\n
A: vendor=0x8086 A: vendor=0x8086\n

View File

@@ -25,60 +25,60 @@ E: ID_VENDOR_FROM_DATABASE=Shenzhen Goodix Technology Co.,Ltd.
E: ID_AUTOSUSPEND=1 E: ID_AUTOSUSPEND=1
E: ID_PATH=pci-0000:00:14.0-usb-0:3 E: ID_PATH=pci-0000:00:14.0-usb-0:3
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_3 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_3
A: authorized=1 A: authorized=1\n
A: avoid_reset_quirk=0 A: avoid_reset_quirk=0\n
A: bConfigurationValue=1 A: bConfigurationValue=1\n
A: bDeviceClass=ef A: bDeviceClass=ef\n
A: bDeviceProtocol=00 A: bDeviceProtocol=00\n
A: bDeviceSubClass=00 A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64 A: bMaxPacketSize0=64\n
A: bMaxPower=100mA A: bMaxPower=100mA\n
A: bNumConfigurations=1 A: bNumConfigurations=1\n
A: bNumInterfaces= 1 A: bNumInterfaces= 1\n
A: bcdDevice=0100 A: bcdDevice=0100\n
A: bmAttributes=a0 A: bmAttributes=a0\n
A: busnum=1 A: busnum=1\n
A: configuration=XXXX_MOC_B0 A: configuration=XXXX_MOC_B0\n
H: descriptors=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000 H: descriptors=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000
A: dev=189:52 A: dev=189:52\n
A: devnum=53 A: devnum=53\n
A: devpath=3 A: devpath=3\n
L: driver=../../../../../bus/usb/drivers/usb L: driver=../../../../../bus/usb/drivers/usb
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:20 L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:20
A: idProduct=6496 A: idProduct=6496\n
A: idVendor=27c6 A: idVendor=27c6\n
A: ltm_capable=no A: ltm_capable=no\n
A: manufacturer=Goodix Technology Co., Ltd. A: manufacturer=Goodix Technology Co., Ltd.\n
A: maxchild=0 A: maxchild=0\n
L: port=../1-0:1.0/usb1-port3 L: port=../1-0:1.0/usb1-port3
A: power/active_duration=29262 A: power/active_duration=29262\n
A: power/autosuspend=2 A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000 A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=57399 A: power/connected_duration=57399\n
A: power/control=auto A: power/control=auto\n
A: power/level=auto A: power/level=auto\n
A: power/persist=1 A: power/persist=1\n
A: power/runtime_active_time=29308 A: power/runtime_active_time=29308\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=27850 A: power/runtime_suspended_time=27850\n
A: power/wakeup=disabled A: power/wakeup=disabled\n
A: power/wakeup_abort_count= A: power/wakeup_abort_count=\n
A: power/wakeup_active= A: power/wakeup_active=\n
A: power/wakeup_active_count= A: power/wakeup_active_count=\n
A: power/wakeup_count= A: power/wakeup_count=\n
A: power/wakeup_expire_count= A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms= A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms= A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms= A: power/wakeup_total_time_ms=\n
A: product=Goodix USB2.0 MISC A: product=Goodix USB2.0 MISC\n
A: quirks=0x0 A: quirks=0x0\n
A: removable=removable A: removable=removable\n
A: rx_lanes=1 A: rx_lanes=1\n
A: serial=XXXX_MOC_B0 A: serial=XXXX_MOC_B0\n
A: speed=12 A: speed=12\n
A: tx_lanes=1 A: tx_lanes=1\n
A: urbnum=394 A: urbnum=394\n
A: version= 2.00 A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0/usb1 P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C N: bus/usb/001/001=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
@@ -111,66 +111,66 @@ E: ID_PATH_TAG=pci-0000_00_14_0
E: ID_FOR_SEAT=usb-pci-0000_00_14_0 E: ID_FOR_SEAT=usb-pci-0000_00_14_0
E: TAGS=:seat: E: TAGS=:seat:
E: CURRENT_TAGS=:seat: E: CURRENT_TAGS=:seat:
A: authorized=1 A: authorized=1\n
A: authorized_default=1 A: authorized_default=1\n
A: avoid_reset_quirk=0 A: avoid_reset_quirk=0\n
A: bConfigurationValue=1 A: bConfigurationValue=1\n
A: bDeviceClass=09 A: bDeviceClass=09\n
A: bDeviceProtocol=01 A: bDeviceProtocol=01\n
A: bDeviceSubClass=00 A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64 A: bMaxPacketSize0=64\n
A: bMaxPower=0mA A: bMaxPower=0mA\n
A: bNumConfigurations=1 A: bNumConfigurations=1\n
A: bNumInterfaces= 1 A: bNumInterfaces= 1\n
A: bcdDevice=0513 A: bcdDevice=0513\n
A: bmAttributes=e0 A: bmAttributes=e0\n
A: busnum=1 A: busnum=1\n
A: configuration= A: configuration=\n
H: descriptors=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C H: descriptors=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0 A: dev=189:0\n
A: devnum=1 A: devnum=1\n
A: devpath=0 A: devpath=0\n
L: driver=../../../../bus/usb/drivers/usb L: driver=../../../../bus/usb/drivers/usb
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d
A: idProduct=0002 A: idProduct=0002\n
A: idVendor=1d6b A: idVendor=1d6b\n
A: interface_authorized_default=1 A: interface_authorized_default=1\n
A: ltm_capable=no A: ltm_capable=no\n
A: manufacturer=Linux 5.13.15-200.fc34.x86_64 xhci-hcd A: manufacturer=Linux 5.13.15-200.fc34.x86_64 xhci-hcd\n
A: maxchild=12 A: maxchild=12\n
A: power/active_duration=219578717 A: power/active_duration=219578717\n
A: power/autosuspend=0 A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0 A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=219649620 A: power/connected_duration=219649620\n
A: power/control=auto A: power/control=auto\n
A: power/level=auto A: power/level=auto\n
A: power/runtime_active_time=219589127 A: power/runtime_active_time=219589127\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=0 A: power/runtime_suspended_time=0\n
A: power/wakeup=disabled A: power/wakeup=disabled\n
A: power/wakeup_abort_count= A: power/wakeup_abort_count=\n
A: power/wakeup_active= A: power/wakeup_active=\n
A: power/wakeup_active_count= A: power/wakeup_active_count=\n
A: power/wakeup_count= A: power/wakeup_count=\n
A: power/wakeup_expire_count= A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms= A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms= A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms= A: power/wakeup_total_time_ms=\n
A: product=xHCI Host Controller A: product=xHCI Host Controller\n
A: quirks=0x0 A: quirks=0x0\n
A: removable=unknown A: removable=unknown\n
A: rx_lanes=1 A: rx_lanes=1\n
A: serial=0000:00:14.0 A: serial=0000:00:14.0\n
A: speed=480 A: speed=480\n
A: tx_lanes=1 A: tx_lanes=1\n
A: urbnum=4325 A: urbnum=4325\n
A: version= 2.00 A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0 P: /devices/pci0000:00/0000:00:14.0
E: DRIVER=xhci_hcd E: DRIVER=xhci_hcd
E: PCI_CLASS=C0330 E: PCI_CLASS=C0330
E: PCI_ID=8086:9DED E: PCI_ID=8086:9DED
E: PCI_SUBSYS_ID=17AA:2292 E: PCI_SUBSYS_ID=17AA:2292\n
E: PCI_SLOT_NAME=0000:00:14.0 E: PCI_SLOT_NAME=0000:00:14.0
E: MODALIAS=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30 E: MODALIAS=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30
E: SUBSYSTEM=pci E: SUBSYSTEM=pci
@@ -180,44 +180,44 @@ E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_AUTOSUSPEND=1 E: ID_AUTOSUSPEND=1
E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller
A: ari_enabled=0 A: ari_enabled=0\n
A: broken_parity_status=0 A: broken_parity_status=0\n
A: class=0x0c0330 A: class=0x0c0330\n
H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004C084B0100000000316000000000000000000000000000000180C2C1080000000000000000000000059087001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000 H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004C084B0100000000316000000000000000000000000000000180C2C1080000000000000000000000059087001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000
A: consistent_dma_mask_bits=64 A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1 A: d3cold_allowed=1\n
A: dbc=disabled A: dbc=disabled\n
A: device=0x9ded A: device=0x9ded\n
A: dma_mask_bits=64 A: dma_mask_bits=64\n
L: driver=../../../bus/pci/drivers/xhci_hcd L: driver=../../../bus/pci/drivers/xhci_hcd
A: driver_override=(null) A: driver_override=(null)\n
A: enable=1 A: enable=1\n
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c
A: irq=128 A: irq=128\n
A: local_cpulist=0-7 A: local_cpulist=0-7\n
A: local_cpus=ff A: local_cpus=ff\n
A: modalias=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30 A: modalias=pci:v00008086d00009DEDsv000017AAsd00002292bc0Csc03i30\n
A: msi_bus=1 A: msi_bus=1\n
A: msi_irqs/128=msi A: msi_irqs/128=msi\n
A: numa_node=-1 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 11 12 2112 12\nxHCI ring segments 46 50 4096 50\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0 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 11 12 2112 12\nxHCI ring segments 46 50 4096 50\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 6 32 128 1\nbuffer-32 0 0 32 0\n
A: power/control=on A: power/control=on\n
A: power/runtime_active_time=219589302 A: power/runtime_active_time=219589302\n
A: power/runtime_status=active A: power/runtime_status=active\n
A: power/runtime_suspended_time=0 A: power/runtime_suspended_time=0\n
A: power/wakeup=enabled A: power/wakeup=enabled\n
A: power/wakeup_abort_count=0 A: power/wakeup_abort_count=0\n
A: power/wakeup_active=0 A: power/wakeup_active=0\n
A: power/wakeup_active_count=0 A: power/wakeup_active_count=0\n
A: power/wakeup_count=0 A: power/wakeup_count=0\n
A: power/wakeup_expire_count=0 A: power/wakeup_expire_count=0\n
A: power/wakeup_last_time_ms=0 A: power/wakeup_last_time_ms=0\n
A: power/wakeup_max_time_ms=0 A: power/wakeup_max_time_ms=0\n
A: power/wakeup_total_time_ms=0 A: power/wakeup_total_time_ms=0\n
A: power_state=D0 A: power_state=D0\n
A: resource=0x00000000ea220000 0x00000000ea22ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000 A: resource=0x00000000ea220000 0x00000000ea22ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
A: revision=0x11 A: revision=0x11\n
A: subsystem_device=0x2292 A: subsystem_device=0x2292\n
A: subsystem_vendor=0x17aa A: subsystem_vendor=0x17aa\n
A: vendor=0x8086 A: vendor=0x8086\n

View File

@@ -27,6 +27,7 @@
#include "fpi-compat.h" #include "fpi-compat.h"
#include "fpi-log.h" #include "fpi-log.h"
#include "test-device-fake.h" #include "test-device-fake.h"
#include "fp-print-private.h"
/* Utility functions */ /* Utility functions */
@@ -142,6 +143,16 @@ make_fake_print (FpDevice *device,
return enrolled_print; return enrolled_print;
} }
static FpPrint *
make_fake_nbis_print (FpDevice *device)
{
FpPrint *enrolled_print = fp_print_new (device);
fpi_print_set_type (enrolled_print, FPI_PRINT_NBIS);
return enrolled_print;
}
static FpPrint * static FpPrint *
make_fake_print_reffed (FpDevice *device, make_fake_print_reffed (FpDevice *device,
GVariant *print_data) GVariant *print_data)
@@ -1045,7 +1056,6 @@ test_driver_enroll_error_no_print (void)
out_print = out_print =
fp_device_enroll_sync (device, fp_print_new (device), NULL, NULL, NULL, &error); fp_device_enroll_sync (device, fp_print_new (device), NULL, NULL, NULL, &error);
g_test_assert_expected_messages ();
g_assert (fake_dev->last_called_function == dev_class->enroll); g_assert (fake_dev->last_called_function == dev_class->enroll);
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL); g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
g_assert_null (out_print); g_assert_null (out_print);
@@ -1053,6 +1063,111 @@ test_driver_enroll_error_no_print (void)
g_clear_error (&error); g_clear_error (&error);
} }
static void
test_driver_enroll_update_nbis (void)
{
g_autoptr(GError) error = NULL;
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpAutoCloseDevice) device = NULL;
g_autoptr(FpPrint) template_print = NULL;
FpiDeviceFake *fake_dev = NULL;
FpPrint *out_print = NULL;
dev_class->features |= FP_DEVICE_FEATURE_UPDATE_PRINT;
device = auto_close_fake_device_new ();
fake_dev = FPI_DEVICE_FAKE (device);
template_print = make_fake_nbis_print (device);
fake_dev->ret_print = template_print;
out_print =
fp_device_enroll_sync (device, template_print, NULL, NULL, NULL, &error);
g_assert (fake_dev->last_called_function == dev_class->enroll);
g_assert (fake_dev->action_data == template_print);
g_assert_no_error (error);
g_assert (out_print == template_print);
}
static void
test_driver_enroll_update_nbis_wrong_device (void)
{
g_autoptr(GError) error = NULL;
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpAutoCloseDevice) device = NULL;
g_autoptr(FpPrint) template_print = NULL;
FpiDeviceFake *fake_dev = NULL;
FpPrint *out_print = NULL;
dev_class->features |= FP_DEVICE_FEATURE_UPDATE_PRINT;
device = auto_close_fake_device_new ();
fake_dev = FPI_DEVICE_FAKE (device);
template_print = make_fake_nbis_print (device);
template_print->device_id = g_strdup ("wrong_device");
fake_dev->ret_print = template_print;
out_print =
fp_device_enroll_sync (device, template_print, NULL, NULL, NULL, &error);
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID);
g_assert (out_print == NULL);
}
static void
test_driver_enroll_update_nbis_wrong_driver (void)
{
g_autoptr(GError) error = NULL;
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpAutoCloseDevice) device = NULL;
g_autoptr(FpPrint) template_print = NULL;
FpiDeviceFake *fake_dev = NULL;
FpPrint *out_print = NULL;
dev_class->features |= FP_DEVICE_FEATURE_UPDATE_PRINT;
device = auto_close_fake_device_new ();
fake_dev = FPI_DEVICE_FAKE (device);
template_print = make_fake_nbis_print (device);
template_print->driver = g_strdup ("wrong_driver");
fake_dev->ret_print = template_print;
out_print =
fp_device_enroll_sync (device, template_print, NULL, NULL, NULL, &error);
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID);
g_assert (out_print == NULL);
}
static void
test_driver_enroll_update_nbis_missing_feature (void)
{
g_autoptr(GError) error = NULL;
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpAutoCloseDevice) device = NULL;
g_autoptr(FpPrint) template_print = NULL;
FpiDeviceFake *fake_dev = NULL;
FpPrint *out_print = NULL;
device = auto_close_fake_device_new ();
fake_dev = FPI_DEVICE_FAKE (device);
template_print = make_fake_nbis_print (device);
fake_dev->ret_print = template_print;
out_print =
fp_device_enroll_sync (device, template_print, NULL, NULL, NULL, &error);
g_assert (fake_dev->last_called_function == dev_class->open);
g_assert (fake_dev->action_data == NULL);
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID);
g_assert (out_print == NULL);
}
typedef struct typedef struct
{ {
gint completed_stages; gint completed_stages;
@@ -3306,6 +3421,13 @@ main (int argc, char *argv[])
g_test_add_func ("/driver/enroll/error", test_driver_enroll_error); g_test_add_func ("/driver/enroll/error", test_driver_enroll_error);
g_test_add_func ("/driver/enroll/error/no_print", test_driver_enroll_error_no_print); g_test_add_func ("/driver/enroll/error/no_print", test_driver_enroll_error_no_print);
g_test_add_func ("/driver/enroll/progress", test_driver_enroll_progress); g_test_add_func ("/driver/enroll/progress", test_driver_enroll_progress);
g_test_add_func ("/driver/enroll/update_nbis", test_driver_enroll_update_nbis);
g_test_add_func ("/driver/enroll/update_nbis_wrong_device",
test_driver_enroll_update_nbis_wrong_device);
g_test_add_func ("/driver/enroll/update_nbis_wrong_driver",
test_driver_enroll_update_nbis_wrong_driver);
g_test_add_func ("/driver/enroll/update_nbis_missing_feature",
test_driver_enroll_update_nbis_missing_feature);
g_test_add_func ("/driver/verify", test_driver_verify); g_test_add_func ("/driver/verify", test_driver_verify);
g_test_add_func ("/driver/verify/fail", test_driver_verify_fail); g_test_add_func ("/driver/verify/fail", test_driver_verify_fail);
g_test_add_func ("/driver/verify/retry", test_driver_verify_retry); g_test_add_func ("/driver/verify/retry", test_driver_verify_retry);

View File

@@ -136,6 +136,7 @@ class VirtualImage(unittest.TestCase):
self.assertTrue(self.dev.has_feature(FPrint.DeviceFeature.CAPTURE)) self.assertTrue(self.dev.has_feature(FPrint.DeviceFeature.CAPTURE))
self.assertTrue(self.dev.has_feature(FPrint.DeviceFeature.IDENTIFY)) self.assertTrue(self.dev.has_feature(FPrint.DeviceFeature.IDENTIFY))
self.assertTrue(self.dev.has_feature(FPrint.DeviceFeature.VERIFY)) self.assertTrue(self.dev.has_feature(FPrint.DeviceFeature.VERIFY))
self.assertTrue(self.dev.has_feature(FPrint.DeviceFeature.UPDATE_PRINT))
self.assertFalse(self.dev.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)) self.assertFalse(self.dev.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK))
self.assertFalse(self.dev.has_feature(FPrint.DeviceFeature.STORAGE)) self.assertFalse(self.dev.has_feature(FPrint.DeviceFeature.STORAGE))
self.assertFalse(self.dev.has_feature(FPrint.DeviceFeature.STORAGE_LIST)) self.assertFalse(self.dev.has_feature(FPrint.DeviceFeature.STORAGE_LIST))
@@ -144,7 +145,8 @@ class VirtualImage(unittest.TestCase):
self.assertEqual(self.dev.get_features(), self.assertEqual(self.dev.get_features(),
FPrint.DeviceFeature.CAPTURE | FPrint.DeviceFeature.CAPTURE |
FPrint.DeviceFeature.IDENTIFY | FPrint.DeviceFeature.IDENTIFY |
FPrint.DeviceFeature.VERIFY) FPrint.DeviceFeature.VERIFY |
FPrint.DeviceFeature.UPDATE_PRINT)
def test_capture_prevents_close(self): def test_capture_prevents_close(self):
cancel = Gio.Cancellable() cancel = Gio.Cancellable()
@@ -167,7 +169,7 @@ class VirtualImage(unittest.TestCase):
while not self._cancelled: while not self._cancelled:
ctx.iteration(True) ctx.iteration(True)
def enroll_print(self, image): def enroll_print(self, image, template=None):
self._step = 0 self._step = 0
self._enrolled = None self._enrolled = None
@@ -181,14 +183,15 @@ class VirtualImage(unittest.TestCase):
self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE) self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE)
self._enrolled = fp self._enrolled = fp
template = FPrint.Print.new(self.dev) if template is None:
template.props.finger = FPrint.Finger.LEFT_THUMB template = FPrint.Print.new(self.dev)
template.props.username = "testuser" template.props.finger = FPrint.Finger.LEFT_THUMB
template.props.description = "test print" template.props.username = "testuser"
datetime = GLib.DateTime.new_now_local() template.props.description = "test print"
date = GLib.Date() datetime = GLib.DateTime.new_now_local()
date.set_dmy(*datetime.get_ymd()[::-1]) date = GLib.Date()
template.props.enroll_date = date date.set_dmy(*datetime.get_ymd()[::-1])
template.props.enroll_date = date
self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE) self.assertEqual(self.dev.get_finger_status(), FPrint.FingerStatusFlags.NONE)
self.dev.enroll(template, None, progress_cb, tuple(), done_cb) self.dev.enroll(template, None, progress_cb, tuple(), done_cb)
@@ -264,6 +267,28 @@ class VirtualImage(unittest.TestCase):
ctx.iteration(True) ctx.iteration(True)
assert(not self._verify_match) assert(not self._verify_match)
# Test fingerprint updates
# Enroll a second print
fp_whorl_tended_arch = self.enroll_print('tented_arch', fp_whorl)
# Make sure the first print verifies successfully after the update
self._verify_match = None
self._verify_fp = None
self.dev.verify(fp_whorl_tended_arch, callback=verify_cb)
self.send_image('whorl')
while self._verify_match is None:
ctx.iteration(True)
assert(self._verify_match)
# Make sure the second print verifies successfully after the update
self._verify_match = None
self._verify_fp = None
self.dev.verify(fp_whorl_tended_arch, callback=verify_cb)
self.send_image('tented_arch')
while self._verify_match is None:
ctx.iteration(True)
assert(self._verify_match)
# Test verify error cases # Test verify error cases
self._verify_fp = None self._verify_fp = None
self._verify_error = None self._verify_error = None