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>