libusb usb_interrupt_read hangs under FreeBSD

Hans Petter Selasky hselasky at c2i.net
Mon Jul 9 16:35:56 UTC 2007


On Sunday 08 July 2007 02:25, Xiaofan Chen wrote:
> On 7/5/07, Hans Petter Selasky <hselasky at 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


More information about the freebsd-usb mailing list