📄 isr.c
字号:
#include "stdio.h"
#include "HAL.H"
//#include "USBD12.H"
#include "SMPro.H"
//#include "USB110.H"
#include "USB.H"
#include "VDOR.H"
#include "Isp1581.h"
#include "main.h"
#include "Isr.h"
#include "Iso.h"
//#include "Hal4sys.h"
#include <AT89X52.H>
/*
//*************************************************************************
// Public static data
//*************************************************************************
*/
extern ZBOARDFLAGS bZBoardFlags;
extern CONTROL_XFER ControlData;
extern GLOBE_VARIABLE globe_variable;
extern IO_REQUEST idata ioRequest;
unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
/* ISR static vars */
unsigned long lClockTicks = 0;
unsigned char dmanum=0;
extern bit writeramflag;
extern unsigned char writeramlen;
/*
void ISR_Timer2(void) interrupt 5
{
}
void ISR_COMM(void) interrupt 4
{
}
void ISR_Timer1(void) interrupt 3
{
}
void ISR_INT1(void) interrupt 2
{
}
*/
void ISR_Timer0(void) interrupt 1
{
DISABLE_INTERRUPTS;
lClockTicks ++;
bZBoardFlags.bits.bTimer = 1;
ENABLE_INTERRUPTS;
}
void ISR_INT0(void) interrupt 0
{
DISABLE_INTERRUPTS;
ISRx_FN_USB();
ENABLE_INTERRUPTS;
}
/*void ISR_timer1(void) interrupt 3
{
DISABLE_INTERRUPTS;
T1=0;
T1=1;
//MCU_LED0=!MCU_LED0;
//dmanum+=1;
//TF1=0;
ENABLE_INTERRUPTS;
}*/
void ISRx_FN_USB()
{
//unsigned int nST;
USHORT int_low, int_high;
unsigned char nosetup;
//bZBoardFlags.bits.bIN_ISR = 1;
bZBoardFlags.bits.At_IRQL1 = 1;
int_low = ISP1581_ReadInterruptRegisterLow();
int_high = ISP1581_ReadInterruptRegisterHigh();
if(int_low != 0 || int_high != 0)
{
if(int_low & int_busreset)
{
ISP1581_IntClearl(int_busreset);
if(int_low & int_hs_stat)
{
bZBoardFlags.bits.ConnectSpeed = HighSpeed;
bZBoardFlags.bits.bBus_Reset = 1;
int_low &= ~int_hs_stat;
ISP1581_IntClearl(int_hs_stat);
}
else
{
bZBoardFlags.bits.ConnectSpeed = FullSpeed;
bZBoardFlags.bits.bBus_Reset = 1;
MCU_LED1 = 1;
}
}
if(int_low & int_hs_stat)
{
ISP1581_IntClearl(int_hs_stat);
if(bZBoardFlags.bits.ConnectSpeed == FullSpeed)
{
bZBoardFlags.bits.ConnectSpeed = HighSpeed;
bZBoardFlags.bits.bBus_Reset = 1;
MCU_LED1 = 0;
}
}
else if(int_low & int_susp)
{Isr_SuspendChange();}
else if(int_low & int_resume)
{Isr_Resume();}
else if(int_low & int_dma)
{Isr_DmaEot();}
else if(int_low & (int_sof|int_psof))
{Isr_SOF();}
else {
if(int_low & int_ep0set)
{nosetup = 0x0;}
else
{nosetup = 0x1;}
if(int_low & int_ep1rx)
Isr_Ep01rxDone();
if(int_low & int_ep1tx)
Isr_Ep01txDone();
if(int_low & int_ep2rx)
Isr_Ep02rxDone();
if(int_low & int_ep2tx)
Isr_Ep02txDone();
if(int_high & int_ep3rx)
Isr_Ep03rxDone();
if(int_high & int_ep3tx)
Isr_Ep03txDone();
// *************************** Control pipe *******************************
if(int_low & int_ep0tx)
Isr_Ep00TxDone(nosetup);
if(int_low & int_ep0rx) /*Keep Control Out of EP0 at Highest priority*/
Isr_Ep00RxDone(nosetup);
if(nosetup == 0)
Isr_EP0Setup();
//**************************** not used endpoints*************************
if(int_high & int_ep4rx)
Isr_Ep04rxDone();
if(int_high & int_ep4tx)
Isr_Ep04txDone();
}
}
bZBoardFlags.bits.At_IRQL1 = 0;
}
///////////////////////////////////////////////////////////////////////////
void Isr_SuspendChange(void)
{
ISP1581_IntClearl(int_susp);
ISP1581_GoSuspend();
}
void Isr_Resume(void)
{
ISP1581_UnlockDevice();
ISP1581_SendResume();
ISP1581_IntClearl(int_resume);
}
void Isr_DmaEot(void)
{
unsigned short dmaeot_reason;// dma_width16, isp1581_dma_counter_remains;
//unsigned int c;
dmaeot_reason = ISP1581_GetDMAInt();
ISP1581_SetDMAInt(dmaeot_reason);//clear DMA interrupt ;
ISP1581_IntClearl(int_dma);
//CPLD_ctl(dmactl_stop);
//ISP1581_SetDMACMD(dmacmd_reset);
//ISP1581_SetDMAIntMask(0);
//c = ISP1581_GetIntEnableLow();
//ISP1581_SetIntEnableLow(c|bulkinendpointinterrupt|bulkoutendpointinterrupt);
//清除中断标志
MCU_LED1=!MCU_LED1;
bZBoardFlags.bits.dma_state = DMA_IDLE;
}
//true iso
void Isr_SOF(void)
{
ISP1581_IntClearl(int_sof|int_psof);
}
void Isr_EP0Setup(void)
{
// Getting Setup Packet
ISP1581_IntClearl(int_ep0set);
SetupToken_Handler();
}
void Isr_Ep00RxDone(unsigned char nosetup)
{
UCHAR i;
unsigned short len;
//ISP1581_IntClearl(int_ep0rx);
switch (bZBoardFlags.bits.DCP_state)
{
case USBFSM4DCP_DATAOUT:
if(ControlData.wLength >= ControlData.wCount)
len = ControlData.wLength - ControlData.wCount;
else
len = 0x0;
i =ISP1581_ReadControlEndpoint(ControlData.dataBuffer + ControlData.wCount, len);
ControlData.wCount += i;
if(ControlData.wCount <= ControlData.wLength && i <= EP0_PACKET_SIZE)
{
bZBoardFlags.bits.CONTROL_HANDLE_DONE = 1;
bZBoardFlags.bits.DCP_state = USBFSM4DCP_REQUESTPROC;
}
else // too much data out than expected
{
if(nosetup)
{
ISP1581_StallEP0InControlWrite();
bZBoardFlags.bits.DCP_state = USBFSM4DCP_STALL;
}
}
ISP1581_IntClearl(int_ep0rx);
break;
case USBFSM4DCP_CONTROLREADHANDSHAKE:
bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
ISP1581_IntClearl(int_ep0rx);
break;
case USBFSM4DCP_IDLE:
bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
if(nosetup)
{//MCU_LED0 = 0;
ISP1581_IntClearl(int_ep0rx);}
break;
case USBFSM4DCP_STALL:
if(nosetup)
ISP1581_IntClearl(int_ep0rx);
break;
default:
if(nosetup)
{
ISP1581_StallEP0InControlWrite();
bZBoardFlags.bits.DCP_state = USBFSM4DCP_STALL;
}
break;
}
}
void Isr_Ep00TxDone(unsigned char nosetup)
{
short i;
ISP1581_IntClearl(int_ep0tx);
switch (bZBoardFlags.bits.DCP_state)
{
case USBFSM4DCP_CONTROLREADHANDSHAKE:
ISP1581_ControlReadHandshake();
bZBoardFlags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
break;
case USBFSM4DCP_CONTROLWRITEHANDSHAKE:
bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
break;
case USBFSM4DCP_DATAIN:
i = ControlData.wLength - ControlData.wCount;
if( i >= EP0_PACKET_SIZE)
{
ISP1581_WriteControlEndpoint(ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
bZBoardFlags.bits.DCP_state = USBFSM4DCP_DATAIN;
}
else if( i != 0)
{
ISP1581_WriteControlEndpoint(ControlData.pData + ControlData.wCount, i);
ControlData.wCount += i;
bZBoardFlags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
}
else if (i == 0)
{
ISP1581_WriteControlEndpoint(0, 0);
bZBoardFlags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
}
break;
case USBFSM4DCP_STALL:
bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
break;
case USBFSM4DCP_IDLE:
//MCU_LED0=0;
break;
case USBFSM4DCP_REQUESTPROC:
break;
case USBFSM4DCP_SETUPPROC:
break;
case USBFSM4DCP_DATAOUT:
break;
default:
// do nothing, maybe just 1st nak for control in.
if(nosetup)
{
//MCU_LED0=0;
ISP1581_StallEP0InControlRead();
bZBoardFlags.bits.DCP_state = USBFSM4DCP_STALL;
}
break;
}
}
void Isr_Ep01rxDone(void)
{
unsigned short len;
ISP1581_IntClearl(int_ep1rx);
len= ISP1581_ReadBulkEndpoint(EPINDEX4EP01OUT,GenEpBuf,EP1_PACKET_SIZE);
writeramflag=1; //7.25
writeramlen=len;
}
void Isr_Ep01txDone(void)
{
ISP1581_IntClearl(int_ep1tx);
}
void Isr_Ep02rxDone(void)
{
unsigned short len;
ISP1581_IntClearl(int_ep2rx);
len= ISP1581_ReadBulkEndpoint(EPINDEX4EP02OUT,GenEpBuf,maxepsize_FS);
}
void Isr_Ep02txDone(void)
{
ISP1581_IntClearl(int_ep2tx);
}
void Isr_Ep03rxDone(void)
{
ISP1581_IntClearh(int_ep3rx);
}
void Isr_Ep03txDone(void)
{
ISP1581_IntClearh(int_ep3tx);
}
void Isr_Ep04rxDone(void)
{
unsigned short len;
ISP1581_IntClearh(int_ep4rx);
len= ISP1581_ReadBulkEndpoint(EPINDEX4EP04OUT,GenEpBuf,EP4_PACKET_SIZE);
ioRequest.bCommand=GenEpBuf[0];
bZBoardFlags.bits.bLED = 1;
}
void Isr_Ep04txDone(void)
{
ISP1581_IntClearh(int_ep4tx);
}
///////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -