Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Jul 2007 18:35:50 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        "Xiaofan Chen" <xiaofanc@gmail.com>
Cc:        freebsd-usb@freebsd.org
Subject:   Re: libusb usb_interrupt_read hangs under FreeBSD
Message-ID:  <200707091835.50445.hselasky@c2i.net>
In-Reply-To: <a276da400707071725x2b2b8ab3ife6c5459d06042bd@mail.gmail.com>
References:  <a276da400704030427g6fcfdc37u43bdf0fd1cd69ea8@mail.gmail.com> <200707051724.30175.hselasky@c2i.net> <a276da400707071725x2b2b8ab3ife6c5459d06042bd@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sunday 08 July 2007 02:25, Xiaofan Chen wrote:
> On 7/5/07, Hans Petter Selasky <hselasky@c2i.net> wrote:
> > > > > The chip does not handle a clear-stall request on the control pipe
> > > > > to clear-stall on the interrupt pipe. The result is that the
> > > > > interrupt pipe stops, or at least all buffers are cleared.
>
> The following is part of the usb firmware from Micrcohip.
>
> Somehow it masks EP0 in the handler to SET & CLEAR FEATURES
> requesrs. Is this the problem?
>
>     if((SetupPkt.bFeature == ENDPOINT_HALT)&&
>        (SetupPkt.Recipient == RCPT_EP)&&
>        (SetupPkt.EPNum != 0))
>
>
> /**************************************************************************
>**** * Function:        void USBStdFeatureReqHandler(void)
>  *
>  * PreCondition:    None
>  *
>  * Input:           None
>  *
>  * Output:          None
>  *
>  * Side Effects:    None
>  *
>  * Overview:        This routine handles the standard SET & CLEAR FEATURES
>  *                  requests
>  *
>  * Note:            None
> 
> ***************************************************************************
>**/ void USBStdFeatureReqHandler(void)
> {
>     if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP)&&
>        (SetupPkt.Recipient == RCPT_DEV))
>     {
>         ctrl_trf_session_owner = MUID_USB9;
>         if(SetupPkt.bRequest == SET_FEATURE)
>             usb_stat.RemoteWakeup = 1;
>         else
>             usb_stat.RemoteWakeup = 0;
>     }//end if
>
>     if((SetupPkt.bFeature == ENDPOINT_HALT)&&
>        (SetupPkt.Recipient == RCPT_EP)&&
>        (SetupPkt.EPNum != 0))
>     {
>         ctrl_trf_session_owner = MUID_USB9;
>         /* Must do address calculation here */
>         pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4);
>
>         if(SetupPkt.bRequest == SET_FEATURE)
>             *pDst.bRam = _USIE|_BSTALL;
>         else
>         {
>             if(SetupPkt.EPDir == 1) // IN
>                 *pDst.bRam = _UCPU;
>             else
>                 *pDst.bRam = _USIE|_DAT0|_DTSEN;
>         }//end if
>     }//end if
> }//end USBStdFeatureReqHandler
>

Perhaps what happens is that the "*pDst.bRam = _UCPU;" command clears the FIFO 
contents of the USB interrupt endpoint in addition to clearing the stall!?

If the sequence is like this:

Write to interrupt endpoint.
Reply command is written to FIFO.
Clear interrupt endpoint stall.
There is no data to read, because the FIFO has been emptied as a part of the 
stall command.

Xiaofan Chen: Could you check the datasheet for the chip that is used, what 
the stall command actually does?

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707091835.50445.hselasky>