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, | 
