示例#1
0
文件: usb.c 项目: Neonkoala/openiBoot
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);
	}
	
}
示例#2
0
文件: usb.c 项目: Neonkoala/openiBoot
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();
		}
	}
}
示例#3
0
void usb_send_interrupt(uint8_t endpoint, void* buffer, int bufferLen) {
	usbTxRx(endpoint, USBIn, USBInterrupt, buffer, bufferLen);
	ringBufferEnqueue(txQueue, endpoint);
	advanceTxQueue();
}
示例#4
0
static void sendControl(void* buffer, int bufferLen) {
	usbTxRx(USB_CONTROLEP, USBIn, USBControl, buffer, bufferLen);
	ringBufferEnqueue(txQueue, USB_CONTROLEP);
	advanceTxQueue();
}