diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb index adeec541..73345574 100644 --- a/data/autosuspend.hwdb +++ b/data/autosuspend.hwdb @@ -227,6 +227,7 @@ usb:v298Dp1010* # Supported by libfprint driver realtek usb:v0BDAp5813* +usb:v0BDAp5816* ID_AUTOSUSPEND=1 ID_PERSIST=0 diff --git a/libfprint/drivers/realtek/realtek.c b/libfprint/drivers/realtek/realtek.c index 45322908..28380901 100644 --- a/libfprint/drivers/realtek/realtek.c +++ b/libfprint/drivers/realtek/realtek.c @@ -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 diff --git a/libfprint/drivers/realtek/realtek.h b/libfprint/drivers/realtek/realtek.h index 803922fe..5658e056 100644 --- a/libfprint/drivers/realtek/realtek.h +++ b/libfprint/drivers/realtek/realtek.h @@ -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}, }; \ No newline at end of file diff --git a/tests/meson.build b/tests/meson.build index 2b9691ee..bfdf9131 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -56,7 +56,8 @@ drivers_tests = [ 'egismoc-0586', 'egismoc-0587', 'fpcmoc', - 'realtek', + 'realtek', + 'realtek-5816', 'focaltech_moc', ] diff --git a/tests/realtek-5816/custom.pcapng b/tests/realtek-5816/custom.pcapng new file mode 100644 index 00000000..579bac6b Binary files /dev/null and b/tests/realtek-5816/custom.pcapng differ diff --git a/tests/realtek-5816/custom.py b/tests/realtek-5816/custom.py new file mode 100755 index 00000000..15a71e2c --- /dev/null +++ b/tests/realtek-5816/custom.py @@ -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 diff --git a/tests/realtek-5816/device b/tests/realtek-5816/device new file mode 100644 index 00000000..55f6f985 --- /dev/null +++ b/tests/realtek-5816/device @@ -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 + diff --git a/tests/realtek/custom.pcapng b/tests/realtek/custom.pcapng index 0fe6dc7b..84b15993 100644 Binary files a/tests/realtek/custom.pcapng and b/tests/realtek/custom.pcapng differ diff --git a/tests/realtek/device b/tests/realtek/device index c4f1c85e..500f62d6 100644 --- a/tests/realtek/device +++ b/tests/realtek/device @@ -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