Hello.
First of all, I want to say that I don't know if this is the right forum to do the question, but after days searching in the web, reading papers and changing the code, I'll try to explain my dude here.
I'm programming a device, with a USB communication in order to communicate with PC. I use an ATmega1281 with MAX3420 as USB controller. I get the windows recognize the device as COM Port...but I can only send or only receive data. If I try to set number of endpoints to 2 in the Data Class Interface descriptor, windows return an error (code 10), and can't initialize the device. Here I show the configuration descriptors I use. Thank you for your time in advance! and regards.
const unsigned char CD[]= // CONFIGURATION Descriptor { 0x09,// bLength 0x02,// bDescriptorType = Config 67,0x00,// wTotalLength(L/H) 0x02,// bNumInterfaces = 2 0x01,// bConfigValue 0x00,// iConfiguration 0xC0,// bmAttributes. b7=1 0x32,// MaxPower is 100 ma
// INTERFACE Descriptor 0x09,// length = 9 0x04,// type = IF 0x00,// InterFace Number = 0 0x00,// bAlternate Setting 0x01,// bNum Endpoints = 1 IN 0x02,// bInterfaceClass = 2 Communication 0x02,// bInterfaceSubClass = 2 0x01,// bInterfaceProtocol =1 (SubClass ACM,V.25ter) 0x00,// iInterface // Header Functional Descriptor (marks beginning of the concatenated set of Functional Descriptors) 0x05,// bFunctionLength, Descriptor size in bytes 0x24,// bDescriptorType, CS_INTERFACE 0x00,// bDescriptorSubtype, Header Functional Descriptor 0x10,0x01,// bcdCDC
// Abstract Control Management Functional Descriptor 0x04,// bDescriptorLength, Descriptor size in bytes 0x24,// bDescriptorType, CS_INTERFACE 0x02,// bDescriptorSubtype, ACM Functional Descriptor 0x06,// bmCapabilities
// Union Functional Descriptor 0x05,// bFunctionLength, Descriptor size in bytes 0x24,// bDescriptorType, CS_INTERFACE 0x06,// bDescriptorSubtype, Union Functional Descriptor 0x00,// bMasterInterface 0x01,// bSlaveInterface0
// Call Management Functional Descriptor 0x05,// bFunctionLength, Descriptor size in bytes 0x24,// bDescriptorType, CS_INTERFACE 0x01,// bDescriptorSubtype, Call Management Funct.Desc. 0x03,// bmCapabilities 0x01,// bDataInterface
// Endpoint Descriptor EP3-IN 0x07,// bLength 0x05,// bDescriptorType (Endpoint) 0x83,// bEndpointAddress (EP3 IN) 0x03,// bmAttributes (interrupt = 3) 0x40,0x00,// wMaxPacketSize 0x02,// bInterval, Maximum latency
// INTERFACE Descriptor 0x09,// length = 9 0x04,// type = IF 0x01,// InterFace Number = 1 0x00,// bAlternate Setting 0x01,// bNum Endpoints = 2 (IN&OUT) 0x0A,// bInterfaceClass = A (Data) 0x00,0x00,// bInterfaceSubClass, bInterfaceProtocol 0x00,// iInterface
// Endpoint Descriptor EP2-IN 0x07,// bLength 0x05,// bDescriptorType (Endpoint) 0x82,// bEndpointAddress (EP2-IN) 0x02,// bmAttributes (bulk = 2) 0x40,0x00,// wMaxPacketSize (64[0x40]) 0x00,// bInterval
// Endpoint Descriptor EP1-OUT 0x07,// bLength 0x05,// bDescriptorType (Endpoint) 0x01,// bEndpointAddress (EP1-OUT) 0x02,// bmAttributes (bulk = 2) 0x40,0x00, // wMaxPacketSize (64[0x40]) 0x00,// bInterval };
Ruben, here are the descriptors for the STR9 as provided by ST. I hope this helps...
/* USB Standard Device Descriptor */ const u8 Virtual_Com_Port_DeviceDescriptor[] = { 0x12, /* bLength */ USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */ 0x00, 0x02, /* bcdUSB = 2.00 */ 0x02, /* bDeviceClass: CDC */ 0x00, /* bDeviceSubClass */ 0x00, /* bDeviceProtocol */ 0x40, /* bMaxPacketSize0 */ 0x83, 0x04, /* idVendor = 0x0483 */ 0x40, 0x57, /* idProduct = 0x7540 */ 0x00, 0x01, /* bcdDevice = 1.00 */ 1, /* Index of string descriptor describing manufacturer */ 2, /* Index of string descriptor describing product */ 3, /* Index of string descriptor describing the device's serial number */ 0x01 /* bNumConfigurations */ }; const u8 Virtual_Com_Port_ConfigDescriptor[] = { /*Configuation Descriptor*/ 0x09, /* bLength: Configuation Descriptor size */ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ VIRTUAL_COM_PORT_SIZ_CONFIG_DESC, /* wTotalLength:no of returned bytes */ 0x00, 0x02, /* bNumInterfaces: 2 interface */ 0x01, /* bConfigurationValue: Configuration value */ 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ 0xC0, /* bmAttributes: self powered */ 0x00, /* MaxPower 0 mA */ /*Interface Descriptor*/ 0x09, /* bLength: Interface Descriptor size */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ /* Interface descriptor type */ 0x00, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ 0x00, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x00, /* bDescriptorSubtype: Header Func Desc */ 0x10, /* bcdCDC: spec release number */ 0x01, /*Call Managment Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x01, /* bDescriptorSubtype: Call Management Func Desc */ 0x00, /* bmCapabilities: D0+D1 */ 0x01, /* bDataInterface: 1 */ /*ACM Functional Descriptor*/ 0x04, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ 0x02, /* bmCapabilities */ /*Union Functional Descriptor*/ 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ 0x00, /* bMasterInterface: Communication class interface */ 0x01, /* bSlaveInterface0: Data Class Interface */ /*Endpoint 2 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ 0x82, /* bEndpointAddress: (IN2) */ 0x03, /* bmAttributes: Interrupt */ VIRTUAL_COM_PORT_INT_SIZE, /* wMaxPacketSize: */ 0x00, 0xFF, /* bInterval: */ /*Data class interface descriptor*/ 0x09, /* bLength: Endpoint Descriptor size */ USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ 0x01, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ 0x00, /* bInterfaceSubClass: */ 0x00, /* bInterfaceProtocol: */ 0x00, /* iInterface: */ /*Endpoint 3 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ 0x03, /* bEndpointAddress: (OUT3) */ 0x02, /* bmAttributes: Bulk */ VIRTUAL_COM_PORT_DATA_SIZE, /* wMaxPacketSize: */ 0x00, 0x00, /* bInterval: ignore for Bulk transfer */ /*Endpoint 1 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ 0x81, /* bEndpointAddress: (IN1) */ 0x02, /* bmAttributes: Bulk */ VIRTUAL_COM_PORT_DATA_SIZE, /* wMaxPacketSize: */ 0x00, 0x00 /* bInterval: ignore for Bulk transfer */ }; /* USB String Descriptors*/ const u8 Virtual_Com_Port_StringLangID[VIRTUAL_COM_PORT_SIZ_STRING_LANGID] = { VIRTUAL_COM_PORT_SIZ_STRING_LANGID, USB_STRING_DESCRIPTOR_TYPE, 0x09, 0x04 }; /* LangID = 0x0409: U.S. English */ const u8 Virtual_Com_Port_StringVendor[VIRTUAL_COM_PORT_SIZ_STRING_VENDOR] = { VIRTUAL_COM_PORT_SIZ_STRING_VENDOR, /* Size of Vendor string */ USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/ /* Manufacturer: "STMicroelectronics" */ 'S',0, 'T',0, 'M',0, 'i',0, 'c',0, 'r',0, 'o',0, 'e',0, 'l',0, 'e',0, 'c',0, 't',0, 'r',0, 'o',0, 'n',0, 'i',0, 'c',0, 's',0 }; const u8 Virtual_Com_Port_StringProduct[VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT] = { VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT, /* bLength */ USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ /* Product name: "STR71x Virtual Com Port" */ 'S',0, 'T',0, 'R',0, '7',0, '1',0, 'x',0, ' ',0, 'V',0, 'i',0, 'r',0, 't',0, 'u',0, 'a',0, 'l',0, ' ',0, 'C',0, 'O',0, 'M',0, ' ',0, 'P',0, 'o',0, 'r',0, 't',0, ' ',0, ' ',0 }; const u8 Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL] = { VIRTUAL_COM_PORT_SIZ_STRING_SERIAL, /* bLength */ USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ 'D',0, 'e',0, 'm',0, 'o',0, ' ',0, '1',0, '.',0, '0',0, '0',0, '0',0 };
Hello Tamir,
I were looking for a difference between the descriptors, but are the same. thanks for your time anyway!
I'll continue working in the solution.
Regards, Ruben.