static usb_status_t USB_DeviceLpc3511IpTransaction(usb_device_lpc3511ip_state_struct_t *lpc3511IpState,
usb_device_lpc3511ip_endpoint_state_struct_t *epState,
uint8_t endpointIndex)
{ usb_status_t status = kStatus_USB_Error;
/* 1. transfer size is 0; 2. All are primed */
if ((epState->transferLength <= epState->transferPrimedLength) && (epState->transferLength != 0))
{ return kStatus_USB_Success;
}
#if (defined USB_DEVICE_IP3511_DOUBLE_BUFFER_ENABLE) && (USB_DEVICE_IP3511_DOUBLE_BUFFER_ENABLE)
//NOTE: here may be problem
uint32_t interruptMask;
if ((endpointIndex >> 1U) != USB_CONTROL_ENDPOINT)
{ /* disable endpoint interrupts */
interruptMask = lpc3511IpState->registerBase->INTEN;
lpc3511IpState->registerBase->INTEN = 0;
/* lpc3511IpState->registerBase->INTEN &= (uint32_t)(~(USB_LPC3511IP_MAX_PHY_ENDPOINT_MASK)); */
do
{ status = USB_DeviceLpc3511IpGetActualBufferAndPrime(lpc3511IpState, epState, endpointIndex, 1U);
if (status != kStatus_USB_Success)
{ break;
}
} while ((epState->transferLength > epState->transferPrimedLength) &&
(epState->stateUnion.stateBitField.doubleBufferBusy < 2));
/* enable endpoint interrupt again */
/* lpc3511IpState->registerBase->INTEN |= (uint32_t)(USB_LPC3511IP_MAX_PHY_ENDPOINT_MASK); */
lpc3511IpState->registerBase->INTEN = interruptMask;
}
else
#endif
{ status = USB_DeviceLpc3511IpGetActualBufferAndPrime(lpc3511IpState, epState, endpointIndex, 0U);
}
return status;
}