Hello!

This is a (bugfixed) variant of a patch I sent here in 2002. Apparently
only parts of it got applied back then. This is against 0.71.

This patch adds prettyprinting of Unit and Unit Exponent Global Items to 
lsusb.c, because they're really annoying to calculate manually. It
should work for all cases.

A diff beween old and new (patched) lsusb output contains lots of

             Item(Global): Unit, data= [ 0x03 0x10 ] 4099
+                            System: English Linear, Unit: Seconds
             Item(Global): Unit Exponent, data= [ 0xfd ] 253
+                            Unit Exponent: -3

and

             Item(Global): Unit, data= [ 0x14 0x00 ] 20
+                            System: English Rotation, Unit: Degrees

Also (And this bit I'm not sure about) I added a few missing Collection
parts. They didn't make any difference on my devices, but it seems right
that they should be there. 

(Oh, and a misindent and missing "break" that doesn't hurt now, but
  it's the kind of thing that can cause a bug when the next case is added.)

/August.

----------------------------8<-------------------------

--- lsusb.c-orig        2006-02-08 01:54:25.000000000 +0100
+++ lsusb.c     2006-02-12 02:03:24.000000000 +0100
@@ -499,6 +499,57 @@
        }
 }
 
+static void dump_unit(unsigned int data, unsigned int len)
+{
+       char *systems[5] = { "None", "SI Linear", "SI Rotation", "English 
Linear", "English Rotation" };
+
+       char *units[5][8] = {
+               { "None", "None", "None", "None", "None", "None", "None", 
"None" },
+               { "None", "Centimeter", "Gram", "Seconds", "Kelvin",     
"Ampere", "Candela", "None" },
+               { "None", "Radians",    "Gram", "Seconds", "Kelvin",     
"Ampere", "Candela", "None" },
+               { "None", "Inch",       "Slug", "Seconds", "Fahrenheit", 
"Ampere", "Candela", "None" },
+               { "None", "Degrees",    "Slug", "Seconds", "Fahrenheit", 
"Ampere", "Candela", "None" },
+       };
+
+       unsigned int i;
+       unsigned int sys;
+        int earlier_unit = 0;
+
+       /* First nibble tells us which system we're in. */
+       sys = data & 0xf;
+       data >>= 4;
+
+       if(sys > 4) {
+               if(sys == 0xf)
+                       printf("System: Vendor defined, Unit: (unknown)\n");
+               else
+                       printf("System: Reserved, Unit: (unknown)\n");
+               return;
+       } else {
+               printf("System: %s, Unit: ", systems[sys]);
+       }
+       for (i=1 ; i<len*2 ; i++) {
+               char nibble = data & 0xf;
+               data >>= 4;
+               if (nibble != 0) {
+                       if(earlier_unit++ > 0)
+                               printf("*");
+                       printf("%s", units[sys][i]);
+                       if(nibble != 1) {
+                               /* This is a _signed_ nibble(!) */
+
+                               int val = nibble & 0x7;
+                               if(nibble & 0x08)
+                                       val = -((0x7 & ~val) +1);
+                               printf("^%d", val);
+                       }
+               }
+       }
+       if(earlier_unit == 0)
+               printf("(None)");
+       printf("\n");
+}
+
 /* ---------------------------------------------------------------------- */
 
 /*
@@ -1374,6 +1425,15 @@
                        printf("%s%s\n", indent, names_hutus((hut << 16) + 
data));
                        break;
                         
+                case 0x54 : /* Unit Exponent */
+                        printf("%sUnit Exponent: %i\n", indent, (signed 
char)data);
+                        break;
+
+                case 0x64 : /* Unit */
+                        printf("%s", indent);
+                        dump_unit(data, bsize);
+                        break;
+
                case 0xa0 : /* Collection */
                        printf("%s", indent);
                        switch (data) {
@@ -1388,7 +1448,23 @@
                        case 0x02:
                                 printf("Logical\n");
                                 break;
-                                
+
+                        case 0x03:
+                                printf("Report\n");
+                                break;
+
+                        case 0x04:
+                                printf("Named Array\n");
+                                break;
+
+                        case 0x05:
+                                printf("Usage Switch\n");
+                                break;
+
+                        case 0x06:
+                                printf("Usage Modifier\n");
+                                break;
+
                        default:
                                if(data & 0x80)
                                        printf("Vendor defined\n");
@@ -1411,7 +1487,8 @@
                               data & 0x40 ? "Null_State": "No_Null_Position",
                               data & 0x80 ? "Volatile": "Non_Volatile",
                               data &0x100 ? "Buffered Bytes": "Bitfield"
-                               );
+                       );
+                       break;
                }
                i += 1 + bsize;
        }


-- 
Björn Augustsson      Sysadmin     IT Systems & Services
Chalmers tekniska högskola     Chalmers University of Technology
         "Damn spooky analog crap." -- John Carmack.


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid3432&bid#0486&dat1642
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to