static void handleTxInterrupts(int endpoint) { if(!inInterruptStatus[endpoint]) { return; } //uartPrintf("\tendpoint %d has an TX interrupt\r\n", endpoint); // clear pending interrupts if((inInterruptStatus[endpoint] & USB_EPINT_INEPNakEff) == USB_EPINT_INEPNakEff) { InEPRegs[endpoint].interrupt = USB_EPINT_INEPNakEff; //uartPrintf("\t\tUSB_EPINT_INEPNakEff\r\n"); } if((inInterruptStatus[endpoint] & USB_EPINT_INTknEPMis) == USB_EPINT_INTknEPMis) { InEPRegs[endpoint].interrupt = USB_EPINT_INTknEPMis; //uartPrintf("\t\tUSB_EPINT_INTknEPMis\r\n"); // clear the corresponding core interrupt SET_REG(USB + GINTSTS, GET_REG(USB + GINTSTS) | GINTMSK_EPMIS); } if((inInterruptStatus[endpoint] & USB_EPINT_INTknTXFEmp) == USB_EPINT_INTknTXFEmp) { InEPRegs[endpoint].interrupt = USB_EPINT_INTknTXFEmp; //uartPrintf("\t\tUSB_EPINT_INTknTXFEmp\r\n"); } if((inInterruptStatus[endpoint] & USB_EPINT_TimeOUT) == USB_EPINT_TimeOUT) { InEPRegs[endpoint].interrupt = USB_EPINT_TimeOUT; //uartPrintf("\t\tUSB_EPINT_TimeOUT\r\n"); currentlySending = 0xFF; //ringBufferDequeue(txQueue); } if((inInterruptStatus[endpoint] & USB_EPINT_AHBErr) == USB_EPINT_AHBErr) { InEPRegs[endpoint].interrupt = USB_EPINT_AHBErr; //uartPrintf("\t\tUSB_EPINT_AHBErr\r\n"); } if((inInterruptStatus[endpoint] & USB_EPINT_EPDisbld) == USB_EPINT_EPDisbld) { InEPRegs[endpoint].interrupt = USB_EPINT_EPDisbld; //uartPrintf("\t\tUSB_EPINT_EPDisbldr\n"); } if((inInterruptStatus[endpoint] & USB_EPINT_XferCompl) == USB_EPINT_XferCompl) { InEPRegs[endpoint].interrupt = USB_EPINT_XferCompl; //uartPrintf("\t\tUSB_EPINT_XferCompl\n"); currentlySending = 0xFF; advanceTxQueue(); if(usb_message_queue[endpoint]) usb_message_queue[endpoint] = usb_message_queue[endpoint]->next; continueMessageQueue(endpoint); } }
static void continueMessageQueue(int _ep) { USBMessageQueue *q = usb_message_queue[_ep]; if(q != NULL) { usbTxRx(_ep, q->dir, q->type, q->data, q->dataLen); if(q->dir == USBIn) { ringBufferEnqueue(txQueue, _ep); advanceTxQueue(); } } }
void usb_send_interrupt(uint8_t endpoint, void* buffer, int bufferLen) { usbTxRx(endpoint, USBIn, USBInterrupt, buffer, bufferLen); ringBufferEnqueue(txQueue, endpoint); advanceTxQueue(); }
static void sendControl(void* buffer, int bufferLen) { usbTxRx(USB_CONTROLEP, USBIn, USBControl, buffer, bufferLen); ringBufferEnqueue(txQueue, USB_CONTROLEP); advanceTxQueue(); }