CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

composite device: enum failed
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

composite device: enum failed
PostPosted: Sat Aug 11, 2007 2:15 pm     Reply with quote

Hil all

I'm trying to make a CDC+HID+KBD device but enumeration fails:
After the configuration descriptor is sent, the comm stops :

Code:

1   in down   n/a   0.001 GET_DESCRIPTOR_FROM_DEVICE
1   in up     n/a   0.003 CONTROL_TRANSFER   12 01 00 02 00 00 00 40   0x00000000
2   in down   n/a   0.003 GET_DESCRIPTOR_FROM_DEVICE
2   in up     n/a   0.005 CONTROL_TRANSFER   09 02 7c 00 04 01 00 c0   0x00000000
3   in down   n/a   0.005 GET_DESCRIPTOR_FROM_DEVICE
3   in up     n/a   0.008 CONTROL_TRANSFER   09 02 7c 00 04 01 00 c0   0x00000000


The content of the last packet displayed by snoopy is exactly was is define in the USB_CONFIG_DESC structure.

Code:

   //////////////////////////////////////////////////////////////////
   ///
   ///  HID Report.  Tells HID driver how to handle and deal with
   ///  received data.  HID Reports can be extremely complex,
   ///  see HID specifcation for help on writing your own.
   ///
   ///  First it defines a block for the first interface for a mouse
   ///  protocol.  Second it defines a block for the second interface
   ///  for a keyboard protocol.
   ///
   //////////////////////////////////////////////////////////////////

   const char USB_CLASS_SPECIFIC_DESC[] = {
    //hid report descriptor for interface 0 (joystick)
      0x05, 0x01,       // Usage Page = Generic Desktop                 ==0,1
      0x09, 0x04,       // Usage = Joystick                             ==2,3
      0xA1, 0x01,       // Collection = Application                     ==4,5
        0x09, 0x33,       // Usage (Rx)                                 ==6,7
        0x09, 0x34,       // Usage (Ry)                                 ==8,9
        0x09, 0x35,       // Usage (Ry)                                 ==10,11
        0x09, 0x36,       // Usage (Slider)                             ==12,13
        0x15, 0x00,       // Logical  Minimum (0)                       ==14,15
        0x26, 0xFF,0x03,  // Logical  Maximum (1023)                    ==16,17,18
        0x35, 0x00,       // Physical Minimum (0)                       ==19,20
        0x46, 0xFF,0x03,  // Physical Maximum (1023)                    ==21,22,23
        0x75, 0x0A,       // Report Size (10)  10 bits                  ==24,25
        0x95, 0x04,       // Report Count (4)                           ==26,27
        0x81, 0x02,       // Input (Data,Var,Abs)                       ==28,29
      0xC0,              // End Collection                              ==30

    //hid report descriptor for interface 1 (keyboard)
      0x05, 0x01, //usage page (generic desktop)                        ==31, 32
      0x09, 0x06, //usage (keyboard)                                    ==33, 34
      0xA1, 0x01, //collection (application)                            ==35, 36
        0x05, 0x07, //usage page (key codes)                            ==37, 38
        0x19, 0xE0, //usage min (224)                                   ==39, 40
        0x29, 0xE7, //usage max (231)                                   ==41, 42
        0x15, 0x00, //logical min (0)                                   ==43, 44
        0x25, 0x01, //logical max (1)                                   ==45, 46
        0x75, 0x01, //report size (1)                                   ==47, 48
        0x95, 0x08, //report count (8)                                  ==49, 50
        0x81, 0x02, //input (data, variable, absolute) [modifier byte]  ==51, 52
        0x95, 0x01, //report count (1)                                  ==53, 54
        0x75, 0x08, //report size (8)                                   ==55, 56
        0x81, 0x01, //input (constant) [reserved byte]                  ==57, 58
        0x95, 0x05, //report count (5)                                  ==59, 60
        0x75, 0x01, //report size (1)                                   ==61, 62
        0x05, 0x08, //usage page (page# for leds)                       ==63, 64
        0x19, 0x01, //usage min (1)                                     ==65, 66
        0x29, 0x05, //usage max (5)                                     ==67, 68
        0x91, 0x02, //output (data, var, abs) [led report]              ==69, 70
        0x95, 0x01, //report count (1)                                  ==71, 72
        0x75, 0x03, //report size (3)                                   ==73, 74
        0x91, 0x01, //output (constant) [led report padding]            ==75, 76
        0x95, 0x05, //report count (5)                                  ==77, 78
        0x75, 0x08, //report size (8)                                   ==79, 80
        0x15, 0x00, //logical min (0)                                   ==81, 82
        0x25, 0x65, //logical max (101)                                 ==83, 84
        0x05, 0x07, //usage page (key codes)                            ==85, 86
        0x19, 0x00, //usage min (0)                                     ==87, 88
        0x29, 0x65, //usage max (101)                                   ==89, 90
        0x81, 0x00, //input (data, array)                               ==91, 92
      0xC0        //end collection                                      ==93
   };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines where to look for it in the const
   // USB_CLASS_SPECIFIC_DESC[] array.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   //Idx in USB_CLASS_SPECIFIC_DESC
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][2] =
   {
   //config 1
      //interface 0
         0,
      //interface 1
         31
   };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines the size of that descriptor.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][2] =
   {
   //config 1
      //interface 0
         31,
      //interface 1
         63
   };

//////////////////////////////////////////////////////////////////
///
///   start config descriptor
///   right now we only support one configuration descriptor.
///   the config, interface, class, and endpoint goes into this array.
///
//////////////////////////////////////////////////////////////////

   #DEFINE USB_TOTAL_CONFIG_LEN      124//67  //config+interface+class+endpoint+endpoint (2 endpoints)

   const char USB_CONFIG_DESC[] = {
   //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
      //    config(s)
      //    interface(s)
      //    class(es)
      //    endpoint(s)

   //config_descriptor for config index 1
         USB_DESC_CONFIG_LEN, //length of descriptor size                                 ==0
         USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02)              ==1
         USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config              ==2,3
         4, //number of interfaces this device supports                                   ==4
         0x01, //identifier for this configuration.  (IF we had more than one configurations)      ==5
         0x00, //index of string descriptor for this configuration                        ==6
         0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==7
         0x32, //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)      == 8

   //interface descriptor 0 (comm class interface)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   ==9
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==10
         0x00, //number defining this interface (IF we had more than one interface)       ==11
         0x00, //alternate setting                                                        ==12
         1, //number of endpoints                                                         ==13
         0x02, //class code, 02 = Comm Interface Class                                    ==14
         0x02, //subclass code, 2 = Abstract                                              ==15
         0x01, //protocol code, 1 = v.25ter                                               ==16
         0x00, //index of string descriptor for interface                                 ==17

   //class descriptor [functional header]
         5, //length of descriptor                                                        ==18
         0x24, //dscriptor type (0x24 == )                                                ==19
         0, //sub type (0=functional header)                                              ==20
         0x10,0x01, //                                                                    ==21,22 //cdc version

   //class descriptor [acm header]
         4, //length of descriptor                                                        ==23
         0x24, //dscriptor type (0x24 == )                                                ==24
         2, //sub type (2=ACM)                                                            ==25
         2, //capabilities                                                                ==26  //we support Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, and the notification Serial_State.

   //class descriptor [union header]
         5, //length of descriptor                                                        ==27
         0x24, //dscriptor type (0x24 == )                                                ==28
         6, //sub type (6=union)                                                          ==29
         0, //master intf                                                                 ==30  //The interface number of the Communication or Dat a Cl [spam] interface, designated as the masteror controlling interface for the union.
         1, //save intf0                                                                  ==31  //Interface number of first slave or associated interface in the union. *

   //class descriptor [call mgmt header]
         5, //length of descriptor                                                        ==32
         0x24, //dscriptor type (0x24 == )                                                ==33
         1, //sub type (1=call mgmt)                                                      ==34
         0, //capabilities                                                                ==35  //device does not handle call management itself
         1, //data interface                                                              ==36  //interface number of data class interface

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==37
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==38
         USB_CDC_COMM_IN_ENDPOINT | 0x80, //endpoint number and direction                 ==39
         0x03, //transfer type supported (0x03 is interrupt)                              ==40
         USB_CDC_COMM_IN_SIZE,0x00, //maximum packet size supported                       ==41,42
         250,  //polling interval, in ms.  (cant be smaller than 10)                      ==43

   //interface descriptor 1 (data class interface)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   ==44
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==45
         0x01, //number defining this interface (IF we had more than one interface)       ==46
         0x00, //alternate setting                                                        ==47
         2, //number of endpoints                                                         ==48
         0x0A, //class code, 0A = Data Interface Class                                    ==49
         0x00, //subclass code                                                            ==50
         0x00, //protocol code                                                            ==51
         0x00, //index of string descriptor for interface                                 ==52

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==53
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==54
         USB_CDC_DATA_OUT_ENDPOINT, //endpoint number and direction (0x02 = EP2 OUT)      ==55
         0x02, //transfer type supported (0x02 is bulk)                                   ==56
         USB_CDC_DATA_OUT_SIZE & 0xFF, (USB_CDC_DATA_OUT_SIZE >> 8) & 0xFF, //maximum packet size supported  ==57, 58
         250,  //polling interval, in ms.  (cant be smaller than 10)                      ==59

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==60
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==61
         USB_CDC_DATA_IN_ENDPOINT | 0x80, //endpoint number and direction (0x82 = EP2 IN) ==62
         0x02, //transfer type supported (0x02 is bulk)                                   ==63
         USB_CDC_DATA_IN_SIZE & 0xFF, (USB_CDC_DATA_IN_SIZE >> 8) & 0xFF, //maximum packet size supported    ==64, 65
         250,  //polling interval, in ms.  (cant be smaller than 10)                      ==66

   //interface descriptor 2 (HID)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   ==67
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==68
         0x00, //number defining this interface (IF we had more than one interface)       ==69
         0x00, //alternate setting                                                        ==70
         1, //number of endpoints for this interface                                      ==71
         0x03, //class code, 03 = HID                                                     ==72
         0x00, //subclass code //boot                                                     ==73
         0x00, //protocol code                                                            ==74
         0x00, //index of string descriptor for interface                                 ==75

   //class descriptor 2  (HID)
         USB_DESC_CLASS_LEN, //length of descriptor                                       ==76
         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)                              ==77
         0x00,0x01, //hid class release number (1.0) (try 1.10)                           ==78,79
         0x00, //localized country code (0 = none)                                        ==80
         0x01, //number of hid class descrptors that follow (1)                           ==81
         USB_DESC_HIDREPORT_TYPE, //report descriptor type (0x22 == HID)                  ==82
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][0], 0x00, //length of report descriptor   ==83,84

   //endpoint descriptor 2
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==85
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==86
         USB_HID_JOY_IN_ENDPOINT | 0x80, //endpoint number and direction (0x81 = EP1 IN)                            ==87
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)       ==88
         USB_EP3_TX_SIZE,0x00, //maximum packet size supported                            ==89,90
         2,  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices) ==91

   //interface descriptor 3 (KEYBOARD)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   ==92
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==93
         0x01, //number defining this interface (IF we had more than one interface)       ==94
         0x00, //alternate setting                                                        ==95
         2, //number of endpoints for this interface                                      ==96
         0x03, //class code, 03 = HID                                                     ==97
         0x01, //subclass code //boot                                                     ==98
         0x01, //protocol code (keyboard)                                                 ==99
         0x00, //index of string descriptor for interface                                 ==100

   //class descriptor 3  (KEYBOARD)
         USB_DESC_CLASS_LEN, //length of descriptor                                       ==101
         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)                              ==102
         0x00,0x01, //hid class release number (1.0) (try 1.10)                           ==103,104
         0x00, //localized country code (0 = none)                                        ==105
         0x01, //number of hid class descriptors that follow (1)                          ==106
         USB_DESC_HIDREPORT_TYPE, //report descriptor type (0x22 == HID)                  ==107
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][1], 0x00, //length of report descriptor   ==108,109

   //endpoint descriptor 3 IN
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==110
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==111
         USB_HID_KBD_IN_ENDPOINT | 0x80, //endpoint number and direction (0x81 = EP1 IN)  ==112
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)       ==113
         USB_EP4_TX_SIZE,0x00, //maximum packet size supported                            ==114,115
         10,  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices)==116

   //endpoint descriptor 3 OUT
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==117
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==118
         USB_HID_KBD_OUT_ENDPOINT, //endpoint number and direction (0x81 = EP1 IN)        ==119
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)       ==120
         USB_EP4_RX_SIZE,0x00, //maximum packet size supported                            ==121,122
         10  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices) ==123


   };

   //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
   //since we can't make pointers to constants in certain pic16s, this is an offset table to find
   //  a specific descriptor in the above table.

   //NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
   //      FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
   #define USB_NUM_HID_INTERFACES   2

   //the maximum number of interfaces seen on any config
   //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
   #define USB_MAX_NUM_INTERFACES   4

   //define how many interfaces there are per config.  [0] is the first config, etc.
   const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={4};

   //define where to find class descriptors
   //first dimension is the config number
   //second dimension specifies which interface
   //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
   //if a class descriptor is not valid, set the value to 0xFFFF
   //Idx class in USB_CONFIG_DESC
   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_MAX_NUM_INTERFACES][4]=
   {
   //config 1
      //interface 0
         //class 1-4
         18,23,27,32,
      //interface 1
         //no classes for this interface
         0xFFFF,0xFFFF,0xFFFF,0xFFFF
      //interface 3
         76,0xFFFF,0xFFFF,0xFFFF
      //interface 4
         101,0xFFFF,0xFFFF,0xFFFF
   };

   //****** END CONFIG DESCRIPTOR LOOKUP TABLES ********

   #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
      #error USB_TOTAL_CONFIG_LEN not defined correctly
   #endif


//////////////////////////////////////////////////////////////////
///
///   start device descriptors
///
//////////////////////////////////////////////////////////////////

   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==0
         0x01, //the constant DEVICE (DEVICE 0x01)  ==1
         0x00,0x02, //usb version in bcd 2.0                                                                  ==3,4
         //0x10,0x01, //usb version in bcd  ==2,3
         0x00, //class code. 0x02=Communication Device Class ==4
         0x00, //subclass code ==5
         0x00, //protocol code ==6
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
         0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)  ==8,9
         0x55,0x00, //product id   ==10,11
         0x00,0x01, //device release number  ==12,13
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==14
         0x02, //index of string descriptor of the product  ==15
         0x00, //index of string descriptor of serial number  ==16
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==17
   };

   #if (sizeof(USB_DEVICE_DESC) != USB_DESC_DEVICE_LEN)
      #error USB_DESC_DEVICE_LEN not defined correctly
   #endif



Do you have any idea what is wrong ?

Regards
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Tue Aug 14, 2007 1:04 am     Reply with quote

I corrected a few errors in the above code and now the emuneration succeed.

I have now HID+KBD+CDC
Quote:
//NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL


I changed USB_CDC_COMM_XX_ENDPOINT accordantly.

When installing, I'm prompted for the CDC driver, but install fails.
HID+KBD are OK

I saw on the microchip forum
Quote:
-Make sure the descriptor CDC readout is first (as number of EPs)

Is it linked to microchip library or to windows enum process ?
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Thu Aug 16, 2007 3:28 pm     Reply with quote

It seems to related to the inf file:
'Can't find any information related to your hardaware ' (tanslated in english by me)

As CDC is now in a compound device, do I have to modify the inf file ?
Guest








PostPosted: Fri Aug 17, 2007 7:31 am     Reply with quote

Have you changed the PID or the VID? If so, yes.

NicolasC wrote:
It seems to related to the inf file:
'Can't find any information related to your hardaware ' (tanslated in english by me)

As CDC is now in a compound device, do I have to modify the inf file ?
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Fri Aug 17, 2007 11:23 am     Reply with quote

Anonymous wrote:
Have you changed the PID or the VID? If so, yes.


Thanks for your answer because this now drives me crasy.
Yes I updated the PID and VIP.

I found in "Device Installation: Windows DDK" that composite device may need the following statement:
Code:

[DDInstall]
Include = AnotherINFFile.inf
Needs = AnotherINFFileDDInstall

[DDInstall.Services]
Include = AnotherINFFile.inf
Needs = AnotherINFFileDDInstall.Services


but I still can't figure out how to use it. RTFM ?
Guest








PostPosted: Fri Aug 17, 2007 1:22 pm     Reply with quote

Hi´, I´m the same anonymous Smile

See if this helps you:

www (dot) osronline (dot) com/DDKx/buses/usbsystem_515z.htm

Please report back, i´m curious to know about a composite device made with a PIC working Smile

NicolasC wrote:
Anonymous wrote:
Have you changed the PID or the VID? If so, yes.


Thanks for your answer because this now drives me crasy.
Yes I updated the PID and VIP.

I found in "Device Installation: Windows DDK" that composite device may need the following statement:
Code:

[DDInstall]
Include = AnotherINFFile.inf
Needs = AnotherINFFileDDInstall

[DDInstall.Services]
Include = AnotherINFFile.inf
Needs = AnotherINFFileDDInstall.Services


but I still can't figure out how to use it. RTFM ?
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Fri Aug 17, 2007 4:18 pm     Reply with quote

I found a mistake I did when I update the inf file:
Code:

[CCS]
%CCS_CDC%=Reader, USB\VID_0461&PID_0055\MI_03
was wrong
Code:
[CCS]
%CCS_CDC%=Reader, USB\VID_0461&PID_0055&MI_03
load the driver. Smile but the interface refuse to start.
I ll keep you posted

Thanks again for the hint anonymous Smile
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Sat Aug 25, 2007 8:17 am     Reply with quote

Hi
Here's the descriptor with all the errors (I founded) fixed.
The modified cdc_NTXP.inf file is accepted on enumeration but I have then the follwing error :
Quote:
The device can't start (error 10)

Then I'm prompted again for a inf file, probably for the fourth interface : it seems that the control and the data interfaces are not read as a union.
Any hint ?

Code:
   const char USB_CLASS_SPECIFIC_DESC[] = {
    //hid report descriptor for interface 0 (joystick)
      0x05, 0x01,       // Usage Page = Generic Desktop                 ==0,1
      0x09, 0x04,       // Usage = Joystick                             ==2,3
      0xA1, 0x01,       // Collection = Application                     ==4,5
        0x09, 0x33,       // Usage (Rx)                                 ==6,7
        0x09, 0x34,       // Usage (Ry)                                 ==8,9
        0x09, 0x35,       // Usage (Ry)                                 ==10,11
        0x09, 0x36,       // Usage (Slider)                             ==12,13
        0x15, 0x00,       // Logical  Minimum (0)                       ==14,15
        0x26, 0xFF,0x03,  // Logical  Maximum (1023)                    ==16,17,18
        0x35, 0x00,       // Physical Minimum (0)                       ==19,20
        0x46, 0xFF,0x03,  // Physical Maximum (1023)                    ==21,22,23
        0x75, 0x0A,       // Report Size (10)  10 bits                  ==24,25
        0x95, 0x04,       // Report Count (4)                           ==26,27
        0x81, 0x02,       // Input (Data,Var,Abs)                       ==28,29
      0xC0,              // End Collection                              ==30

    //hid report descriptor for interface 1 (keyboard)
      0x05, 0x01, //usage page (generic desktop)                        ==31, 32
      0x09, 0x06, //usage (keyboard)                                    ==33, 34
      0xA1, 0x01, //collection (application)                            ==35, 36
        0x05, 0x07, //usage page (key codes)                            ==37, 38
        0x19, 0xE0, //usage min (224)                                   ==39, 40
        0x29, 0xE7, //usage max (231)                                   ==41, 42
        0x15, 0x00, //logical min (0)                                   ==43, 44
        0x25, 0x01, //logical max (1)                                   ==45, 46
        0x75, 0x01, //report size (1)                                   ==47, 48
        0x95, 0x08, //report count (8)                                  ==49, 50
        0x81, 0x02, //input (data, variable, absolute) [modifier byte]  ==51, 52
        0x95, 0x01, //report count (1)                                  ==53, 54
        0x75, 0x08, //report size (8)                                   ==55, 56
        0x81, 0x01, //input (constant) [reserved byte]                  ==57, 58
        0x95, 0x05, //report count (5)                                  ==59, 60
        0x75, 0x01, //report size (1)                                   ==61, 62
        0x05, 0x08, //usage page (page# for leds)                       ==63, 64
        0x19, 0x01, //usage min (1)                                     ==65, 66
        0x29, 0x05, //usage max (5)                                     ==67, 68
        0x91, 0x02, //output (data, var, abs) [led report]              ==69, 70
        0x95, 0x01, //report count (1)                                  ==71, 72
        0x75, 0x03, //report size (3)                                   ==73, 74
        0x91, 0x01, //output (constant) [led report padding]            ==75, 76
        0x95, 0x05, //report count (5)                                  ==77, 78
        0x75, 0x08, //report size (8)                                   ==79, 80
        0x15, 0x00, //logical min (0)                                   ==81, 82
        0x25, 0x65, //logical max (101)                                 ==83, 84
        0x05, 0x07, //usage page (key codes)                            ==85, 86
        0x19, 0x00, //usage min (0)                                     ==87, 88
        0x29, 0x65, //usage max (101)                                   ==89, 90
        0x81, 0x00, //input (data, array)                               ==91, 92
      0xC0        //end collection                                      ==93
   };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines where to look for it in the const
   // USB_CLASS_SPECIFIC_DESC[] array.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   //Idx in USB_CLASS_SPECIFIC_DESC
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][2] =
   {
   //config 1
      //interface 0
         0,
      //interface 1
         31
   };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines the size of that descriptor.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][2] =
   {
   //config 1
      //interface 0
         31,
      //interface 1
         63
   };

//////////////////////////////////////////////////////////////////
///
///   start config descriptor
///   right now we only support one configuration descriptor.
///   the config, interface, class, and endpoint goes into this array.
///
//////////////////////////////////////////////////////////////////

   #DEFINE USB_TOTAL_CONFIG_LEN      124 //config+interface+class+endpoint

   const char USB_CONFIG_DESC[] = {
   //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
      //    config(s)
      //    interface(s)
      //    class(es)
      //    endpoint(s)

   //config_descriptor for config index 1
         USB_DESC_CONFIG_LEN, //length of descriptor size                                 ==0
         USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02)              ==1
         USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config              ==2,3
         4, //number of interfaces this device supports                                   ==4
         0x01, //identifier for this configuration.  (IF we had more than one configurations)      ==5
         0x00, //index of string descriptor for this configuration                        ==6
         0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==7
         0x32, //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)      == 8

   //interface descriptor 0 (HID)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   == 9
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==10
         0x00, //number defining this interface (IF we had more than one interface)       ==11
         0x00, //alternate setting                                                        ==12
         1, //number of endpoints for this interface                                      ==13
         0x03, //class code, 03 = HID                                                     ==14
         0x00, //subclass code //boot                                                     ==15
         0x00, //protocol code                                                            ==16
         0x00, //index of string descriptor for interface                                 ==17

   //class descriptor 0  (HID)
         USB_DESC_CLASS_LEN, //length of descriptor                                       ==18
         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)                              ==19
         0x00,0x01, //hid class release number (1.0) (try 1.10)                           ==20,21
         0x00, //localized country code (0 = none)                                        ==22
         0x01, //number of hid class descrptors that follow (1)                           ==23
         USB_DESC_HIDREPORT_TYPE, //report descriptor type (0x22 == HID)                  ==24
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][0], 0x00, //length of report descriptor   ==25,26

   //endpoint descriptor 0
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==27
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==28
         USB_EP_JOY_IN_ENDPOINT | 0x80, //endpoint number and direction (0x81 = EP1 IN)  ==29
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)       ==30
         USB_EP_JOY_TX_SIZE,0x00, //maximum packet size supported                         ==31,32
         2,  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices) ==33

   //interface descriptor 1 (KEYBOARD)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   ==34
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==35
         0x01, //number defining this interface (IF we had more than one interface)       ==36
         0x00, //alternate setting                                                        ==37
         2, //number of endpoints for this interface                                      ==38
         0x03, //class code, 03 = HID                                                     ==39
         0x01, //subclass code //boot                                                     ==40
         0x01, //protocol code (keyboard)                                                 ==41
         0x00, //index of string descriptor for interface                                 ==42

   //class descriptor 1  (KEYBOARD)
         USB_DESC_CLASS_LEN, //length of descriptor                                       ==43
         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)                              ==44
         0x00,0x01, //hid class release number (1.0) (try 1.10)                           ==45,46
         0x00, //localized country code (0 = none)                                        ==47
         0x01, //number of hid class descriptors that follow (1)                          ==48
         USB_DESC_HIDREPORT_TYPE, //report descriptor type (0x22 == HID)                  ==49
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][1], 0x00, //length of report descriptor   ==50,51

   //endpoint descriptor 1 IN
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==52
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==53
         USB_EP_KBD_IN_ENDPOINT | 0x80, //endpoint number and direction (0x81 = EP1 IN)   ==54
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)       ==55
         USB_EP_KBD_TX_SIZE,0x00, //maximum packet size supported                         ==56,57
         10,  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices)==58

   //endpoint descriptor 1 OUT
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==59
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==60
         USB_EP_KBD_OUT_ENDPOINT, //endpoint number and direction (0x81 = EP1 IN)         ==61
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)       ==62
         USB_EP_KBD_RX_SIZE,0x00, //maximum packet size supported                         ==63,64
         10  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices) ==65


   //interface descriptor 2 (comm class interface)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   ==66
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==67
         0x02, //number defining this interface (IF we had more than one interface)       ==68
         0x00, //alternate setting                                                        ==69
         1, //number of endpoints                                                         ==70
         0x02, //class code, 02 = Comm Interface Class                                    ==71
         0x02, //subclass code, 2 = Abstract                                              ==72
         0x01, //protocol code, 1 = v.25ter                                               ==73
         0x00, //index of string descriptor for interface                                 ==74

   //class descriptor [functional header]
         5, //length of descriptor                                                        ==75
         0x24, //dscriptor type (0x24 == )                                                ==76
         0, //sub type (0=functional header)                                              ==77
         0x00,0x02, // cdc version                                                        ==78,79

   //class descriptor [acm header]
         4, //length of descriptor                                                        ==80
         0x24, //dscriptor type (0x24 == )                                                ==81
         2, //sub type (2=ACM)                                                            ==82
         2, //capabilities                                                                ==83  //we support Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, and the notification Serial_State.

   //class descriptor [union header]
         5, //length of descriptor                                                        ==84
         0x24, //dscriptor type (0x24 == )                                                ==85
         6, //sub type (6=union)                                                          ==86
         2, //master intf                                                                 ==87  //The interface number of the Communication or Data Class interface, designated as the master or controlling interface for the union.
         3, //save intf0                                                                  ==88  //Interface number of first slave or associated interface in the union. *

   //class descriptor [call mgmt header]
         5, //length of descriptor                                                        ==89
         0x24, //dscriptor type (0x24 == )                                                ==90
         1, //sub type (1=call mgmt)                                                      ==91
         0, //capabilities                                                                ==92  //device does not handle call management itself
         3, //data interface                                                              ==93  //interface number of data class interface

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==94
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==95
         USB_CDC_COMM_IN_ENDPOINT | 0x80, //endpoint number and direction                 ==96
         0x03, //transfer type supported (0x03 is interrupt)                              ==97
         USB_CDC_COMM_IN_SIZE,0x00, //maximum packet size supported                       ==98,99
         250,  //polling interval, in ms.  (cant be smaller than 10)                      ==100

   //interface descriptor 3 (data class interface)
         USB_DESC_INTERFACE_LEN, //length of descriptor                                   ==101
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)                   ==102
         0x03, //number defining this interface (IF we had more than one interface)       ==103
         0x00, //alternate setting                                                        ==104
         2, //number of endpoints                                                         ==105
         0x0A, //class code, 0A = Data Interface Class                                    ==106
         0x00, //subclass code                                                            ==107
         0x00, //protocol code                                                            ==108
         0x00, //index of string descriptor for interface                                 ==109

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==110
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==111
         USB_CDC_DATA_OUT_ENDPOINT, //endpoint number and direction (0x02 = EP2 OUT)      ==112
         0x02, //transfer type supported (0x02 is bulk)                                   ==113
         USB_CDC_DATA_OUT_SIZE & 0xFF, (USB_CDC_DATA_OUT_SIZE >> 8) & 0xFF, //maximum packet size supported        ==114, 115
         250,  //polling interval, in ms.  (cant be smaller than 10)                      ==116

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                                    ==117
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)                      ==118
         USB_CDC_DATA_IN_ENDPOINT | 0x80, //endpoint number and direction (0x82 = EP2 IN) ==119
         0x02, //transfer type supported (0x02 is bulk)                                   ==120
         USB_CDC_DATA_IN_SIZE & 0xFF, (USB_CDC_DATA_IN_SIZE >> 8) & 0xFF, //maximum packet size supported          ==121, 122
         250,  //polling interval, in ms.  (cant be smaller than 10)                      ==123
   };



   //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
   //since we can't make pointers to constants in certain pic16s, this is an offset table to find
   //  a specific descriptor in the above table.

   //NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
   //      FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
   #define USB_NUM_HID_INTERFACES   2

   //the maximum number of interfaces seen on any config
   //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
   #define USB_MAX_NUM_INTERFACES   4

   //define how many interfaces there are per config.  [0] is the first config, etc.
   const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={4};

   //define where to find class descriptors
   //first dimension is the config number
   //second dimension specifies which interface
   //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
   //if a class descriptor is not valid, set the value to 0xFFFF
   //Idx class in USB_CONFIG_DESC
   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_MAX_NUM_INTERFACES][4]=
   {
   //config 1

      //interface 0
         //class 1-4
         18,0xFFFF,0xFFFF,0xFFFF   
      //interface 1
         //no classes for this interface
         43,0xFFFF,0xFFFF,0xFFFF
      //interface 3
         75,80,84,89,
      //interface 4
         0xFFFF,0xFFFF,0xFFFF,0xFFFF
   };

   //****** END CONFIG DESCRIPTOR LOOKUP TABLES ********

   #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
      #error USB_TOTAL_CONFIG_LEN not defined correctly
   #endif


//////////////////////////////////////////////////////////////////
///
///   start device descriptors
///
//////////////////////////////////////////////////////////////////

   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report                                                 ==1
         0x01, //the constant DEVICE (DEVICE 0x01)                                                        ==2
         0x00,0x02, //usb version in bcd 2.0                                                              ==3,4
         0x00, //class code                                                                               ==5
         0x00, //subclass code                                                                            ==6
         0x00, //protocol code                                                                            ==7
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)         ==8
         0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)                                 ==9,10
         0x55,0x00, //product id                                                                          ==11,12 
         0x00,0x01, //device release number                                                               ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)==15
         0x02, //index of string descriptor of the product                                                ==16
         0x00, //index of string descriptor of serial number                                              ==17
         USB_NUM_CONFIGURATIONS  //number of possible configurations                                      ==18
   };


Last edited by NicolasC on Tue Aug 28, 2007 5:02 am; edited 1 time in total
Guest








PostPosted: Mon Aug 27, 2007 5:22 am     Reply with quote

See if this hepls you

www (dot) cygna (dot) org/ubb/Forum9/HTML/001050.html
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Mon Aug 27, 2007 5:55 am     Reply with quote

Thanks Guest
It seems to be what I need I 'll have a close look

PS: a letter was drop in the above post
http://www.cygnal.org/ubb/Forum9/HTML/001050.html
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Tue Sep 04, 2007 2:57 am     Reply with quote

Hil all
Couldn't find anything to solve my problem but my descriptor seems to be ok. If so the trouble then must come from the modifications I made in CCS demo file in order to compile CDC and HID in the same project (ifdef CDC and ifdef HID where quite "exclusive").
Debugging this will not be easy :(

Regards
Nicolas
Ttelmah
Guest







PostPosted: Tue Sep 04, 2007 4:01 am     Reply with quote

As a comment, have you got SP2 loaded on the (presumably XP) machine you are using to test?.
There were historical problems with usbser.sys, when it was used in a composite device. Have a look at the MS knowledgebase article 918365.
SP2, is meant to fix this.

Best Wishes
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Thu Sep 06, 2007 6:22 am     Reply with quote

I installed the hotfix. Things changed a bit: I'm prompted twice for driver for the 2 last interfaces ("Comm Interface Class" and "data class interface")
and 2 comport are added Mad . Then the device manager display a working icon for the first one. (Of course openning this com fails Sad )

I'm afraid this king of device support is broken under Windows : http://www.usb.org/phpbb/viewtopic.php?p=45645#45645

Nicolas
NicolasC



Joined: 14 Sep 2006
Posts: 27

View user's profile Send private message

PostPosted: Wed Sep 12, 2007 3:09 am     Reply with quote

This kind of compound device is working using Microchip USB framework, but
Quote:
-Make sure the descriptor CDC readout is first (as number of EPs)

that is incompatible with CCS USB library:
Quote:
//NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL

I couldn't found any workaround :(
Guest








PostPosted: Wed Sep 12, 2007 7:20 am     Reply with quote

What makes necessary to put CDC first? Windows, INF file or something else?

(the same Guest again... i think I should make an account Smile )
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group