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
> is there any way to get more information than the "illegal parameter"?
It's configuration "1", as it tells. :-) ie. Windows doesn't like configuration 1 on your descriptor.
It also suggests conflict of the descriptor with the registry.
Delete (uninstall) all device instances of the VID/PID once using USBDeview, And re-install the INF file.
USBDeview www.nirsoft.net/.../usb_devices_view.html
I posted an example of a composite device of CDC + HID using IAD at the top of this topic on SiLabs USB forum,
USB composite device www.cygnal.org/.../001050.html USB_CDC_HID_IAD_10.zip
It has enumerated fine on XP-SP3 and Vista-SP1 (not tested on Win7 yet). Compare descriptors and INF file with yours. These are common to the implementations of all USB chips.
Tsuneo