mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2025-11-15 07:38:12 +00:00
Compare commits
2 Commits
benzea/per
...
benzea/ela
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
664126b431 | ||
|
|
7b1fe6ec19 |
21
NEWS
21
NEWS
@@ -1,27 +1,6 @@
|
|||||||
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.
|
||||||
|
|
||||||
2022-05-24: v1.94.4 release
|
|
||||||
|
|
||||||
Highlights:
|
|
||||||
* synaptics: New PIDs 0x0168, 0x015f
|
|
||||||
* elan: New PID 0x0c4b
|
|
||||||
* elanspi: New PID 0x241f
|
|
||||||
* synaptics: Minor fix to interrupt transfer resubmission
|
|
||||||
* Avoid sysfs writes if value is already expected
|
|
||||||
* Improvements to the testing setup
|
|
||||||
* Fixes to the internal critical section API
|
|
||||||
|
|
||||||
2021-11-02: v1.94.3 release
|
|
||||||
|
|
||||||
Highlights:
|
|
||||||
* Ensure idle mainloop before completing enumeration (fprintd#119)
|
|
||||||
* It is now possible to extend already enrolled prints
|
|
||||||
* elanspi: Fix timeout error with some hardware (#438)
|
|
||||||
* elanspi: Fix cancellation issues
|
|
||||||
* goodixmoc: Return matching device print; fixes duplicate checking (#444)
|
|
||||||
* goodixmoc: Support clearing the storage (usually unused)
|
|
||||||
|
|
||||||
2021-11-02: v1.94.2 release
|
2021-11-02: v1.94.2 release
|
||||||
|
|
||||||
Highlights:
|
Highlights:
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
# libfprint
|
libfprint
|
||||||
|
=========
|
||||||
|
|
||||||
libfprint is part of the fprint project:
|
libfprint is part of the fprint project:
|
||||||
https://fprint.freedesktop.org/
|
https://fprint.freedesktop.org/
|
||||||
|
|
||||||
## History
|
|
||||||
|
|
||||||
libfprint was originally developed as part of an academic project at the
|
libfprint was originally developed as part of an academic project at the
|
||||||
University of Manchester with the aim of hiding differences between different
|
University of Manchester with the aim of hiding differences between different
|
||||||
consumer fingerprint scanners and providing a single uniform API to application
|
consumer fingerprint scanners and providing a single uniform API to application
|
||||||
@@ -16,8 +15,6 @@ from this one, although I try to keep them as similar as possible (I'm not
|
|||||||
hiding anything in the academic branch, it's just the open source release
|
hiding anything in the academic branch, it's just the open source release
|
||||||
contains some commits excluded from the academic project).
|
contains some commits excluded from the academic project).
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
THE UNIVERSITY OF MANCHESTER DOES NOT ENDORSE THIS THIS SOFTWARE RELEASE AND
|
THE UNIVERSITY OF MANCHESTER DOES NOT ENDORSE THIS THIS SOFTWARE RELEASE AND
|
||||||
IS IN NO WAY RESPONSIBLE FOR THE CODE CONTAINED WITHIN, OR ANY DAMAGES CAUSED
|
IS IN NO WAY RESPONSIBLE FOR THE CODE CONTAINED WITHIN, OR ANY DAMAGES CAUSED
|
||||||
BY USING OR DISTRIBUTING THE SOFTWARE. Development does not happen on
|
BY USING OR DISTRIBUTING THE SOFTWARE. Development does not happen on
|
||||||
30
TODO
Normal file
30
TODO
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
LIBRARY
|
||||||
|
=======
|
||||||
|
test suite against NFIQ compliance set
|
||||||
|
make library optionally asynchronous and maybe thread-safe
|
||||||
|
nbis cleanups
|
||||||
|
API function to determine if img device supports uncond. capture
|
||||||
|
race-free way of saying "save this print but don't overwrite"
|
||||||
|
|
||||||
|
NEW DRIVERS
|
||||||
|
===========
|
||||||
|
Sunplus 895 driver
|
||||||
|
AES3400/3500 driver
|
||||||
|
ID Mouse driver
|
||||||
|
Support for 2nd generation MS devices
|
||||||
|
Support for 2nd generation UPEK devices
|
||||||
|
|
||||||
|
IMAGING
|
||||||
|
=======
|
||||||
|
ignore first frame or two with aes2501
|
||||||
|
aes2501: increase threshold "sum" for end-of-image detection
|
||||||
|
aes2501 gain calibration
|
||||||
|
aes4000 gain calibration
|
||||||
|
aes4000 resampling
|
||||||
|
PPMM parameter to get_minutiae seems to have no effect
|
||||||
|
nbis minutiae should be stored in endian-independent format
|
||||||
|
|
||||||
|
PORTABILITY
|
||||||
|
===========
|
||||||
|
OpenBSD can't do -Wshadow or visibility
|
||||||
|
OpenBSD: add compat codes for ENOTSUP ENODATA and EPROTO
|
||||||
@@ -133,7 +133,6 @@ usb:v04F3p0C32*
|
|||||||
usb:v04F3p0C33*
|
usb:v04F3p0C33*
|
||||||
usb:v04F3p0C3D*
|
usb:v04F3p0C3D*
|
||||||
usb:v04F3p0C42*
|
usb:v04F3p0C42*
|
||||||
usb:v04F3p0C4B*
|
|
||||||
usb:v04F3p0C4D*
|
usb:v04F3p0C4D*
|
||||||
usb:v04F3p0C4F*
|
usb:v04F3p0C4F*
|
||||||
usb:v04F3p0C63*
|
usb:v04F3p0C63*
|
||||||
@@ -145,8 +144,6 @@ usb:v04F3p0C58*
|
|||||||
# Supported by libfprint driver elanmoc
|
# Supported by libfprint driver elanmoc
|
||||||
usb:v04F3p0C7D*
|
usb:v04F3p0C7D*
|
||||||
usb:v04F3p0C7E*
|
usb:v04F3p0C7E*
|
||||||
usb:v04F3p0C82*
|
|
||||||
usb:v04F3p0C88*
|
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
@@ -184,14 +181,13 @@ usb:v06CBp00DF*
|
|||||||
usb:v06CBp00F9*
|
usb:v06CBp00F9*
|
||||||
usb:v06CBp00FC*
|
usb:v06CBp00FC*
|
||||||
usb:v06CBp00C2*
|
usb:v06CBp00C2*
|
||||||
|
usb:v06CBp00C9*
|
||||||
usb:v06CBp0100*
|
usb:v06CBp0100*
|
||||||
usb:v06CBp00F0*
|
usb:v06CBp00F0*
|
||||||
usb:v06CBp0103*
|
usb:v06CBp0103*
|
||||||
usb:v06CBp0123*
|
usb:v06CBp0123*
|
||||||
usb:v06CBp0126*
|
usb:v06CBp0126*
|
||||||
usb:v06CBp0129*
|
usb:v06CBp0129*
|
||||||
usb:v06CBp0168*
|
|
||||||
usb:v06CBp015F*
|
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
@@ -259,9 +255,9 @@ usb:v138Ap0091*
|
|||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
# Known unsupported devices
|
# Known unsupported devices
|
||||||
usb:v04E8p730B*
|
|
||||||
usb:v04F3p036B*
|
usb:v04F3p036B*
|
||||||
usb:v04F3p0C00*
|
usb:v04F3p0C00*
|
||||||
|
usb:v04F3p0C4B*
|
||||||
usb:v04F3p0C4C*
|
usb:v04F3p0C4C*
|
||||||
usb:v04F3p0C57*
|
usb:v04F3p0C57*
|
||||||
usb:v04F3p0C5E*
|
usb:v04F3p0C5E*
|
||||||
@@ -272,20 +268,15 @@ usb:v06CBp008A*
|
|||||||
usb:v06CBp009A*
|
usb:v06CBp009A*
|
||||||
usb:v06CBp009B*
|
usb:v06CBp009B*
|
||||||
usb:v06CBp00A2*
|
usb:v06CBp00A2*
|
||||||
usb:v06CBp00A8*
|
|
||||||
usb:v06CBp00B7*
|
usb:v06CBp00B7*
|
||||||
usb:v06CBp00BB*
|
usb:v06CBp00BB*
|
||||||
usb:v06CBp00BE*
|
usb:v06CBp00BE*
|
||||||
usb:v06CBp00C4*
|
usb:v06CBp00C4*
|
||||||
usb:v06CBp00CB*
|
usb:v06CBp00CB*
|
||||||
usb:v06CBp00C9*
|
|
||||||
usb:v06CBp00D8*
|
usb:v06CBp00D8*
|
||||||
usb:v06CBp00DA*
|
usb:v06CBp00DA*
|
||||||
usb:v06CBp00DC*
|
|
||||||
usb:v06CBp00E4*
|
|
||||||
usb:v06CBp00E7*
|
usb:v06CBp00E7*
|
||||||
usb:v06CBp00E9*
|
usb:v06CBp00E9*
|
||||||
usb:v06CBp00FD*
|
|
||||||
usb:v0A5Cp5801*
|
usb:v0A5Cp5801*
|
||||||
usb:v0A5Cp5805*
|
usb:v0A5Cp5805*
|
||||||
usb:v0A5Cp5834*
|
usb:v0A5Cp5834*
|
||||||
@@ -297,8 +288,6 @@ usb:v0A5Cp5844*
|
|||||||
usb:v0A5Cp5845*
|
usb:v0A5Cp5845*
|
||||||
usb:v0BDAp5812*
|
usb:v0BDAp5812*
|
||||||
usb:v10A5p0007*
|
usb:v10A5p0007*
|
||||||
usb:v10A5p9200*
|
|
||||||
usb:v10A5p9800*
|
|
||||||
usb:v1188p9545*
|
usb:v1188p9545*
|
||||||
usb:v138Ap0007*
|
usb:v138Ap0007*
|
||||||
usb:v138Ap003A*
|
usb:v138Ap003A*
|
||||||
@@ -316,11 +305,9 @@ usb:v1491p0088*
|
|||||||
usb:v16D1p1027*
|
usb:v16D1p1027*
|
||||||
usb:v1C7Ap0300*
|
usb:v1C7Ap0300*
|
||||||
usb:v1C7Ap0575*
|
usb:v1C7Ap0575*
|
||||||
usb:v1C7Ap0576*
|
|
||||||
usb:v27C6p5042*
|
usb:v27C6p5042*
|
||||||
usb:v27C6p5110*
|
usb:v27C6p5110*
|
||||||
usb:v27C6p5117*
|
usb:v27C6p5117*
|
||||||
usb:v27C6p5125*
|
|
||||||
usb:v27C6p5201*
|
usb:v27C6p5201*
|
||||||
usb:v27C6p521D*
|
usb:v27C6p521D*
|
||||||
usb:v27C6p5301*
|
usb:v27C6p5301*
|
||||||
@@ -332,15 +319,12 @@ usb:v27C6p5385*
|
|||||||
usb:v27C6p538C*
|
usb:v27C6p538C*
|
||||||
usb:v27C6p538D*
|
usb:v27C6p538D*
|
||||||
usb:v27C6p5395*
|
usb:v27C6p5395*
|
||||||
usb:v27C6p5503*
|
|
||||||
usb:v27C6p5584*
|
usb:v27C6p5584*
|
||||||
usb:v27C6p55A2*
|
usb:v27C6p55A2*
|
||||||
usb:v27C6p55A4*
|
usb:v27C6p55A4*
|
||||||
usb:v27C6p55B4*
|
usb:v27C6p55B4*
|
||||||
usb:v27C6p5740*
|
usb:v27C6p5740*
|
||||||
usb:v27C6p5E0A*
|
|
||||||
usb:v2808p9338*
|
usb:v2808p9338*
|
||||||
usb:v298Dp2020*
|
|
||||||
usb:v298Dp2033*
|
usb:v298Dp2033*
|
||||||
usb:v3538p0930*
|
usb:v3538p0930*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
|
|||||||
@@ -40,8 +40,6 @@ fp_device_has_feature
|
|||||||
fp_device_has_storage
|
fp_device_has_storage
|
||||||
fp_device_supports_identify
|
fp_device_supports_identify
|
||||||
fp_device_supports_capture
|
fp_device_supports_capture
|
||||||
fp_device_get_persistent_data
|
|
||||||
fp_device_set_persistent_data
|
|
||||||
fp_device_is_open
|
fp_device_is_open
|
||||||
fp_device_open
|
fp_device_open
|
||||||
fp_device_close
|
fp_device_close
|
||||||
@@ -249,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
|
||||||
|
|||||||
@@ -143,7 +143,6 @@ on_identify_cb (FpDevice *dev, FpPrint *match, FpPrint *print,
|
|||||||
if (match)
|
if (match)
|
||||||
{
|
{
|
||||||
g_autoptr(FpPrint) matched_print = g_object_ref (match);
|
g_autoptr(FpPrint) matched_print = g_object_ref (match);
|
||||||
const GDate *date;
|
|
||||||
char date_str[128] = {};
|
char date_str[128] = {};
|
||||||
|
|
||||||
identify_data->ret_value = EXIT_SUCCESS;
|
identify_data->ret_value = EXIT_SUCCESS;
|
||||||
@@ -156,8 +155,7 @@ on_identify_cb (FpDevice *dev, FpPrint *match, FpPrint *print,
|
|||||||
matched_print = g_steal_pointer (&stored_print);
|
matched_print = g_steal_pointer (&stored_print);
|
||||||
}
|
}
|
||||||
|
|
||||||
date = fp_print_get_enroll_date (matched_print);
|
if (fp_print_get_enroll_date (matched_print))
|
||||||
if (date && g_date_valid (date))
|
|
||||||
g_date_strftime (date_str, G_N_ELEMENTS (date_str), "%Y-%m-%d\0",
|
g_date_strftime (date_str, G_N_ELEMENTS (date_str), "%Y-%m-%d\0",
|
||||||
fp_print_get_enroll_date (matched_print));
|
fp_print_get_enroll_date (matched_print));
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ on_list_completed (FpDevice *dev,
|
|||||||
finger_to_string (fp_print_get_finger (print)),
|
finger_to_string (fp_print_get_finger (print)),
|
||||||
fp_print_get_username (print));
|
fp_print_get_username (print));
|
||||||
|
|
||||||
if (date && g_date_valid (date))
|
if (date)
|
||||||
{
|
{
|
||||||
g_date_strftime (buf, G_N_ELEMENTS (buf), "%Y-%m-%d\0", date);
|
g_date_strftime (buf, G_N_ELEMENTS (buf), "%Y-%m-%d\0", date);
|
||||||
g_print (", enrolled on %s", buf);
|
g_print (", enrolled on %s", buf);
|
||||||
|
|||||||
@@ -130,14 +130,12 @@ on_match_cb (FpDevice *dev, FpPrint *match, FpPrint *print,
|
|||||||
|
|
||||||
if (match)
|
if (match)
|
||||||
{
|
{
|
||||||
const GDate *date = fp_print_get_enroll_date (match);
|
char date_str[128];
|
||||||
char date_str[128] = "<unknown>";
|
|
||||||
|
|
||||||
verify_data->ret_value = EXIT_SUCCESS;
|
verify_data->ret_value = EXIT_SUCCESS;
|
||||||
|
|
||||||
if (date && g_date_valid (date))
|
g_date_strftime (date_str, G_N_ELEMENTS (date_str), "%Y-%m-%d\0",
|
||||||
g_date_strftime (date_str, G_N_ELEMENTS (date_str), "%Y-%m-%d\0",
|
fp_print_get_enroll_date (match));
|
||||||
fp_print_get_enroll_date (match));
|
|
||||||
g_debug ("Match report: device %s matched finger %s successifully "
|
g_debug ("Match report: device %s matched finger %s successifully "
|
||||||
"with print %s, enrolled on date %s by user %s",
|
"with print %s, enrolled on date %s by user %s",
|
||||||
fp_device_get_name (dev),
|
fp_device_get_name (dev),
|
||||||
|
|||||||
@@ -215,7 +215,6 @@ static const FpIdEntry elan_id_table[] = {
|
|||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c33, .driver_data = ELAN_ALL_DEV},
|
{.vid = ELAN_VEND_ID, .pid = 0x0c33, .driver_data = ELAN_ALL_DEV},
|
||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c3d, .driver_data = ELAN_ALL_DEV},
|
{.vid = ELAN_VEND_ID, .pid = 0x0c3d, .driver_data = ELAN_ALL_DEV},
|
||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c42, .driver_data = ELAN_0C42},
|
{.vid = ELAN_VEND_ID, .pid = 0x0c42, .driver_data = ELAN_0C42},
|
||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c4b, .driver_data = ELAN_ALL_DEV},
|
|
||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c4d, .driver_data = ELAN_ALL_DEV},
|
{.vid = ELAN_VEND_ID, .pid = 0x0c4d, .driver_data = ELAN_ALL_DEV},
|
||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c4f, .driver_data = ELAN_ALL_DEV},
|
{.vid = ELAN_VEND_ID, .pid = 0x0c4f, .driver_data = ELAN_ALL_DEV},
|
||||||
{.vid = ELAN_VEND_ID, .pid = 0x0c63, .driver_data = ELAN_ALL_DEV},
|
{.vid = ELAN_VEND_ID, .pid = 0x0c63, .driver_data = ELAN_ALL_DEV},
|
||||||
|
|||||||
@@ -27,8 +27,6 @@ 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 = 0x0c7d, },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c7e, },
|
{ .vid = 0x04f3, .pid = 0x0c7e, },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c82, },
|
|
||||||
{ .vid = 0x04f3, .pid = 0x0c88, },
|
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -759,7 +757,6 @@ identify_status_report (FpiDeviceElanmoc *self, int verify_status_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum identify_states {
|
enum identify_states {
|
||||||
IDENTIFY_SET_MODE,
|
|
||||||
IDENTIFY_WAIT_FINGER,
|
IDENTIFY_WAIT_FINGER,
|
||||||
IDENTIFY_NUM_STATES,
|
IDENTIFY_NUM_STATES,
|
||||||
};
|
};
|
||||||
@@ -795,13 +792,6 @@ elan_identify_run_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
fp_info ("elanmoc %s ", __func__);
|
fp_info ("elanmoc %s ", __func__);
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case IDENTIFY_SET_MODE:
|
|
||||||
fp_info ("elanmoc %s IDENTIFY_SET_MODE", __func__);
|
|
||||||
cmd_buf = elanmoc_compose_cmd (&elanmoc_set_mod_cmd);
|
|
||||||
cmd_buf[3] = 0x03;
|
|
||||||
elanmoc_get_cmd (dev, cmd_buf, elanmoc_set_mod_cmd.cmd_len, elanmoc_set_mod_cmd.resp_len, 0, elanmoc_cmd_ack_cb);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDENTIFY_WAIT_FINGER:
|
case IDENTIFY_WAIT_FINGER:
|
||||||
fp_info ("elanmoc %s VERIFY_WAIT_FINGER", __func__);
|
fp_info ("elanmoc %s VERIFY_WAIT_FINGER", __func__);
|
||||||
cmd_buf = elanmoc_compose_cmd (&elanmoc_verify_cmd);
|
cmd_buf = elanmoc_compose_cmd (&elanmoc_verify_cmd);
|
||||||
|
|||||||
@@ -434,27 +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 termination */
|
|
||||||
if (fpi_device_get_current_action (dev) == FPI_DEVICE_ACTION_NONE)
|
|
||||||
{
|
|
||||||
fpi_ssm_mark_completed (transfer->ssm);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* 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
|
||||||
@@ -613,6 +595,7 @@ elanspi_calibrate_old_handler (FpiSsm *ssm, FpDevice *dev)
|
|||||||
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_silence_debug (chld);
|
||||||
|
fpi_ssm_set_critical (chld);
|
||||||
fpi_ssm_start_subsm (ssm, chld);
|
fpi_ssm_start_subsm (ssm, chld);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -868,6 +851,7 @@ 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_silence_debug (chld);
|
||||||
|
fpi_ssm_set_critical (chld);
|
||||||
fpi_ssm_start_subsm (ssm, chld);
|
fpi_ssm_start_subsm (ssm, chld);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1124,6 +1108,7 @@ do_sw_reset:
|
|||||||
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_silence_debug (chld);
|
||||||
|
fpi_ssm_set_critical (chld);
|
||||||
fpi_ssm_start_subsm (ssm, chld);
|
fpi_ssm_start_subsm (ssm, chld);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1133,6 +1118,7 @@ do_sw_reset:
|
|||||||
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_silence_debug (chld);
|
||||||
|
fpi_ssm_set_critical (chld);
|
||||||
fpi_ssm_start_subsm (ssm, chld);
|
fpi_ssm_start_subsm (ssm, chld);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1492,12 +1478,11 @@ elanspi_fp_capture_ssm_handler (FpiSsm *ssm, FpDevice *dev)
|
|||||||
if (self->deactivating)
|
if (self->deactivating)
|
||||||
{
|
{
|
||||||
fp_dbg ("<capture> got deactivate; exiting");
|
fp_dbg ("<capture> got deactivate; exiting");
|
||||||
|
|
||||||
self->deactivating = FALSE;
|
|
||||||
fpi_ssm_mark_completed (ssm);
|
fpi_ssm_mark_completed (ssm);
|
||||||
|
|
||||||
/* mark deactivate done */
|
/* mark deactivate done */
|
||||||
fpi_image_device_deactivate_complete (FP_IMAGE_DEVICE (dev), NULL);
|
fpi_image_device_deactivate_complete (FP_IMAGE_DEVICE (dev), NULL);
|
||||||
|
self->deactivating = FALSE;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1507,6 +1492,7 @@ elanspi_fp_capture_ssm_handler (FpiSsm *ssm, FpDevice *dev)
|
|||||||
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_silence_debug (chld);
|
||||||
|
fpi_ssm_set_critical (chld);
|
||||||
fpi_ssm_start_subsm (ssm, chld);
|
fpi_ssm_start_subsm (ssm, chld);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -97,37 +97,7 @@ static const struct elanspi_reg_entry elanspi_calibration_table_default[] = {
|
|||||||
{0xff, 0xff}
|
{0xff, 0xff}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct elanspi_reg_entry elanspi_calibration_table_id6[] = {
|
static const struct elanspi_reg_entry elanspi_calibration_table_id567[] = {
|
||||||
{0x2A, 0x07},
|
|
||||||
{0x1, 0x00},
|
|
||||||
{0x2, 0x5f},
|
|
||||||
{0x3, 0x00},
|
|
||||||
{0x4, 0x5f},
|
|
||||||
{0x5, 0x60},
|
|
||||||
{0x6, 0xC0},
|
|
||||||
{0x7, 0x80},
|
|
||||||
{0x8, 0x04},
|
|
||||||
{0xA, 0x97},
|
|
||||||
{0xB, 0x72},
|
|
||||||
{0xC, 0x69},
|
|
||||||
{0xF, 0x2A},
|
|
||||||
{0x11, 0x2A},
|
|
||||||
{0x13, 0x27},
|
|
||||||
{0x15, 0x67},
|
|
||||||
{0x18, 0x04},
|
|
||||||
{0x21, 0x20},
|
|
||||||
{0x22, 0x36},
|
|
||||||
{0x29, 0x02},
|
|
||||||
{0x2A, 0x03},
|
|
||||||
{0x2A, 0x5F},
|
|
||||||
{0x2B, 0xC0},
|
|
||||||
{0x2C, 0x10},
|
|
||||||
{0x2E, 0xFF},
|
|
||||||
|
|
||||||
{0xff, 0xff}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct elanspi_reg_entry elanspi_calibration_table_id57[] = {
|
|
||||||
{0x2A, 0x07},
|
{0x2A, 0x07},
|
||||||
{0x5, 0x60},
|
{0x5, 0x60},
|
||||||
{0x6, 0xC0},
|
{0x6, 0xC0},
|
||||||
@@ -173,9 +143,9 @@ static const struct elanspi_regtable elanspi_calibration_table_old = {
|
|||||||
.other = elanspi_calibration_table_default,
|
.other = elanspi_calibration_table_default,
|
||||||
.entries = {
|
.entries = {
|
||||||
{ .sid = 0x0, .table = elanspi_calibration_table_id0 },
|
{ .sid = 0x0, .table = elanspi_calibration_table_id0 },
|
||||||
{ .sid = 0x5, .table = elanspi_calibration_table_id57 },
|
{ .sid = 0x5, .table = elanspi_calibration_table_id567 },
|
||||||
{ .sid = 0x6, .table = elanspi_calibration_table_id6 },
|
{ .sid = 0x6, .table = elanspi_calibration_table_id567 },
|
||||||
{ .sid = 0x7, .table = elanspi_calibration_table_id57 },
|
{ .sid = 0x7, .table = elanspi_calibration_table_id567 },
|
||||||
{ .sid = 0x0, .table = NULL }
|
{ .sid = 0x0, .table = NULL }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -348,7 +318,6 @@ static const FpIdEntry elanspi_id_table[] = {
|
|||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN70A1", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN70A1", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x309f}, .driver_data = ELANSPI_180_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x309f}, .driver_data = ELANSPI_180_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x241f}, .driver_data = ELANSPI_NO_ROTATE},
|
|
||||||
{.udev_types = 0}
|
{.udev_types = 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
{
|
{
|
||||||
fpi_ssm_mark_failed (transfer->ssm,
|
fpi_ssm_mark_failed (transfer->ssm,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
"Corrupted message header received"));
|
"Corrupted message received"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,9 +420,12 @@ fp_verify_cb (FpiDeviceGoodixMoc *self,
|
|||||||
gxfp_cmd_response_t *resp,
|
gxfp_cmd_response_t *resp,
|
||||||
GError *error)
|
GError *error)
|
||||||
{
|
{
|
||||||
|
g_autoptr(GPtrArray) templates = NULL;
|
||||||
FpDevice *device = FP_DEVICE (self);
|
FpDevice *device = FP_DEVICE (self);
|
||||||
FpPrint *new_scan = NULL;
|
FpPrint *match = NULL;
|
||||||
FpPrint *matching = NULL;
|
FpPrint *print = NULL;
|
||||||
|
gint cnt = 0;
|
||||||
|
gboolean find = false;
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
@@ -431,34 +434,46 @@ fp_verify_cb (FpiDeviceGoodixMoc *self,
|
|||||||
}
|
}
|
||||||
if (resp->verify.match)
|
if (resp->verify.match)
|
||||||
{
|
{
|
||||||
new_scan = fp_print_from_template (self, &resp->verify.template);
|
match = fp_print_from_template (self, &resp->verify.template);
|
||||||
|
|
||||||
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
||||||
{
|
{
|
||||||
fpi_device_get_verify_data (device, &matching);
|
templates = g_ptr_array_sized_new (1);
|
||||||
if (!fp_print_equal (matching, new_scan))
|
fpi_device_get_verify_data (device, &print);
|
||||||
matching = NULL;
|
g_ptr_array_add (templates, print);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GPtrArray *templates = NULL;
|
|
||||||
fpi_device_get_identify_data (device, &templates);
|
fpi_device_get_identify_data (device, &templates);
|
||||||
|
g_ptr_array_ref (templates);
|
||||||
|
}
|
||||||
|
for (cnt = 0; cnt < templates->len; cnt++)
|
||||||
|
{
|
||||||
|
print = g_ptr_array_index (templates, cnt);
|
||||||
|
|
||||||
for (gint i = 0; i < templates->len; i++)
|
if (fp_print_equal (print, match))
|
||||||
{
|
{
|
||||||
if (fp_print_equal (g_ptr_array_index (templates, i), new_scan))
|
find = true;
|
||||||
{
|
break;
|
||||||
matching = g_ptr_array_index (templates, i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (find)
|
||||||
|
{
|
||||||
|
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
||||||
|
fpi_device_verify_report (device, FPI_MATCH_SUCCESS, match, error);
|
||||||
|
else
|
||||||
|
fpi_device_identify_report (device, print, match, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
if (!find)
|
||||||
fpi_device_verify_report (device, matching ? FPI_MATCH_SUCCESS : FPI_MATCH_FAIL, new_scan, error);
|
{
|
||||||
else
|
if (fpi_device_get_current_action (device) == FPI_DEVICE_ACTION_VERIFY)
|
||||||
fpi_device_identify_report (device, matching, new_scan, error);
|
fpi_device_verify_report (device, FPI_MATCH_FAIL, NULL, error);
|
||||||
|
else
|
||||||
|
fpi_device_identify_report (device, NULL, NULL, error);
|
||||||
|
}
|
||||||
|
|
||||||
fpi_ssm_next_state (self->task_ssm);
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
|
|
||||||
@@ -661,7 +676,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
|
|||||||
/* */
|
/* */
|
||||||
if (resp->result >= GX_FAILED)
|
if (resp->result >= GX_FAILED)
|
||||||
{
|
{
|
||||||
fp_info ("Capture sample failed, result: 0x%x", resp->result);
|
fp_warn ("Capture sample failed, result: 0x%x", resp->result);
|
||||||
fpi_device_enroll_progress (FP_DEVICE (self),
|
fpi_device_enroll_progress (FP_DEVICE (self),
|
||||||
self->enroll_stage,
|
self->enroll_stage,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -675,7 +690,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
|
|||||||
if ((resp->capture_data_resp.img_quality < self->sensorcfg->config[4]) ||
|
if ((resp->capture_data_resp.img_quality < self->sensorcfg->config[4]) ||
|
||||||
(resp->capture_data_resp.img_coverage < self->sensorcfg->config[5]))
|
(resp->capture_data_resp.img_coverage < self->sensorcfg->config[5]))
|
||||||
{
|
{
|
||||||
fp_info ("Capture sample poor quality(%d): %d or coverage(%d): %d",
|
fp_warn ("Capture sample poor quality(%d): %d or coverage(%d): %d",
|
||||||
self->sensorcfg->config[4],
|
self->sensorcfg->config[4],
|
||||||
resp->capture_data_resp.img_quality,
|
resp->capture_data_resp.img_quality,
|
||||||
self->sensorcfg->config[5],
|
self->sensorcfg->config[5],
|
||||||
@@ -749,14 +764,9 @@ fp_enroll_check_duplicate_cb (FpiDeviceGoodixMoc *self,
|
|||||||
}
|
}
|
||||||
if (resp->check_duplicate_resp.duplicate)
|
if (resp->check_duplicate_resp.duplicate)
|
||||||
{
|
{
|
||||||
g_autoptr(FpPrint) print = NULL;
|
|
||||||
|
|
||||||
print = g_object_ref_sink (fp_print_from_template (self, &resp->check_duplicate_resp.template));
|
|
||||||
|
|
||||||
fpi_ssm_mark_failed (self->task_ssm,
|
fpi_ssm_mark_failed (self->task_ssm,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_DUPLICATE,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_DATA_DUPLICATE,
|
||||||
"Finger was already enrolled as '%s'",
|
"Finger has already enrolled"));
|
||||||
fp_print_get_description (print)));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1041,47 +1051,6 @@ fp_init_config_cb (FpiDeviceGoodixMoc *self,
|
|||||||
fpi_ssm_next_state (self->task_ssm);
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
fp_init_cb_reset_or_complete (FpiDeviceGoodixMoc *self,
|
|
||||||
gxfp_cmd_response_t *resp,
|
|
||||||
GError *error)
|
|
||||||
{
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
fp_warn ("Template storage appears to have been corrupted! Error was: %s", error->message);
|
|
||||||
fp_warn ("A known reason for this to happen is a firmware bug triggered by another storage area being initialized.");
|
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_INIT_RESET_DEVICE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fpi_ssm_mark_completed (self->task_ssm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
fp_init_reset_device_cb (FpiDeviceGoodixMoc *self,
|
|
||||||
gxfp_cmd_response_t *resp,
|
|
||||||
GError *error)
|
|
||||||
{
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
fp_warn ("Reset failed: %s", error->message);
|
|
||||||
fpi_ssm_mark_failed (self->task_ssm, error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((resp->result >= GX_FAILED) && (resp->result != GX_ERROR_FINGER_ID_NOEXIST))
|
|
||||||
{
|
|
||||||
fp_warn ("Reset failed, device reported: 0x%x", resp->result);
|
|
||||||
fpi_ssm_mark_failed (self->task_ssm,
|
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
|
||||||
"Failed clear storage, result: 0x%x",
|
|
||||||
resp->result));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fp_warn ("Reset completed");
|
|
||||||
fpi_ssm_mark_completed (self->task_ssm);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
||||||
@@ -1106,30 +1075,6 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
sizeof (gxfp_sensor_cfg_t),
|
sizeof (gxfp_sensor_cfg_t),
|
||||||
fp_init_config_cb);
|
fp_init_config_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_INIT_TEMPLATE_LIST:
|
|
||||||
/* List prints to check whether the template DB was corrupted.
|
|
||||||
* As of 2022-06-13 there is a known firmware issue that can cause the
|
|
||||||
* stored templates for Linux to be corrupted when the Windows storage
|
|
||||||
* area is initialized.
|
|
||||||
* In that case, we'll get a protocol failure trying to retrieve the
|
|
||||||
* list of prints.
|
|
||||||
*/
|
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_GETFINGERLIST, MOC_CMD1_DEFAULT,
|
|
||||||
FALSE,
|
|
||||||
(const guint8 *) &dummy,
|
|
||||||
1,
|
|
||||||
fp_init_cb_reset_or_complete);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FP_INIT_RESET_DEVICE:
|
|
||||||
fp_warn ("Resetting device storage, you will need to enroll all prints again!");
|
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_DELETETEMPLATE, MOC_CMD1_DELETE_ALL,
|
|
||||||
FALSE,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
fp_init_reset_device_cb);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1225,32 +1170,6 @@ fp_template_delete_cb (FpiDeviceGoodixMoc *self,
|
|||||||
fp_info ("Successfully deleted enrolled user");
|
fp_info ("Successfully deleted enrolled user");
|
||||||
fpi_device_delete_complete (device, NULL);
|
fpi_device_delete_complete (device, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
fp_template_delete_all_cb (FpiDeviceGoodixMoc *self,
|
|
||||||
gxfp_cmd_response_t *resp,
|
|
||||||
GError *error)
|
|
||||||
{
|
|
||||||
FpDevice *device = FP_DEVICE (self);
|
|
||||||
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
fpi_device_clear_storage_complete (device, error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((resp->result >= GX_FAILED) && (resp->result != GX_ERROR_FINGER_ID_NOEXIST))
|
|
||||||
{
|
|
||||||
fpi_device_clear_storage_complete (FP_DEVICE (self),
|
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
|
||||||
"Failed clear storage, result: 0x%x",
|
|
||||||
resp->result));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fp_info ("Successfully cleared storage");
|
|
||||||
fpi_device_clear_storage_complete (device, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* fp_template_list Function
|
* fp_template_list Function
|
||||||
@@ -1574,19 +1493,6 @@ gx_fp_template_delete (FpDevice *device)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gx_fp_template_delete_all (FpDevice *device)
|
|
||||||
{
|
|
||||||
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
|
|
||||||
|
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_DELETETEMPLATE, MOC_CMD1_DELETE_ALL,
|
|
||||||
false,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
fp_template_delete_all_cb);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fpi_device_goodixmoc_init (FpiDeviceGoodixMoc *self)
|
fpi_device_goodixmoc_init (FpiDeviceGoodixMoc *self)
|
||||||
{
|
{
|
||||||
@@ -1630,7 +1536,6 @@ fpi_device_goodixmoc_class_init (FpiDeviceGoodixMocClass *klass)
|
|||||||
dev_class->probe = gx_fp_probe;
|
dev_class->probe = gx_fp_probe;
|
||||||
dev_class->enroll = gx_fp_enroll;
|
dev_class->enroll = gx_fp_enroll;
|
||||||
dev_class->delete = gx_fp_template_delete;
|
dev_class->delete = gx_fp_template_delete;
|
||||||
dev_class->clear_storage = gx_fp_template_delete_all;
|
|
||||||
dev_class->list = gx_fp_template_list;
|
dev_class->list = gx_fp_template_list;
|
||||||
dev_class->verify = gx_fp_verify_identify;
|
dev_class->verify = gx_fp_verify_identify;
|
||||||
dev_class->identify = gx_fp_verify_identify;
|
dev_class->identify = gx_fp_verify_identify;
|
||||||
|
|||||||
@@ -35,8 +35,6 @@ typedef enum {
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
FP_INIT_VERSION = 0,
|
FP_INIT_VERSION = 0,
|
||||||
FP_INIT_CONFIG,
|
FP_INIT_CONFIG,
|
||||||
FP_INIT_TEMPLATE_LIST,
|
|
||||||
FP_INIT_RESET_DEVICE,
|
|
||||||
FP_INIT_NUM_STATES,
|
FP_INIT_NUM_STATES,
|
||||||
} FpInitState;
|
} FpInitState;
|
||||||
|
|
||||||
|
|||||||
@@ -259,9 +259,12 @@ gx_proto_parse_fingerid (
|
|||||||
|
|
||||||
if (buffer[Offset++] != 67)
|
if (buffer[Offset++] != 67)
|
||||||
return -1;
|
return -1;
|
||||||
|
fid_buffer_size--;
|
||||||
|
|
||||||
template->type = buffer[Offset++];
|
template->type = buffer[Offset++];
|
||||||
|
fid_buffer_size--;
|
||||||
template->finger_index = buffer[Offset++];
|
template->finger_index = buffer[Offset++];
|
||||||
|
fid_buffer_size--;
|
||||||
Offset++;
|
Offset++;
|
||||||
memcpy (template->accountid, &buffer[Offset], sizeof (template->accountid));
|
memcpy (template->accountid, &buffer[Offset], sizeof (template->accountid));
|
||||||
Offset += sizeof (template->accountid);
|
Offset += sizeof (template->accountid);
|
||||||
@@ -270,8 +273,6 @@ gx_proto_parse_fingerid (
|
|||||||
template->payload.size = buffer[Offset++];
|
template->payload.size = buffer[Offset++];
|
||||||
if (template->payload.size > sizeof (template->payload.data))
|
if (template->payload.size > sizeof (template->payload.data))
|
||||||
return -1;
|
return -1;
|
||||||
if (template->payload.size + Offset > fid_buffer_size)
|
|
||||||
return -1;
|
|
||||||
memset (template->payload.data, 0, template->payload.size);
|
memset (template->payload.data, 0, template->payload.size);
|
||||||
memcpy (template->payload.data, &buffer[Offset], template->payload.size);
|
memcpy (template->payload.data, &buffer[Offset], template->payload.size);
|
||||||
|
|
||||||
@@ -364,12 +365,9 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
|
|||||||
if (buffer_len < 3)
|
if (buffer_len < 3)
|
||||||
return -1;
|
return -1;
|
||||||
uint16_t tid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + 1));
|
uint16_t tid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + 1));
|
||||||
offset += 3;
|
if ((buffer_len < tid_size + 3) || (buffer_len > sizeof (template_format_t)) + 3)
|
||||||
|
|
||||||
if (buffer_len < tid_size + offset)
|
|
||||||
return -1;
|
|
||||||
if (gx_proto_parse_fingerid (buffer + offset, tid_size, &presp->check_duplicate_resp.template) != 0)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
memcpy (&presp->check_duplicate_resp.template, buffer + 3, tid_size);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -382,19 +380,18 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
|
|||||||
fingerlist = buffer + 2;
|
fingerlist = buffer + 2;
|
||||||
for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++)
|
for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++)
|
||||||
{
|
{
|
||||||
uint16_t fingerid_length;
|
uint16_t fingerid_length = GUINT16_FROM_LE (*(uint16_t *) (fingerlist + offset));
|
||||||
if (buffer_len < offset + 2)
|
|
||||||
return -1;
|
|
||||||
fingerid_length = GUINT16_FROM_LE (*(uint16_t *) (fingerlist + offset));
|
|
||||||
offset += 2;
|
offset += 2;
|
||||||
if (buffer_len < fingerid_length + offset)
|
if (buffer_len < fingerid_length + offset + 2)
|
||||||
return -1;
|
return -1;
|
||||||
if (gx_proto_parse_fingerid (fingerlist + offset,
|
if (gx_proto_parse_fingerid (fingerlist + offset,
|
||||||
fingerid_length,
|
fingerid_length,
|
||||||
&presp->finger_list_resp.finger_list[num]) != 0)
|
&presp->finger_list_resp.finger_list[num]) != 0)
|
||||||
{
|
{
|
||||||
g_warning ("Failed to parse finger list");
|
g_error ("parse fingerlist error");
|
||||||
return -1;
|
presp->finger_list_resp.finger_num = 0;
|
||||||
|
presp->result = GX_FAILED;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
offset += fingerid_length;
|
offset += fingerid_length;
|
||||||
}
|
}
|
||||||
@@ -408,7 +405,7 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
|
|||||||
presp->verify.match = (buffer[0] == 0) ? true : false;
|
presp->verify.match = (buffer[0] == 0) ? true : false;
|
||||||
if (presp->verify.match)
|
if (presp->verify.match)
|
||||||
{
|
{
|
||||||
if (buffer_len < 10)
|
if (buffer_len < sizeof (template_format_t) + 10)
|
||||||
return -1;
|
return -1;
|
||||||
offset += 1;
|
offset += 1;
|
||||||
presp->verify.rejectdetail = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset));
|
presp->verify.rejectdetail = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset));
|
||||||
@@ -419,8 +416,6 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
|
|||||||
offset += 1;
|
offset += 1;
|
||||||
fingerid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset));
|
fingerid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset));
|
||||||
offset += 2;
|
offset += 2;
|
||||||
if (buffer_len < fingerid_size + offset)
|
|
||||||
return -1;
|
|
||||||
if (gx_proto_parse_fingerid (buffer + offset, fingerid_size, &presp->verify.template) != 0)
|
if (gx_proto_parse_fingerid (buffer + offset, fingerid_size, &presp->verify.template) != 0)
|
||||||
{
|
{
|
||||||
presp->result = GX_FAILED;
|
presp->result = GX_FAILED;
|
||||||
|
|||||||
@@ -36,14 +36,13 @@ static const FpIdEntry id_table[] = {
|
|||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F9, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F9, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00FC, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00FC, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C2, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C2, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C9, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x015F, },
|
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -226,7 +225,6 @@ cmd_interrupt_cb (FpiUsbTransfer *transfer,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fpi_device_critical_leave (device);
|
|
||||||
fpi_usb_transfer_submit (fpi_usb_transfer_ref (transfer),
|
fpi_usb_transfer_submit (fpi_usb_transfer_ref (transfer),
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -361,8 +361,6 @@ fp_context_init (FpContext *self)
|
|||||||
FpContextPrivate *priv = fp_context_get_instance_private (self);
|
FpContextPrivate *priv = fp_context_get_instance_private (self);
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
g_debug ("Initializing FpContext (libfprint version " LIBFPRINT_VERSION ")");
|
|
||||||
|
|
||||||
priv->drivers = fpi_get_driver_types ();
|
priv->drivers = fpi_get_driver_types ();
|
||||||
|
|
||||||
if (get_drivers_whitelist_env ())
|
if (get_drivers_whitelist_env ())
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ typedef struct
|
|||||||
FpDeviceFeature features;
|
FpDeviceFeature features;
|
||||||
|
|
||||||
guint64 driver_data;
|
guint64 driver_data;
|
||||||
GVariant *persistent_data;
|
|
||||||
|
|
||||||
gint nr_enroll_stages;
|
gint nr_enroll_stages;
|
||||||
GSList *sources;
|
GSList *sources;
|
||||||
@@ -131,9 +130,6 @@ typedef struct
|
|||||||
|
|
||||||
void match_data_free (FpMatchData *match_data);
|
void match_data_free (FpMatchData *match_data);
|
||||||
|
|
||||||
void fpi_device_suspend (FpDevice *device);
|
|
||||||
void fpi_device_resume (FpDevice *device);
|
|
||||||
|
|
||||||
void fpi_device_configure_wakeup (FpDevice *device,
|
void fpi_device_configure_wakeup (FpDevice *device,
|
||||||
gboolean enabled);
|
gboolean enabled);
|
||||||
void fpi_device_update_temp (FpDevice *device,
|
void fpi_device_update_temp (FpDevice *device,
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ enum {
|
|||||||
PROP_FPI_UDEV_DATA_SPIDEV,
|
PROP_FPI_UDEV_DATA_SPIDEV,
|
||||||
PROP_FPI_UDEV_DATA_HIDRAW,
|
PROP_FPI_UDEV_DATA_HIDRAW,
|
||||||
PROP_FPI_DRIVER_DATA,
|
PROP_FPI_DRIVER_DATA,
|
||||||
PROP_FPI_PERSISTENT_DATA,
|
|
||||||
N_PROPS
|
N_PROPS
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -226,7 +225,6 @@ fp_device_finalize (GObject *object)
|
|||||||
|
|
||||||
g_clear_pointer (&priv->current_idle_cancel_source, g_source_destroy);
|
g_clear_pointer (&priv->current_idle_cancel_source, g_source_destroy);
|
||||||
g_clear_pointer (&priv->current_task_idle_return_source, g_source_destroy);
|
g_clear_pointer (&priv->current_task_idle_return_source, g_source_destroy);
|
||||||
g_clear_pointer (&priv->critical_section_flush_source, g_source_destroy);
|
|
||||||
|
|
||||||
g_clear_pointer (&priv->device_id, g_free);
|
g_clear_pointer (&priv->device_id, g_free);
|
||||||
g_clear_pointer (&priv->device_name, g_free);
|
g_clear_pointer (&priv->device_name, g_free);
|
||||||
@@ -236,8 +234,6 @@ fp_device_finalize (GObject *object)
|
|||||||
g_clear_pointer (&priv->udev_data.spidev_path, g_free);
|
g_clear_pointer (&priv->udev_data.spidev_path, g_free);
|
||||||
g_clear_pointer (&priv->udev_data.hidraw_path, g_free);
|
g_clear_pointer (&priv->udev_data.hidraw_path, g_free);
|
||||||
|
|
||||||
g_clear_pointer (&priv->persistent_data, g_variant_unref);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (fp_device_parent_class)->finalize (object);
|
G_OBJECT_CLASS (fp_device_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,10 +303,6 @@ fp_device_get_property (GObject *object,
|
|||||||
g_value_set_string (value, NULL);
|
g_value_set_string (value, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_FPI_PERSISTENT_DATA:
|
|
||||||
g_value_set_variant (value, priv->persistent_data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
@@ -361,11 +353,6 @@ fp_device_set_property (GObject *object,
|
|||||||
priv->driver_data = g_value_get_uint64 (value);
|
priv->driver_data = g_value_get_uint64 (value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_FPI_PERSISTENT_DATA:
|
|
||||||
g_clear_pointer (&priv->persistent_data, g_variant_unref);
|
|
||||||
priv->persistent_data = g_value_dup_variant (value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
}
|
}
|
||||||
@@ -606,21 +593,6 @@ fp_device_class_init (FpDeviceClass *klass)
|
|||||||
0,
|
0,
|
||||||
G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
|
G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
|
||||||
|
|
||||||
/**
|
|
||||||
* FpDevice::fpi-persistent-data: (skip)
|
|
||||||
*
|
|
||||||
* This property is only for internal purposes.
|
|
||||||
*
|
|
||||||
* Stability: private
|
|
||||||
*/
|
|
||||||
properties[PROP_FPI_PERSISTENT_DATA] =
|
|
||||||
g_param_spec_variant ("fpi-persistent-data",
|
|
||||||
"Persistent Driver Data",
|
|
||||||
"Private: Previously stored data for the device",
|
|
||||||
G_VARIANT_TYPE_ANY,
|
|
||||||
NULL,
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -766,139 +738,6 @@ fp_device_get_temperature (FpDevice *device)
|
|||||||
return priv->temp_current;
|
return priv->temp_current;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fp_device_get_persistent_data:
|
|
||||||
* @device: A #FpDevice
|
|
||||||
* @data: (array length=length) (transfer full) (out): Return location for data pointer
|
|
||||||
* @length: (transfer full) (out): Length of @data
|
|
||||||
* @error: Return location for error
|
|
||||||
*
|
|
||||||
* Retrieves persistent data that should be stored for this device. Storage
|
|
||||||
* needs to be device specific, i.e. device ID and driver must match when
|
|
||||||
* restored.
|
|
||||||
*
|
|
||||||
* Returns: (type void): %TRUE on success
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
fp_device_get_persistent_data (FpDevice *device,
|
|
||||||
guchar **data,
|
|
||||||
gsize *length,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
g_autoptr(GVariant) res = NULL;
|
|
||||||
FpDevicePrivate *priv = fp_device_get_instance_private (device);
|
|
||||||
|
|
||||||
g_assert (data);
|
|
||||||
g_assert (length);
|
|
||||||
|
|
||||||
if (priv->persistent_data == NULL)
|
|
||||||
{
|
|
||||||
*data = NULL;
|
|
||||||
*length = 0;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Version + variant from driver */
|
|
||||||
res = g_variant_new ("(issv)",
|
|
||||||
1,
|
|
||||||
fp_device_get_driver (device),
|
|
||||||
priv->device_id,
|
|
||||||
priv->persistent_data);
|
|
||||||
|
|
||||||
*length = g_variant_get_size (res);
|
|
||||||
*data = g_malloc (*length);
|
|
||||||
g_variant_store (res, *data);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fp_device_get_persistent_data:
|
|
||||||
* @device: A #FpDevice
|
|
||||||
* @data: (array length=length) (transfer none): Persistent Data
|
|
||||||
* @length: (transfer none): Length of @data
|
|
||||||
* @error: Return location for error
|
|
||||||
*
|
|
||||||
* Load persistent data from storage. This function should be called after
|
|
||||||
* a device was discovered and before it is opened for the first time. It is
|
|
||||||
* an error to call it if data has already been set (or generated by the
|
|
||||||
* driver).
|
|
||||||
*
|
|
||||||
* Note that the driver may update the data. The API user should retrieve the
|
|
||||||
* value when done with the device and store it in a persistent location.
|
|
||||||
*
|
|
||||||
* Returns: (type void): %TRUE on success
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
fp_device_set_persistent_data (FpDevice *device,
|
|
||||||
guchar *data,
|
|
||||||
gsize length,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
g_autoptr(GVariant) stored = NULL;
|
|
||||||
g_autoptr(GVariant) loaded = NULL;
|
|
||||||
FpDevicePrivate *priv = fp_device_get_instance_private (device);
|
|
||||||
guchar *copy;
|
|
||||||
gint version;
|
|
||||||
const gchar *device_id;
|
|
||||||
const gchar *driver;
|
|
||||||
|
|
||||||
if (priv->is_open)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
|
||||||
"Data can only be set right after device creation");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->persistent_data)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS,
|
|
||||||
"Data has already been set");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (length == 0)
|
|
||||||
{
|
|
||||||
g_clear_pointer (&priv->persistent_data, g_variant_unref);
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (device), properties[PROP_FPI_PERSISTENT_DATA]);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
g_assert (data);
|
|
||||||
|
|
||||||
copy = g_memdup (data, length);
|
|
||||||
stored = g_variant_new_from_data (G_VARIANT_TYPE ("(issv)"), copy, length, FALSE, g_free, copy);
|
|
||||||
|
|
||||||
if (!stored)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
|
|
||||||
"Data could not be parsed");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_variant_get (stored, "(issv)", &version, &driver, &device_id, &loaded);
|
|
||||||
if (version != 1)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
|
|
||||||
"Unknown data storage version");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_strcmp0 (device_id, priv->device_id) != 0 ||
|
|
||||||
g_strcmp0 (driver, fp_device_get_driver (device)) != 0)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
|
|
||||||
"Driver or device ID mismatch!");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_clear_pointer (&priv->persistent_data, g_variant_unref);
|
|
||||||
priv->persistent_data = g_steal_pointer (&loaded);
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (device), properties[PROP_FPI_PERSISTENT_DATA]);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fp_device_supports_identify:
|
* fp_device_supports_identify:
|
||||||
* @device: A #FpDevice
|
* @device: A #FpDevice
|
||||||
@@ -1109,6 +948,16 @@ fp_device_close_finish (FpDevice *device,
|
|||||||
return g_task_propagate_boolean (G_TASK (result), error);
|
return g_task_propagate_boolean (G_TASK (result), error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
complete_suspend_resume_task (FpDevice *device)
|
||||||
|
{
|
||||||
|
FpDevicePrivate *priv = fp_device_get_instance_private (device);
|
||||||
|
|
||||||
|
g_assert (priv->suspend_resume_task);
|
||||||
|
|
||||||
|
g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fp_device_suspend:
|
* fp_device_suspend:
|
||||||
* @device: a #FpDevice
|
* @device: a #FpDevice
|
||||||
@@ -1159,7 +1008,48 @@ fp_device_suspend (FpDevice *device,
|
|||||||
|
|
||||||
priv->suspend_resume_task = g_steal_pointer (&task);
|
priv->suspend_resume_task = g_steal_pointer (&task);
|
||||||
|
|
||||||
fpi_device_suspend (device);
|
/* If the device is currently idle, just complete immediately.
|
||||||
|
* For long running tasks, call the driver handler right away, for short
|
||||||
|
* tasks, wait for completion and then return the task.
|
||||||
|
*/
|
||||||
|
switch (priv->current_action)
|
||||||
|
{
|
||||||
|
case FPI_DEVICE_ACTION_NONE:
|
||||||
|
fpi_device_suspend_complete (device, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FPI_DEVICE_ACTION_ENROLL:
|
||||||
|
case FPI_DEVICE_ACTION_VERIFY:
|
||||||
|
case FPI_DEVICE_ACTION_IDENTIFY:
|
||||||
|
case FPI_DEVICE_ACTION_CAPTURE:
|
||||||
|
if (FP_DEVICE_GET_CLASS (device)->suspend)
|
||||||
|
{
|
||||||
|
if (priv->critical_section)
|
||||||
|
priv->suspend_queued = TRUE;
|
||||||
|
else
|
||||||
|
FP_DEVICE_GET_CLASS (device)->suspend (device);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fpi_device_suspend_complete (device, fpi_device_error_new (FP_DEVICE_ERROR_NOT_SUPPORTED));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case FPI_DEVICE_ACTION_PROBE:
|
||||||
|
case FPI_DEVICE_ACTION_OPEN:
|
||||||
|
case FPI_DEVICE_ACTION_CLOSE:
|
||||||
|
case FPI_DEVICE_ACTION_DELETE:
|
||||||
|
case FPI_DEVICE_ACTION_LIST:
|
||||||
|
case FPI_DEVICE_ACTION_CLEAR_STORAGE:
|
||||||
|
g_signal_connect_object (priv->current_task,
|
||||||
|
"notify::completed",
|
||||||
|
G_CALLBACK (complete_suspend_resume_task),
|
||||||
|
device,
|
||||||
|
G_CONNECT_SWAPPED);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1224,7 +1114,41 @@ fp_device_resume (FpDevice *device,
|
|||||||
|
|
||||||
priv->suspend_resume_task = g_steal_pointer (&task);
|
priv->suspend_resume_task = g_steal_pointer (&task);
|
||||||
|
|
||||||
fpi_device_resume (device);
|
switch (priv->current_action)
|
||||||
|
{
|
||||||
|
case FPI_DEVICE_ACTION_NONE:
|
||||||
|
fpi_device_resume_complete (device, NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FPI_DEVICE_ACTION_ENROLL:
|
||||||
|
case FPI_DEVICE_ACTION_VERIFY:
|
||||||
|
case FPI_DEVICE_ACTION_IDENTIFY:
|
||||||
|
case FPI_DEVICE_ACTION_CAPTURE:
|
||||||
|
if (FP_DEVICE_GET_CLASS (device)->resume)
|
||||||
|
{
|
||||||
|
if (priv->critical_section)
|
||||||
|
priv->resume_queued = TRUE;
|
||||||
|
else
|
||||||
|
FP_DEVICE_GET_CLASS (device)->resume (device);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fpi_device_resume_complete (device, fpi_device_error_new (FP_DEVICE_ERROR_NOT_SUPPORTED));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case FPI_DEVICE_ACTION_PROBE:
|
||||||
|
case FPI_DEVICE_ACTION_OPEN:
|
||||||
|
case FPI_DEVICE_ACTION_CLOSE:
|
||||||
|
case FPI_DEVICE_ACTION_DELETE:
|
||||||
|
case FPI_DEVICE_ACTION_LIST:
|
||||||
|
case FPI_DEVICE_ACTION_CLEAR_STORAGE:
|
||||||
|
/* cannot happen as we make sure these tasks complete before suspend */
|
||||||
|
g_assert_not_reached ();
|
||||||
|
complete_suspend_resume_task (device);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -230,15 +230,6 @@ FpDeviceFeature fp_device_get_features (FpDevice *device);
|
|||||||
gboolean fp_device_has_feature (FpDevice *device,
|
gboolean fp_device_has_feature (FpDevice *device,
|
||||||
FpDeviceFeature feature);
|
FpDeviceFeature feature);
|
||||||
|
|
||||||
gboolean fp_device_get_persistent_data (FpDevice *device,
|
|
||||||
guchar **data,
|
|
||||||
gsize *length,
|
|
||||||
GError **error);
|
|
||||||
gboolean fp_device_set_persistent_data (FpDevice *device,
|
|
||||||
guchar *data,
|
|
||||||
gsize length,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
/* Opening the device */
|
/* Opening the device */
|
||||||
void fp_device_open (FpDevice *device,
|
void fp_device_open (FpDevice *device,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
#define FP_COMPONENT "device"
|
#define FP_COMPONENT "device"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "fpi-log.h"
|
#include "fpi-log.h"
|
||||||
|
|
||||||
@@ -867,16 +866,16 @@ fpi_device_critical_section_flush_idle_cb (FpDevice *device)
|
|||||||
|
|
||||||
if (priv->suspend_queued)
|
if (priv->suspend_queued)
|
||||||
{
|
{
|
||||||
|
cls->suspend (device);
|
||||||
priv->suspend_queued = FALSE;
|
priv->suspend_queued = FALSE;
|
||||||
fpi_device_suspend (device);
|
|
||||||
|
|
||||||
return G_SOURCE_CONTINUE;
|
return G_SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->resume_queued)
|
if (priv->resume_queued)
|
||||||
{
|
{
|
||||||
|
cls->resume (device);
|
||||||
priv->resume_queued = FALSE;
|
priv->resume_queued = FALSE;
|
||||||
fpi_device_resume (device);
|
|
||||||
|
|
||||||
return G_SOURCE_CONTINUE;
|
return G_SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
@@ -913,7 +912,6 @@ fpi_device_critical_leave (FpDevice *device)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
priv->critical_section_flush_source = g_idle_source_new ();
|
priv->critical_section_flush_source = g_idle_source_new ();
|
||||||
g_source_set_priority (priv->critical_section_flush_source, G_PRIORITY_HIGH);
|
|
||||||
g_source_set_callback (priv->critical_section_flush_source,
|
g_source_set_callback (priv->critical_section_flush_source,
|
||||||
(GSourceFunc) fpi_device_critical_section_flush_idle_cb,
|
(GSourceFunc) fpi_device_critical_section_flush_idle_cb,
|
||||||
device,
|
device,
|
||||||
@@ -1552,148 +1550,6 @@ fpi_device_list_complete (FpDevice *device,
|
|||||||
fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_ERROR, error);
|
fpi_device_return_task_in_idle (device, FP_DEVICE_TASK_RETURN_ERROR, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
update_attr (const char *attr, const char *value)
|
|
||||||
{
|
|
||||||
int fd, err;
|
|
||||||
gssize r;
|
|
||||||
char buf[50] = { 0 };
|
|
||||||
|
|
||||||
fd = open (attr, O_RDONLY);
|
|
||||||
err = -errno;
|
|
||||||
if (fd < 0)
|
|
||||||
return -err;
|
|
||||||
|
|
||||||
r = read (fd, buf, sizeof (buf) - 1);
|
|
||||||
err = errno;
|
|
||||||
close (fd);
|
|
||||||
if (r < 0)
|
|
||||||
return -err;
|
|
||||||
|
|
||||||
g_strchomp (buf);
|
|
||||||
if (g_strcmp0 (buf, value) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* O_TRUNC makes things work in the umockdev environment */
|
|
||||||
fd = open (attr, O_WRONLY | O_TRUNC);
|
|
||||||
err = errno;
|
|
||||||
if (fd < 0)
|
|
||||||
return -err;
|
|
||||||
|
|
||||||
r = write (fd, value, strlen (value));
|
|
||||||
err = -errno;
|
|
||||||
close (fd);
|
|
||||||
if (r < 0)
|
|
||||||
{
|
|
||||||
/* Write failures are weird, and are worth a warning */
|
|
||||||
g_warning ("Could not write %s to %s", value, attr);
|
|
||||||
return -err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
complete_suspend_resume_task (FpDevice *device)
|
|
||||||
{
|
|
||||||
FpDevicePrivate *priv = fp_device_get_instance_private (device);
|
|
||||||
|
|
||||||
g_assert (priv->suspend_resume_task);
|
|
||||||
|
|
||||||
g_task_return_boolean (g_steal_pointer (&priv->suspend_resume_task), TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
fpi_device_suspend (FpDevice *device)
|
|
||||||
{
|
|
||||||
FpDevicePrivate *priv = fp_device_get_instance_private (device);
|
|
||||||
|
|
||||||
/* If the device is currently idle, just complete immediately.
|
|
||||||
* For long running tasks, call the driver handler right away, for short
|
|
||||||
* tasks, wait for completion and then return the task.
|
|
||||||
*/
|
|
||||||
switch (priv->current_action)
|
|
||||||
{
|
|
||||||
case FPI_DEVICE_ACTION_NONE:
|
|
||||||
fpi_device_suspend_complete (device, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FPI_DEVICE_ACTION_ENROLL:
|
|
||||||
case FPI_DEVICE_ACTION_VERIFY:
|
|
||||||
case FPI_DEVICE_ACTION_IDENTIFY:
|
|
||||||
case FPI_DEVICE_ACTION_CAPTURE:
|
|
||||||
if (FP_DEVICE_GET_CLASS (device)->suspend)
|
|
||||||
{
|
|
||||||
if (priv->critical_section)
|
|
||||||
priv->suspend_queued = TRUE;
|
|
||||||
else
|
|
||||||
FP_DEVICE_GET_CLASS (device)->suspend (device);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fpi_device_suspend_complete (device, fpi_device_error_new (FP_DEVICE_ERROR_NOT_SUPPORTED));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
case FPI_DEVICE_ACTION_PROBE:
|
|
||||||
case FPI_DEVICE_ACTION_OPEN:
|
|
||||||
case FPI_DEVICE_ACTION_CLOSE:
|
|
||||||
case FPI_DEVICE_ACTION_DELETE:
|
|
||||||
case FPI_DEVICE_ACTION_LIST:
|
|
||||||
case FPI_DEVICE_ACTION_CLEAR_STORAGE:
|
|
||||||
g_signal_connect_object (priv->current_task,
|
|
||||||
"notify::completed",
|
|
||||||
G_CALLBACK (complete_suspend_resume_task),
|
|
||||||
device,
|
|
||||||
G_CONNECT_SWAPPED);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
fpi_device_resume (FpDevice *device)
|
|
||||||
{
|
|
||||||
FpDevicePrivate *priv = fp_device_get_instance_private (device);
|
|
||||||
|
|
||||||
switch (priv->current_action)
|
|
||||||
{
|
|
||||||
case FPI_DEVICE_ACTION_NONE:
|
|
||||||
fpi_device_resume_complete (device, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FPI_DEVICE_ACTION_ENROLL:
|
|
||||||
case FPI_DEVICE_ACTION_VERIFY:
|
|
||||||
case FPI_DEVICE_ACTION_IDENTIFY:
|
|
||||||
case FPI_DEVICE_ACTION_CAPTURE:
|
|
||||||
if (FP_DEVICE_GET_CLASS (device)->resume)
|
|
||||||
{
|
|
||||||
if (priv->critical_section)
|
|
||||||
priv->resume_queued = TRUE;
|
|
||||||
else
|
|
||||||
FP_DEVICE_GET_CLASS (device)->resume (device);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fpi_device_resume_complete (device, fpi_device_error_new (FP_DEVICE_ERROR_NOT_SUPPORTED));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
case FPI_DEVICE_ACTION_PROBE:
|
|
||||||
case FPI_DEVICE_ACTION_OPEN:
|
|
||||||
case FPI_DEVICE_ACTION_CLOSE:
|
|
||||||
case FPI_DEVICE_ACTION_DELETE:
|
|
||||||
case FPI_DEVICE_ACTION_LIST:
|
|
||||||
case FPI_DEVICE_ACTION_CLEAR_STORAGE:
|
|
||||||
/* cannot happen as we make sure these tasks complete before suspend */
|
|
||||||
g_assert_not_reached ();
|
|
||||||
complete_suspend_resume_task (device);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
|
fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
|
||||||
{
|
{
|
||||||
@@ -1709,7 +1565,8 @@ fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
|
|||||||
guint8 bus, port;
|
guint8 bus, port;
|
||||||
g_autofree gchar *sysfs_wakeup = NULL;
|
g_autofree gchar *sysfs_wakeup = NULL;
|
||||||
g_autofree gchar *sysfs_persist = NULL;
|
g_autofree gchar *sysfs_persist = NULL;
|
||||||
int res;
|
gssize r;
|
||||||
|
int fd;
|
||||||
|
|
||||||
ports = g_string_new (NULL);
|
ports = g_string_new (NULL);
|
||||||
bus = g_usb_device_get_bus (priv->usb_device);
|
bus = g_usb_device_get_bus (priv->usb_device);
|
||||||
@@ -1725,9 +1582,20 @@ fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
|
|||||||
g_string_set_size (ports, ports->len - 1);
|
g_string_set_size (ports, ports->len - 1);
|
||||||
|
|
||||||
sysfs_wakeup = g_strdup_printf ("/sys/bus/usb/devices/%d-%s/power/wakeup", bus, ports->str);
|
sysfs_wakeup = g_strdup_printf ("/sys/bus/usb/devices/%d-%s/power/wakeup", bus, ports->str);
|
||||||
res = update_attr (sysfs_wakeup, wakeup_command);
|
fd = open (sysfs_wakeup, O_WRONLY);
|
||||||
if (res < 0)
|
|
||||||
g_debug ("Failed to set %s to %s", sysfs_wakeup, wakeup_command);
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
/* Wakeup not existing appears to be relatively normal. */
|
||||||
|
g_debug ("Failed to open %s", sysfs_wakeup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r = write (fd, wakeup_command, strlen (wakeup_command));
|
||||||
|
if (r < 0)
|
||||||
|
g_warning ("Could not configure wakeup to %s by writing %s", wakeup_command, sysfs_wakeup);
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
/* Persist means that the kernel tries to keep the USB device open
|
/* Persist means that the kernel tries to keep the USB device open
|
||||||
* in case it is "replugged" due to suspend.
|
* in case it is "replugged" due to suspend.
|
||||||
@@ -1735,9 +1603,20 @@ fpi_device_configure_wakeup (FpDevice *device, gboolean enabled)
|
|||||||
* state. Instead, seeing an unplug and a new device makes more sense.
|
* state. Instead, seeing an unplug and a new device makes more sense.
|
||||||
*/
|
*/
|
||||||
sysfs_persist = g_strdup_printf ("/sys/bus/usb/devices/%d-%s/power/persist", bus, ports->str);
|
sysfs_persist = g_strdup_printf ("/sys/bus/usb/devices/%d-%s/power/persist", bus, ports->str);
|
||||||
res = update_attr (sysfs_persist, "0");
|
fd = open (sysfs_persist, O_WRONLY);
|
||||||
if (res < 0)
|
|
||||||
g_warning ("Failed to disable USB persist by writing to %s", sysfs_persist);
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
g_warning ("Failed to open %s", sysfs_persist);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r = write (fd, "0", 1);
|
||||||
|
if (r < 0)
|
||||||
|
g_message ("Could not disable USB persist by writing to %s", sysfs_persist);
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,9 +42,9 @@ gboolean fpi_print_add_from_image (FpPrint *print,
|
|||||||
FpImage *image,
|
FpImage *image,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
FpiMatchResult fpi_print_bz3_match (FpPrint *temp,
|
FpiMatchResult fpi_print_bz3_match (FpPrint * template,
|
||||||
FpPrint *print,
|
FpPrint * print,
|
||||||
gint bz3_threshold,
|
gint bz3_threshold,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
/* Helpers to encode metadata into user ID strings. */
|
/* Helpers to encode metadata into user ID strings. */
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ struct _FpiSsm
|
|||||||
int start_cleanup;
|
int start_cleanup;
|
||||||
int cur_state;
|
int cur_state;
|
||||||
gboolean completed;
|
gboolean completed;
|
||||||
|
gboolean critical;
|
||||||
gboolean silence;
|
gboolean silence;
|
||||||
GSource *timeout;
|
GSource *timeout;
|
||||||
GError *error;
|
GError *error;
|
||||||
@@ -277,6 +278,10 @@ 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;
|
||||||
|
|
||||||
|
if (ssm->critical)
|
||||||
|
fpi_device_critical_enter (ssm->dev);
|
||||||
|
|
||||||
__ssm_call_handler (ssm, TRUE);
|
__ssm_call_handler (ssm, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -660,6 +669,23 @@ fpi_ssm_silence_debug (FpiSsm *machine)
|
|||||||
machine->silence = TRUE;
|
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
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ 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_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.
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ static const FpIdEntry whitelist_id_table[] = {
|
|||||||
* You can generate this list from the wiki page using e.g.:
|
* You can generate this list from the wiki page using e.g.:
|
||||||
* gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p'
|
* gio cat https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices.md | sed -n 's!|.*\([0-9a-fA-F]\{4\}\):\([0-9a-fA-F]\{4\}\).*|.*! { .vid = 0x\1, .pid = 0x\2 },!p'
|
||||||
*/
|
*/
|
||||||
{ .vid = 0x04e8, .pid = 0x730b },
|
|
||||||
{ .vid = 0x04f3, .pid = 0x036b },
|
{ .vid = 0x04f3, .pid = 0x036b },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c00 },
|
{ .vid = 0x04f3, .pid = 0x0c00 },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0c4b },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c4c },
|
{ .vid = 0x04f3, .pid = 0x0c4c },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c57 },
|
{ .vid = 0x04f3, .pid = 0x0c57 },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c5e },
|
{ .vid = 0x04f3, .pid = 0x0c5e },
|
||||||
@@ -42,20 +42,15 @@ static const FpIdEntry whitelist_id_table[] = {
|
|||||||
{ .vid = 0x06cb, .pid = 0x009a },
|
{ .vid = 0x06cb, .pid = 0x009a },
|
||||||
{ .vid = 0x06cb, .pid = 0x009b },
|
{ .vid = 0x06cb, .pid = 0x009b },
|
||||||
{ .vid = 0x06cb, .pid = 0x00a2 },
|
{ .vid = 0x06cb, .pid = 0x00a2 },
|
||||||
{ .vid = 0x06cb, .pid = 0x00a8 },
|
|
||||||
{ .vid = 0x06cb, .pid = 0x00b7 },
|
{ .vid = 0x06cb, .pid = 0x00b7 },
|
||||||
{ .vid = 0x06cb, .pid = 0x00bb },
|
{ .vid = 0x06cb, .pid = 0x00bb },
|
||||||
{ .vid = 0x06cb, .pid = 0x00be },
|
{ .vid = 0x06cb, .pid = 0x00be },
|
||||||
{ .vid = 0x06cb, .pid = 0x00c4 },
|
{ .vid = 0x06cb, .pid = 0x00c4 },
|
||||||
{ .vid = 0x06cb, .pid = 0x00cb },
|
{ .vid = 0x06cb, .pid = 0x00cb },
|
||||||
{ .vid = 0x06cb, .pid = 0x00c9 },
|
|
||||||
{ .vid = 0x06cb, .pid = 0x00d8 },
|
{ .vid = 0x06cb, .pid = 0x00d8 },
|
||||||
{ .vid = 0x06cb, .pid = 0x00da },
|
{ .vid = 0x06cb, .pid = 0x00da },
|
||||||
{ .vid = 0x06cb, .pid = 0x00dc },
|
|
||||||
{ .vid = 0x06cb, .pid = 0x00e4 },
|
|
||||||
{ .vid = 0x06cb, .pid = 0x00e7 },
|
{ .vid = 0x06cb, .pid = 0x00e7 },
|
||||||
{ .vid = 0x06cb, .pid = 0x00e9 },
|
{ .vid = 0x06cb, .pid = 0x00e9 },
|
||||||
{ .vid = 0x06cb, .pid = 0x00fd },
|
|
||||||
{ .vid = 0x0a5c, .pid = 0x5801 },
|
{ .vid = 0x0a5c, .pid = 0x5801 },
|
||||||
{ .vid = 0x0a5c, .pid = 0x5805 },
|
{ .vid = 0x0a5c, .pid = 0x5805 },
|
||||||
{ .vid = 0x0a5c, .pid = 0x5834 },
|
{ .vid = 0x0a5c, .pid = 0x5834 },
|
||||||
@@ -67,8 +62,6 @@ static const FpIdEntry whitelist_id_table[] = {
|
|||||||
{ .vid = 0x0a5c, .pid = 0x5845 },
|
{ .vid = 0x0a5c, .pid = 0x5845 },
|
||||||
{ .vid = 0x0bda, .pid = 0x5812 },
|
{ .vid = 0x0bda, .pid = 0x5812 },
|
||||||
{ .vid = 0x10a5, .pid = 0x0007 },
|
{ .vid = 0x10a5, .pid = 0x0007 },
|
||||||
{ .vid = 0x10a5, .pid = 0x9200 },
|
|
||||||
{ .vid = 0x10a5, .pid = 0x9800 },
|
|
||||||
{ .vid = 0x1188, .pid = 0x9545 },
|
{ .vid = 0x1188, .pid = 0x9545 },
|
||||||
{ .vid = 0x138a, .pid = 0x0007 },
|
{ .vid = 0x138a, .pid = 0x0007 },
|
||||||
{ .vid = 0x138a, .pid = 0x003a },
|
{ .vid = 0x138a, .pid = 0x003a },
|
||||||
@@ -86,11 +79,9 @@ static const FpIdEntry whitelist_id_table[] = {
|
|||||||
{ .vid = 0x16d1, .pid = 0x1027 },
|
{ .vid = 0x16d1, .pid = 0x1027 },
|
||||||
{ .vid = 0x1c7a, .pid = 0x0300 },
|
{ .vid = 0x1c7a, .pid = 0x0300 },
|
||||||
{ .vid = 0x1c7a, .pid = 0x0575 },
|
{ .vid = 0x1c7a, .pid = 0x0575 },
|
||||||
{ .vid = 0x1c7a, .pid = 0x0576 },
|
|
||||||
{ .vid = 0x27c6, .pid = 0x5042 },
|
{ .vid = 0x27c6, .pid = 0x5042 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5110 },
|
{ .vid = 0x27c6, .pid = 0x5110 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5117 },
|
{ .vid = 0x27c6, .pid = 0x5117 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5125 },
|
|
||||||
{ .vid = 0x27c6, .pid = 0x5201 },
|
{ .vid = 0x27c6, .pid = 0x5201 },
|
||||||
{ .vid = 0x27c6, .pid = 0x521d },
|
{ .vid = 0x27c6, .pid = 0x521d },
|
||||||
{ .vid = 0x27c6, .pid = 0x5301 },
|
{ .vid = 0x27c6, .pid = 0x5301 },
|
||||||
@@ -102,15 +93,12 @@ static const FpIdEntry whitelist_id_table[] = {
|
|||||||
{ .vid = 0x27c6, .pid = 0x538c },
|
{ .vid = 0x27c6, .pid = 0x538c },
|
||||||
{ .vid = 0x27c6, .pid = 0x538d },
|
{ .vid = 0x27c6, .pid = 0x538d },
|
||||||
{ .vid = 0x27c6, .pid = 0x5395 },
|
{ .vid = 0x27c6, .pid = 0x5395 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5503 },
|
|
||||||
{ .vid = 0x27c6, .pid = 0x5584 },
|
{ .vid = 0x27c6, .pid = 0x5584 },
|
||||||
{ .vid = 0x27c6, .pid = 0x55a2 },
|
{ .vid = 0x27c6, .pid = 0x55a2 },
|
||||||
{ .vid = 0x27c6, .pid = 0x55a4 },
|
{ .vid = 0x27c6, .pid = 0x55a4 },
|
||||||
{ .vid = 0x27c6, .pid = 0x55b4 },
|
{ .vid = 0x27c6, .pid = 0x55b4 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5740 },
|
{ .vid = 0x27c6, .pid = 0x5740 },
|
||||||
{ .vid = 0x27c6, .pid = 0x5e0a },
|
|
||||||
{ .vid = 0x2808, .pid = 0x9338 },
|
{ .vid = 0x2808, .pid = 0x9338 },
|
||||||
{ .vid = 0x298d, .pid = 0x2020 },
|
|
||||||
{ .vid = 0x298d, .pid = 0x2033 },
|
{ .vid = 0x298d, .pid = 0x2033 },
|
||||||
{ .vid = 0x3538, .pid = 0x0930 },
|
{ .vid = 0x3538, .pid = 0x0930 },
|
||||||
{ .vid = 0 },
|
{ .vid = 0 },
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
From 2584d440afc87d463cb8dc809d48c660e091c2c4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Sam James <sam@gentoo.org>
|
|
||||||
Date: Thu, 23 Jun 2022 05:57:46 +0100
|
|
||||||
Subject: [PATCH] nbis: fix build on musl
|
|
||||||
|
|
||||||
Drop re-definition of stderr. There's no need for this anywhere
|
|
||||||
(including glibc). This breaks in particular on musl because
|
|
||||||
stderr (and stdin) are both const, and macros unlike in glibc.
|
|
||||||
|
|
||||||
Bug: https://bugs.gentoo.org/853811
|
|
||||||
---
|
|
||||||
nbis/include/bozorth.h | 2 --
|
|
||||||
1 file changed, 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/nbis/include/bozorth.h b/nbis/include/bozorth.h
|
|
||||||
index a705da98..fd8975bf 100644
|
|
||||||
--- a/nbis/include/bozorth.h
|
|
||||||
+++ b/nbis/include/bozorth.h
|
|
||||||
@@ -217,8 +217,6 @@ struct xytq_struct {
|
|
||||||
/**************************************************************************/
|
|
||||||
/* Globals supporting command line options */
|
|
||||||
extern int verbose_threshold;
|
|
||||||
-/* Global supporting error reporting */
|
|
||||||
-extern FILE *stderr;
|
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
/* In: BZ_GBLS.C */
|
|
||||||
--
|
|
||||||
GitLab
|
|
||||||
|
|
||||||
|
|
||||||
@@ -217,6 +217,8 @@ struct xytq_struct {
|
|||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
/* Globals supporting command line options */
|
/* Globals supporting command line options */
|
||||||
extern int verbose_threshold;
|
extern int verbose_threshold;
|
||||||
|
/* Global supporting error reporting */
|
||||||
|
extern FILE *stderr;
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
/* In: BZ_GBLS.C */
|
/* In: BZ_GBLS.C */
|
||||||
|
|||||||
@@ -198,6 +198,3 @@ patch -p0 < fix-scan-build-reports.patch
|
|||||||
|
|
||||||
# Add pass to remove perimeter points
|
# Add pass to remove perimeter points
|
||||||
patch -p0 < remove-perimeter-pts.patch
|
patch -p0 < remove-perimeter-pts.patch
|
||||||
|
|
||||||
# Fix build on musl by dropping unnecessary redeclaration of stderr
|
|
||||||
patch -p0 < fix-musl-build.patch
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
project('libfprint', [ 'c', 'cpp' ],
|
project('libfprint', [ 'c', 'cpp' ],
|
||||||
version: '1.94.4',
|
version: '1.94.2',
|
||||||
license: 'LGPLv2.1+',
|
license: 'LGPLv2.1+',
|
||||||
default_options: [
|
default_options: [
|
||||||
'buildtype=debugoptimized',
|
'buildtype=debugoptimized',
|
||||||
@@ -11,7 +11,6 @@ project('libfprint', [ 'c', 'cpp' ],
|
|||||||
gnome = import('gnome')
|
gnome = import('gnome')
|
||||||
|
|
||||||
libfprint_conf = configuration_data()
|
libfprint_conf = configuration_data()
|
||||||
libfprint_conf.set_quoted('LIBFPRINT_VERSION', meson.project_version())
|
|
||||||
|
|
||||||
cc = meson.get_compiler('c')
|
cc = meson.get_compiler('c')
|
||||||
cpp = meson.get_compiler('cpp')
|
cpp = meson.get_compiler('cpp')
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ nl_multi_line_cond true
|
|||||||
# Not clear what to do about that...
|
# Not clear what to do about that...
|
||||||
mod_full_brace_for Remove
|
mod_full_brace_for Remove
|
||||||
mod_full_brace_if Remove
|
mod_full_brace_if Remove
|
||||||
mod_full_brace_if_chain 1
|
mod_full_brace_if_chain True
|
||||||
mod_full_brace_while Remove
|
mod_full_brace_while Remove
|
||||||
mod_full_brace_do Remove
|
mod_full_brace_do Remove
|
||||||
mod_full_brace_nl 3
|
mod_full_brace_nl 3
|
||||||
|
|||||||
@@ -105,11 +105,6 @@ process.wait()
|
|||||||
# Run capture
|
# Run capture
|
||||||
# https://osqa-ask.wireshark.org/questions/53919/how-can-i-precisely-specify-a-usb-device-to-capture-with-tshark/
|
# https://osqa-ask.wireshark.org/questions/53919/how-can-i-precisely-specify-a-usb-device-to-capture-with-tshark/
|
||||||
|
|
||||||
print(f'### Reseting USB port (as descriptors could be missing in the dump otherwise)')
|
|
||||||
usb_device.open()
|
|
||||||
usb_device.reset()
|
|
||||||
usb_device.close()
|
|
||||||
|
|
||||||
print(f'### Starting USB capture on usbmon{bus_num}')
|
print(f'### Starting USB capture on usbmon{bus_num}')
|
||||||
capture_pid = os.fork()
|
capture_pid = os.fork()
|
||||||
assert(capture_pid >= 0)
|
assert(capture_pid >= 0)
|
||||||
|
|||||||
Binary file not shown.
@@ -1,67 +1,63 @@
|
|||||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-9
|
P: /devices/pci0000:00/0000:00:14.0/usb1/1-1
|
||||||
N: bus/usb/001/003=1201000200000008F304880C04800102000109025300010100A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
|
N: bus/usb/001/010=1201000200000040F3047E0C05030102000109025300010103A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
|
||||||
E: DEVNAME=/dev/bus/usb/001/003
|
E: DEVNAME=/dev/bus/usb/001/010
|
||||||
E: DEVTYPE=usb_device
|
E: DEVTYPE=usb_device
|
||||||
E: DRIVER=usb
|
E: DRIVER=usb
|
||||||
E: PRODUCT=4f3/c88/8004
|
E: PRODUCT=4f3/c7e/305
|
||||||
E: TYPE=0/0/0
|
E: TYPE=0/0/0
|
||||||
E: BUSNUM=001
|
E: BUSNUM=001
|
||||||
E: DEVNUM=003
|
E: DEVNUM=010
|
||||||
E: MAJOR=189
|
E: MAJOR=189
|
||||||
E: MINOR=2
|
E: MINOR=9
|
||||||
E: SUBSYSTEM=usb
|
E: SUBSYSTEM=usb
|
||||||
E: ID_VENDOR=ELAN
|
E: ID_VENDOR=ELAN
|
||||||
E: ID_VENDOR_ENC=ELAN
|
E: ID_VENDOR_ENC=ELAN
|
||||||
E: ID_VENDOR_ID=04f3
|
E: ID_VENDOR_ID=04f3
|
||||||
E: ID_MODEL=ELAN:ARM-M4
|
E: ID_MODEL=ELAN:ARM-M4
|
||||||
E: ID_MODEL_ENC=ELAN:ARM-M4
|
E: ID_MODEL_ENC=ELAN:ARM-M4
|
||||||
E: ID_MODEL_ID=0c88
|
E: ID_MODEL_ID=0c7e
|
||||||
E: ID_REVISION=8004
|
E: ID_REVISION=0305
|
||||||
E: ID_SERIAL=ELAN_ELAN:ARM-M4
|
E: ID_SERIAL=ELAN_ELAN:ARM-M4
|
||||||
E: ID_BUS=usb
|
E: ID_BUS=usb
|
||||||
E: ID_USB_INTERFACES=:ff0000:
|
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:9
|
E: ID_PATH=pci-0000:00:14.0-usb-0:1
|
||||||
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_9
|
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_1
|
||||||
E: ID_FOR_SEAT=usb-pci-0000_00_14_0-usb-0_9
|
|
||||||
E: TAGS=:seat:
|
|
||||||
E: CURRENT_TAGS=:seat:
|
|
||||||
A: authorized=1\n
|
A: authorized=1\n
|
||||||
A: avoid_reset_quirk=0\n
|
A: avoid_reset_quirk=0\n
|
||||||
A: bConfigurationValue=1\n
|
A: bConfigurationValue=1\n
|
||||||
A: bDeviceClass=00\n
|
A: bDeviceClass=00\n
|
||||||
A: bDeviceProtocol=00\n
|
A: bDeviceProtocol=00\n
|
||||||
A: bDeviceSubClass=00\n
|
A: bDeviceSubClass=00\n
|
||||||
A: bMaxPacketSize0=8\n
|
A: bMaxPacketSize0=64\n
|
||||||
A: bMaxPower=100mA\n
|
A: bMaxPower=100mA\n
|
||||||
A: bNumConfigurations=1\n
|
A: bNumConfigurations=1\n
|
||||||
A: bNumInterfaces= 1\n
|
A: bNumInterfaces= 1\n
|
||||||
A: bcdDevice=8004\n
|
A: bcdDevice=0305\n
|
||||||
A: bmAttributes=a0\n
|
A: bmAttributes=a0\n
|
||||||
A: busnum=1\n
|
A: busnum=1\n
|
||||||
A: configuration=
|
A: configuration=add909c9-e67e-4126-a6f7-1e31179e27d9\n
|
||||||
H: descriptors=1201000200000008F304880C04800102000109025300010100A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
|
H: descriptors=1201000200000040F3047E0C05030102000109025300010103A0320904000008FF0000000921100100012215000705810240000107050102400001070582024000010705020240000107058302400001070503024000010705840240000107050402400001
|
||||||
A: dev=189:2\n
|
A: dev=189:9\n
|
||||||
A: devnum=3\n
|
A: devnum=10\n
|
||||||
A: devpath=9\n
|
A: devpath=1\n
|
||||||
L: driver=../../../../../bus/usb/drivers/usb
|
L: driver=../../../../../bus/usb/drivers/usb
|
||||||
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:3d/device:3e/device:47
|
A: idProduct=0c7e\n
|
||||||
A: idProduct=0c88\n
|
|
||||||
A: idVendor=04f3\n
|
A: idVendor=04f3\n
|
||||||
A: ltm_capable=no\n
|
A: ltm_capable=no\n
|
||||||
A: manufacturer=ELAN\n
|
A: manufacturer=ELAN\n
|
||||||
A: maxchild=0\n
|
A: maxchild=0\n
|
||||||
L: port=../1-0:1.0/usb1-port9
|
L: port=../1-0:1.0/usb1-port1
|
||||||
A: power/active_duration=35269124\n
|
A: power/active_duration=94712\n
|
||||||
A: power/async=enabled\n
|
A: power/async=enabled\n
|
||||||
A: power/autosuspend=2\n
|
A: power/autosuspend=2\n
|
||||||
A: power/autosuspend_delay_ms=2000\n
|
A: power/autosuspend_delay_ms=2000\n
|
||||||
A: power/connected_duration=35283788\n
|
A: power/connected_duration=94712\n
|
||||||
A: power/control=on\n
|
A: power/control=on\n
|
||||||
A: power/level=on\n
|
A: power/level=on\n
|
||||||
A: power/persist=0\n
|
A: power/persist=1\n
|
||||||
A: power/runtime_active_kids=0\n
|
A: power/runtime_active_kids=0\n
|
||||||
A: power/runtime_active_time=35276624\n
|
A: power/runtime_active_time=94436\n
|
||||||
A: power/runtime_enabled=forbidden\n
|
A: power/runtime_enabled=forbidden\n
|
||||||
A: power/runtime_status=active\n
|
A: power/runtime_status=active\n
|
||||||
A: power/runtime_suspended_time=0\n
|
A: power/runtime_suspended_time=0\n
|
||||||
@@ -81,40 +77,38 @@ A: removable=removable\n
|
|||||||
A: rx_lanes=1\n
|
A: rx_lanes=1\n
|
||||||
A: speed=12\n
|
A: speed=12\n
|
||||||
A: tx_lanes=1\n
|
A: tx_lanes=1\n
|
||||||
A: urbnum=2773\n
|
A: urbnum=12\n
|
||||||
A: version= 2.00\n
|
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=12010002090001406B1D020015050302010109021900010100E0000904000001090000000705810304000C
|
N: bus/usb/001/001=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C
|
||||||
E: DEVNAME=/dev/bus/usb/001/001
|
E: DEVNAME=/dev/bus/usb/001/001
|
||||||
E: DEVTYPE=usb_device
|
E: DEVTYPE=usb_device
|
||||||
E: DRIVER=usb
|
E: DRIVER=usb
|
||||||
E: PRODUCT=1d6b/2/515
|
E: PRODUCT=1d6b/2/504
|
||||||
E: TYPE=9/0/1
|
E: TYPE=9/0/1
|
||||||
E: BUSNUM=001
|
E: BUSNUM=001
|
||||||
E: DEVNUM=001
|
E: DEVNUM=001
|
||||||
E: MAJOR=189
|
E: MAJOR=189
|
||||||
E: MINOR=0
|
E: MINOR=0
|
||||||
E: SUBSYSTEM=usb
|
E: SUBSYSTEM=usb
|
||||||
E: ID_VENDOR=Linux_5.15.0-39-generic_xhci-hcd
|
E: ID_VENDOR=Linux_5.4.0-42-generic_xhci-hcd
|
||||||
E: ID_VENDOR_ENC=Linux\x205.15.0-39-generic\x20xhci-hcd
|
E: ID_VENDOR_ENC=Linux\x205.4.0-42-generic\x20xhci-hcd
|
||||||
E: ID_VENDOR_ID=1d6b
|
E: ID_VENDOR_ID=1d6b
|
||||||
E: ID_MODEL=xHCI_Host_Controller
|
E: ID_MODEL=xHCI_Host_Controller
|
||||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||||
E: ID_MODEL_ID=0002
|
E: ID_MODEL_ID=0002
|
||||||
E: ID_REVISION=0515
|
E: ID_REVISION=0504
|
||||||
E: ID_SERIAL=Linux_5.15.0-39-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
E: ID_SERIAL=Linux_5.4.0-42-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||||
E: ID_BUS=usb
|
E: ID_BUS=usb
|
||||||
E: ID_USB_INTERFACES=:090000:
|
E: ID_USB_INTERFACES=:090000:
|
||||||
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
|
||||||
E: ID_AUTOSUSPEND=1
|
|
||||||
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
E: ID_MODEL_FROM_DATABASE=2.0 root hub
|
||||||
E: ID_PATH=pci-0000:00:14.0
|
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:
|
||||||
E: CURRENT_TAGS=:seat:
|
|
||||||
A: authorized=1\n
|
A: authorized=1\n
|
||||||
A: authorized_default=1\n
|
A: authorized_default=1\n
|
||||||
A: avoid_reset_quirk=0\n
|
A: avoid_reset_quirk=0\n
|
||||||
@@ -126,31 +120,30 @@ A: bMaxPacketSize0=64\n
|
|||||||
A: bMaxPower=0mA\n
|
A: bMaxPower=0mA\n
|
||||||
A: bNumConfigurations=1\n
|
A: bNumConfigurations=1\n
|
||||||
A: bNumInterfaces= 1\n
|
A: bNumInterfaces= 1\n
|
||||||
A: bcdDevice=0515\n
|
A: bcdDevice=0504\n
|
||||||
A: bmAttributes=e0\n
|
A: bmAttributes=e0\n
|
||||||
A: busnum=1\n
|
A: busnum=1\n
|
||||||
A: configuration=
|
A: configuration=\n
|
||||||
H: descriptors=12010002090001406B1D020015050302010109021900010100E0000904000001090000000705810304000C
|
H: descriptors=12010002090001406B1D020004050302010109021900010100E0000904000001090000000705810304000C
|
||||||
A: dev=189:0\n
|
A: dev=189:0\n
|
||||||
A: devnum=1\n
|
A: devnum=1\n
|
||||||
A: devpath=0\n
|
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:3d/device:3e
|
|
||||||
A: idProduct=0002\n
|
A: idProduct=0002\n
|
||||||
A: idVendor=1d6b\n
|
A: idVendor=1d6b\n
|
||||||
A: interface_authorized_default=1\n
|
A: interface_authorized_default=1\n
|
||||||
A: ltm_capable=no\n
|
A: ltm_capable=no\n
|
||||||
A: manufacturer=Linux 5.15.0-39-generic xhci-hcd\n
|
A: manufacturer=Linux 5.4.0-42-generic xhci-hcd\n
|
||||||
A: maxchild=14\n
|
A: maxchild=12\n
|
||||||
A: power/active_duration=35270364\n
|
A: power/active_duration=74604360\n
|
||||||
A: power/async=enabled\n
|
A: power/async=enabled\n
|
||||||
A: power/autosuspend=0\n
|
A: power/autosuspend=0\n
|
||||||
A: power/autosuspend_delay_ms=0\n
|
A: power/autosuspend_delay_ms=0\n
|
||||||
A: power/connected_duration=35284300\n
|
A: power/connected_duration=74606456\n
|
||||||
A: power/control=auto\n
|
A: power/control=auto\n
|
||||||
A: power/level=auto\n
|
A: power/level=auto\n
|
||||||
A: power/runtime_active_kids=2\n
|
A: power/runtime_active_kids=4\n
|
||||||
A: power/runtime_active_time=35277420\n
|
A: power/runtime_active_time=74605838\n
|
||||||
A: power/runtime_enabled=enabled\n
|
A: power/runtime_enabled=enabled\n
|
||||||
A: power/runtime_status=active\n
|
A: power/runtime_status=active\n
|
||||||
A: power/runtime_suspended_time=0\n
|
A: power/runtime_suspended_time=0\n
|
||||||
@@ -171,63 +164,62 @@ A: rx_lanes=1\n
|
|||||||
A: serial=0000:00:14.0\n
|
A: serial=0000:00:14.0\n
|
||||||
A: speed=480\n
|
A: speed=480\n
|
||||||
A: tx_lanes=1\n
|
A: tx_lanes=1\n
|
||||||
A: urbnum=549\n
|
A: urbnum=490\n
|
||||||
A: version= 2.00\n
|
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:8C31
|
E: PCI_ID=8086:9DED
|
||||||
E: PCI_SUBSYS_ID=1043:201F
|
E: PCI_SUBSYS_ID=103C:85EF
|
||||||
E: PCI_SLOT_NAME=0000:00:14.0
|
E: PCI_SLOT_NAME=0000:00:14.0
|
||||||
E: MODALIAS=pci:v00008086d00008C31sv00001043sd0000201Fbc0Csc03i30
|
E: MODALIAS=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30
|
||||||
E: SUBSYSTEM=pci
|
E: SUBSYSTEM=pci
|
||||||
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
|
||||||
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
|
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=8 Series/C220 Series Chipset Family USB xHCI
|
E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller
|
||||||
A: ari_enabled=0\n
|
A: ari_enabled=0\n
|
||||||
A: broken_parity_status=0\n
|
A: broken_parity_status=0\n
|
||||||
A: class=0x0c0330\n
|
A: class=0x0c0330\n
|
||||||
H: config=8680318C060490020530030C000000000400A0F700000000000000000000000000000000000000000000000043101F200000000070000000000000000B010000FD01368089C60F8000000000000000009F6E8807000000000000000000000000302000000000000000000000000000000180C2C1080000000000000000000000050087000410E0FE000000002F00000000000000000000000000000000000000400100000000000000000000000000000F000100000000000000000000000000030420C0030C3000030C300000000000FF1A0000FF1A00003F0000003F000000A00000000000000000000000D8D8D8080000000000000000B10F060800000000
|
H: config=8680ED9D060490023030030C00008000040030A10000000000000000000000000000000000000000000000003C10EF85000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F00000000181C030400000000316000000000000000000000000000000180C2C1080000000000000000000000059087007802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000B50F300112000000
|
||||||
A: consistent_dma_mask_bits=64\n
|
A: consistent_dma_mask_bits=64\n
|
||||||
A: d3cold_allowed=1\n
|
A: d3cold_allowed=1\n
|
||||||
A: device=0x8c31\n
|
A: dbc=disabled\n
|
||||||
|
A: device=0x9ded\n
|
||||||
A: dma_mask_bits=64\n
|
A: dma_mask_bits=64\n
|
||||||
L: driver=../../../bus/pci/drivers/xhci_hcd
|
L: driver=../../../bus/pci/drivers/xhci_hcd
|
||||||
A: driver_override=(null)\n
|
A: driver_override=(null)\n
|
||||||
A: enable=1\n
|
A: enable=1\n
|
||||||
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:3d
|
A: irq=124\n
|
||||||
A: irq=31\n
|
|
||||||
A: local_cpulist=0-3\n
|
A: local_cpulist=0-3\n
|
||||||
A: local_cpus=f\n
|
A: local_cpus=f\n
|
||||||
A: modalias=pci:v00008086d00008C31sv00001043sd0000201Fbc0Csc03i30\n
|
A: modalias=pci:v00008086d00009DEDsv0000103Csd000085EFbc0Csc03i30\n
|
||||||
A: msi_bus=1\n
|
A: msi_bus=1\n
|
||||||
A: msi_irqs/31=msi\n
|
A: msi_irqs/124=msi\n
|
||||||
A: numa_node=-1\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 5 6 2112 6\nxHCI ring segments 24 24 4096 24\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 3 32 128 1\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 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\n
|
A: power/async=enabled\n
|
||||||
A: power/control=on\n
|
A: power/control=auto\n
|
||||||
A: power/runtime_active_kids=1\n
|
A: power/runtime_active_kids=1\n
|
||||||
A: power/runtime_active_time=35278060\n
|
A: power/runtime_active_time=74606194\n
|
||||||
A: power/runtime_enabled=forbidden\n
|
A: power/runtime_enabled=enabled\n
|
||||||
A: power/runtime_status=active\n
|
A: power/runtime_status=active\n
|
||||||
A: power/runtime_suspended_time=0\n
|
A: power/runtime_suspended_time=0\n
|
||||||
A: power/runtime_usage=1\n
|
A: power/runtime_usage=0\n
|
||||||
A: power/wakeup=enabled\n
|
A: power/wakeup=enabled\n
|
||||||
A: power/wakeup_abort_count=0\n
|
A: power/wakeup_abort_count=0\n
|
||||||
A: power/wakeup_active=0\n
|
A: power/wakeup_active=0\n
|
||||||
A: power/wakeup_active_count=5\n
|
A: power/wakeup_active_count=0\n
|
||||||
A: power/wakeup_count=0\n
|
A: power/wakeup_count=0\n
|
||||||
A: power/wakeup_expire_count=5\n
|
A: power/wakeup_expire_count=0\n
|
||||||
A: power/wakeup_last_time_ms=12694896\n
|
A: power/wakeup_last_time_ms=0\n
|
||||||
A: power/wakeup_max_time_ms=103\n
|
A: power/wakeup_max_time_ms=0\n
|
||||||
A: power/wakeup_total_time_ms=518\n
|
A: power/wakeup_total_time_ms=0\n
|
||||||
A: power_state=D0\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\n
|
||||||
A: resource=0x00000000f7a00000 0x00000000f7a0ffff 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\n
|
||||||
A: revision=0x05\n
|
A: subsystem_device=0x85ef\n
|
||||||
A: subsystem_device=0x201f\n
|
A: subsystem_vendor=0x103c\n
|
||||||
A: subsystem_vendor=0x1043\n
|
|
||||||
A: vendor=0x8086\n
|
A: vendor=0x8086\n
|
||||||
|
|
||||||
|
|||||||
@@ -24,10 +24,6 @@ TW 8c62
|
|||||||
TW 805a
|
TW 805a
|
||||||
TW 04
|
TW 04
|
||||||
TW aa07
|
TW aa07
|
||||||
TW 8100
|
|
||||||
TW 825f
|
|
||||||
TW 8300
|
|
||||||
TW 845f
|
|
||||||
TW 8560
|
TW 8560
|
||||||
TW 86c0
|
TW 86c0
|
||||||
TW 8780
|
TW 8780
|
||||||
@@ -42,11 +38,8 @@ TW 9567
|
|||||||
TW 9804
|
TW 9804
|
||||||
TW a120
|
TW a120
|
||||||
TW a236
|
TW a236
|
||||||
TW a902
|
|
||||||
TW aa03
|
|
||||||
TW aa5f
|
TW aa5f
|
||||||
TW abc0
|
TW abc0
|
||||||
TW ac10
|
|
||||||
TW aeff
|
TW aeff
|
||||||
TW 01
|
TW 01
|
||||||
TW 03ff
|
TW 03ff
|
||||||
|
|||||||
Binary file not shown.
@@ -21,13 +21,10 @@ assert d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
|
|||||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
|
||||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
|
||||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
|
||||||
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
assert not d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
|
||||||
|
|
||||||
d.open_sync()
|
d.open_sync()
|
||||||
|
|
||||||
# 1. verify clear storage command, 2. make sure later asserts are good
|
|
||||||
d.clear_storage_sync()
|
|
||||||
|
|
||||||
template = FPrint.Print.new(d)
|
template = FPrint.Print.new(d)
|
||||||
|
|
||||||
def enroll_progress(*args):
|
def enroll_progress(*args):
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-3
|
P: /devices/pci0000:00/0000:00:14.0/usb1/1-3
|
||||||
N: bus/usb/001/023=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000
|
N: bus/usb/001/053=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000
|
||||||
E: DEVNAME=/dev/bus/usb/001/023
|
E: DEVNAME=/dev/bus/usb/001/053
|
||||||
E: DEVTYPE=usb_device
|
E: DEVTYPE=usb_device
|
||||||
E: DRIVER=usb
|
E: DRIVER=usb
|
||||||
E: PRODUCT=27c6/6496/100
|
E: PRODUCT=27c6/6496/100
|
||||||
E: TYPE=239/0/0
|
E: TYPE=239/0/0
|
||||||
E: BUSNUM=001
|
E: BUSNUM=001
|
||||||
E: DEVNUM=023
|
E: DEVNUM=053
|
||||||
E: MAJOR=189
|
E: MAJOR=189
|
||||||
E: MINOR=22
|
E: MINOR=52
|
||||||
E: SUBSYSTEM=usb
|
E: SUBSYSTEM=usb
|
||||||
E: ID_VENDOR=Goodix_Technology_Co.__Ltd.
|
E: ID_VENDOR=Goodix_Technology_Co.__Ltd.
|
||||||
E: ID_VENDOR_ENC=Goodix\x20Technology\x20Co.\x2c\x20Ltd.
|
E: ID_VENDOR_ENC=Goodix\x20Technology\x20Co.\x2c\x20Ltd.
|
||||||
@@ -23,7 +23,6 @@ E: ID_BUS=usb
|
|||||||
E: ID_USB_INTERFACES=:ff0000:
|
E: ID_USB_INTERFACES=:ff0000:
|
||||||
E: ID_VENDOR_FROM_DATABASE=Shenzhen Goodix Technology Co.,Ltd.
|
E: ID_VENDOR_FROM_DATABASE=Shenzhen Goodix Technology Co.,Ltd.
|
||||||
E: ID_AUTOSUSPEND=1
|
E: ID_AUTOSUSPEND=1
|
||||||
E: ID_PERSIST=0
|
|
||||||
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\n
|
A: authorized=1\n
|
||||||
@@ -41,8 +40,8 @@ A: bmAttributes=a0\n
|
|||||||
A: busnum=1\n
|
A: busnum=1\n
|
||||||
A: configuration=XXXX_MOC_B0\n
|
A: configuration=XXXX_MOC_B0\n
|
||||||
H: descriptors=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000
|
H: descriptors=12010002EF000040C627966400010102030109022000010103A0320904000002FF0000040705830240000007050102400000
|
||||||
A: dev=189:22\n
|
A: dev=189:52\n
|
||||||
A: devnum=23\n
|
A: devnum=53\n
|
||||||
A: devpath=3\n
|
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
|
||||||
@@ -52,16 +51,16 @@ A: ltm_capable=no\n
|
|||||||
A: manufacturer=Goodix Technology Co., Ltd.\n
|
A: manufacturer=Goodix Technology Co., Ltd.\n
|
||||||
A: maxchild=0\n
|
A: maxchild=0\n
|
||||||
L: port=../1-0:1.0/usb1-port3
|
L: port=../1-0:1.0/usb1-port3
|
||||||
A: power/active_duration=22667\n
|
A: power/active_duration=29262\n
|
||||||
A: power/autosuspend=2\n
|
A: power/autosuspend=2\n
|
||||||
A: power/autosuspend_delay_ms=2000\n
|
A: power/autosuspend_delay_ms=2000\n
|
||||||
A: power/connected_duration=917616\n
|
A: power/connected_duration=57399\n
|
||||||
A: power/control=auto\n
|
A: power/control=auto\n
|
||||||
A: power/level=auto\n
|
A: power/level=auto\n
|
||||||
A: power/persist=1\n
|
A: power/persist=1\n
|
||||||
A: power/runtime_active_time=22809\n
|
A: power/runtime_active_time=29308\n
|
||||||
A: power/runtime_status=active\n
|
A: power/runtime_status=active\n
|
||||||
A: power/runtime_suspended_time=894564\n
|
A: power/runtime_suspended_time=27850\n
|
||||||
A: power/wakeup=disabled\n
|
A: power/wakeup=disabled\n
|
||||||
A: power/wakeup_abort_count=\n
|
A: power/wakeup_abort_count=\n
|
||||||
A: power/wakeup_active=\n
|
A: power/wakeup_active=\n
|
||||||
@@ -78,29 +77,29 @@ A: rx_lanes=1\n
|
|||||||
A: serial=XXXX_MOC_B0\n
|
A: serial=XXXX_MOC_B0\n
|
||||||
A: speed=12\n
|
A: speed=12\n
|
||||||
A: tx_lanes=1\n
|
A: tx_lanes=1\n
|
||||||
A: urbnum=298\n
|
A: urbnum=394\n
|
||||||
A: version= 2.00\n
|
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=12010002090001406B1D020017050302010109021900010100E0000904000001090000000705810304000C
|
N: bus/usb/001/001=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
|
||||||
E: DEVNAME=/dev/bus/usb/001/001
|
E: DEVNAME=/dev/bus/usb/001/001
|
||||||
E: DEVTYPE=usb_device
|
E: DEVTYPE=usb_device
|
||||||
E: DRIVER=usb
|
E: DRIVER=usb
|
||||||
E: PRODUCT=1d6b/2/517
|
E: PRODUCT=1d6b/2/513
|
||||||
E: TYPE=9/0/1
|
E: TYPE=9/0/1
|
||||||
E: BUSNUM=001
|
E: BUSNUM=001
|
||||||
E: DEVNUM=001
|
E: DEVNUM=001
|
||||||
E: MAJOR=189
|
E: MAJOR=189
|
||||||
E: MINOR=0
|
E: MINOR=0
|
||||||
E: SUBSYSTEM=usb
|
E: SUBSYSTEM=usb
|
||||||
E: ID_VENDOR=Linux_5.17.12-300.fc36.x86_64_xhci-hcd
|
E: ID_VENDOR=Linux_5.13.15-200.fc34.x86_64_xhci-hcd
|
||||||
E: ID_VENDOR_ENC=Linux\x205.17.12-300.fc36.x86_64\x20xhci-hcd
|
E: ID_VENDOR_ENC=Linux\x205.13.15-200.fc34.x86_64\x20xhci-hcd
|
||||||
E: ID_VENDOR_ID=1d6b
|
E: ID_VENDOR_ID=1d6b
|
||||||
E: ID_MODEL=xHCI_Host_Controller
|
E: ID_MODEL=xHCI_Host_Controller
|
||||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||||
E: ID_MODEL_ID=0002
|
E: ID_MODEL_ID=0002
|
||||||
E: ID_REVISION=0517
|
E: ID_REVISION=0513
|
||||||
E: ID_SERIAL=Linux_5.17.12-300.fc36.x86_64_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
E: ID_SERIAL=Linux_5.13.15-200.fc34.x86_64_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||||
E: ID_BUS=usb
|
E: ID_BUS=usb
|
||||||
E: ID_USB_INTERFACES=:090000:
|
E: ID_USB_INTERFACES=:090000:
|
||||||
@@ -123,11 +122,11 @@ A: bMaxPacketSize0=64\n
|
|||||||
A: bMaxPower=0mA\n
|
A: bMaxPower=0mA\n
|
||||||
A: bNumConfigurations=1\n
|
A: bNumConfigurations=1\n
|
||||||
A: bNumInterfaces= 1\n
|
A: bNumInterfaces= 1\n
|
||||||
A: bcdDevice=0517\n
|
A: bcdDevice=0513\n
|
||||||
A: bmAttributes=e0\n
|
A: bmAttributes=e0\n
|
||||||
A: busnum=1\n
|
A: busnum=1\n
|
||||||
A: configuration=\n
|
A: configuration=\n
|
||||||
H: descriptors=12010002090001406B1D020017050302010109021900010100E0000904000001090000000705810304000C
|
H: descriptors=12010002090001406B1D020013050302010109021900010100E0000904000001090000000705810304000C
|
||||||
A: dev=189:0\n
|
A: dev=189:0\n
|
||||||
A: devnum=1\n
|
A: devnum=1\n
|
||||||
A: devpath=0\n
|
A: devpath=0\n
|
||||||
@@ -137,15 +136,15 @@ A: idProduct=0002\n
|
|||||||
A: idVendor=1d6b\n
|
A: idVendor=1d6b\n
|
||||||
A: interface_authorized_default=1\n
|
A: interface_authorized_default=1\n
|
||||||
A: ltm_capable=no\n
|
A: ltm_capable=no\n
|
||||||
A: manufacturer=Linux 5.17.12-300.fc36.x86_64 xhci-hcd\n
|
A: manufacturer=Linux 5.13.15-200.fc34.x86_64 xhci-hcd\n
|
||||||
A: maxchild=12\n
|
A: maxchild=12\n
|
||||||
A: power/active_duration=164289796\n
|
A: power/active_duration=219578717\n
|
||||||
A: power/autosuspend=0\n
|
A: power/autosuspend=0\n
|
||||||
A: power/autosuspend_delay_ms=0\n
|
A: power/autosuspend_delay_ms=0\n
|
||||||
A: power/connected_duration=164360220\n
|
A: power/connected_duration=219649620\n
|
||||||
A: power/control=auto\n
|
A: power/control=auto\n
|
||||||
A: power/level=auto\n
|
A: power/level=auto\n
|
||||||
A: power/runtime_active_time=164331876\n
|
A: power/runtime_active_time=219589127\n
|
||||||
A: power/runtime_status=active\n
|
A: power/runtime_status=active\n
|
||||||
A: power/runtime_suspended_time=0\n
|
A: power/runtime_suspended_time=0\n
|
||||||
A: power/wakeup=disabled\n
|
A: power/wakeup=disabled\n
|
||||||
@@ -164,14 +163,14 @@ A: rx_lanes=1\n
|
|||||||
A: serial=0000:00:14.0\n
|
A: serial=0000:00:14.0\n
|
||||||
A: speed=480\n
|
A: speed=480\n
|
||||||
A: tx_lanes=1\n
|
A: tx_lanes=1\n
|
||||||
A: urbnum=2097\n
|
A: urbnum=4325\n
|
||||||
A: version= 2.00\n
|
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
|
||||||
@@ -184,7 +183,7 @@ E: ID_MODEL_FROM_DATABASE=Cannon Point-LP USB 3.1 xHCI Controller
|
|||||||
A: ari_enabled=0\n
|
A: ari_enabled=0\n
|
||||||
A: broken_parity_status=0\n
|
A: broken_parity_status=0\n
|
||||||
A: class=0x0c0330\n
|
A: class=0x0c0330\n
|
||||||
H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F00000000F507312600000000316000000000000000000000000000000180C2C1080000000000000000000000059087001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000
|
H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004C084B0100000000316000000000000000000000000000000180C2C1080000000000000000000000059087001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000
|
||||||
A: consistent_dma_mask_bits=64\n
|
A: consistent_dma_mask_bits=64\n
|
||||||
A: d3cold_allowed=1\n
|
A: d3cold_allowed=1\n
|
||||||
A: dbc=disabled\n
|
A: dbc=disabled\n
|
||||||
@@ -202,8 +201,8 @@ A: msi_bus=1\n
|
|||||||
A: msi_irqs/128=msi\n
|
A: msi_irqs/128=msi\n
|
||||||
A: numa_node=-1\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 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: 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=auto\n
|
A: power/control=on\n
|
||||||
A: power/runtime_active_time=164332777\n
|
A: power/runtime_active_time=219589302\n
|
||||||
A: power/runtime_status=active\n
|
A: power/runtime_status=active\n
|
||||||
A: power/runtime_suspended_time=0\n
|
A: power/runtime_suspended_time=0\n
|
||||||
A: power/wakeup=enabled\n
|
A: power/wakeup=enabled\n
|
||||||
|
|||||||
Binary file not shown.
@@ -1,14 +1,10 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import os
|
|
||||||
import gi
|
import gi
|
||||||
gi.require_version('FPrint', '2.0')
|
gi.require_version('FPrint', '2.0')
|
||||||
from gi.repository import FPrint, GLib
|
from gi.repository import FPrint, GLib
|
||||||
|
|
||||||
import sys
|
ctx = GLib.main_context_default()
|
||||||
import traceback
|
|
||||||
sys.excepthook = lambda *args : (traceback.print_exception(*args), sys.exit(1))
|
|
||||||
|
|
||||||
|
|
||||||
c = FPrint.Context()
|
c = FPrint.Context()
|
||||||
c.enumerate()
|
c.enumerate()
|
||||||
@@ -17,24 +13,6 @@ devices = c.get_devices()
|
|||||||
d = devices[0]
|
d = devices[0]
|
||||||
del devices
|
del devices
|
||||||
|
|
||||||
usb_device = d.get_property('fpi-usb-device')
|
|
||||||
bus_num = usb_device.get_bus()
|
|
||||||
port = []
|
|
||||||
while True:
|
|
||||||
parent = usb_device.get_parent()
|
|
||||||
if parent is None:
|
|
||||||
break
|
|
||||||
port.append(str(usb_device.get_port_number()))
|
|
||||||
usb_device = parent
|
|
||||||
port = '.'.join(port)
|
|
||||||
|
|
||||||
persist = f'/sys/bus/usb/devices/{bus_num}-{port}/power/persist'
|
|
||||||
wakeup = f'/sys/bus/usb/devices/{bus_num}-{port}/power/wakeup'
|
|
||||||
|
|
||||||
# may not have written anything
|
|
||||||
assert open(persist).read().strip() == "0"
|
|
||||||
assert open(wakeup).read().strip() == "disabled"
|
|
||||||
|
|
||||||
assert d.get_driver() == "synaptics"
|
assert d.get_driver() == "synaptics"
|
||||||
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
|
||||||
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
|
||||||
@@ -51,7 +29,7 @@ d.clear_storage_sync()
|
|||||||
template = FPrint.Print.new(d)
|
template = FPrint.Print.new(d)
|
||||||
|
|
||||||
def enroll_progress(*args):
|
def enroll_progress(*args):
|
||||||
#assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
|
assert d.get_finger_status() == FPrint.FingerStatusFlags.NEEDED
|
||||||
print('enroll progress: ' + str(args))
|
print('enroll progress: ' + str(args))
|
||||||
|
|
||||||
# List, enroll, list, verify, delete, list
|
# List, enroll, list, verify, delete, list
|
||||||
@@ -63,21 +41,6 @@ print("enroll done")
|
|||||||
|
|
||||||
print("verifying")
|
print("verifying")
|
||||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||||
|
|
||||||
# Inject a suspend/resume cycle into the verify
|
|
||||||
def suspend_resume():
|
|
||||||
d.suspend_sync()
|
|
||||||
assert open(persist).read().strip() == "0"
|
|
||||||
assert open(wakeup).read().strip() == "enabled"
|
|
||||||
|
|
||||||
assert open(persist, 'w').write('0\n')
|
|
||||||
d.resume_sync()
|
|
||||||
# This tests that libfprint doesn't write if the value is correct
|
|
||||||
# (i.e. the trailing \ would be lost inside umockdev if written)
|
|
||||||
assert open(persist).read() == "0\n"
|
|
||||||
assert open(wakeup).read().strip() == "disabled"
|
|
||||||
|
|
||||||
GLib.idle_add(suspend_resume, priority=GLib.PRIORITY_HIGH)
|
|
||||||
verify_res, verify_print = d.verify_sync(p)
|
verify_res, verify_print = d.verify_sync(p)
|
||||||
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
|
||||||
print("verify done")
|
print("verify done")
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
P: /devices/pci0000:00/0000:00:14.0/usb1/1-9
|
P: /devices/pci0000:00/0000:00:14.0/usb1/1-9
|
||||||
N: bus/usb/001/004=12010002FF10FF08CB06BD0000000000010109022700010100A0320904000003FF000000070501024000000705810240000007058303080004
|
N: bus/usb/001/005
|
||||||
E: DEVNAME=/dev/bus/usb/001/004
|
E: DEVNAME=/dev/bus/usb/001/005
|
||||||
E: DEVTYPE=usb_device
|
E: DEVTYPE=usb_device
|
||||||
E: DRIVER=usb
|
E: DRIVER=usb
|
||||||
E: PRODUCT=6cb/bd/0
|
E: PRODUCT=6cb/bd/0
|
||||||
E: TYPE=255/16/255
|
E: TYPE=255/16/255
|
||||||
E: BUSNUM=001
|
E: BUSNUM=001
|
||||||
E: DEVNUM=004
|
E: DEVNUM=005
|
||||||
E: MAJOR=189
|
E: MAJOR=189
|
||||||
E: MINOR=3
|
E: MINOR=4
|
||||||
E: SUBSYSTEM=usb
|
E: SUBSYSTEM=usb
|
||||||
E: ID_VENDOR=06cb
|
E: ID_VENDOR=06cb
|
||||||
E: ID_VENDOR_ENC=06cb
|
E: ID_VENDOR_ENC=06cb
|
||||||
@@ -24,82 +24,82 @@ E: ID_USB_INTERFACES=:ff0000:
|
|||||||
E: ID_VENDOR_FROM_DATABASE=Synaptics, Inc.
|
E: ID_VENDOR_FROM_DATABASE=Synaptics, Inc.
|
||||||
E: ID_AUTOSUSPEND=1
|
E: ID_AUTOSUSPEND=1
|
||||||
E: ID_MODEL_FROM_DATABASE=Prometheus MIS Touch Fingerprint Reader
|
E: ID_MODEL_FROM_DATABASE=Prometheus MIS Touch Fingerprint Reader
|
||||||
E: ID_PERSIST=0
|
|
||||||
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
|
||||||
A: authorized=1
|
E: LIBFPRINT_DRIVER=Synaptics Sensors
|
||||||
A: avoid_reset_quirk=0
|
A: authorized=1\n
|
||||||
A: bConfigurationValue=1
|
A: avoid_reset_quirk=0\n
|
||||||
A: bDeviceClass=ff
|
A: bConfigurationValue=1\n
|
||||||
A: bDeviceProtocol=ff
|
A: bDeviceClass=ff\n
|
||||||
A: bDeviceSubClass=10
|
A: bDeviceProtocol=ff\n
|
||||||
A: bMaxPacketSize0=8
|
A: bDeviceSubClass=10\n
|
||||||
A: bMaxPower=100mA
|
A: bMaxPacketSize0=8\n
|
||||||
A: bNumConfigurations=1
|
A: bMaxPower=100mA\n
|
||||||
A: bNumInterfaces= 1
|
A: bNumConfigurations=1\n
|
||||||
A: bcdDevice=0000
|
A: bNumInterfaces= 1\n
|
||||||
A: bmAttributes=a0
|
A: bcdDevice=0000\n
|
||||||
A: busnum=1
|
A: bmAttributes=a0\n
|
||||||
|
A: busnum=1\n
|
||||||
A: configuration=
|
A: configuration=
|
||||||
H: descriptors=12010002FF10FF08CB06BD0000000000010109022700010100A0320904000003FF000000070501024000000705810240000007058303080004
|
H: descriptors=12010002FF10FF08CB06BD0000000000010109022700010100A0320904000003FF000000070501024000000705810240000007058303080004
|
||||||
A: dev=189:3
|
A: dev=189:4\n
|
||||||
A: devnum=4
|
A: devnum=5\n
|
||||||
A: devpath=9
|
A: devpath=9\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:28
|
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:1c/device:1d/device:28
|
||||||
A: idProduct=00bd
|
A: idProduct=00bd\n
|
||||||
A: idVendor=06cb
|
A: idVendor=06cb\n
|
||||||
A: ltm_capable=no
|
A: ltm_capable=no\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=9424964
|
A: power/active_duration=82065\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=866169213
|
A: power/connected_duration=4271349\n
|
||||||
A: power/control=auto
|
A: power/control=auto\n
|
||||||
A: power/level=auto
|
A: power/level=auto\n
|
||||||
A: power/persist=0
|
A: power/persist=1\n
|
||||||
A: power/runtime_active_time=9431408
|
A: power/runtime_active_time=82975\n
|
||||||
A: power/runtime_status=active
|
A: power/runtime_status=suspended\n
|
||||||
A: power/runtime_suspended_time=856661633
|
A: power/runtime_suspended_time=4186597\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: quirks=0x0
|
A: quirks=0x0\n
|
||||||
A: removable=fixed
|
A: removable=fixed\n
|
||||||
A: rx_lanes=1
|
A: rx_lanes=1\n
|
||||||
A: serial=c087f7d72126
|
A: serial=c087f7d72126\n
|
||||||
A: speed=12
|
A: speed=12\n
|
||||||
A: tx_lanes=1
|
A: tx_lanes=1\n
|
||||||
A: urbnum=8945
|
A: urbnum=618\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=12010002090001406B1D020016050302010109021900010100E0000904000001090000000705810304000C
|
N: bus/usb/001/001=12010002090001406B1D020012050302010109021900010100E0000904000001090000000705810304000C
|
||||||
E: DEVNAME=/dev/bus/usb/001/001
|
E: DEVNAME=/dev/bus/usb/001/001
|
||||||
E: DEVTYPE=usb_device
|
E: DEVTYPE=usb_device
|
||||||
E: DRIVER=usb
|
E: DRIVER=usb
|
||||||
E: PRODUCT=1d6b/2/516
|
E: PRODUCT=1d6b/2/512
|
||||||
E: TYPE=9/0/1
|
E: TYPE=9/0/1
|
||||||
E: BUSNUM=001
|
E: BUSNUM=001
|
||||||
E: DEVNUM=001
|
E: DEVNUM=001
|
||||||
E: MAJOR=189
|
E: MAJOR=189
|
||||||
E: MINOR=0
|
E: MINOR=0
|
||||||
E: SUBSYSTEM=usb
|
E: SUBSYSTEM=usb
|
||||||
E: ID_VENDOR=Linux_5.16.8-200.fc35.x86_64_xhci-hcd
|
E: ID_VENDOR=Linux_5.12.9-300.fc34.x86_64_xhci-hcd
|
||||||
E: ID_VENDOR_ENC=Linux\x205.16.8-200.fc35.x86_64\x20xhci-hcd
|
E: ID_VENDOR_ENC=Linux\x205.12.9-300.fc34.x86_64\x20xhci-hcd
|
||||||
E: ID_VENDOR_ID=1d6b
|
E: ID_VENDOR_ID=1d6b
|
||||||
E: ID_MODEL=xHCI_Host_Controller
|
E: ID_MODEL=xHCI_Host_Controller
|
||||||
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
|
||||||
E: ID_MODEL_ID=0002
|
E: ID_MODEL_ID=0002
|
||||||
E: ID_REVISION=0516
|
E: ID_REVISION=0512
|
||||||
E: ID_SERIAL=Linux_5.16.8-200.fc35.x86_64_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
E: ID_SERIAL=Linux_5.12.9-300.fc34.x86_64_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
|
||||||
E: ID_SERIAL_SHORT=0000:00:14.0
|
E: ID_SERIAL_SHORT=0000:00:14.0
|
||||||
E: ID_BUS=usb
|
E: ID_BUS=usb
|
||||||
E: ID_USB_INTERFACES=:090000:
|
E: ID_USB_INTERFACES=:090000:
|
||||||
@@ -111,60 +111,60 @@ 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=0516
|
A: bcdDevice=0512\n
|
||||||
A: bmAttributes=e0
|
A: bmAttributes=e0\n
|
||||||
A: busnum=1
|
A: busnum=1\n
|
||||||
A: configuration=
|
A: configuration=
|
||||||
H: descriptors=12010002090001406B1D020016050302010109021900010100E0000904000001090000000705810304000C
|
H: descriptors=12010002090001406B1D020012050302010109021900010100E0000904000001090000000705810304000C
|
||||||
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.16.8-200.fc35.x86_64 xhci-hcd
|
A: manufacturer=Linux 5.12.9-300.fc34.x86_64 xhci-hcd\n
|
||||||
A: maxchild=12
|
A: maxchild=12\n
|
||||||
A: power/active_duration=865968060
|
A: power/active_duration=4270585\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=866169920
|
A: power/connected_duration=4272308\n
|
||||||
A: power/control=auto
|
A: power/control=auto\n
|
||||||
A: power/level=auto
|
A: power/level=auto\n
|
||||||
A: power/runtime_active_time=866093998
|
A: power/runtime_active_time=4270770\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=9372
|
A: urbnum=463\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,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=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F0000000060069A2400000000316000000000000000000000000000000180C2C108000000000000000000000005908700D802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000000000000000000008000000040000000000000000000000000000000000000000000000000000000800000004000000000000000000000000000000000000000000000000000000B50F320112000000
|
H: config=8680ED9D060490021130030C00008000040022EA000000000000000000000000000000000000000000000000AA179222000000007000000000000000FF010000
|
||||||
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=126
|
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/126=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 21 24 2112 24\nxHCI ring segments 68 80 4096 80\nbuffer-2048 0 38 2048 19\nbuffer-512 0 0 512 0\nbuffer-128 18 32 128 1\nbuffer-32 0 128 32 1
|
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 12 2112 12\nxHCI ring segments 40 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=auto
|
A: power/control=auto\n
|
||||||
A: power/runtime_active_time=866094158
|
A: power/runtime_active_time=4271635\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=2
|
A: power/wakeup_active_count=0\n
|
||||||
A: power/wakeup_count=0
|
A: power/wakeup_count=0\n
|
||||||
A: power/wakeup_expire_count=2
|
A: power/wakeup_expire_count=0\n
|
||||||
A: power/wakeup_last_time_ms=476219021
|
A: power/wakeup_last_time_ms=0\n
|
||||||
A: power/wakeup_max_time_ms=103
|
A: power/wakeup_max_time_ms=0\n
|
||||||
A: power/wakeup_total_time_ms=207
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -232,53 +232,6 @@ test_device_has_storage (void)
|
|||||||
G_GNUC_END_IGNORE_DEPRECATIONS
|
G_GNUC_END_IGNORE_DEPRECATIONS
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
test_device_persistent_data (void)
|
|
||||||
{
|
|
||||||
g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_device (FPT_VIRTUAL_DEVICE_IMAGE);
|
|
||||||
g_autoptr(GVariant) initial = NULL;
|
|
||||||
g_autoptr(GVariant) loaded = NULL;
|
|
||||||
g_autoptr(GError) error = NULL;
|
|
||||||
guint8 *data = (guint8 *) 0xdeadbeef;
|
|
||||||
gsize length = 1;
|
|
||||||
|
|
||||||
initial = g_variant_ref_sink (g_variant_new ("(s)", "stored data"));
|
|
||||||
|
|
||||||
g_assert_true (fp_device_get_persistent_data (tctx->device, &data, &length, &error));
|
|
||||||
g_assert_cmpint (length, ==, 0);
|
|
||||||
g_assert_null (data);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
|
|
||||||
/* Use the fact that this is a property that we can poke from the outside. */
|
|
||||||
g_object_set (tctx->device, "fpi-persistent-data", initial, NULL);
|
|
||||||
|
|
||||||
/* Works now */
|
|
||||||
g_assert_true (fp_device_get_persistent_data (tctx->device, &data, &length, &error));
|
|
||||||
g_assert_cmpint (length, !=, 0);
|
|
||||||
g_assert_nonnull (data);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
|
|
||||||
/* We can't load the data, as data has been set already. */
|
|
||||||
g_assert_false (fp_device_set_persistent_data (tctx->device, data, length, &error));
|
|
||||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS);
|
|
||||||
g_clear_pointer (&error, g_error_free);
|
|
||||||
|
|
||||||
/* Abuse that we can "load" again if the data is set to NULL.
|
|
||||||
* This is an implementation detail and just a lack of error checking. */
|
|
||||||
g_object_set (tctx->device, "fpi-persistent-data", NULL, NULL);
|
|
||||||
|
|
||||||
/* Incomplete data, causes parsing error */
|
|
||||||
g_assert_false (fp_device_set_persistent_data (tctx->device, data, 5, &error));
|
|
||||||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA);
|
|
||||||
g_clear_pointer (&error, g_error_free);
|
|
||||||
|
|
||||||
g_assert_true (fp_device_set_persistent_data (tctx->device, data, length, &error));
|
|
||||||
g_assert_no_error (error);
|
|
||||||
|
|
||||||
g_object_get (tctx->device, "fpi-persistent-data", &loaded, NULL);
|
|
||||||
g_assert_cmpvariant (initial, loaded);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -299,7 +252,6 @@ main (int argc, char *argv[])
|
|||||||
g_test_add_func ("/device/sync/supports_identify", test_device_supports_identify);
|
g_test_add_func ("/device/sync/supports_identify", test_device_supports_identify);
|
||||||
g_test_add_func ("/device/sync/supports_capture", test_device_supports_capture);
|
g_test_add_func ("/device/sync/supports_capture", test_device_supports_capture);
|
||||||
g_test_add_func ("/device/sync/has_storage", test_device_has_storage);
|
g_test_add_func ("/device/sync/has_storage", test_device_has_storage);
|
||||||
g_test_add_func ("/device/persistent_data", test_device_persistent_data);
|
|
||||||
|
|
||||||
return g_test_run ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,10 +29,6 @@
|
|||||||
#include "test-device-fake.h"
|
#include "test-device-fake.h"
|
||||||
#include "fp-print-private.h"
|
#include "fp-print-private.h"
|
||||||
|
|
||||||
/* gcc 12.0.1 is complaining about dangling pointers in the auto_close* functions */
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wdangling-pointer"
|
|
||||||
|
|
||||||
/* Utility functions */
|
/* Utility functions */
|
||||||
|
|
||||||
typedef FpDevice FpAutoCloseDevice;
|
typedef FpDevice FpAutoCloseDevice;
|
||||||
@@ -69,8 +65,6 @@ auto_close_fake_device_free (FpAutoCloseDevice *device)
|
|||||||
}
|
}
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpAutoCloseDevice, auto_close_fake_device_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpAutoCloseDevice, auto_close_fake_device_free)
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
typedef FpDeviceClass FpAutoResetClass;
|
typedef FpDeviceClass FpAutoResetClass;
|
||||||
static FpAutoResetClass default_fake_dev_class = {0};
|
static FpAutoResetClass default_fake_dev_class = {0};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user