aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Čerman <ondrej.cerman@gmail.com>2019-08-04 21:11:26 +0200
committerOndrej Čerman <ondrej.cerman@gmail.com>2019-08-04 21:11:26 +0200
commit7efea8df3316180be625309d52ce34475d924071 (patch)
tree69006c1bf51e303944e0fb412f7fc709cbc21f2d
parent36f4722f05c8a2e089d42f41904b9d984f802182 (diff)
usb: added more properties
-rw-r--r--hardinfo/usb_util.c34
-rw-r--r--includes/usb_util.h3
-rw-r--r--modules/devices/usb.c31
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,