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

📄 interrupt.c

📁 2440超级bios(ads1.2 rvds2.2)通用
💻 C
字号:
#ifndef __INTERRUPT_C__
#define __INTERRUPT_C__

#include "Includes.h"

#define CLR_EP3_OUT_PKT_READY() rOUT_CSR1_REG = \
								( out_csr3 &(~ EPO_WR_BITS)\
								&(~EPO_OUT_PKT_READY) ) 
#define SET_EP3_SEND_STALL()	rOUT_CSR1_REG = \
								( out_csr3 & (~EPO_WR_BITS)\
								| EPO_SEND_STALL) )
#define CLR_EP3_SENT_STALL()	rOUT_CSR1_REG= \
								( out_csr3 & (~EPO_WR_BITS)\
								&(~EPO_SENT_STALL) )
#define FLUSH_EP3_FIFO() 		rOUT_CSR1_REG = \
								( out_csr3 & (~EPO_WR_BITS)\
								|EPO_FIFO_FLUSH) )

void ClrPending(int bit)
{
	register i;
	
	rSRCPND = bit;
	rINTPND = bit;
	i = rINTPND;
}
void ClrSubPending(int bit)
{
	register i;
	
	rSUBSRCPND = bit;
	i = rINTPND;
}                       
void HaltUndef(void)
{
	while(1);
}
void HaltSwi(void)
{
    while(1);
}
void HaltPabort(void)
{
    while(1);
}
void HaltDabort(void)
{
    while(1);
}
void __irq Irq_eint0(void)
{
    rSRCPND = BIT_EINT0;
    rINTPND = BIT_EINT0;
    rINTPND;
	bitflags.bits.irq_eint0 = 1;
}
void __irq Irq_eint1(void)
{
    rSRCPND = BIT_EINT1;
    rINTPND = BIT_EINT1;
    rINTPND;
	bitflags.bits.irq_eint1 = 1;
}
void __irq Irq_eint2(void)
{
    rSRCPND = BIT_EINT2;
    rINTPND = BIT_EINT2;
    rINTPND;
	bitflags.bits.irq_eint2 = 1;
}
void __irq Irq_eint3(void)
{
    rSRCPND = BIT_EINT3;
    rINTPND = BIT_EINT3;
    rINTPND;
	bitflags.bits.irq_eint3 = 1;
}
void __irq Irq_eint4_7(void)
{
	bitflags.bits.irq_eint4_7 = 1;
}
void __irq Irq_eint8_23(void)
{
	bitflags.bits.irq_eint8_23 = 1;
}
void __irq Irq_cam(void)
{
	bitflags.bits.irq_cam = 1;
}
void __irq Irq_batt_flt(void)
{
	bitflags.bits.irq_batt_flt = 1;
}
void __irq Irq_tick(void)
{
    rSRCPND = BIT_RTC;
    rINTPND = BIT_RTC;
    rINTPND;
	UartPrintf(SHL_PRT,"tick\n");
	bitflags.bits.irq_tick = 1;
}
void __irq Irq_wdt_ac97(void)
{
	bitflags.bits.irq_wdt_ac97 = 1;
}
void __irq Irq_timer0(void)
{
    rSRCPND = BIT_TIMER0;       //Clear pending bit
    rINTPND = BIT_TIMER0;
    rINTPND;                    //Prevent an double interrupt pending
	bitflags.bits.irq_timer0 = 1;
}
void __irq Irq_timer1(void)
{
    rSRCPND = BIT_TIMER1;       //Clear pending bit
    rINTPND = BIT_TIMER1;
    rINTPND;
	bitflags.bits.irq_timer1 = 1;	
}
void __irq Irq_timer2(void)
{
    rSRCPND = BIT_TIMER2;       //Clear pending bit
    rINTPND = BIT_TIMER2;
    rINTPND;
	bitflags.bits.irq_timer2 = 1;
}
void __irq Irq_timer3(void)
{
    rSRCPND = BIT_TIMER3;       //Clear pending bit
    rINTPND = BIT_TIMER3;
    rINTPND;
	bitflags.bits.irq_timer3 = 1;
}
void __irq Irq_timer4(void)
{
    rSRCPND = BIT_TIMER4;       //Clear pending bit
    rINTPND = BIT_TIMER4;
    rINTPND;
	bitflags.bits.irq_timer4 = 1;
}
void __irq Irq_uart2(void)
{
    ClrSubPending(BIT_SUB_RXD2);
    ClrPending(BIT_UART2);
	if (rUTRSTAT2 & 0x1)
	{
		// Receive data ready
		qUart0_R_buf[qUart0_R_len] = RdURXH2();
		if(qUart0_R_len < UART0_R_MAX)
			qUart0_R_len++;
		else
			qUart0_R_len = 0;
		bitflags.bits.irq_uart2 = 1;
	}
}
void __irq Irq_lcd(void)
{
	bitflags.bits.irq_lcd = 1;
}
void __irq Irq_dma0(void)
{
	bitflags.bits.irq_dma0 = 1;
}
void __irq Irq_dma1(void)
{
	bitflags.bits.irq_dma1 = 1;
}
void __irq Irq_dma2(void)
{
    U08 out_csr3;
    U32 nextTotalDmaCount;
    U08 saveIndexReg = rINDEX_REG;

    rINDEX_REG = 3;
    out_csr3 = rOUT_CSR1_REG;
    ClearPending(BIT_DMA2);
    totalDmaCount += 0x80000;
    if(totalDmaCount >= downloadFileSize)// is last?
    {
		totalDmaCount = downloadFileSize;
    	ConfigEp3IntMode();
    	if(out_csr3& EPO_OUT_PKT_READY)
	   	    CLR_EP3_OUT_PKT_READY();
        rINTMSK |= BIT_DMA2;
        rINTMSK &= ~(BIT_USBD);
    }
    else
    {
    	if((totalDmaCount+0x80000) < downloadFileSize)
    	{
		    nextTotalDmaCount = totalDmaCount+0x80000;
    	    if((nextTotalDmaCount+0x80000) < downloadFileSize)	//for (2~n)th autoreload
    	    {
				rDIDST2 = ((U32)downloadAddress+nextTotalDmaCount-8);
				rDIDSTC2 = (1<<2)|(0<<1)|(0<<0);
	        	rDCON2 = rDCON2&~(0xfffff)|(0x80000);
    	    	while(rEP3_DMA_TTC < 0xfffff)
    	    	{
    	    	    rEP3_DMA_TTC_L = 0xff;
    	    	    rEP3_DMA_TTC_M = 0xff;
    	    	    rEP3_DMA_TTC_H = 0xf;
    	    	}
	   	    }
 		    else
 		    {
   	    	    rDIDST2= ((U32)downloadAddress+nextTotalDmaCount-8);
	      	    rDIDSTC2 = (0<<1) | (0<<0);
    	  	    rDCON2= rDCON2&~(0xfffff)|(downloadFileSize-nextTotalDmaCount);
   	    		while(rEP3_DMA_TTC < 0xfffff)
   	    		{
   	    		    rEP3_DMA_TTC_L = 0xff;
   	    	    	rEP3_DMA_TTC_M = 0xff;
	   	    	    rEP3_DMA_TTC_H = 0xf;
   		    	}
	    	}
		}
		else
  	    	rDIDSTC2 = (0<<1)|(0<<0);  // reload is occurred when Curr_TC is 0
    }
    rINDEX_REG = saveIndexReg;
	bitflags.bits.irq_dma2 = 1;
}
void __irq Irq_dma3(void)
{
	bitflags.bits.irq_dma3 = 1;
}
void __irq Irq_sdi(void)
{
	bitflags.bits.irq_sdi = 1;
}
void __irq Irq_spi0(void)
{
	bitflags.bits.irq_spi0 = 1;
}
void __irq Irq_uart1(void)
{
    ClrSubPending(BIT_SUB_RXD1);
    ClrPending(BIT_UART1);
	// Receive data ready
	qUart1_R_buf[qUart1_R_len] = RdURXH1();
	if(qUart1_R_len < UART1_R_MAX)
		qUart1_R_len++;
	else
		qUart0_R_len = 0;
	bitflags.bits.irq_uart1 = 1;
}
void __irq Irq_nfcon(void)
{
	bitflags.bits.irq_nfcon = 1;
}
void __irq Irq_usbd(void)
{
    U08 usbdIntpnd,epIntpnd;
    U08 saveIndexReg = rINDEX_REG;
    
    usbdIntpnd = rUSB_INT_REG;
    epIntpnd = rEP_INT_REG;
    if(usbdIntpnd & SUSPEND_INT)
    	rUSB_INT_REG = SUSPEND_INT;
    if(usbdIntpnd & RESUME_INT)
    	rUSB_INT_REG = RESUME_INT;
    if(usbdIntpnd & RESET_INT)
    {
    	ReconfigUsbd();
    	rUSB_INT_REG = RESET_INT;  // RESET_INT should be cleared after ResetUsbd().   	
        PrepareEp1Fifo();
    }
    if(epIntpnd&EP0_INT)
    {
		rEP_INT_REG = EP0_INT;
    	Ep0Handler();
    }
    if(epIntpnd&EP1_INT)
    {
    	rEP_INT_REG = EP1_INT;
    	Ep1Handler();
    }
    if(epIntpnd&EP2_INT)
    {
    	rEP_INT_REG = EP2_INT;  
    	//Ep2Handler();
    }
    if(epIntpnd&EP3_INT)
    {
    	rEP_INT_REG = EP3_INT;
    	Ep3Handler();
    }
    if(epIntpnd&EP4_INT)
    {
    	rEP_INT_REG = EP4_INT;
    	//Ep4Handler();
    }
    ClearPending(BIT_USBD);
    
    rINDEX_REG = saveIndexReg;
	bitflags.bits.irq_usbd = 1;
}
void __irq Irq_usbh(void)
{
	bitflags.bits.irq_usbh = 1;
}
void __irq Irq_iic(void)
{
	bitflags.bits.irq_iic = 1;
}
void __irq Irq_uart0(void)
{
    ClrSubPending(BIT_SUB_RXD0);
    ClrPending(BIT_UART0);
	// Receive data ready
	qUart0_R_buf[qUart0_R_len] = RdURXH0();
	if(qUart0_R_len < UART0_R_MAX)
		qUart0_R_len++;
	else
		qUart0_R_len = 0;
	bitflags.bits.irq_uart0 = 1;
}
void __irq Irq_spi1(void)
{
	bitflags.bits.irq_spi1 = 1;
}
void __irq Irq_rtc(void)
{
    rSRCPND = BIT_RTC;
    rINTPND = BIT_RTC;
    rINTPND;
	UartPrintf(SHL_PRT,"rtc\n");
	bitflags.bits.irq_rtcint = 1;
}
void __irq Irq_adc(void)
{
	int i;

    if(rADCDAT0 & 0x8000)
    {
		UartPrintf(1,"\nStylus Up!\n");
		rADCTSC &= 0x00ff;					//Set stylus down interrupt bit
    }
    else
		UartPrintf(1,"\nStylus Down!\n");
	rADCTSC = (1<<3)|(1<<2);				//Pull-up disable, Seq. X,Y postion measure.
	rADCDLY = 40000;						//Normal conversion mode delay about (1/50M)*40000=0.8ms
	rADCCON |= 0x1;							//start ADC

	while(rADCCON & 0x1);					//check if Enable_start is low
	while(!(rADCCON & 0x8000));				//check if EC(End of Conversion) flag is high, This line is necessary~!!
	while(!(rSRCPND & (BIT_ADC)));			//check if ADC is finished with interrupt bit
    xdata = (rADCDAT0 & 0x3ff);
    ydata = (rADCDAT1 & 0x3ff);
	
	rSUBSRCPND |= BIT_SUB_TC;				//YH 0627, To check Stylus Up Interrupt.
	ClrPending(BIT_ADC);
			 
	rADCTSC = 0xd3;							//Waiting for interrupt
	rADCTSC = rADCTSC|(1<<8);				//Detect stylus up interrupt signal.
	while(1)								//to check Pen-up state
	{
		if(rSUBSRCPND & (BIT_SUB_TC))		//check if ADC is finished with interrupt bit
		{
			UartPrintf(1,"Stylus Up Int!\n");
			break;							//if Stylus is up(1) state
		}
	}	
    UartPrintf(1,"XP=%04d,YP=%04d\n",xdata,ydata); //X-position Conversion data            
	rADCTSC = rADCTSC&~(1<<8);				//Detect stylus Down interrupt signal.
    rSUBSRCPND |= BIT_SUB_TC;
    ClrPending(BIT_ADC);
	//bitflags.bits.irq_adc_ts = 1;
}
void Isr_init(void)
{
    rINTMOD		= 0x0;					//All=IRQ mode
    rINTMSK		= BIT_ALLMSK;			//All interrupt is masked.
    rINTSUBMSK  = BIT_SUB_ALLMSK;		//All sub-interrupt is masked. <- April 01, 2002 SOP

    pISR_UNDEF		= (U32)HaltUndef;
    pISR_SWI		= (U32)HaltSwi;
    pISR_PABORT		= (U32)HaltPabort;
    pISR_DABORT		= (U32)HaltDabort;

	pISR_EINT0		= (U32)Irq_eint0;
	pISR_EINT1		= (U32)Irq_eint1;
	pISR_EINT2		= (U32)Irq_eint2;
	pISR_EINT3		= (U32)Irq_eint3;
	pISR_EINT4_7	= (U32)Irq_eint4_7;
	pISR_EINT8_23	= (U32)Irq_eint8_23;
	pISR_CAM		= (U32)Irq_cam;
	pISR_BAT_FLT	= (U32)Irq_batt_flt;
	pISR_TICK		= (U32)Irq_tick;
	pISR_WDT_AC97	= (U32)Irq_wdt_ac97;
	pISR_TIMER0		= (U32)Irq_timer0;
	pISR_TIMER1		= (U32)Irq_timer1;
	pISR_TIMER2		= (U32)Irq_timer2;
	pISR_TIMER3		= (U32)Irq_timer3;
	pISR_TIMER4		= (U32)Irq_timer4;
	pISR_UART2		= (U32)Irq_uart2;
	pISR_LCD		= (U32)Irq_lcd;
	pISR_DMA0		= (U32)Irq_dma0;
	pISR_DMA1		= (U32)Irq_dma1;
	pISR_DMA2		= (U32)Irq_dma2;
	pISR_DMA3		= (U32)Irq_dma3;
	pISR_SDI		= (U32)Irq_sdi;
	pISR_SPI0		= (U32)Irq_spi0;
	pISR_UART1		= (U32)Irq_uart1;
	pISR_NFCON		= (U32)Irq_nfcon;
	pISR_USBD		= (U32)Irq_usbd;
	pISR_USBH		= (U32)Irq_usbh;
	pISR_IIC		= (U32)Irq_iic;
	pISR_UART0		= (U32)Irq_uart0;
	pISR_SPI1		= (U32)Irq_spi1;
	pISR_RTC		= (U32)Irq_rtc;
    pISR_ADC		= (U32)Irq_adc;
	ClrSubPending(BIT_SUB_RXD0);
	ClrPending(BIT_UART0);
	ClrSubPending(BIT_SUB_RXD1);
	ClrPending(BIT_UART1);
	ClrSubPending(BIT_SUB_RXD2);
	ClrPending(BIT_UART2);
	ClrPending(BIT_DMA2);
	ClrPending(BIT_USBD);

	rINTSUBMSK	= ~(BIT_SUB_RXD2 |
//					BIT_SUB_RXD1 |
					BIT_SUB_RXD0 |
					BIT_SUB_TC);
	rINTMSK		&= EN_TIMER0;
	rINTMSK		&= EN_TIMER1;
	rINTMSK		&= EN_TIMER2;
	rINTMSK		&= EN_TIMER3;
	rINTMSK		&= EN_TIMER4;
	rINTMSK		&= EN_UART0;
//	rINTMSK		&= EN_UART1;
	rINTMSK		&= EN_UART2;
	rINTMSK		&= EN_ADC;
	rINTMSK		&= EN_USBD;
	rINTMSK		&= EN_DMA2;
	rINTMSK		&= EN_TICK;
	rINTMSK		&= EN_RTC;
}

#endif

⌨️ 快捷键说明

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