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
msg09864/pgp00000.pgp
Description: PGP signature
