📄 isr.c
字号:
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 + -