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 IN Endpoint freeze after some time

Hello Guys,

I am working on USB CDC application. I am using Windows XP and usbser.sys driver at host side.
I am trying to run a loopback in which host initiated a write of 64K to USB device over BULK OUT Endpoint and then read it back over BULK IN Endpoint. This loop should be able to run indefinitely.

Now the problem is after some time, HOST stops sending IN token to device. hence device stop sending data over IN Endpoint.
There is no ERR or STALL messages are being sent by either device. HOST just stops sending IN token to device.

I am not seeing this problem for small packet size like 512 bytes, 1K bytes. For these packet size loopback runs for a long time.

Kindly help me if anyone has any clue. I have read so many forum but didn't get the clue for this issue.
Any help is highly appreciated.

Regards,
Gaurav

Parents
  • Hi John,

    Thanks for taking out time and replying the query.

    I have checked the post and feel that it is related to the basic working of USB-CDC example.
    Yes, I do agree that I got an answer to a question why Host keep sending IN tokens to device? (Answer: Polling IN transactions from HOST).

    In my case, USB-CDC implementation is workig fine and I am able to read/write data from/to device. The issue is when I initiates a loopback of large packets (like 4K, 64K etc), in between IN transfer, Host stops sending IN token to device. Since device is not getting IN token, transfer stops. I have checked that IN endpoint FIFO at device side has data.

    Just for an additional information, following Endpoints are configured-
    Endpoint 0 - Control Endpoint
    Endpoint 1 - Interrupt Endpoint to poll device every 4ms
    Endpoint 5 - Bulk IN Endpoint
    Endpoint 6 - Bulk OUT Endpoint

    I don't think Host is busy because in the protocol analyzer after host stops sending IN token to USB device for Endpoint 5, I am seeing traffic related to interrupt endpoint 1 (IN token from host and NAK token from device).

    I am not able to find the reason why Host abruptly stops sending IN token to USB device?
    Kindly help.

    Best Regards,
    Gaurav

Reply
  • Hi John,

    Thanks for taking out time and replying the query.

    I have checked the post and feel that it is related to the basic working of USB-CDC example.
    Yes, I do agree that I got an answer to a question why Host keep sending IN tokens to device? (Answer: Polling IN transactions from HOST).

    In my case, USB-CDC implementation is workig fine and I am able to read/write data from/to device. The issue is when I initiates a loopback of large packets (like 4K, 64K etc), in between IN transfer, Host stops sending IN token to device. Since device is not getting IN token, transfer stops. I have checked that IN endpoint FIFO at device side has data.

    Just for an additional information, following Endpoints are configured-
    Endpoint 0 - Control Endpoint
    Endpoint 1 - Interrupt Endpoint to poll device every 4ms
    Endpoint 5 - Bulk IN Endpoint
    Endpoint 6 - Bulk OUT Endpoint

    I don't think Host is busy because in the protocol analyzer after host stops sending IN token to USB device for Endpoint 5, I am seeing traffic related to interrupt endpoint 1 (IN token from host and NAK token from device).

    I am not able to find the reason why Host abruptly stops sending IN token to USB device?
    Kindly help.

    Best Regards,
    Gaurav

Children
  • 1) What is the RX buffer size on Windows CDC class driver?
    The size is set by SetupComm() (WinAPI) or SerialPort.ReadBufferSize (.NET).

    2) Depending on Windows version (Win2K or older), you may need to insert ZLP (Zero-Length Packet) to bulk IN at every 4K bytes transfer.

    Tsuneo

  • Hi Tsuneo,

    Thanks for your reply to the query.

    1) What is the RX buffer size on Windows CDC class driver?
    The size is set by SetupComm() (WinAPI) or SerialPort.ReadBufferSize (.NET).

    I have not used this function and settings are default only.

    2) Depending on Windows version (Win2K or older), you may need to insert ZLP (Zero-Length Packet) to bulk IN at every 4K bytes transfer.

    I am testing this on windows Xp and handling the received ZLP from Host to device. Also I am sending ZLP to host after completion of transfer. Just to add, ZLP handling is done only in case of transfer size equal to integral multiple of endpoint size.

    I think issue may be related to Rx buffer as you have mentioned.
    I have read your other posts and set Rx buffer as 65536 bytes using SetupComm. I ran the test case for 64K loopback, but it is still showing the same issue. Host stop sending IN packets to IN endpoint after some time.

    I am studying through this buffer usage.

    Please help me out.

    Best Regards,
    Gaurav

  • Hmmm..
    Sound like bulk IN error case.

    Windows CDC driver, usbser.sys, silently stops bulk IN transactions on error.
    It doesn't do any error recovery, like reset_pipe.
    For the details, visit to this post

    CDC - stalled bulk IN
    www.microchip.com/.../m538194.aspx

    Noise on USB line is often the cause of this error.
    But this error is also caused when device drops bulk IN endpoint into disabled.

    If you see this trouble randomly, noise may be the culprit.
    But if it occurs regularly, disabled bulk IN EP may be the cause.

    Tsuneo

  • Hi Tsuneo,

    i am seeing that this issue is coming for every test case.
    I checked in the analyzer, only the expected packets are seen for the device. Does it means NO noise?

    How can I detect that device has disabled a specific IN endpoint? I checked, but this information is not provided in any USB registers.
    What could be the reason for device to disable the Bulk IN end points?

    Sorry for asking you too many questions. I am bit new to USB stuff.

    Thanks,
    Gaurav

  • Hi Tsuneo,

    Is there any driver which I can use instead of Usbser.sys for USB CDC?

    Best Regards,
    Gaurav

  • Maybe try it with Linux or with Mac OS?