This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

USB Descriptor Problem, XP ok, Vista/7 not?!?

Hey!

we're having a problem with our USB-device...it's a composite device with 3 interfaces, a normal cdc interface, a cdc data interface and a costum interface.

Using windows XP, everthing is fine, it work's as intended, but with Windows Vista/Seven it doesn't.

Logging the transfers it say's an illegal_parameter while selecting the configuration. (seven/vista).

000029: Select Configuration (UP), 25.09.2009 22:07:21.463 +0.0. Status: 0x80000300
Configuration Index: 1
Configuration Handle: 0x0

Somehow strange is that the device works using a Win Seven/Vista - VM (VMWare Workstation 6.5) on a Seven host - no idea why ;)

We're using the interface association descriptor...maybe that's the problem.

Here's the complete config descriptor

/* USB configuration descriptor */
    9,          /* sizeof(usbDescrConfig): length of descriptor in bytes */
    USBDESCR_CONFIG,    /* descriptor type */
    84,
    0,          /* total length of data returned (including inlined descriptors) */
    3,          /* number of interfaces in this configuration */
    1,          /* index of this configuration */
    0,          /* configuration name string index */
#if USB_CFG_IS_SELF_POWERED
    USBATTR_SELFPOWER,  /* attributes */
#else
    USBATTR_BUSPOWER,   /* attributes */
#endif
    USB_CFG_MAX_BUS_POWER/2,            /* max USB current in 2mA units */

    /* IAD descriptor */
    8,
    11,       // bDescriptorType = 11
       0x00,               // bFirstInterface
       0x02,               // bInterfaceCount
       0x02,               // bFunctionClass (Communication Class)
       0x02,               // bFunctionSubClass (Abstract Control Model)
       0x01,               // bFunctionProcotol (V.25ter, Common AT commands)
       0x00,                // iInterface

    /* Test */

    /* interface descriptor follows inline: */
    9,          /* sizeof(usbDescrInterface): length of descriptor in bytes */
    USBDESCR_INTERFACE, /* descriptor type */
    0,          /* index of this interface */
    0,          /* alternate setting for this interface */
    USB_CFG_HAVE_INTRIN_ENDPOINT,   /* endpoints excl 0: number of endpoint descriptors to follow */
    USB_CFG_INTERFACE_CLASS,
    USB_CFG_INTERFACE_SUBCLASS,
    USB_CFG_INTERFACE_PROTOCOL,
    0,          /* string index for interface */

    /* CDC Class-Specific descriptor */
    5,           /* sizeof(usbDescrCDC_HeaderFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    0,           /* header functional descriptor */
    0x10, 0x01,

    4,           /* sizeof(usbDescrCDC_AcmFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    2,           /* abstract control management functional descriptor */
    0x02,        /* SET_LINE_CODING,    GET_LINE_CODING, SET_CONTROL_LINE_STATE    */

    5,           /* sizeof(usbDescrCDC_UnionFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    6,           /* union functional descriptor */
    0,           /* CDC_COMM_INTF_ID */
    1,           /* CDC_DATA_INTF_ID */

    5,           /* sizeof(usbDescrCDC_CallMgtFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    1,           /* call management functional descriptor */
    3,           /* allow management on data interface, handles call management by itself */
    1,           /* CDC_DATA_INTF_ID */

    /* Endpoint Descriptor */
    7,           /* sizeof(usbDescrEndpoint) */
    USBDESCR_ENDPOINT,  /* descriptor type = endpoint */
    0x83,        /* IN endpoint number 3 */
    0x03,        /* attrib: Interrupt endpoint */
    8, 0,        /* maximum packet size */
    USB_CFG_INTR_POLL_INTERVAL,        /* in ms */

    /* Interface Descriptor  */
    9,           /* sizeof(usbDescrInterface): length of descriptor in bytes */
    USBDESCR_INTERFACE,           /* descriptor type */
    1,           /* index of this interface */
    0,           /* alternate setting for this interface */
    2,           /* endpoints excl 0: number of endpoint descriptors to follow */
    0x0A,        /* Data Interface Class Codes */
    0,
    0,           /* Data Interface Class Protocol Codes */
    0,           /* string index for interface */

    /* Endpoint Descriptor */
    7,           /* sizeof(usbDescrEndpoint) */
    USBDESCR_ENDPOINT,  /* descriptor type = endpoint */
    0x01,        /* OUT endpoint number 1 */
    0x02,        /* attrib: Bulk endpoint */
    HW_CDC_BULK_OUT_SIZE, 0,        /* maximum packet size */
    0,           /* in ms */

    /* Endpoint Descriptor */
    7,           /* sizeof(usbDescrEndpoint) */
    USBDESCR_ENDPOINT,  /* descriptor type = endpoint */
    0x81,        /* IN endpoint number 1 */
    0x02,        /* attrib: Bulk endpoint */
    HW_CDC_BULK_IN_SIZE, 0,        /* maximum packet size */
    0,           /* in ms */

    /* usbasp descriptor */
   9,                  /* sizeof () usbasp descriptor */
   USBDESCR_INTERFACE,      /* descriptor Type */
   2,                  /* index for this interface */
   0,                  /* alternate Setting for this interface */
   0,                  /* number of endpoint descriptros to follow */
   0,                  /* interface class */
   0,                  /* interface subclass */
   0,                  /* interface protocol */
   0,                  /* string index for interface */

Here's the device descriptor:

   18,         /* sizeof(usbDescriptorDevice): length of descriptor in bytes */
    USBDESCR_DEVICE,        /* descriptor type */
    0x10, 0x01,             /* USB version supported */
    0xEF,                /* USB_CFG_DEVICE_CLASS */
    0x02,                /* USB_CFG_DEVICE_SUBCLASS */
    1,                      /* protocol */
    8,                      /* max packet size */
    /* the following two casts affect the first byte of the constant only, but
     * that's sufficient to avoid a warning with the default values.
     */
    (char)USB_CFG_VENDOR_ID,/* 2 bytes */
    (char)USB_CFG_DEVICE_ID,/* 2 bytes */
    USB_CFG_DEVICE_VERSION, /* 2 bytes */
    USB_CFG_DESCR_PROPS_STRING_VENDOR != 0 ? 1 : 0,         /* manufacturer string index */
    USB_CFG_DESCR_PROPS_STRING_PRODUCT != 0 ? 2 : 0,        /* product string index */
    USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER != 0 ? 3 : 0,  /* serial number string index */
    1,          /* number of configurations */

if you need the complete config descriptor, i'll post it, but it's pretty long ;)

Every idea will be appreciated ;)

Thanks,
Kai

Parents
  • I don't see any error on the descriptors.

    On the sniffer, you'll see Get_Descriptor( Config ) twice just before Set_Configuration (Select Config). First one requests just 9 bytes, for config descriptor. And second one does full set of config descriptors. Check the contents of replies for these Get_Descriptor. Do they match to this descriptor?

    The major difference of VM from real machine is timing. VM is slower than real.
    Shorter request interval may cause timing error on the firmware.

    Another difference of Vista / Win7 vs XP is INF file for CDC.
    Vista / Win7 stores usbser.sys in .cab file as the default, not in the driver folder.
    In this reason, INF file refers in-box mdmcpq.inf, which defines the source disk as FakeModemCopyFileSection, as follows.

    [MYDEV000.NT]
    include=mdmcpq.inf
    CopyFiles=FakeModemCopyFileSection
    AddReg=MYDEV000.NT.AddReg

    Tsuneo

Reply
  • I don't see any error on the descriptors.

    On the sniffer, you'll see Get_Descriptor( Config ) twice just before Set_Configuration (Select Config). First one requests just 9 bytes, for config descriptor. And second one does full set of config descriptors. Check the contents of replies for these Get_Descriptor. Do they match to this descriptor?

    The major difference of VM from real machine is timing. VM is slower than real.
    Shorter request interval may cause timing error on the firmware.

    Another difference of Vista / Win7 vs XP is INF file for CDC.
    Vista / Win7 stores usbser.sys in .cab file as the default, not in the driver folder.
    In this reason, INF file refers in-box mdmcpq.inf, which defines the source disk as FakeModemCopyFileSection, as follows.

    [MYDEV000.NT]
    include=mdmcpq.inf
    CopyFiles=FakeModemCopyFileSection
    AddReg=MYDEV000.NT.AddReg

    Tsuneo

Children