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