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

📄 oemintr.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:

    case SYSINTR_ETHER:
		s2410INT->rINTMSK   |= BIT_EINT8_23;
		s2410IOP->rEINTMASK |= 0x200;
        break;        

	case SYSINTR_USB:
		s2410INT->rINTMSK |= BIT_USBH;
		break;
        		
	case SYSINTR_USBD:
		s2410INT->rINTMSK |= BIT_USBD;
		//RETAILMSG(1,(TEXT("::: SYSINTR_USBD    OEMInterruptDisable\r\n")));
		break;
        
	case SYSINTR_POWER:
		s2410INT->rINTMSK |= BIT_EINT0;
		s2410INT->rINTMSK |= BIT_EINT2;
		break;        

	default:
		break;
	}
	
    INTR_ON();	
}

// ********************************************************************
//声明:void OEM_InterruptDone( DWORD idInt )
//参数:
//	IN idInt-逻辑中断号
//返回值:无
//功能描述:当设备驱动程序做完中断处理后,用该函数去让设备继续工作
//引用: 当一个设备驱动程序调用INTR_Done时,由 INTR_Done 调用该函数
// ********************************************************************

void OEM_InterruptDone( DWORD idInt )
{
    INTR_OFF();

	switch (idInt) 
	{
    case SYSINTR_DMA0:
        s2410INT->rINTMSK &= ~BIT_DMA0; // SDIO DMA interrupt
		//RETAILMSG(1,(TEXT("::: SYSINTR_DMA0    OEMInterruptDone\r\n")));
		break;

	case SYSINTR_SDMMC:
		s2410INT->rINTMSK &= ~BIT_MMC;
		//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC    OEMInterruptDone\r\n")));
		break;

	case SYSINTR_SDMMC_SDIO_INTERRUPT:
		s2410INT->rINTMSK &= ~BIT_MMC;
		//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_SDIO_INTERRUPT    OEMInterruptDone\r\n")));
		break;

	case SYSINTR_SDMMC_CARD_DETECT:
		s2410IOP->rEINTMASK &= ~(1 << 18);
		s2410INT->rINTMSK   &= ~BIT_EINT8_23;
		//RETAILMSG(1,(TEXT("::: SYSINTR_SDMMC_CARD_DETECT    OEMInterruptDone\r\n")));
		break;        

    case SYSINTR_TOUCH:
        /*
         * Nothing has to be done here as interrupts are masked and unmasked by the touch
         * handler in the HAL.
         */
		s2410INT->rINTMSK &= ~BIT_TIMER1;
        break;

    case SYSINTR_TOUCH_CHANGED:
		s2410INT->rINTMSK &= ~BIT_TIMER1;
		
        /*
         * Nothing has to be done here as interrupts are masked and unmasked by the touch
         * handler in the HAL.
         */
//		s2410INT->rINTMSK &= ~BIT_ADC;
//		s2410INT->rINTSUBMSK &= ~INTSUB_TC;
		//bTouchSample = TRUE;
		RETAILMSG(1,(TEXT("OEMInterruptDone:TOUCH CHANGED\n\r\n")));
        break;
	case SYSINTR_KEYBOARD:
		s2410INT->rINTMSK &= ~BIT_EINT1;
		break;
/*
	case SYSINTR_SERIAL:
		s2410INT->rINTMSK    &= ~BIT_UART0;
		s2410INT->rINTSUBMSK &= ~INTSUB_RXD0;
		break;

	case SYSINTR_IR:
		s2410INT->rINTMSK    &= ~BIT_UART2;
		s2410INT->rINTSUBMSK &= ~INTSUB_RXD2;
		break;
*/
	case SYSINTR_SERIAL:
		s2410INT->rINTMSK    &= ~BIT_UART0;
#ifdef xyg_ser_sub_mask
		s2410INT->rINTSUBMSK &= ~INTSUB_RXD0;
#endif
	    //RETAILMSG(1,(TEXT(":::SYSINTR_SERIAL OEMInterruptDone\n\r\n")));
		break;
	case SYSINTR_IR:
		s2410INT->rINTMSK    &= ~BIT_UART1;
#ifdef xyg_ser_sub_mask
		s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;
#endif
	    //RETAILMSG(1,(TEXT(":::SYSINTR_IR OEMInterruptDone\n\r\n")));
		break;

	case SYSINTR_AUDIO:
		// DMA1 is for audio input.
		// DMA2 is for audio output.
		s2410INT->rSRCPND = (BIT_DMA1 | BIT_DMA2); 
		if (s2410INT->rINTPND & BIT_DMA1) 
			s2410INT->rINTPND = BIT_DMA1;
		if (s2410INT->rINTPND & BIT_DMA2) 
			s2410INT->rINTPND = BIT_DMA2;
        s2410INT->rINTMSK &= ~BIT_DMA1;
        s2410INT->rINTMSK &= ~BIT_DMA2;
		break;

	case SYSINTR_ADC:
		break;

	case SYSINTR_PCMCIA_LEVEL:
		s2410INT->rSRCPND	= BIT_EINT8_23;
		if (s2410INT->rINTPND & BIT_EINT8_23) 
			s2410INT->rINTPND = BIT_EINT8_23; 
		s2410INT->rINTMSK   &= ~BIT_EINT8_23;
		s2410IOP->rEINTMASK &= ~(1<<8);
		//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_LEVEL    OEMInterruptDone\r\n")));
		break;

	case SYSINTR_PCMCIA_EDGE:
		//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_EDGE    OEMInterruptDone\r\n")));
		break;

	case SYSINTR_PCMCIA_STATE:
		s2410INT->rINTMSK &= ~BIT_EINT3;
		//RETAILMSG(1,(TEXT("::: SYSINTR_PCMCIA_STATE    OEMInterruptDone\r\n")));
		break;

	case SYSINTR_ETHER:
		s2410INT->rINTMSK   &= ~BIT_EINT8_23;
		s2410IOP->rEINTMASK &= ~0x200;
		break;
			        
	case SYSINTR_USB:
		s2410INT->rINTMSK &= ~BIT_USBH;
		break;

	case SYSINTR_USBD:
		s2410INT->rINTMSK &= ~BIT_USBD;
		//RETAILMSG(1,(TEXT("::: SYSINTR_USBD    OEMInterruptDone\r\n")));
		break;
        
	case SYSINTR_POWER:
		s2410INT->rSRCPND = BIT_EINT0;
		// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
		if (s2410INT->rINTPND & BIT_EINT0) 
			s2410INT->rINTPND = BIT_EINT0;
		s2410INT->rINTMSK &= ~BIT_EINT0;
		s2410INT->rSRCPND = BIT_EINT2;
		// S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
		if (s2410INT->rINTPND & BIT_EINT2) 
			s2410INT->rINTPND = BIT_EINT2;
		s2410INT->rINTMSK &= ~BIT_EINT2;
		break;

	}
	INTR_ON();
}

// ********************************************************************
//声明:int OEM_InterruptHandler( unsigned int ra )
//参数:
//	IN ra-保留
//返回值:中断 id
//功能描述:中断处理接口,当系统产生一个中断后,内核会调用该函数
//          去做最重要的处理(如关掉自己)。
//引用: 
// ********************************************************************
static DWORD dwLoadPageEntryCount = 0;
LPDWORD lpdwLoadPageEntryCount = &dwLoadPageEntryCount;
int OEM_InterruptHandler(unsigned int ra)
{
	unsigned int IntPendVal;
	unsigned int SubIntPendVal;	// for serial
	DWORD			submask;
	volatile BYTE usbd_eir = 0, usbd_uir = 0;
	static DWORD tickCount = 0;
	static UINT intSave, nIntrCount=0;
	static BOOL bPrint = FALSE;

//    TOUCH_GLOBALS *odo_tsb;  //Sample buffer stuff
    // for this, You MUST modify bsp/inc/drv_glob.h.. check drv_glob.h_jylee
    //odo_tsb = &((DRIVER_GLOBALS *)DRIVER_GLOBALS_PHYSICAL_MEMORY_START)->tch;

  
	IntPendVal = s2410INT->rINTOFFSET;	// Get pending IRQ mode interrupt in INTPND.
    
	// Fake CPUEnterIdle needs to know about interrupt firing.
//	fInterruptFlag = TRUE;
/*
    if (fIntrTime) {
        //
        // We're doing interrupt timing. Get Time to ISR. We subtract TIMER_COUNTDOWN
        // here because the compare register has not been updated.
        //
        dwIsrTime1 = PerfCountSinceTick() - dwReschedIncrement;
        dwSPC = ra;
        wNumInterrupts++;
    }
*/
	//
	// Check the timer interrupt.
	//
	if (IntPendVal == INTSRC_TIMER4) 
	{
		DWORD ttmp;
		
		ulTickCount++;

		
//        if( tickCount >= 2000 )
  //      {
    //  		RETAILMSG(1, (TEXT("intr timer.\r\n") ));	
      //		tickCount = 0;
        //}

		s2410PWM->rTCNTB4 = RESCHED_INCREMENT;//dwReschedIncrement;
                             
		ttmp = s2410PWM->rTCON & (~(0xf << 20));
    	// ???                         
		s2410PWM->rTCON = ttmp | (2 << 20);		/* update TCVNTB4, stop					*/
		s2410PWM->rTCON = ttmp | (1 << 20);		/* one-shot mode,  start				*/
                             
		//
		// Clear the interrupt
		//
		s2410INT->rSRCPND = BIT_TIMER4;        
		if (s2410INT->rINTPND & BIT_TIMER4) 
			s2410INT->rINTPND = BIT_TIMER4;
		{
			extern DWORD dwIdleTick;
			extern int nCountRunning;
			void WINAPI KL_ProfileKernel( UINT uiOption, VOID * lpv );
			if( ulTickCount - dwIdleTick > 10000 )
			{	//死锁
				dwIdleTick = ulTickCount;
				RETAILMSG(1, (TEXT("_dead,run=%d,ret pc=0x%x,intSave=%d,nIntrCount=%d,SubPend=0x%x,SubMask=0x%x.\r\n"),nCountRunning, ra, intSave, nIntrCount, s2410INT->rSUBSRCPND, s2410INT->rINTSUBMSK ));
				KL_ProfileKernel( 1, NULL );  
				bPrint = TRUE;
			}
		}
		return SYSINTR_RESCHED;
	} 
	intSave = IntPendVal;


//	RETAILMSG(1, (TEXT("intr no(%d).\r\n"),IntPendVal ));	
	if(IntPendVal == INTSRC_MMC)	// SD, MMC
	{
		s2410INT->rINTMSK |= BIT_MMC;
        s2410INT->rSRCPND = BIT_MMC;        
        if (s2410INT->rINTPND & BIT_MMC) 
        	s2410INT->rINTPND = BIT_MMC;
		//RETAILMSG(1, (TEXT("ARMINT.C-INT:INTSRC_MMC INT\r\n")));
		if( s2410SDIO->rSDIDATSTA & (0x1<<9) ){
			//RETAILMSG(1, (TEXT("INT:SYSINTR_SDMMC_SDIO_INTERRUPT INT\r\n")));
			return SYSINTR_SDMMC_SDIO_INTERRUPT;
		}
		else {
			//RETAILMSG(1, (TEXT("INT:SYSINTR_SDMMC INT\r\n")));
			return SYSINTR_SDMMC;
		}
	}	
	else if(IntPendVal == INTSRC_DMA0)	// SD DMA interrupt
	{
		s2410INT->rINTMSK |= BIT_DMA0;
		s2410INT->rSRCPND = BIT_DMA0;
		if (s2410INT->rINTPND & BIT_DMA0) 
			s2410INT->rINTPND = BIT_DMA0;
		return SYSINTR_DMA0;
	}
	
	else if (IntPendVal == INTSRC_EINT1)	// Keyboard interrupt is connected to EINT1.
	{ 
		s2410INT->rINTMSK |= BIT_EINT1;
		s2410INT->rSRCPND  = BIT_EINT1;        
		if (s2410INT->rINTPND & BIT_EINT1) 
			s2410INT->rINTPND  = BIT_EINT1;

		return(SYSINTR_KEYBOARD);

	} 
	
	else if (IntPendVal == INTSRC_EINT2)	// EINT2
	{ 
		s2410INT->rINTMSK |= BIT_EINT2;
		s2410INT->rSRCPND  = BIT_EINT2;	/* Interrupt Clear				*/
		if (s2410INT->rINTPND & BIT_EINT2) 
			s2410INT->rINTPND  = BIT_EINT2;
//		RETAILMSG(1, (TEXT(">>> CPUPowerReset \r\n")));
		RETAILMSG(1,(TEXT(">>> >>> Reset Button Pressed <<< <<< \r\n")));
		// ???? by lilin
		// CPUPowerReset();
		return(SYSINTR_POWER);
	}
	else if (IntPendVal == INTSRC_EINT3)	// PCMCIA interrupt is connected to EINT3. (nINT_P_DEV)
	{ 
   		s2410INT->rINTMSK |= BIT_EINT3;
   		s2410INT->rSRCPND  =  BIT_EINT3;        
   		if (s2410INT->rINTPND & BIT_EINT3) 
   			s2410INT->rINTPND = BIT_EINT3;
		//RETAILMSG(1, (TEXT("ARMINT.C - SYSINTR_PCMCIA_STATE\r\n")));			
                           
   		return(SYSINTR_PCMCIA_STATE);
	}  
	else if (IntPendVal == INTSRC_EINT8_23)		// EINT8 ~ 23
	{ 
		s2410INT->rINTMSK |= BIT_EINT8_23;	
		submask = s2410IOP->rEINTPEND;

		if ( submask & (1 << 18)) // EINT28 : SDMMC_CARD_DETECT
		{
			s2410IOP->rEINTMASK |= (1 << 18);
			s2410IOP->rEINTPEND  = (1 << 18);
			s2410INT->rSRCPND  = BIT_EINT8_23;
			if (s2410INT->rINTPND & BIT_EINT8_23) 
				s2410INT->rINTPND = BIT_EINT8_23;

			//RETAILMSG(1, (TEXT("ARMINT.C - SYSINTR_SDMMC_CARD_DETECT\r\n")));			
			return SYSINTR_SDMMC_CARD_DETECT;
		}
		else if ( submask & (1 << 9))	// 0x200 EINT9 : CS8900
		{
			s2410IOP->rEINTMASK |= 0x200;
			s2410IOP->rEINTPEND = 0x200;

			s2410INT->rSRCPND = BIT_EINT8_23;        
			if (s2410INT->rINTPND & BIT_EINT8_23) 
				s2410INT->rINTPND = BIT_EINT8_23;

			//RETAILMSG(1, (TEXT("INT:SYSINTR_ETHER INT\r\n")));
			return SYSINTR_ETHER;
		}
		else if (submask & (1 << 8))	// 0x100 EINT8 : PCMCIA_LEVEL
		{
			s2410IOP->rEINTMASK |= 0x100;
			s2410IOP->rEINTPEND = 0x100;

			s2410INT->rSRCPND = BIT_EINT8_23;        
			if (s2410INT->rINTPND & BIT_EINT8_23) 
				s2410INT->rINTPND = BIT_EINT8_23;

			//RETAILMSG(1, (TEXT("INT:SYSINTR_PCMCIA_LEVEL INT\r\n")));
			return SYSINTR_PCMCIA_LEVEL;
		}
		else
		{
			s2410INT->rSRCPND = BIT_EINT8_23; 
			if (s2410INT->rINTPND & BIT_EINT8_23) 

⌨️ 快捷键说明

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