⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr.c

📁 飞利浦公司usb2.0芯片isp1581的通用驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
void Isr_Ep00TxDone(unsigned char nosetup)
{
	short i;
	UCHAR ep_last;
	unsigned long offset;
	unsigned short far *fp;
	unsigned short seg, off;
#ifdef debug
//	cprintf("Interrupt function = x%xh, x%xh\n", * ControlData.Addr.pData, (ControlData.Addr.pData + ControlData.wCount));
#endif

	ISP1581_IntClearl(int_ep0tx);
	switch (bISP1581flags.bits.DCP_state)
	{
	case USBFSM4DCP_CONTROLREADHANDSHAKE:
		ISP1581_ControlReadHandshake();
		bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
#ifdef debug
		cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
		break;
	case USBFSM4DCP_CONTROLWRITEHANDSHAKE:
// Set feature for test Mode;
		if(bISP1581flags.bits.testmodeen == 1)
		{
			bISP1581flags.bits.testmodeen = 0;
				switch(bISP1581flags.bits.testmode)
				{
					case USB_FEATURE_TEST_J: // force high speed j state
					{	cprintf("\r\nTest Mode J State\r\n");
						ISP1581_SetTestMode(testmode_jstate|testmode_forcehs);
						break;
					}
					case USB_FEATURE_TEST_K: // force high speed k state
					{	cprintf("\r\nTest Mode K State\r\n");
						ISP1581_SetTestMode(testmode_kstate|testmode_forcehs);
						break;
					}
					case USB_FEATURE_TEST_SE0_NAK:
					{	cprintf("\r\nTest Mode SE0NAK\r\n"); // force high speed nak for IN-token;
						ISP1581_SetTestMode(testmode_se0nak|testmode_forcehs);
						break;
					}
					case USB_FEATURE_TEST_Packet:
					{	cprintf("\r\nTest Mode Packet\r\n"); // force high speed send test packet
						ISP1581_WriteControlEndpoint((PUCHAR)&bTestPacket, sizeof(USB_TESTPACKET));
						ISP1581_SetTestMode(testmode_prbs|testmode_forcehs);
						break;
					}
				}
		}
		bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
#ifdef debug
		cprintf("^_^%hx2", bISP1581flags.bits.DCP_state);
#endif
		// setup for bulk in transfer, this is to fix the bug that there could not be any other endpoint
		// operation inbetween the control transfer (setup.. data out.. in stage).
/*		if(bISP1581flags.bits.Vendor_CMD == BULKIN_Set)
		{
			offset = (((unsigned long)ioRequest.bAddressH)<<16)	+ ioRequest.uAddressL;
			ioBuffer = dmaBuffer + offset;
			seg = (ioBuffer + globe_variable.ioINCount)>>4;
			off = (ioBuffer + globe_variable.ioINCount)&0xf;
			fp = MK_FP(seg, off);
			ISP1581_WriteBulkEndpoint(bulkinendpointindex, fp, 64);
			globe_variable.ioINCount += 64;
			bISP1581flags.bits.Vendor_CMD = BULKIN_Idle;
		}
*/		break;
	case USBFSM4DCP_DATAIN:
			i = ControlData.wLength - ControlData.wCount;
		if( i >= EP0_PACKET_SIZE)
		{
			ISP1581_WriteControlEndpoint(ControlData.Addr.pData + ControlData.wCount, EP0_PACKET_SIZE);
			ControlData.wCount += EP0_PACKET_SIZE;
			bISP1581flags.bits.DCP_state = USBFSM4DCP_DATAIN;
#ifdef debug
			cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
			// State remains at USBFSM4DCP_DATAIN
		}
		else if( i != 0)
		{
			ISP1581_WriteControlEndpoint(ControlData.Addr.pData + ControlData.wCount, i);
			ControlData.wCount += i;
			// Go to Handshake state, let HOST send 0-length Pkt.
			bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
#ifdef debug
			cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
			LowerIRQL();
		}
		else if (i == 0)
		{
			// Go to Handshake state, let HOST send 0-length Pkt.
			// Jiang Qian apend 0 length pkt,
			ISP1581_WriteControlEndpoint(0, 0);
			bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
#ifdef debug
			cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
		}
		break;
	case USBFSM4DCP_REQUESTPROC1:
		{
			bISP1581flags.bits.CONTROL_HANDLE_DONE = 1;
			bISP1581flags.bits.DCP_state = USBFSM4DCP_REQUESTPROC;
#ifdef debug
			cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
			break;
		}
	case USBFSM4DCP_STALL:
		{
			bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
#ifdef debug
			cprintf("^_^%hx3", bISP1581flags.bits.DCP_state);
#endif
			break;
		}
	case USBFSM4DCP_REQUESTPROC:
	case USBFSM4DCP_SETUPPROC:
	case USBFSM4DCP_DATAOUT:
	case USBFSM4DCP_IDLE:
	default:
// do nothing, maybe just 1st nak for control in.
		if(nosetup)
		{
			ISP1581_StallEP0InControlRead();
			bISP1581flags.bits.DCP_state = USBFSM4DCP_STALL;
#ifdef debug
			cprintf("^_^%hxINTIN", bISP1581flags.bits.DCP_state);
#endif
			//			key2go();
		}
		break;
	}
}


void Isr_Ep01rxDone(void)
{
	if(bISP1581flags.bits.dma_endpoint  == bulkoutendpointindex)
	{
#ifdef debug
		cprintf("endpoint configured dma out");
#endif
		return;
	}
	ISP1581_IntClearl(int_ep1rx);
	receive_bulkendpoint(bulkoutendpointindex);
}


void Isr_Ep01txDone(void)
{
	if(bISP1581flags.bits.dma_endpoint == EPINDEX4EP01IN)//bulkinendpointindex)
	{
#ifdef debug
		cprintf("endpoint configured dma in");
#endif
		return;
	}
	ISP1581_IntClearl(int_ep1tx);
	if(bISP1581flags.bits.BULKIN_EP1_STALL == 1)
	{
#ifdef debug
		cprintf("bulk in stalled, still get interrupt?");
#endif
		bISP1581flags.bits.BULKIN_EP1_STALL = 0;
		return;
	}
	transmit_bulkendpoint(bulkinendpointindex);
}

void Isr_Ep02rxDone(void)
{
	if(bISP1581flags.bits.dma_endpoint  == bulkoutendpointindex)
	{
#ifdef debug
		cprintf("endpoint configured dma out");
#endif
		return;
	}
	ISP1581_IntClearl(int_ep2rx);
	receive_bulkendpoint(bulkoutendpointindex);

	if(bISP1581flags.bits.BULKIN_EP1_STALL == 1)
	{
#ifdef debug
		cprintf("bulk in stalled, still get interrupt?");
#endif
		bISP1581flags.bits.BULKIN_EP1_STALL = 0;
		return;
	}
}

void Isr_Ep02txDone(void)
{
	if(bISP1581flags.bits.dma_endpoint == bulkinendpointindex)
	{
#ifdef debug
		cprintf("endpoint configured dma in");
#endif
		return;
	}
	ISP1581_IntClearl(int_ep2tx);
	if(bISP1581flags.bits.BULKIN_EP1_STALL == 1)
	{
#ifdef debug
		cprintf("bulk in stalled, still get interrupt?");
#endif
		bISP1581flags.bits.BULKIN_EP1_STALL = 0;
		return;
	}
	transmit_bulkendpoint(bulkinendpointindex);
}

void Isr_Ep03rxDone(void)
{
	unsigned short far *fp;
	unsigned short seg, off;
	unsigned short length;
#ifdef debug
	cprintf("iso out interrupt");
#endif
	ISP1581_IntClearh(int_ep3rx);
	seg = (isoBuffer + globe_variable.isoOUTCount)>>4;
	off = (isoBuffer + globe_variable.isoOUTCount)&0xf;
	fp = MK_FP(seg, off);
	length = globe_variable.isoOUTSize - globe_variable.isoOUTCount;
	if(length <= 256)
	{
#ifdef debug
			cprintf("start to iso loop back\r\n");
#endif
			if(length <= 256)
			{
				length = ISP1581_ReadISOEndpoint(EPINDEX4EP03OUT, fp);
				globe_variable.isoOUTCount += length;
				bISP1581flags.bits.ISO_state = ISO_IDLE;
			}
			else
			{
				length = ISP1581_ReadISOEndpoint(EPINDEX4EP03OUT, fp);
				globe_variable.isoOUTCount += 256;
				bISP1581flags.bits.ISO_state = ISO_OUT;
			}
	}
//	else
//		bISP1581flags.bits.ISO_state == ISO_IDLE;

/*	if(length < 256)
	{
		if(bISP1581flags.bits.ISO_state == ISO_LOOP)
		{
#ifdef debug
			cprintf("start to iso loop back\r\n");
#endif
			globe_variable.isoINCount = 0;
			seg = (isoBuffer + globe_variable.isoINCount)>>4;
			off = (isoBuffer + globe_variable.isoINCount)&0xf;
			fp = MK_FP(seg, off);
			length = globe_variable.isoINSize - globe_variable.isoINCount;
			if(length <= 256)
			{
				ISP1581_WriteISOEndpoint(EPINDEX4EP03IN, fp, length);
				globe_variable.isoINCount += length;
				bISP1581flags.bits.ISO_state = ISO_IDLE;
			}
			else
			{
				ISP1581_WriteISOEndpoint(EPINDEX4EP03IN, fp, 256);
				globe_variable.isoINCount += 256;
				bISP1581flags.bits.ISO_state = ISO_IN;
			}
		}
	}
	else
		bISP1581flags.bits.ISO_state == ISO_IDLE;
*/
}

void Isr_Ep03txDone(void)
{
	unsigned short far *fp;
	unsigned short seg, off;
	unsigned short length;
	ISP1581_IntClearh(int_ep3tx);
	if(bISP1581flags.bits.ISO_state != ISO_IDLE)
	{
		seg = (isoBuffer + globe_variable.isoINCount)>>4;
		off = (isoBuffer + globe_variable.isoINCount)&0xf;
		fp = MK_FP(seg, off);
		length = globe_variable.isoINSize - globe_variable.isoINCount;
		if(length == 0)
		{
			bISP1581flags.bits.ISO_state = ISO_IDLE;

		}
		else if(length <= 256)
		{
			ISP1581_WriteISOEndpoint(EPINDEX4EP03IN, fp, length);
			globe_variable.isoINCount += length;
			bISP1581flags.bits.ISO_state = ISO_IDLE;
		}
		else
		{
			ISP1581_WriteISOEndpoint(EPINDEX4EP03IN, fp, 256);
			globe_variable.isoINCount += 256;
			bISP1581flags.bits.ISO_state = ISO_IN;
		}
	}
//	else
//		bISP1581flags.bits.ISO_state == ISO_IDLE;
}

void Isr_Ep04rxDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP07); /* Clear interrupt flag */
}
void Isr_Ep04txDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP08); /* Clear interrupt flag */
}
void Isr_Ep05rxDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP09); /* Clear interrupt flag */
}
void Isr_Ep05txDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP0A); /* Clear interrupt flag */
}
void Isr_Ep06rxDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP0B); /* Clear interrupt flag */
}
void Isr_Ep06txDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP0C); /* Clear interrupt flag */
}
void Isr_Ep07rxDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP0D); /* Clear interrupt flag */
}
void Isr_Ep07txDone(void)
{
	UCHAR  c;
//	c = ISP1581_GetEndpointStatusWInteruptClear(EPINDEX4EP0E); /* Clear interrupt flag */
}

void receive_bulkendpoint(unsigned char bEPINDEX)
{
	unsigned short len;
	unsigned short far *fp;
	unsigned short seg, off;

	seg = (ioBuffer + globe_variable.ioOUTCount)>>4;
	off = (ioBuffer + globe_variable.ioOUTCount)&0xf;
	fp = MK_FP(seg, off);

		if (globe_variable.ioOUTCount <= globe_variable.ioOUTSize)
		{
			if((globe_variable.ioOUTSize-globe_variable.ioOUTCount) > globe_variable.maxepsize_bulk)
				len = globe_variable.maxepsize_bulk;
			else
				len = globe_variable.ioOUTSize - globe_variable.ioOUTCount;
		}
		else
			len = 0;

		globe_variable.ioOUTCount += ISP1581_ReadBulkEndpoint(bEPINDEX, fp, len);

	if(globe_variable.ioOUTCount >= globe_variable.ioOUTSize)
		bISP1581flags.bits.dma_state = DMA_IDLE;
#ifdef debug1
		cprintf("dma_state OUT %x ",bISP1581flags.bits.dma_state);
#endif
}

void transmit_bulkendpoint(unsigned char bEPINDEX)
{	
	unsigned short len;
	unsigned short far *fp;
	unsigned short seg, off;

	seg = (ioBuffer + globe_variable.ioINCount)>>4;
	off = (ioBuffer + globe_variable.ioINCount)&0xf;
	fp = MK_FP(seg, off);

	if(globe_variable.ioINSize >= globe_variable.ioINCount)
		len = globe_variable.ioINSize - globe_variable.ioINCount;

	if(len == 0 && bISP1581flags.bits.dma_state == DMA_IN_DONE)
	{
		bISP1581flags.bits.dma_state = DMA_IDLE;
#ifdef debug1
		cprintf("dma_state ECHO %x ",bISP1581flags.bits.dma_state);
#endif
#ifdef debug
		cprintf("DONE");
#endif
		return;
	}
	else if(len > globe_variable.maxepsize_bulk)
	{
		ISP1581_WriteBulkEndpoint(bEPINDEX, fp, globe_variable.maxepsize_bulk);
		globe_variable.ioINCount += globe_variable.maxepsize_bulk;
//		bISP1581flags.bits.dma_state = DMA_PIO;
	}
	else if(len > 0)// && bISP1581flags.bits.dma_state == DMA_PIO)
	{
		ISP1581_WriteBulkEndpoint(bEPINDEX, fp, len);
		globe_variable.ioINCount += len;
		bISP1581flags.bits.dma_state = DMA_IN_DONE;
#ifdef debug1
		cprintf("dma_state IN %x ",bISP1581flags.bits.dma_state);
#endif
#ifdef debug
		cprintf("last packet, len = %x", len);
#endif
	}
}
/*
//*********************************************************************
// supporting Functions
//*********************************************************************
*/



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -