diff options
author | Ondrej Čerman <ondrej.cerman@gmail.com> | 2019-08-04 21:11:26 +0200 |
---|---|---|
committer | Ondrej Čerman <ondrej.cerman@gmail.com> | 2019-08-04 21:11:26 +0200 |
commit | 7efea8df3316180be625309d52ce34475d924071 (patch) | |
tree | 69006c1bf51e303944e0fb412f7fc709cbc21f2d | |
parent | 36f4722f05c8a2e089d42f41904b9d984f802182 (diff) |
usb: added more properties
-rw-r--r-- | hardinfo/usb_util.c | 34 | ||||
-rw-r--r-- | includes/usb_util.h | 3 | ||||
-rw-r--r-- | modules/devices/usb.c | 31 |
3 files changed, 47 insertions, 21 deletions
diff --git a/hardinfo/usb_util.c b/hardinfo/usb_util.c index e4b0b2fd..792750a6 100644 --- a/hardinfo/usb_util.c +++ b/hardinfo/usb_util.c @@ -64,8 +64,10 @@ void usbd_free(usbd *s) { g_free(s->device); g_free(s->usb_version); g_free(s->device_version); + g_free(s->serial); g_free(s->dev_class_str); g_free(s->dev_subclass_str); + g_free(s->dev_protocol_str); g_free(s); } } @@ -206,6 +208,19 @@ static gboolean usb_get_device_lsusb(int bus, int dev, usbd *s) { s->dev_subclass = atoi(l); if (t = strchr(l, ' ')) s->dev_subclass_str = g_strdup(t + 1); + } else if (l = lsusb_line_value(p, "bDeviceProtocol")) { + s->dev_protocol = atoi(l); + if (t = strchr(l, ' ')) + s->dev_protocol_str = g_strdup(t + 1); + } else if (l = lsusb_line_value(p, "iManufacturer")) { + if (t = strchr(l, ' ')) + s->manufacturer = g_strdup(t + 1); + } else if (l = lsusb_line_value(p, "iProduct")) { + if (t = strchr(l, ' ')) + s->device = g_strdup(t + 1); + } else if (l = lsusb_line_value(p, "iSerial")) { + if (t = strchr(l, ' ')) + s->serial = g_strdup(t + 1); // interface info } else if (l = lsusb_line_value(p, "bInterfaceNumber")) { @@ -353,13 +368,17 @@ static gboolean usb_get_device_sysfs(int bus, int dev, const char* sysfspath, us g_free(qpath); } - if (s->dev_class_str == NULL && s->dev_subclass_str == NULL) { - qpath = g_strdup_printf("C %02x/%02x", s->dev_class, s->dev_subclass); + if (s->dev_class_str == NULL && s->dev_subclass_str == NULL + && s->dev_protocol_str == NULL) { + qpath = g_strdup_printf("C %02x/%02x/%02x", s->dev_class, + s->dev_subclass, s->dev_protocol); scan_ids_file(usb_ids_file, qpath, &result, -1); if (result.results[0]) s->dev_class_str = g_strdup(result.results[0]); if (result.results[1]) s->dev_subclass_str = g_strdup(result.results[1]); + if (result.results[2]) + s->dev_protocol_str = g_strdup(result.results[2]); g_free(qpath); } @@ -368,6 +387,16 @@ static gboolean usb_get_device_sysfs(int bus, int dev, const char* sysfspath, us if (s->usb_version == NULL) s->usb_version = h_sysfs_read_string(sysfspath, "version"); + if (s->serial == NULL) + s->serial = h_sysfs_read_string(sysfspath, "serial"); + + if (s->device_version == NULL) { + ver = h_sysfs_read_int(sysfspath, "bcdDevice"); + if (ver > 0){ + s->device_version = g_strdup_printf("%d.%02d", ver/100, ver%100); + } + } + if (s->if_list == NULL){ // create interfaces list if_count = h_sysfs_read_int(sysfspath, "bNumInterfaces"); for (i = 0; i <= if_count; i++){ @@ -402,7 +431,6 @@ usbd *usb_get_device(int bus, int dev, const gchar* sysfspath) { ok = usb_get_device_lsusb(bus, dev, s); /* try sysfs */ ok |= usb_get_device_sysfs(bus, dev, sysfspath, s); - if (!ok) { usbd_free(s); s = NULL; diff --git a/includes/usb_util.h b/includes/usb_util.h index 1b92a34c..045f07e4 100644 --- a/includes/usb_util.h +++ b/includes/usb_util.h @@ -27,11 +27,14 @@ typedef struct usbd { char *product; char *manufacturer; char *device; + char *serial; int dev_class; int dev_subclass; + int dev_protocol; char *dev_class_str; char *dev_subclass_str; + char *dev_protocol_str; char *usb_version; char *device_version; /* bcdDevice */ diff --git a/modules/devices/usb.c b/modules/devices/usb.c index f01bee5a..d8909efc 100644 --- a/modules/devices/usb.c +++ b/modules/devices/usb.c @@ -25,7 +25,7 @@ gchar *usb_list = NULL; gchar *usb_icons = NULL; -#define UNKIFNULL_AC(f) (f != NULL) ? f : _("(Unknown)"); +#define UNKIFNULL_AC(f) (f != NULL) ? f : _("(Unknown)") #define IARR_END -2 #define IARR_ANY -1 @@ -99,9 +99,7 @@ static const char* get_usbdev_icon(const usbd *u) { static void _usb_dev(const usbd *u) { gchar *name, *key, *v_str, *label, *str, *speed; - gchar *product, *vendor, *dev_class_str, *dev_subclass_str; /* don't free */ - gchar *manufacturer, *device, *if_driver, *if_class_str; /* don't free */ - gchar *if_subclass_str, *if_protocol_str; /* don't free */ + gchar *product, *vendor, *manufacturer, *device; /* don't free */ gchar *interfaces = strdup(""); usbi *i; const char* icon; @@ -110,8 +108,6 @@ static void _usb_dev(const usbd *u) { product = UNKIFNULL_AC(u->product); manufacturer = UNKIFNULL_AC(u->manufacturer); device = UNKIFNULL_AC(u->device); - dev_class_str = UNKIFNULL_AC(u->dev_class_str); - dev_subclass_str = UNKIFNULL_AC(u->dev_subclass_str); name = g_strdup_printf("%s %s", u->vendor? vendor: manufacturer, u->product? product: device); key = g_strdup_printf("USB%03d:%03d:%03d", u->bus, u->dev, 0); @@ -126,11 +122,6 @@ static void _usb_dev(const usbd *u) { if (u->if_list != NULL) { i = u->if_list; while (i != NULL){ - if_class_str = UNKIFNULL_AC(i->if_class_str); - if_subclass_str = UNKIFNULL_AC(i->if_subclass_str); - if_protocol_str = UNKIFNULL_AC(i->if_protocol_str); - if_driver = UNKIFNULL_AC(i->driver); - interfaces = h_strdup_cprintf("[%s %d %s]\n" /* Class */ "%s=[%d] %s\n" /* Sub-class */ "%s=[%d] %s\n" @@ -138,10 +129,10 @@ static void _usb_dev(const usbd *u) { /* Driver */ "%s=%s\n", interfaces, _("Interface"), i->if_number, i->if_label? i->if_label: "", - _("Class"), i->if_class, if_class_str, - _("Sub-class"), i->if_subclass, if_subclass_str, - _("Protocol"), i->if_protocol, if_protocol_str, - _("Driver"), if_driver + _("Class"), i->if_class, UNKIFNULL_AC(i->if_class_str), + _("Sub-class"), i->if_subclass, UNKIFNULL_AC(i->if_subclass_str), + _("Protocol"), i->if_protocol, UNKIFNULL_AC(i->if_protocol_str), + _("Driver"), UNKIFNULL_AC(i->driver) ); i = i->next; } @@ -164,7 +155,9 @@ static void _usb_dev(const usbd *u) { /* Speed */ "%s=%s\n" /* Class */ "%s=[%d] %s\n" /* Sub-class */ "%s=[%d] %s\n" + /* Protocol */ "%s=[%d] %s\n" /* Dev Version */ "%s=%s\n" + /* Serial */ "%s=%s\n" "[%s]\n" /* Bus */ "%s=%03d\n" /* Device */ "%s=%03d\n" @@ -177,9 +170,11 @@ static void _usb_dev(const usbd *u) { _("Max Current"), u->max_curr_ma, _("mA"), _("USB Version"), u->usb_version, _("Speed"), speed, - _("Class"), u->dev_class, dev_class_str, - _("Sub-class"), u->dev_subclass, dev_subclass_str, - _("Device Version"), u->device_version, + _("Class"), u->dev_class, UNKIFNULL_AC(u->dev_class_str), + _("Sub-class"), u->dev_subclass, UNKIFNULL_AC(u->dev_subclass_str), + _("Protocol"), u->dev_protocol, UNKIFNULL_AC(u->dev_protocol_str), + _("Device Version"), UNKIFNULL_AC(u->device_version), + _("Serial Number"), UNKIFNULL_AC(u->serial), _("Connection"), _("Bus"), u->bus, _("Device"), u->dev, |