/* * Handle IN endpoint transfer interrupt. */ static void Handle_USB_GINTSTS_IEPINT( void ) { int epnum; uint16_t epint; uint16_t epmask; uint32_t status; USBD_Ep_TypeDef *ep; DEBUG_USB_INT_HI_PUTCHAR( 'i' ); epint = USBDHAL_GetAllInEpInts(); for ( epnum = 0, epmask = 1; epnum <= MAX_NUM_IN_EPS; epnum++, epmask <<= 1 ) { if ( epint & epmask ) { ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | epnum ); status = USBDHAL_GetInEpInts( ep ); if ( status & USB_DIEP_INT_XFERCOMPL ) { USB_DINEPS[ epnum ].INT = USB_DIEP_INT_XFERCOMPL; DEBUG_USB_INT_HI_PUTCHAR( 'c' ); if ( epnum == 0 ) { if ( ep->remaining > ep->packetSize ) { ep->remaining -= ep->packetSize; ep->xferred += ep->packetSize; } else { ep->xferred += ep->remaining; ep->remaining = 0; } USBDEP_Ep0Handler( dev ); } else { ep->xferred = ep->remaining - ( ( USB_DINEPS[ epnum ].TSIZ & _USB_DIEP_TSIZ_XFERSIZE_MASK ) >> _USB_DIEP_TSIZ_XFERSIZE_SHIFT ); ep->remaining -= ep->xferred; USBDEP_EpHandler( ep->addr ); #if defined( USB_DOEP0INT_STUPPKTRCVD ) if ( USB_DINEPS[ ep->num ].INT & USB_DIEP_INT_NAKINTRPT ) { USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_NAKINTRPT; } #endif } } }
/* * Handle host channel IN transfer interrupt. */ static void Handle_HcInInt( uint8_t hcnum ) { USBH_Hc_TypeDef *hc; USB_Status_TypeDef result; uint32_t status, hcchar, eptype; #ifdef DEBUG_USB_INT_HI uint32_t status2; #endif hc = &hcs[ hcnum ]; status = USBHHAL_GetHcInts( hcnum ); hcchar = USB->HC[ hcnum ].CHAR; eptype = hcchar & _USB_HC_CHAR_EPTYPE_MASK; DEBUG_USB_INT_HI_PUTCHAR( 'i' ); #if !defined( USB_SLAVEMODE ) if ( status & USB_HC_INT_CHHLTD ) { USB->HC[ hcnum ].INT = 0xFFFFFFFF; #ifdef DEBUG_USB_INT_HI status2 = status; #endif status &= USB_HC_INT_XFERCOMPL | USB_HC_INT_STALL | USB_HC_INT_XACTERR | USB_HC_INT_ACK | USB_HC_INT_NAK | USB_HC_INT_DATATGLERR | USB_HC_INT_BBLERR; if ( ( status & ( USB_HC_INT_ACK | USB_HC_INT_XFERCOMPL ) ) == ( USB_HC_INT_ACK | USB_HC_INT_XFERCOMPL ) ) { DEBUG_USB_INT_HI_PUTCHAR( 'c' ); hc->xferred = hc->hwXferSize - ( ( USB->HC[ hcnum ].TSIZ & _USB_HC_TSIZ_XFERSIZE_MASK ) >> _USB_HC_TSIZ_XFERSIZE_SHIFT ); hc->remaining -= hc->xferred; hc->ep->toggle = ( USB->HC[ hcnum ].TSIZ & _USB_HC_TSIZ_PID_MASK ) == USB_HC_TSIZ_PID_DATA0 ? USB_PID_DATA0 : USB_PID_DATA1; result = USB_STATUS_OK; }