Module Name:    src
Committed By:   mlelstv
Date:           Sun Jun 26 07:10:24 UTC 2016

Modified Files:
        src/usr.sbin/usbdevs: usbdevs.8 usbdevs.c

Log Message:
Print release also in hex.
Print device class information if -v is used twice.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/usr.sbin/usbdevs/usbdevs.8
cvs rdiff -u -r1.31 -r1.32 src/usr.sbin/usbdevs/usbdevs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/usbdevs/usbdevs.8
diff -u src/usr.sbin/usbdevs/usbdevs.8:1.9 src/usr.sbin/usbdevs/usbdevs.8:1.10
--- src/usr.sbin/usbdevs/usbdevs.8:1.9	Mon Aug 15 14:31:24 2011
+++ src/usr.sbin/usbdevs/usbdevs.8	Sun Jun 26 07:10:24 2016
@@ -1,4 +1,4 @@
-.\" $NetBSD: usbdevs.8,v 1.9 2011/08/15 14:31:24 wiz Exp $
+.\" $NetBSD: usbdevs.8,v 1.10 2016/06/26 07:10:24 mlelstv Exp $
 .\"
 .\" Copyright (c) 1999 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -53,7 +53,7 @@ Show the device drivers associated with 
 .It Fl f Ar dev
 Only print information for the given USB controller.
 .It Fl v
-Be verbose.
+Be verbose, more information is given if used twice.
 .El
 .Sh FILES
 .Bl -tag -width Pa

Index: src/usr.sbin/usbdevs/usbdevs.c
diff -u src/usr.sbin/usbdevs/usbdevs.c:1.31 src/usr.sbin/usbdevs/usbdevs.c:1.32
--- src/usr.sbin/usbdevs/usbdevs.c:1.31	Tue Aug 12 13:40:07 2014
+++ src/usr.sbin/usbdevs/usbdevs.c	Sun Jun 26 07:10:24 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbdevs.c,v 1.31 2014/08/12 13:40:07 skrll Exp $	*/
+/*	$NetBSD: usbdevs.c,v 1.32 2016/06/26 07:10:24 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -47,7 +47,13 @@
 static int verbose = 0;
 static int showdevs = 0;
 
+struct stringtable {
+	int row, col;
+	const char *string;
+};
+
 __dead static void usage(void);
+static void getstrings(const struct stringtable *, int, int, const char **, const char **);
 static void usbdev(int f, int a, int rec);
 static void usbdump(int f);
 static void dumpone(char *name, int f, int addr);
@@ -92,6 +98,104 @@ u2t(const char *utf8str, char *termstr)
 	strcpy(termstr, "(invalid)");
 }
 
+struct stringtable class_strings[] = {
+	{ UICLASS_UNSPEC,      -1, "Unspecified" },
+
+	{ UICLASS_AUDIO,       -1, "Audio" },
+	{ UICLASS_AUDIO,       UISUBCLASS_AUDIOCONTROL, "Audio Control" },
+	{ UICLASS_AUDIO,       UISUBCLASS_AUDIOSTREAM, "Audio Streaming" },
+	{ UICLASS_AUDIO,       UISUBCLASS_MIDISTREAM, "MIDI Streaming" },
+
+	{ UICLASS_CDC,         -1, "Communications and CDC Control" },
+	{ UICLASS_CDC,         UISUBCLASS_DIRECT_LINE_CONTROL_MODEL, "Direct Line" },
+	{ UICLASS_CDC,         UISUBCLASS_ABSTRACT_CONTROL_MODEL, "Abstract" },
+	{ UICLASS_CDC,         UISUBCLASS_TELEPHONE_CONTROL_MODEL, "Telephone" },
+	{ UICLASS_CDC,         UISUBCLASS_MULTICHANNEL_CONTROL_MODEL, "Multichannel" },
+	{ UICLASS_CDC,         UISUBCLASS_CAPI_CONTROLMODEL, "CAPI" },
+	{ UICLASS_CDC,         UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL, "Ethernet Networking" },
+	{ UICLASS_CDC,         UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL, "ATM Networking" },
+
+	{ UICLASS_HID,         -1, "Human Interface Device" },
+	{ UICLASS_HID,         UISUBCLASS_BOOT, "Boot" },
+
+	{ UICLASS_PHYSICAL,    -1, "Physical" },
+
+	{ UICLASS_IMAGE,       -1, "Image" },
+
+	{ UICLASS_PRINTER,     -1, "Printer" },
+	{ UICLASS_PRINTER,     UISUBCLASS_PRINTER, "Printer" },
+
+	{ UICLASS_MASS,        -1, "Mass Storage" },
+	{ UICLASS_MASS,        UISUBCLASS_RBC, "RBC" },
+	{ UICLASS_MASS,        UISUBCLASS_SFF8020I, "SFF8020I" },
+	{ UICLASS_MASS,        UISUBCLASS_QIC157, "QIC157" },
+	{ UICLASS_MASS,        UISUBCLASS_UFI, "UFI" },
+	{ UICLASS_MASS,        UISUBCLASS_SFF8070I, "SFF8070I" },
+	{ UICLASS_MASS,        UISUBCLASS_SCSI, "SCSI" },
+	{ UICLASS_MASS,        UISUBCLASS_SCSI, "SCSI" },
+
+	{ UICLASS_HUB,         -1, "Hub" },
+	{ UICLASS_HUB,         UISUBCLASS_HUB, "Hub" },
+
+	{ UICLASS_CDC_DATA,    -1, "CDC-Data" },
+	{ UICLASS_CDC_DATA,    UISUBCLASS_DATA, "Data" },
+
+	{ UICLASS_SMARTCARD,   -1, "Smart Card" },
+
+	{ UICLASS_SECURITY,    -1, "Content Security" },
+
+	{ UICLASS_VIDEO,       -1, "Video" },
+	{ UICLASS_VIDEO,       UISUBCLASS_VIDEOCONTROL, "Video Control" },
+	{ UICLASS_VIDEO,       UISUBCLASS_VIDEOSTREAMING, "Video Streaming" },
+	{ UICLASS_VIDEO,       UISUBCLASS_VIDEOCOLLECTION, "Video Collection" },
+
+#ifdef notyet
+	{ UICLASS_HEALTHCARE,  -1, "Personal Healthcare" },
+	{ UICLASS_AVDEVICE,    -1, "Audio/Video Device" },
+	{ UICLASS_BILLBOARD,   -1, "Billboard" },
+#endif
+
+	{ UICLASS_DIAGNOSTIC,  -1, "Diagnostic" },
+	{ UICLASS_WIRELESS,    -1, "Wireless" },
+	{ UICLASS_WIRELESS,    UISUBCLASS_RF, "Radio Frequency" },
+
+#ifdef notyet
+	{ UICLASS_MISC,        -1, "Miscellaneous" },
+#endif
+
+	{ UICLASS_APPL_SPEC,   -1, "Application Specific" },
+	{ UICLASS_APPL_SPEC,   UISUBCLASS_FIRMWARE_DOWNLOAD, "Firmware Download" },
+	{ UICLASS_APPL_SPEC,   UISUBCLASS_IRDA,              "Irda" },
+
+	{ UICLASS_VENDOR,      -1, "Vendor Specific" },
+
+	{ -1, -1, NULL }
+};
+
+static void
+getstrings(const struct stringtable *table,
+           int row, int col, const char **rp, const char **cp) {
+	static char rbuf[5], cbuf[5];
+
+	snprintf(rbuf, sizeof(rbuf), "0x%02x", row);
+	snprintf(cbuf, sizeof(cbuf), "0x%02x", col);
+
+	*rp = rbuf;
+	*cp = cbuf;
+
+	while (table->string != NULL) {
+		if (table->row == row) {
+			if (table->col == -1)
+				*rp = table->string;
+			else if (table->col == col)
+				*cp = table->string;
+		} else if (table->row > row)
+			break;
+
+		++table;
+	}
+}
+
 static void
 usbdev(int f, int a, int rec)
 {
@@ -128,14 +232,22 @@ usbdev(int f, int a, int rec)
 	u2t(di.udi_vendor, vendor);
 	u2t(di.udi_serial, serial);
 	if (verbose) {
-		printf("%s(0x%04x), %s(0x%04x), rev %s",
+		printf("%s(0x%04x), %s(0x%04x), rev %s(0x%04x)",
 		       product, di.udi_productNo,
-		       vendor, di.udi_vendorNo, di.udi_release);
+		       vendor, di.udi_vendorNo,
+			di.udi_release, di.udi_releaseNo);
 		if (di.udi_serial[0])
 			printf(", serial %s", serial);
 	} else
 		printf("%s, %s", product, vendor);
 	printf("\n");
+	if (verbose > 1 && di.udi_class != UICLASS_UNSPEC) {
+		const char *cstr, *sstr;
+		getstrings(class_strings, di.udi_class, di.udi_subclass, &cstr, &sstr);
+		printf("%*s  %s(0x%02x), %s(0x%02x), proto %u\n", indent, "",
+			cstr, di.udi_class, sstr, di.udi_subclass,
+			di.udi_protocol);
+	}
 	if (showdevs) {
 		for (i = 0; i < USB_MAX_DEVNAMES; i++)
 			if (di.udi_devnames[i][0])
@@ -215,7 +327,7 @@ main(int argc, char **argv)
 			dev = optarg;
 			break;
 		case 'v':
-			verbose = 1;
+			verbose++;
 			break;
 		case '?':
 		default:

Reply via email to