diff --git a/libfprint/fprint-list-supported-devices.c b/libfprint/fprint-list-supported-devices.c index be6dc28..132a72f 100644 --- a/libfprint/fprint-list-supported-devices.c +++ b/libfprint/fprint-list-supported-devices.c @@ -28,8 +28,8 @@ GHashTable *printed = NULL; -static GList * -insert_drivers (GList *list) +static void +insert_drivers (GList **usb_list, GList **spi_list) { g_autoptr(GArray) drivers = fpi_get_driver_types (); gint i; @@ -41,34 +41,70 @@ insert_drivers (GList *list) g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver); const FpIdEntry *entry; - if (cls->type != FP_DEVICE_TYPE_USB) - continue; - - for (entry = cls->id_table; entry->vid; entry++) + switch (cls->type) { - char *key; + case FP_DEVICE_TYPE_USB: - key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); - - if (g_hash_table_lookup (printed, key) != NULL) + for (entry = cls->id_table; entry->vid; entry++) { - g_free (key); - continue; + char *key; + + key = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid); + + if (g_hash_table_lookup (printed, key) != NULL) + { + g_free (key); + continue; + } + + g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + + *usb_list = g_list_prepend (*usb_list, + g_strdup_printf ("%s | %s\n", key, cls->full_name)); } + break; - g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + case FP_DEVICE_TYPE_UDEV: + for (entry = cls->id_table; entry->udev_types; entry++) + { + char *key; - list = g_list_prepend (list, g_strdup_printf ("%s | %s\n", key, cls->full_name)); + /* Need SPI device */ + if ((entry->udev_types & FPI_DEVICE_UDEV_SUBTYPE_SPIDEV) == 0) + continue; + + key = g_strdup_printf ("SPI:%s:%04x:%04x", entry->spi_acpi_id, entry->hid_id.vid, entry->hid_id.pid); + + if (g_hash_table_lookup (printed, key) != NULL) + { + g_free (key); + continue; + } + + g_hash_table_insert (printed, key, GINT_TO_POINTER (1)); + + if (entry->udev_types & FPI_DEVICE_UDEV_SUBTYPE_HIDRAW) + *spi_list = g_list_prepend (*spi_list, + g_strdup_printf ("%s | %04x:%04x | %s\n", entry->spi_acpi_id, entry->hid_id.vid, entry->hid_id.pid, cls->full_name)); + else + *spi_list = g_list_prepend (*spi_list, + g_strdup_printf ("%s | - | %s\n", entry->spi_acpi_id, cls->full_name)); + } + break; + + case FP_DEVICE_TYPE_VIRTUAL: + default: + break; } } - - return list; } int main (int argc, char **argv) { - GList *list, *l; + GList *usb_list = NULL; + GList *spi_list = NULL; + GList *l; setlocale (LC_ALL, ""); @@ -83,19 +119,36 @@ main (int argc, char **argv) g_print ("\n"); g_print ("This is a list of supported devices in libfprint's development version. Those drivers might not all be available in the stable, released version. If in doubt, contact your distribution or systems integrator for details.\n"); g_print ("\n"); + + insert_drivers (&usb_list, &spi_list); + g_print ("## USB devices\n"); g_print ("\n"); g_print ("USB ID | Driver\n"); g_print ("------------ | ------------\n"); - list = NULL; - list = insert_drivers (list); - - list = g_list_sort (list, (GCompareFunc) g_strcmp0); - for (l = list; l != NULL; l = l->next) + usb_list = g_list_sort (usb_list, (GCompareFunc) g_strcmp0); + for (l = usb_list; l != NULL; l = l->next) g_print ("%s", (char *) l->data); + g_print ("\n"); + + g_list_free_full (usb_list, g_free); + + g_print ("## SPI devices\n"); + g_print ("\n"); + g_print ("The ACPI ID represents the SPI interface. Some sensors are also connected to a HID device (Human Input Device) for side-channel requests such as resets.\n"); + g_print ("\n"); + g_print ("ACPI ID | HID ID | Driver\n"); + g_print ("------------ | ------------ | ------------\n"); + + spi_list = g_list_sort (spi_list, (GCompareFunc) g_strcmp0); + for (l = spi_list; l != NULL; l = l->next) + g_print ("%s", (char *) l->data); + g_print ("\n"); + + g_list_free_full (usb_list, g_free); + - g_list_free_full (list, g_free); g_hash_table_destroy (printed); return 0;