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

USB CDC descriptor problem

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
};

  • Bamb,

    There are four buffers on the CDC implementation, on the firmware and PC device driver. Until you specifies the buffer which causes overrun, I can't tell the exact cause. As you didn't specify the MCU and the USB CDC example on which you are based, I can't tell which one is which.

    - Which MCU and example are you working on?
    - Which buffer do you see buffer overrun?

    Tsuneo

  • I've seen two types of buffer naming on CDC implementations on device side.

    a) Named after the connection
    bulk OUT EP ---> TX buffer ---> UART TX
    bulk IN EP <--- RX buffer <--- UART RX

    b) Named after the function on the device
    bulk OUT EP ---> RX buffer (receive data)
    bulk IN EP <--- TX buffer (send data)

    Then, until you specify the example you are working on, our discussion will go out of focus.

    Tsuneo

  • Hello Tsuneo
    I have followed your discusion around the CDC descriptor problem. This was very useful info to me, but never the less i got stuck.

    I have come so far that i get the enumeration to work.

    Now to my problem.
    If i try to connect with hyper terminal i get an error on my USB analyzer (the one you recommended above) with the following commands
    when I try to change rate: get_line_command => IRP status = NO_SUCH_DEVICE and URB status = USBD_STATUS_INVALID_PARAMETER. set_control_line_state => IRP status = NO_SUCH_DEVICE and URB status = USBD_STATUS_INVALID_PARAMETER.

    The same happens if i try to send a file to the device Bulk_or_interupt_transfer => IRP_status = INVALID_PARAMETER and URB status = USBD_STATUS_INVALID_PARAMETER.