|
|
View previous topic :: View next topic |
Author |
Message |
NicolasC
Joined: 14 Sep 2006 Posts: 27
|
composite device: enum failed |
Posted: Sat Aug 11, 2007 2:15 pm |
|
|
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
|
|
Posted: Tue Aug 14, 2007 1:04 am |
|
|
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
|
|
Posted: Thu Aug 16, 2007 3:28 pm |
|
|
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
|
|
Posted: Fri Aug 17, 2007 7:31 am |
|
|
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
|
|
Posted: Fri Aug 17, 2007 11:23 am |
|
|
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
|
|
Posted: Fri Aug 17, 2007 1:22 pm |
|
|
Hi´, I´m the same anonymous
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
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
|
|
Posted: Fri Aug 17, 2007 4:18 pm |
|
|
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. but the interface refuse to start.
I ll keep you posted
Thanks again for the hint anonymous |
|
|
NicolasC
Joined: 14 Sep 2006 Posts: 27
|
|
Posted: Sat Aug 25, 2007 8:17 am |
|
|
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
|
|
Posted: Mon Aug 27, 2007 5:22 am |
|
|
See if this hepls you
www (dot) cygna (dot) org/ubb/Forum9/HTML/001050.html |
|
|
NicolasC
Joined: 14 Sep 2006 Posts: 27
|
|
|
NicolasC
Joined: 14 Sep 2006 Posts: 27
|
|
Posted: Tue Sep 04, 2007 2:57 am |
|
|
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
|
|
Posted: Tue Sep 04, 2007 4:01 am |
|
|
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
|
|
Posted: Thu Sep 06, 2007 6:22 am |
|
|
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 . Then the device manager display a working icon for the first one. (Of course openning this com fails )
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
|
|
Posted: Wed Sep 12, 2007 3:09 am |
|
|
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
|
|
Posted: Wed Sep 12, 2007 7:20 am |
|
|
What makes necessary to put CDC first? Windows, INF file or something else?
(the same Guest again... i think I should make an account ) |
|
|
|
|
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
|