libusb usb_interrupt_read hangs under FreeBSD
Xiaofan Chen
xiaofanc at gmail.com
Sun Jul 8 00:25:21 UTC 2007
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
Regards,
Xiaofan
More information about the freebsd-usb
mailing list