realtek: add support for rts5816

Signed-off-by: huan_huang <huan_huang@realsil.com.cn>
This commit is contained in:
huan_huang
2024-07-09 14:27:48 +08:00
committed by Marco Trevisan (Treviño)
parent 75adfd37d1
commit a88582761f
9 changed files with 695 additions and 137 deletions

View File

@@ -227,6 +227,7 @@ usb:v298Dp1010*
# Supported by libfprint driver realtek
usb:v0BDAp5813*
usb:v0BDAp5816*
ID_AUTOSUSPEND=1
ID_PERSIST=0

View File

@@ -28,6 +28,7 @@ G_DEFINE_TYPE (FpiDeviceRealtek, fpi_device_realtek, FP_TYPE_DEVICE)
static const FpIdEntry id_table[] = {
{ .vid = 0x0bda, .pid = 0x5813, },
{ .vid = 0x0bda, .pid = 0x5816, },
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
};
@@ -92,6 +93,50 @@ fp_task_ssm_generic_cb (FpiDeviceRealtek *self,
fpi_ssm_next_state (self->task_ssm);
}
static void
fp_get_device_info_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
self->template_len = TEMPLATE_LEN_COMMON;
fpi_ssm_next_state (self->task_ssm);
}
static void
fp_update_template_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES);
}
static void
fp_enroll_commit_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_ENROLL_NUM_STATES);
}
static void
fp_finish_capture_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
@@ -103,8 +148,17 @@ fp_finish_capture_cb (FpiDeviceRealtek *self,
return;
}
gint capture_status = buffer_in[0];
/* We hope this polling CMD can be completed before the action is cancelled */
GCancellable *cancellable = fpi_device_get_cancellable (FP_DEVICE (self));
if (g_cancellable_is_cancelled (cancellable))
{
fpi_ssm_mark_failed (self->task_ssm,
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
"Action is cancelled!"));
return;
}
gint capture_status = buffer_in[0];
if (capture_status == 0)
{
fpi_device_report_finger_status_changes (FP_DEVICE (self),
@@ -238,7 +292,6 @@ fp_identify_feature_cb (FpiDeviceRealtek *self,
}
gint in_status = buffer_in[0];
if (in_status == FP_RTK_CMD_ERR)
{
fpi_ssm_mark_failed (self->task_ssm,
@@ -291,7 +344,7 @@ fp_identify_feature_cb (FpiDeviceRealtek *self,
else
{
fpi_device_identify_report (device, print, match, error);
fpi_ssm_mark_completed (self->task_ssm);
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES);
}
return;
}
@@ -340,9 +393,9 @@ fp_get_delete_pos_cb (FpiDeviceRealtek *self,
for (gint i = 0; i < self->template_num; i++)
{
if (buffer_in[i * TEMPLATE_LEN] != 0)
if (buffer_in[i * self->template_len] != 0)
{
memcpy (temp_userid, buffer_in + i * TEMPLATE_LEN + UID_OFFSET, DEFAULT_UID_LEN);
memcpy (temp_userid, buffer_in + i * self->template_len + UID_OFFSET, DEFAULT_UID_LEN);
if (g_strcmp0 (fp_print_get_description (print), (const char *) temp_userid) == 0)
{
self->pos_index = i;
@@ -380,10 +433,25 @@ fp_get_enroll_num_cb (FpiDeviceRealtek *self,
}
static void
fp_get_template_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
fp_verify_get_template_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
if (error)
{
fpi_ssm_mark_failed (self->task_ssm, error);
return;
}
fpi_ssm_next_state (self->task_ssm);
}
static void
fp_enroll_get_template_cb (FpiDeviceRealtek *self,
uint8_t *buffer_in,
GError *error)
{
g_autofree guchar *seq_list = NULL;
gboolean found = FALSE;
if (error)
@@ -394,7 +462,7 @@ fp_get_template_cb (FpiDeviceRealtek *self,
for (gint i = 0; i < self->template_num; i++)
{
if (buffer_in[i * TEMPLATE_LEN] == 0)
if (buffer_in[i * self->template_len] == 0)
{
self->pos_index = i;
found = TRUE;
@@ -425,7 +493,6 @@ fp_check_duplicate_cb (FpiDeviceRealtek *self,
}
gint in_status = buffer_in[0];
if (in_status == FP_RTK_CMD_ERR)
{
fpi_ssm_mark_failed (self->task_ssm,
@@ -471,10 +538,10 @@ fp_list_cb (FpiDeviceRealtek *self,
for (gint i = 0; i < self->template_num; i++)
{
if (buffer_in[i * TEMPLATE_LEN] != 0)
if (buffer_in[i * self->template_len] != 0)
{
FpPrint *print = NULL;
print = fp_print_from_data (self, buffer_in + i * TEMPLATE_LEN + SUBFACTOR_OFFSET);
print = fp_print_from_data (self, buffer_in + i * self->template_len + SUBFACTOR_OFFSET);
g_ptr_array_add (list_result, g_object_ref_sink (print));
found = TRUE;
}
@@ -518,11 +585,11 @@ parse_status (guint8 *buffer, gint status_type)
{
switch (status_type)
{
case FP_RTK_MSG_PLAINTEXT_NO_STATUS:
case FP_RTK_MSG_NO_STATUS:
return 0;
break;
case FP_RTK_MSG_PLAINTEXT:
case FP_RTK_MSG_DEFAULT:
return buffer[0];
break;
@@ -621,13 +688,13 @@ fp_cmd_run_state (FpiSsm *ssm, FpDevice *dev)
break;
case FP_RTK_CMD_TRANS_DATA:
if (self->cmd_type == FP_RTK_CMD_ONLY)
if (self->cmd_type == FP_RTK_CMD_BULK_ONLY)
{
fpi_ssm_jump_to_state (ssm, FP_RTK_CMD_GET_STATUS);
break;
}
if (self->cmd_type == FP_RTK_CMD_WRITE)
if (self->cmd_type == FP_RTK_CMD_BULK_WRITE)
{
if (self->data_transfer)
{
@@ -688,10 +755,10 @@ fp_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
}
static FpiUsbTransfer *
prepare_transfer (FpDevice *dev,
guint8 *data,
gsize data_len,
GDestroyNotify free_func)
prepare_bulk_transfer (FpDevice *dev,
guint8 *data,
gsize data_len,
GDestroyNotify free_func)
{
g_autoptr(FpiUsbTransfer) transfer = NULL;
@@ -708,29 +775,100 @@ prepare_transfer (FpDevice *dev,
return g_steal_pointer (&transfer);
}
static void
realtek_sensor_cmd (FpiDeviceRealtek *self,
guint8 *cmd,
guint8 *trans_data,
FpRtkMsgType message_type,
gboolean bwait_data_delay,
SynCmdMsgCallback callback)
fp_ctrl_cmd_cb (FpiUsbTransfer *transfer,
FpDevice *device,
gpointer user_data,
GError *error)
{
FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device);
g_autofree CommandData *data = g_steal_pointer (&user_data);
g_return_if_fail (data != NULL);
if (error)
{
fpi_ssm_mark_failed (transfer->ssm, error);
return;
}
if (transfer->direction == G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE)
{
if (data->callback)
data->callback (self, NULL, NULL);
}
else
{
if (transfer->actual_length == 0)
{
fp_info ("Control transfer receive data failed!");
fpi_ssm_mark_failed (transfer->ssm,
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID));
return;
}
if (data->callback)
data->callback (self, transfer->buffer, NULL);
}
}
static void
rtk_send_ctrl_cmd (FpiDeviceRealtek *self,
struct rtk_cmd_ctrl *ctrl_cmd,
guint8 *cmd_data,
SynCmdMsgCallback callback)
{
FpiUsbTransfer *transfer = NULL;
g_autofree CommandData *data = g_new0 (CommandData, 1);
data->callback = callback;
transfer = fpi_usb_transfer_new (FP_DEVICE (self));
fpi_usb_transfer_fill_control (transfer,
ctrl_cmd->direction,
G_USB_DEVICE_REQUEST_TYPE_VENDOR,
G_USB_DEVICE_RECIPIENT_DEVICE,
ctrl_cmd->request,
ctrl_cmd->value,
ctrl_cmd->index,
ctrl_cmd->len);
transfer->ssm = self->task_ssm;
if (ctrl_cmd->direction == G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST &&
cmd_data != NULL && ctrl_cmd->len != 0)
memcpy (transfer->buffer, cmd_data, ctrl_cmd->len);
fpi_usb_transfer_submit (transfer,
CMD_TIMEOUT,
NULL,
fp_ctrl_cmd_cb,
g_steal_pointer (&data));
}
static void
rtk_sensor_bulk_cmd (FpiDeviceRealtek *self,
guint8 *cmd,
guint8 *trans_data,
FpRtkMsgType message_type,
gboolean bwait_data_delay,
SynCmdMsgCallback callback)
{
g_autoptr(FpiUsbTransfer) cmd_transfer = NULL;
g_autoptr(FpiUsbTransfer) data_transfer = NULL;
CommandData *data = g_new0 (CommandData, 1);
self->cmd_type = GET_CMD_TYPE (cmd[0]);
self->cmd_type = GET_BULK_CMD_TYPE (cmd[0]);
self->message_type = message_type;
self->trans_data_len = GET_TRANS_DATA_LEN (cmd[11], cmd[10]);
self->cmd_cancellable = bwait_data_delay;
cmd_transfer = prepare_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_TOTAL_LEN, NULL);
cmd_transfer = prepare_bulk_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_BULK_TOTAL_LEN, NULL);
self->cmd_transfer = g_steal_pointer (&cmd_transfer);
if ((self->cmd_type == FP_RTK_CMD_WRITE) && trans_data)
if ((self->cmd_type == FP_RTK_CMD_BULK_WRITE) && trans_data)
{
data_transfer = prepare_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free);
data_transfer = prepare_bulk_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free);
self->data_transfer = g_steal_pointer (&data_transfer);
}
@@ -829,34 +967,49 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm))
{
case FP_RTK_VERIFY_GET_TEMPLATE:
g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_verify_get_template_cb);
break;
case FP_RTK_VERIFY_CAPTURE:
fpi_device_report_finger_status_changes (device,
FP_FINGER_STATUS_NEEDED,
FP_FINGER_STATUS_NONE);
cmd_buf = (guint8 *) &co_start_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break;
case FP_RTK_VERIFY_FINISH_CAPTURE:
cmd_buf = (guint8 *) &co_finish_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb);
break;
case FP_RTK_VERIFY_ACCEPT_SAMPLE:
co_accept_sample.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_accept_sample;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb);
break;
case FP_RTK_VERIFY_INDENTIFY_FEATURE:
cmd_buf = (guint8 *) &tls_identify_feature;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 0, fp_identify_feature_cb);
cmd_buf = (guint8 *) &nor_identify_feature;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_identify_feature_cb);
break;
case FP_RTK_VERIFY_UPDATE_TEMPLATE:
cmd_buf = (guint8 *) &co_update_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_update_template_cb);
break;
case FP_RTK_VERIFY_CANCEL_CAPTURE:
co_cancel_capture.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_cancel_capture;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break;
}
}
@@ -869,7 +1022,6 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device);
FpPrint *print = NULL;
guint8 *cmd_buf = NULL;
guint8 *trans_id = NULL;
GVariant *uid = NULL;
GVariant *data = NULL;
gsize user_id_len;
@@ -880,17 +1032,17 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
case FP_RTK_ENROLL_GET_TEMPLATE:
g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num);
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_template_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_enroll_get_template_cb);
break;
case FP_RTK_ENROLL_BEGIN_POS:
tls_enroll_begin.param[0] = self->pos_index;
cmd_buf = (guint8 *) &tls_enroll_begin;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
nor_enroll_begin.param[0] = self->pos_index;
cmd_buf = (guint8 *) &nor_enroll_begin;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break;
case FP_RTK_ENROLL_CAPTURE:
@@ -899,32 +1051,37 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
FP_FINGER_STATUS_NONE);
cmd_buf = (guint8 *) &co_start_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break;
case FP_RTK_ENROLL_FINISH_CAPTURE:
cmd_buf = (guint8 *) &co_finish_capture;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb);
break;
case FP_RTK_ENROLL_ACCEPT_SAMPLE:
co_accept_sample.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_accept_sample;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb);
break;
case FP_RTK_ENROLL_CHECK_DUPLICATE:
cmd_buf = (guint8 *) &co_check_duplicate;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_check_duplicate_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_check_duplicate_cb);
break;
case FP_RTK_ENROLL_COMMIT:
guint8 *trans_id = NULL;
gint payload_len;
payload_len = UID_PAYLOAD_LEN_DEFAULT;
fpi_device_get_enroll_data (device, &print);
user_id = fpi_print_generate_user_id (print);
user_id_len = strlen (user_id);
user_id_len = MIN (DEFAULT_UID_LEN, user_id_len);
payload = g_malloc0 (UID_PAYLOAD_LEN);
payload = g_malloc0 (payload_len);
memcpy (payload, user_id, user_id_len);
trans_id = g_steal_pointer (&payload);
@@ -945,10 +1102,18 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
g_debug ("user_id: %s, finger: 0x%x", user_id, finger);
tls_enroll_commit.param[0] = SUB_FINGER_01;
cmd_buf = (guint8 *) &tls_enroll_commit;
realtek_sensor_cmd (self, cmd_buf, trans_id, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
nor_enroll_commit.param[0] = SUB_FINGER_01;
nor_enroll_commit.data_len[0] = GET_LEN_L (payload_len);
nor_enroll_commit.data_len[1] = GET_LEN_H (payload_len);
cmd_buf = (guint8 *) &nor_enroll_commit;
rtk_sensor_bulk_cmd (self, cmd_buf, trans_id, FP_RTK_MSG_DEFAULT, 1, fp_enroll_commit_cb);
break;
case FP_RTK_ENROLL_CANCEL_CAPTURE:
co_cancel_capture.param[0] = self->fp_purpose;
cmd_buf = (guint8 *) &co_cancel_capture;
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
}
}
@@ -960,15 +1125,19 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
switch (fpi_ssm_get_cur_state (ssm))
{
case FP_RTK_INIT_GET_DEVICE_INFO:
rtk_send_ctrl_cmd (self, &get_device_info, NULL, fp_get_device_info_cb);
break;
case FP_RTK_INIT_SELECT_OS:
co_select_system.param[0] = 0x01;
cmd_buf = (guint8 *) &co_select_system;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break;
case FP_RTK_INIT_GET_ENROLL_NUM:
cmd_buf = (guint8 *) &co_get_enroll_num;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_enroll_num_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_enroll_num_cb);
break;
}
}
@@ -984,17 +1153,17 @@ fp_delete_sm_run_state (FpiSsm *ssm, FpDevice *device)
case FP_RTK_DELETE_GET_POS:
g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num);
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_delete_pos_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_delete_pos_cb);
break;
case FP_RTK_DELETE_PRINT:
co_delete_record.param[0] = self->pos_index;
cmd_buf = (guint8 *) &co_delete_record;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
break;
}
}
@@ -1012,17 +1181,14 @@ identify_verify (FpDevice *device)
g_assert (current_action == FPI_DEVICE_ACTION_VERIFY ||
current_action == FPI_DEVICE_ACTION_IDENTIFY);
if (current_action == FPI_DEVICE_ACTION_IDENTIFY)
self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY;
else
self->fp_purpose = FP_RTK_PURPOSE_VERIFY;
self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY;
g_assert (!self->task_ssm);
self->task_ssm = fpi_ssm_new_full (device,
fp_verify_sm_run_state,
FP_RTK_VERIFY_NUM_STATES,
FP_RTK_VERIFY_NUM_STATES,
FP_RTK_VERIFY_CANCEL_CAPTURE,
"Verify & Identify");
fpi_ssm_start (self->task_ssm, fp_verify_ssm_done);
@@ -1042,7 +1208,7 @@ enroll (FpDevice *device)
self->task_ssm = fpi_ssm_new_full (device,
fp_enroll_sm_run_state,
FP_RTK_ENROLL_NUM_STATES,
FP_RTK_ENROLL_NUM_STATES,
FP_RTK_ENROLL_CANCEL_CAPTURE,
"Enroll");
fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done);
@@ -1167,7 +1333,7 @@ clear_storage (FpDevice *device)
G_DEBUG_HERE ();
co_delete_record.param[0] = 0xff;
cmd_buf = (guint8 *) &co_delete_record;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_clear_storage_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_clear_storage_cb);
}
static void
@@ -1179,11 +1345,11 @@ list_print (FpDevice *device)
G_DEBUG_HERE ();
g_assert (self->template_num > 0);
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num);
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
cmd_buf = (guint8 *) &co_get_template;
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_list_cb);
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 1, fp_list_cb);
}
static void

View File

@@ -30,16 +30,17 @@
#define EP_IN_MAX_BUF_SIZE 2048
#define FP_RTK_CMD_TOTAL_LEN 12
#define FP_RTK_CMD_LEN 2
#define FP_RTK_CMD_PARAM_LEN 4
#define FP_RTK_CMD_ADDR_LEN 4
#define FP_RTK_CMD_DATA_LEN 2
#define FP_RTK_CMD_BULK_TOTAL_LEN 12
#define FP_RTK_CMD_BULK_LEN 2
#define FP_RTK_CMD_BULK_PARAM_LEN 4
#define FP_RTK_CMD_BULK_ADDR_LEN 4
#define FP_RTK_CMD_BULK_DATA_LEN 2
#define TEMPLATE_LEN_COMMON 35
#define TEMPLATE_LEN 35
#define SUBFACTOR_OFFSET 2
#define UID_OFFSET 3
#define UID_PAYLOAD_LEN 32
#define UID_PAYLOAD_LEN_DEFAULT 32
/* Command transfer timeout :ms*/
#define CMD_TIMEOUT 1000
@@ -50,7 +51,7 @@
#define DEFAULT_UID_LEN 28
#define SUB_FINGER_01 0xFF
#define GET_CMD_TYPE(val) ((val & 0xC0) >> 6)
#define GET_BULK_CMD_TYPE(val) ((val & 0xC0) >> 6)
#define GET_TRANS_DATA_LEN(len_h, len_l) ((len_h << 8) | len_l)
#define GET_LEN_L(total_data_len) ((total_data_len) & 0xff)
#define GET_LEN_H(total_data_len) ((total_data_len) >> 8)
@@ -67,19 +68,19 @@ typedef struct
} CommandData;
typedef enum {
FP_RTK_CMD_ONLY = 0,
FP_RTK_CMD_READ,
FP_RTK_CMD_WRITE,
FP_RTK_CMD_BULK_ONLY = 0,
FP_RTK_CMD_BULK_READ,
FP_RTK_CMD_BULK_WRITE,
} FpRtkCmdType;
typedef enum {
FP_RTK_MSG_PLAINTEXT = 0,
FP_RTK_MSG_PLAINTEXT_NO_STATUS,
FP_RTK_MSG_DEFAULT = 0,
FP_RTK_MSG_NO_STATUS,
} FpRtkMsgType;
typedef enum {
FP_RTK_PURPOSE_IDENTIFY = 0x01, /* identify before enroll */
FP_RTK_PURPOSE_VERIFY = 0x02,
FP_RTK_PURPOSE_VERIFY = 0x01,
FP_RTK_PURPOSE_IDENTIFY = 0x02,
FP_RTK_PURPOSE_ENROLL = 0x04,
} FpRtkPurpose;
@@ -107,15 +108,18 @@ typedef enum {
FP_RTK_ENROLL_ACCEPT_SAMPLE,
FP_RTK_ENROLL_CHECK_DUPLICATE,
FP_RTK_ENROLL_COMMIT,
FP_RTK_ENROLL_CANCEL_CAPTURE,
FP_RTK_ENROLL_NUM_STATES,
} FpRtkEnrollState;
typedef enum {
FP_RTK_VERIFY_CAPTURE = 0,
FP_RTK_VERIFY_GET_TEMPLATE = 0,
FP_RTK_VERIFY_CAPTURE,
FP_RTK_VERIFY_FINISH_CAPTURE,
FP_RTK_VERIFY_ACCEPT_SAMPLE,
FP_RTK_VERIFY_INDENTIFY_FEATURE,
FP_RTK_VERIFY_UPDATE_TEMPLATE,
FP_RTK_VERIFY_CANCEL_CAPTURE,
FP_RTK_VERIFY_NUM_STATES,
} FpRtkVerifyState;
@@ -126,7 +130,8 @@ typedef enum {
} FpRtkDeleteState;
typedef enum {
FP_RTK_INIT_SELECT_OS = 0,
FP_RTK_INIT_GET_DEVICE_INFO = 0,
FP_RTK_INIT_SELECT_OS,
FP_RTK_INIT_GET_ENROLL_NUM,
FP_RTK_INIT_NUM_STATES,
} FpRtkInitState;
@@ -155,66 +160,87 @@ struct _FpiDeviceRealtek
FpRtkPurpose fp_purpose;
gint pos_index;
gint template_num;
gint template_len;
};
struct realtek_fp_cmd
struct rtk_cmd_bulk
{
uint8_t cmd[FP_RTK_CMD_LEN];
uint8_t param[FP_RTK_CMD_PARAM_LEN];
uint8_t addr[FP_RTK_CMD_ADDR_LEN];
uint8_t data_len[FP_RTK_CMD_DATA_LEN];
uint8_t cmd[FP_RTK_CMD_BULK_LEN];
uint8_t param[FP_RTK_CMD_BULK_PARAM_LEN];
uint8_t addr[FP_RTK_CMD_BULK_ADDR_LEN];
uint8_t data_len[FP_RTK_CMD_BULK_DATA_LEN];
};
static struct realtek_fp_cmd co_start_capture = {
struct rtk_cmd_ctrl
{
int direction;
uint8_t request;
uint16_t value;
uint16_t index;
uint16_t len;
};
static struct rtk_cmd_ctrl get_device_info = {
.direction = G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST,
.request = 0x07,
.value = 0x000D,
.index = 0x0000,
.len = 0x0008,
};
static struct rtk_cmd_bulk co_start_capture = {
.cmd = {0x05, 0x05},
};
static struct realtek_fp_cmd co_finish_capture = {
static struct rtk_cmd_bulk co_finish_capture = {
.cmd = {0x45, 0x06},
.data_len = {0x05},
};
static struct realtek_fp_cmd co_accept_sample = {
static struct rtk_cmd_bulk co_accept_sample = {
.cmd = {0x45, 0x08},
.data_len = {0x09},
};
static struct realtek_fp_cmd tls_identify_feature = {
static struct rtk_cmd_bulk nor_identify_feature = {
.cmd = {0x45, 0x22},
.data_len = {0x2A},
};
static struct realtek_fp_cmd co_get_enroll_num = {
static struct rtk_cmd_bulk co_get_enroll_num = {
.cmd = {0x45, 0x0d},
.data_len = {0x02},
};
static struct realtek_fp_cmd co_get_template = {
static struct rtk_cmd_bulk co_get_template = {
.cmd = {0x45, 0x0E},
};
static struct realtek_fp_cmd tls_enroll_begin = {
static struct rtk_cmd_bulk nor_enroll_begin = {
.cmd = {0x05, 0x20},
};
static struct realtek_fp_cmd co_check_duplicate = {
static struct rtk_cmd_bulk co_check_duplicate = {
.cmd = {0x45, 0x10},
.data_len = {0x22},
};
static struct realtek_fp_cmd tls_enroll_commit = {
static struct rtk_cmd_bulk nor_enroll_commit = {
.cmd = {0x85, 0x21},
.data_len = {0x20},
};
static struct realtek_fp_cmd co_update_template = {
static struct rtk_cmd_bulk co_update_template = {
.cmd = {0x05, 0x11},
};
static struct realtek_fp_cmd co_delete_record = {
static struct rtk_cmd_bulk co_delete_record = {
.cmd = {0x05, 0x0F},
};
static struct realtek_fp_cmd co_select_system = {
static struct rtk_cmd_bulk co_select_system = {
.cmd = {0x05, 0x13},
};
static struct rtk_cmd_bulk co_cancel_capture = {
.cmd = {0x05, 0x07},
};

View File

@@ -56,7 +56,8 @@ drivers_tests = [
'egismoc-0586',
'egismoc-0587',
'fpcmoc',
'realtek',
'realtek',
'realtek-5816',
'focaltech_moc',
]

Binary file not shown.

110
tests/realtek-5816/custom.py Executable file
View File

@@ -0,0 +1,110 @@
#!/usr/bin/python3
import traceback
import sys
import gi
gi.require_version('FPrint', '2.0')
from gi.repository import FPrint, GLib
# Exit with error on any exception, included those happening in async callbacks
sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1))
ctx = GLib.main_context_default()
c = FPrint.Context()
c.enumerate()
devices = c.get_devices()
d = devices[0]
del devices
assert d.get_driver() == "realtek"
assert not d.has_feature(FPrint.DeviceFeature.CAPTURE)
assert d.has_feature(FPrint.DeviceFeature.IDENTIFY)
assert d.has_feature(FPrint.DeviceFeature.VERIFY)
assert not d.has_feature(FPrint.DeviceFeature.DUPLICATES_CHECK)
assert d.has_feature(FPrint.DeviceFeature.STORAGE)
assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST)
assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE)
assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR)
d.open_sync()
# 1. verify clear storage command, 2. make sure later asserts are good
d.clear_storage_sync()
template = FPrint.Print.new(d)
def enroll_progress(*args):
# assert d.get_finger_status() & FPrint.FingerStatusFlags.NEEDED
print('enroll progress: ' + str(args))
def identify_done(dev, res):
global identified
identified = True
try:
identify_match, identify_print = dev.identify_finish(res)
except gi.repository.GLib.GError as e:
print("Please try again")
else:
print('indentification_done: ', identify_match, identify_print)
assert identify_match.equal(identify_print)
def start_identify_async(prints):
global identified
print('async identifying')
d.identify(prints, callback=identify_done)
del prints
while not identified:
ctx.iteration(True)
identified = False
# List, enroll, list, verify, identify, delete
print("enrolling")
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
p = d.enroll_sync(template, None, enroll_progress, None)
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
print("enroll done")
print("listing")
stored = d.list_prints_sync()
print("listing done")
assert len(stored) == 1
assert stored[0].equal(p)
print("verifying")
try:
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
verify_res, verify_print = d.verify_sync(p)
assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE
except gi.repository.GLib.GError as e:
print("Please try again")
else:
print("verify done")
del p
assert verify_res == True
identified = False
deserialized_prints = []
for p in stored:
deserialized_prints.append(FPrint.Print.deserialize(p.serialize()))
assert deserialized_prints[-1].equal(p)
del stored
print('async identifying')
d.identify(deserialized_prints, callback=identify_done)
del deserialized_prints
while not identified:
ctx.iteration(True)
print("deleting")
d.delete_print_sync(p)
print("delete done")
d.close_sync()
del d
del c

250
tests/realtek-5816/device Normal file
View File

@@ -0,0 +1,250 @@
P: /devices/pci0000:00/0000:00:14.0/usb1/1-6
N: bus/usb/001/006=12010102EF020140DA0B165800000301020109022E00010104A0FA0904000004FF02000507050102000200070583034000080705840340000807058202000200
E: DEVNAME=/dev/bus/usb/001/006
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=bda/5816/0
E: TYPE=239/2/1
E: BUSNUM=001
E: DEVNUM=006
E: MAJOR=189
E: MINOR=5
E: SUBSYSTEM=usb
E: ID_VENDOR=Generic
E: ID_VENDOR_ENC=Generic
E: ID_VENDOR_ID=0bda
E: ID_MODEL=Realtek_USB2.0_Finger_Print_Bridge
E: ID_MODEL_ENC=Realtek\x20USB2.0\x20Finger\x20Print\x20Bridge
E: ID_MODEL_ID=5816
E: ID_REVISION=0000
E: ID_SERIAL=Generic_Realtek_USB2.0_Finger_Print_Bridge_201801010001
E: ID_SERIAL_SHORT=201801010001
E: ID_BUS=usb
E: ID_USB_INTERFACES=:ff0200:
E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Corp.
E: ID_PATH=pci-0000:00:14.0-usb-0:6
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_6
A: authorized=1\n
A: avoid_reset_quirk=0\n
A: bConfigurationValue=1\n
A: bDeviceClass=ef\n
A: bDeviceProtocol=01\n
A: bDeviceSubClass=02\n
A: bMaxPacketSize0=64\n
A: bMaxPower=500mA\n
A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n
A: bcdDevice=0000\n
A: bmAttributes=a0\n
A: busnum=1\n
A: configuration=Realtek USB2.0 Finger Print Bridge\n
H: descriptors=12010102EF020140DA0B165800000301020109022E00010104A0FA0904000004FF02000507050102000200070583034000080705840340000807058202000200
A: dev=189:5\n
A: devnum=6\n
A: devpath=6\n
L: driver=../../../../../bus/usb/drivers/usb
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:52
A: idProduct=5816\n
A: idVendor=0bda\n
A: ltm_capable=no\n
A: manufacturer=Generic\n
A: maxchild=0\n
A: physical_location/dock=no\n
A: physical_location/horizontal_position=left\n
A: physical_location/lid=no\n
A: physical_location/panel=top\n
A: physical_location/vertical_position=upper\n
L: port=../1-0:1.0/usb1-port6
A: power/active_duration=37699\n
A: power/async=enabled\n
A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=37699\n
A: power/control=on\n
A: power/level=on\n
A: power/persist=1\n
A: power/runtime_active_kids=0\n
A: power/runtime_active_time=37457\n
A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
A: power/runtime_usage=1\n
A: power/wakeup=disabled\n
A: power/wakeup_abort_count=\n
A: power/wakeup_active=\n
A: power/wakeup_active_count=\n
A: power/wakeup_count=\n
A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms=\n
A: product=Realtek USB2.0 Finger Print Bridge\n
A: quirks=0x0\n
A: removable=removable\n
A: rx_lanes=1\n
A: serial=201801010001\n
A: speed=480\n
A: tx_lanes=1\n
A: urbnum=22\n
A: version= 2.01\n
P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C
E: DEVNAME=/dev/bus/usb/001/001
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=1d6b/2/608
E: TYPE=9/0/1
E: BUSNUM=001
E: DEVNUM=001
E: MAJOR=189
E: MINOR=0
E: SUBSYSTEM=usb
E: ID_VENDOR=Linux_6.8.0-40-generic_xhci-hcd
E: ID_VENDOR_ENC=Linux\x206.8.0-40-generic\x20xhci-hcd
E: ID_VENDOR_ID=1d6b
E: ID_MODEL=xHCI_Host_Controller
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
E: ID_MODEL_ID=0002
E: ID_REVISION=0608
E: ID_SERIAL=Linux_6.8.0-40-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
E: ID_SERIAL_SHORT=0000:00:14.0
E: ID_BUS=usb
E: ID_USB_INTERFACES=:090000:
E: ID_VENDOR_FROM_DATABASE=Linux Foundation
E: ID_AUTOSUSPEND=1
E: ID_MODEL_FROM_DATABASE=2.0 root hub
E: ID_PATH=pci-0000:00:14.0
E: ID_PATH_TAG=pci-0000_00_14_0
E: ID_FOR_SEAT=usb-pci-0000_00_14_0
E: TAGS=:seat:
E: CURRENT_TAGS=:seat:
A: authorized=1\n
A: authorized_default=1\n
A: avoid_reset_quirk=0\n
A: bConfigurationValue=1\n
A: bDeviceClass=09\n
A: bDeviceProtocol=01\n
A: bDeviceSubClass=00\n
A: bMaxPacketSize0=64\n
A: bMaxPower=0mA\n
A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n
A: bcdDevice=0608\n
A: bmAttributes=e0\n
A: busnum=1\n
A: configuration=
H: descriptors=12010002090001406B1D020008060302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0\n
A: devnum=1\n
A: devpath=0\n
L: driver=../../../../bus/usb/drivers/usb
L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c
A: idProduct=0002\n
A: idVendor=1d6b\n
A: interface_authorized_default=1\n
A: ltm_capable=no\n
A: manufacturer=Linux 6.8.0-40-generic xhci-hcd\n
A: maxchild=16\n
A: power/active_duration=1096259\n
A: power/async=enabled\n
A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=1096259\n
A: power/control=auto\n
A: power/level=auto\n
A: power/runtime_active_kids=3\n
A: power/runtime_active_time=1096256\n
A: power/runtime_enabled=enabled\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
A: power/runtime_usage=0\n
A: power/wakeup=disabled\n
A: power/wakeup_abort_count=\n
A: power/wakeup_active=\n
A: power/wakeup_active_count=\n
A: power/wakeup_count=\n
A: power/wakeup_expire_count=\n
A: power/wakeup_last_time_ms=\n
A: power/wakeup_max_time_ms=\n
A: power/wakeup_total_time_ms=\n
A: product=xHCI Host Controller\n
A: quirks=0x0\n
A: removable=unknown\n
A: rx_lanes=1\n
A: serial=0000:00:14.0\n
A: speed=480\n
A: tx_lanes=1\n
A: urbnum=229\n
A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0
E: DRIVER=xhci_hcd
E: PCI_CLASS=C0330
E: PCI_ID=8086:A36D
E: PCI_SUBSYS_ID=1028:085C
E: PCI_SLOT_NAME=0000:00:14.0
E: MODALIAS=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30
E: SUBSYSTEM=pci
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller
A: ari_enabled=0\n
A: broken_parity_status=0\n
A: class=0x0c0330\n
H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000005B17C10300000000316000000000000000000000000000000180C2C10800000000000000000000000590B7001803E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000
A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1\n
A: dbc=disabled\n
A: dbc_bInterfaceProtocol=01\n
A: dbc_bcdDevice=0010\n
A: dbc_idProduct=0010\n
A: dbc_idVendor=1d6b\n
A: device=0xa36d\n
A: dma_mask_bits=64\n
L: driver=../../../bus/pci/drivers/xhci_hcd
A: driver_override=(null)\n
A: enable=1\n
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b
A: index=4\n
L: iommu=../../virtual/iommu/dmar1
L: iommu_group=../../../kernel/iommu_groups/4
A: irq=125\n
A: label=Onboard - Other\n
A: local_cpulist=0-3\n
A: local_cpus=f\n
A: modalias=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30\n
A: msi_bus=1\n
A: msi_irqs/125=msi\n
A: msi_irqs/126=msi\n
A: msi_irqs/127=msi\n
A: msi_irqs/128=msi\n
A: msi_irqs/129=msi\n
A: numa_node=-1\n
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 7 2112 7\nxHCI ring segments 25 25 4096 25\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 12 32 128 1\nbuffer-32 0 0 32 0\n
A: power/async=enabled\n
A: power/control=on\n
A: power/runtime_active_kids=1\n
A: power/runtime_active_time=1096935\n
A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
A: power/runtime_usage=1\n
A: power/wakeup=enabled\n
A: power/wakeup_abort_count=0\n
A: power/wakeup_active=0\n
A: power/wakeup_active_count=0\n
A: power/wakeup_count=0\n
A: power/wakeup_expire_count=0\n
A: power/wakeup_last_time_ms=0\n
A: power/wakeup_max_time_ms=0\n
A: power/wakeup_total_time_ms=0\n
A: power_state=D0\n
A: resource=0x00000000d2300000 0x00000000d230ffff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n
A: revision=0x10\n
A: subsystem_device=0x085c\n
A: subsystem_vendor=0x1028\n
A: vendor=0x8086\n

Binary file not shown.

View File

@@ -1,14 +1,14 @@
P: /devices/pci0000:00/0000:00:14.0/usb1/1-4
N: bus/usb/001/005=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200
E: DEVNAME=/dev/bus/usb/001/005
P: /devices/pci0000:00/0000:00:14.0/usb1/1-8
N: bus/usb/001/025=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200
E: DEVNAME=/dev/bus/usb/001/025
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=bda/5813/2101
E: TYPE=239/2/1
E: BUSNUM=001
E: DEVNUM=005
E: DEVNUM=025
E: MAJOR=189
E: MINOR=4
E: MINOR=24
E: SUBSYSTEM=usb
E: ID_VENDOR=Generic
E: ID_VENDOR_ENC=Generic
@@ -22,8 +22,8 @@ E: ID_SERIAL_SHORT=201801010001
E: ID_BUS=usb
E: ID_USB_INTERFACES=:ff0200:
E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Corp.
E: ID_PATH=pci-0000:00:14.0-usb-0:4
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_4
E: ID_PATH=pci-0000:00:14.0-usb-0:8
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_8
A: authorized=1\n
A: avoid_reset_quirk=0\n
A: bConfigurationValue=1\n
@@ -39,11 +39,11 @@ A: bmAttributes=a0\n
A: busnum=1\n
A: configuration=Realtek USB2.0 Finger Print Bridge\n
H: descriptors=12010102EF020140DA0B135801210301020109022E00010104A0FA0904000004FF02000507050102000200070583031000080705840310000807058202000200
A: dev=189:4\n
A: devnum=5\n
A: devpath=4\n
A: dev=189:24\n
A: devnum=25\n
A: devpath=8\n
L: driver=../../../../../bus/usb/drivers/usb
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:50
L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/device:4c/device:54
A: idProduct=5813\n
A: idVendor=0bda\n
A: ltm_capable=no\n
@@ -54,21 +54,21 @@ A: physical_location/horizontal_position=left\n
A: physical_location/lid=no\n
A: physical_location/panel=top\n
A: physical_location/vertical_position=upper\n
L: port=../1-0:1.0/usb1-port4
A: power/active_duration=91232868\n
L: port=../1-0:1.0/usb1-port8
A: power/active_duration=271844\n
A: power/async=enabled\n
A: power/autosuspend=2\n
A: power/autosuspend_delay_ms=2000\n
A: power/connected_duration=91232868\n
A: power/connected_duration=271844\n
A: power/control=on\n
A: power/level=on\n
A: power/persist=1\n
A: power/runtime_active_kids=0\n
A: power/runtime_active_time=91232594\n
A: power/runtime_active_time=271564\n
A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
A: power/runtime_usage=7\n
A: power/runtime_usage=1\n
A: power/wakeup=disabled\n
A: power/wakeup_abort_count=\n
A: power/wakeup_active=\n
@@ -85,29 +85,29 @@ A: rx_lanes=1\n
A: serial=201801010001\n
A: speed=480\n
A: tx_lanes=1\n
A: urbnum=15076313\n
A: urbnum=297176\n
A: version= 2.01\n
P: /devices/pci0000:00/0000:00:14.0/usb1
N: bus/usb/001/001=12010002090001406B1D020002060302010109021900010100E0000904000001090000000705810304000C
N: bus/usb/001/001=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C
E: DEVNAME=/dev/bus/usb/001/001
E: DEVTYPE=usb_device
E: DRIVER=usb
E: PRODUCT=1d6b/2/602
E: PRODUCT=1d6b/2/605
E: TYPE=9/0/1
E: BUSNUM=001
E: DEVNUM=001
E: MAJOR=189
E: MINOR=0
E: SUBSYSTEM=usb
E: ID_VENDOR=Linux_6.2.0-35-generic_xhci-hcd
E: ID_VENDOR_ENC=Linux\x206.2.0-35-generic\x20xhci-hcd
E: ID_VENDOR=Linux_6.5.0-18-generic_xhci-hcd
E: ID_VENDOR_ENC=Linux\x206.5.0-18-generic\x20xhci-hcd
E: ID_VENDOR_ID=1d6b
E: ID_MODEL=xHCI_Host_Controller
E: ID_MODEL_ENC=xHCI\x20Host\x20Controller
E: ID_MODEL_ID=0002
E: ID_REVISION=0602
E: ID_SERIAL=Linux_6.2.0-35-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
E: ID_REVISION=0605
E: ID_SERIAL=Linux_6.5.0-18-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0
E: ID_SERIAL_SHORT=0000:00:14.0
E: ID_BUS=usb
E: ID_USB_INTERFACES=:090000:
@@ -130,11 +130,11 @@ A: bMaxPacketSize0=64\n
A: bMaxPower=0mA\n
A: bNumConfigurations=1\n
A: bNumInterfaces= 1\n
A: bcdDevice=0602\n
A: bcdDevice=0605\n
A: bmAttributes=e0\n
A: busnum=1\n
A: configuration=
H: descriptors=12010002090001406B1D020002060302010109021900010100E0000904000001090000000705810304000C
H: descriptors=12010002090001406B1D020005060302010109021900010100E0000904000001090000000705810304000C
A: dev=189:0\n
A: devnum=1\n
A: devpath=0\n
@@ -144,17 +144,17 @@ A: idProduct=0002\n
A: idVendor=1d6b\n
A: interface_authorized_default=1\n
A: ltm_capable=no\n
A: manufacturer=Linux 6.2.0-35-generic xhci-hcd\n
A: manufacturer=Linux 6.5.0-18-generic xhci-hcd\n
A: maxchild=16\n
A: power/active_duration=264747968\n
A: power/active_duration=351477916\n
A: power/async=enabled\n
A: power/autosuspend=0\n
A: power/autosuspend_delay_ms=0\n
A: power/connected_duration=264747968\n
A: power/connected_duration=351477916\n
A: power/control=auto\n
A: power/level=auto\n
A: power/runtime_active_kids=3\n
A: power/runtime_active_time=264747968\n
A: power/runtime_active_time=351477912\n
A: power/runtime_enabled=enabled\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n
@@ -175,7 +175,7 @@ A: rx_lanes=1\n
A: serial=0000:00:14.0\n
A: speed=480\n
A: tx_lanes=1\n
A: urbnum=3177\n
A: urbnum=2135\n
A: version= 2.00\n
P: /devices/pci0000:00/0000:00:14.0
@@ -194,10 +194,14 @@ E: ID_MODEL_FROM_DATABASE=Cannon Lake PCH USB 3.1 xHCI Host Controller
A: ari_enabled=0\n
A: broken_parity_status=0\n
A: class=0x0c0330\n
H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000005919041B00000000316000000000000000000000000000000180C2C108000000000000000000000005908700D802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000
H: config=86806DA3060590021030030C00008000040030D200000000000000000000000000000000000000000000000028105C08000000007000000000000000FF010000FD0134808FC6FF8300000000000000007F6DDC0F000000004505531F00000000316000000000000000000000000000000180C2C108000000000000000000000005908700D802E0FE0000000000000000090014F01000400100000000C10A080000080E00001800008F40020000010000030000000C00000000000000C000000000000000000100003000000000000000030000000C0000000000000000000000000000000000000000000000000000000000000000000000B50F120112000000
A: consistent_dma_mask_bits=64\n
A: d3cold_allowed=1\n
A: dbc=disabled\n
A: dbc_bInterfaceProtocol=01\n
A: dbc_bcdDevice=0010\n
A: dbc_idProduct=0010\n
A: dbc_idVendor=1d6b\n
A: device=0xa36d\n
A: dma_mask_bits=64\n
L: driver=../../../bus/pci/drivers/xhci_hcd
@@ -205,19 +209,19 @@ A: driver_override=(null)\n
A: enable=1\n
L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b
A: index=4\n
A: irq=125\n
A: irq=126\n
A: label=Onboard - Other\n
A: local_cpulist=0-3\n
A: local_cpus=f\n
A: modalias=pci:v00008086d0000A36Dsv00001028sd0000085Cbc0Csc03i30\n
A: msi_bus=1\n
A: msi_irqs/125=msi\n
A: msi_irqs/126=msi\n
A: numa_node=-1\n
A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 6 7 2112 7\nxHCI ring segments 24 24 4096 24\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 12 32 128 1\nbuffer-32 0 0 32 0\n
A: power/async=enabled\n
A: power/control=on\n
A: power/runtime_active_kids=1\n
A: power/runtime_active_time=264748677\n
A: power/runtime_active_time=351478612\n
A: power/runtime_enabled=forbidden\n
A: power/runtime_status=active\n
A: power/runtime_suspended_time=0\n