BCD is nybble-oriented, not byte oriented.  Look at the example you quoted:
2.10 is 0x0210, not 0x020a (as your suggestion would have it).

Matt

On Mon, Dec 09, 2002 at 05:26:55AM +0000, Rui Saraiva wrote:
> Hello,
> 
> I don't know if this is a bug, but it seems so...
> 
> The two fields "bcdUSB" and "bcdDevice" in the struct
> "usb_device_descriptor" are, as the name indicates, BCD - Binary-Coded
> Decimal. According to the "Universal Serial Bus Specification - Revision
> 1.1" pages 197 and 198:
> 
> 
>               Table 9-7. Standard Device Descriptor
> 
> Offset        Field           Size    Value   Description
> -------------------------------------------------------------------------
> 2     bcdUSB          2       BCD     USB Specification Release Number
>                                       in Binary-Coded Decimal (i.e.,
>                                       2.10 is 210H). This field
>                                       identifies the release of the USB
>                                       Specification with which the
>                                       device  and its descriptors are
>                                       compliant.
> 
> 12    bcdDevice       2       BCD     Device release number in
>                                       binary-coded decimal
> 
> Also, both values are in 0xJJMN format, where JJ is the major version
> number, M is the minor version number and N the sub minor version number.
> 
> The problem is when any of those versions are greater then 9, and
> /proc/bus/usb/devices shows them as hexadecimal values, as in:
> 
> P:  Vendor=04cb ProdID=0108 Rev=10.00
> 
> Where bcdDevice is 0x1000 and I think the correct representation would be
> 16.00, in other words, print the values in decimal.
> 
> bcdUSB also have the same problem, but because there are only 3 possible
> values (0x0200, 0x0110 and 0x0100) and all versions bellow 9, it is hidden.
> 
> 
> Rui Saraiva
> 
> 
> Possible patch follows (Apply to 2.5.50):
> --------------------------------------------------------------------------------
> diff -Nru linux-2.5.50/drivers/usb/core/devices.c 
>linux-current/drivers/usb/core/devices.c
> --- linux-2.5.50/drivers/usb/core/devices.c   2002-11-27 22:36:22.000000000 +0000
> +++ linux-current/drivers/usb/core/devices.c  2002-12-09 03:02:35.000000000 +0000
> @@ -89,12 +89,12 @@
>    "B:  Alloc=%3d/%3d us (%2d%%), #Int=%3d, #Iso=%3d\n";
> 
>  static char *format_device1 =
> -/* D:  Ver=xx.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd */
> -  "D:  Ver=%2x.%02x Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n";
> +/* D:  Ver=dd.dd Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd */
> +  "D:  Ver=%2d.%d%d Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n";
> 
>  static char *format_device2 =
> -/* P:  Vendor=xxxx ProdID=xxxx Rev=xx.xx */
> -  "P:  Vendor=%04x ProdID=%04x Rev=%2x.%02x\n";
> +/* P:  Vendor=xxxx ProdID=xxxx Rev=dd.dd */
> +  "P:  Vendor=%04x ProdID=%04x Rev=%2d.%d%d\n";
> 
>  static char *format_config =
>  /* C:  #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA */
> @@ -330,7 +330,8 @@
>       if (start > end)
>               return start;
>       start += sprintf (start, format_device1,
> -                       desc->bcdUSB >> 8, desc->bcdUSB & 0xff,
> +                       USB_MAJOR_VERSION(desc->bcdUSB),
> +                       USB_MINOR_VERSION(desc->bcdUSB), 
>USB_SUB_VERSION(desc->bcdUSB),
>                         desc->bDeviceClass,
>                         class_decode (desc->bDeviceClass),
>                         desc->bDeviceSubClass,
> @@ -341,7 +342,8 @@
>               return start;
>       start += sprintf(start, format_device2,
>                        desc->idVendor, desc->idProduct,
> -                      desc->bcdDevice >> 8, desc->bcdDevice & 0xff);
> +                      USB_MAJOR_VERSION(desc->bcdDevice),
> +                      USB_MINOR_VERSION(desc->bcdDevice), 
>USB_SUB_VERSION(desc->bcdDevice));
>       return start;
>  }
> 
> diff -Nru linux-2.5.50/include/linux/usb_ch9.h linux-current/include/linux/usb_ch9.h
> --- linux-2.5.50/include/linux/usb_ch9.h      2002-11-27 22:35:59.000000000 +0000
> +++ linux-current/include/linux/usb_ch9.h     2002-12-09 03:18:48.000000000 +0000
> @@ -126,6 +126,13 @@
> 
>  /*-------------------------------------------------------------------------*/
> 
> +/*
> + * BCD versions, for bcdUSB and bcdDevice fields
> + */
> +#define USB_MAJOR_VERSION(version)   ((version & 0xFF00) >> 8)
> +#define USB_MINOR_VERSION(version)   ((version & 0x00F0) >> 4)
> +#define USB_SUB_VERSION(version)     (version & 0x000F)
> +
>  /* USB_DT_DEVICE: Device descriptor */
>  struct usb_device_descriptor {
>       __u8  bLength;
> 
> 
> 
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> [EMAIL PROTECTED]
> To unsubscribe, use the last form field at:
> https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

-- 
Matthew Dharm                              Home: [EMAIL PROTECTED] 
Maintainer, Linux USB Mass Storage Driver

G:  Money isn't everything, A.J.
AJ: Who convinced you of that?
G:  The Chief, at my last salary review.
                                        -- Mike and Greg
User Friendly, 11/3/1998

Attachment: msg09864/pgp00000.pgp
Description: PGP signature

Reply via email to