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

📄 interrupt.c

📁 ebd9307开发板wince bsp源码,包括cs8900,lcd,nand,serial,touch,usb,gpio,wd等驱动
💻 C
📖 第 1 页 / 共 4 页
字号:

				//value = *GPIO_BINTTYPE2;
				//value |= EGPIO_UART7_INT; // high level 
				//*GPIO_BINTTYPE2 = value;

				//value = *GPIO_BINTEN;
				//value |= EGPIO_UART7_INT; // Enable interrupt
				//*GPIO_BINTEN = value;	

				//*VIC2_INTCLEAR = INT2_GPIO;
				//*VIC2_INTENABLE = INT2_GPIO;
				retval  = SYSINTR_UART7;
			}
			else if ( (*GPIO_INTSTATUSA & EGPIO_CAN1_INT) == EGPIO_CAN1_INT )
			{
				UINT value;
								
				value = *GPIO_AINTEN;
				value &= ~EGPIO_CAN1_INT;
				*GPIO_AINTEN = value; // Disable all interrupt.

				retval  = SYSINTR_CAN1;
				//RETAILMSG(1, (TEXT("......................................\r\n")));

			}
			else if ( (*GPIO_INTSTATUSA & EGPIO_CAN2_INT) == EGPIO_CAN2_INT )
			{
				UINT value;
								
				value = *GPIO_AINTEN;
				value &= ~EGPIO_CAN2_INT;
				*GPIO_AINTEN = value; // Disable all interrupt.

				retval  = SYSINTR_CAN2;
				//RETAILMSG(1, (TEXT("......................................I'm sorry but it's an accident. \r\n")));

			}
			else
			{
				*GPIO_BEOI = 0xff; // clean cir interrupt of gpio b
				*GPIO_AEOI = 0xff; // clean cir interrupt of gpio b
			    //*VIC2_INTCLEAR = INT2_GPIO;
				//*VIC2_INTENABLE = INT2_GPIO;
				RETAILMSG(1, (TEXT("......................................I'm sorry but it's an accident. \r\n")));
    	        		retval = SYSINTR_NOP;   
			}
		//RETAILMSG(1, (TEXT(".........OEMInterruptHandler,GPIO_INTSTATUSB = 0x%X \r\n"),temp ));
		//*VIC2_INTENABLE = INT2_GPIO;
		//RETAILMSG(1, (TEXT(".........OEMInterruptHandler,retval = 0x%X \r\n"),retval ));
		}
//#endif

        else if(ulVic1Irq & INT1_UNUSED1)
        {
            *VIC1_INTCLEAR = INT1_UNUSED1;
            retval         = SYSINTR_PIO_PLAYBACK;   
        }
        else if(ulVic1Irq & INT1_UNUSED2)
        {
            *VIC1_INTCLEAR = INT1_UNUSED2;
            retval         = SYSINTR_PIO_RECORD;   
        }

        //
        // Check to see if it is a keyboard interrupt
        //
        else if(ulVic1Irq & INT1_KEYPAD)
        {
            *VIC1_INTCLEAR = INT1_KEYPAD;
            retval = SYSINTR_KEYBOARD;   
        }

        //
        // Check to see if the SPI port has generated an interrupt.
        // This is used for the PS/2 keyboard driver.
        //
        else if(ulVic2Irq & INT2_SPI)
        {
            fPS2Int         = 1;
            *VIC2_INTCLEAR = INT2_SPI;
            retval = SYSINTR_SPI;   
        }
        //
        // Real time clock interrupt.  Occurs very infrequently so
        // put at the bottom of the interrupt priority list.
        //
        else if (ulVic2Irq & INT2_RTC)
        {
            *VIC2_INTCLEAR = INT2_RTC;
//            retval = SYSINTR_RTC_ALARM;   
        }

        //
        // Check the DMA channels.
        //
        else if (ulVic1Irq &  INT1_DMAM2P0 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P0;
            retval = SYSINTR_DMA0;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P1 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P1;
            retval = SYSINTR_DMA1;   
        }
        #if 0
        else if (ulVic1Irq &  INT1_DMAM2P2 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P2;
            retval = SYSINTR_DMA2;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P3 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P3;
            retval = SYSINTR_DMA3;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P4 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P4;
            retval = SYSINTR_DMA4;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P5 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P5;
            retval = SYSINTR_DMA1;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P5 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P5;
            retval = SYSINTR_DMA5;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P6 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P6;
            retval = SYSINTR_DMA6;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P7 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P7;
            retval = SYSINTR_DMA7;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P8 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P8;
            retval = SYSINTR_DMA8;   
        }
        else if (ulVic1Irq &  INT1_DMAM2P9 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2P9;
            retval = SYSINTR_DMA9;   
        }
        #endif // 0
        else if (ulVic1Irq &  INT1_DMAM2M0 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2M0;
            retval = SYSINTR_DMA_M2M0;   
        }
        else if (ulVic1Irq &  INT1_DMAM2M1 )
        {
            *VIC1_INTCLEAR = INT1_DMAM2M1;
            retval = SYSINTR_DMA_M2M1;   
        }
        
        //
        // Check to see if it is a touch pad interrupt.
        //
        else if (ulVic1Irq  & INT1_TOUCH)
        {
            *VIC1_INTCLEAR = INT1_TOUCH;

			//RETAILMSG(1, (TEXT("TOUCH\r\n")));

//			*VIC1_INTENABLE=INT1_TOUCH;

			if( !gfResumeFlag )
			{
				if( *RTC_DR -  dwTimeValueWhenSuspend     < 1 ) //10 ms, the time1 is running at 508k Hz
				{
					*TOUCH_TSSETUP2=0x0; // Clear Touch panel interrupt from the device.

					*VIC1_INTENABLE=INT1_TOUCH;
				}
				else
					retval = SYSINTR_TOUCH;
			}
			else
			{
//				RETAILMSG(1, (TEXT("TOUCH %d\r\n"),dwWakeupSourceIgnored));
				retval = SYSINTR_TOUCH;
			}
        }
        //
        // See if it is timer 2 also used for the touch interface.
        //
        else if (ulVic1Irq  & INT1_TIMER2)
        {
            *VIC1_INTCLEAR = INT1_TIMER2;
            retval = SYSINTR_TIMER2;   
        }
/*
#ifdef EDB9315A_CIR
		//
		// Check to see if it is the GPIO interrupt
		//
		else if(ulVic2Irq & INT2_GPIO)
		{
			//
			// Check to see if it is the GPIO interrupt from IRDA
			//
			if( (*GPIO_INTSTATUSB & 0x20) == 0x20 )
			{			
				UINT value;
				UINT dir;
				

				value = *GPIO_BINTEN;
				value &= ~0x20;
				*GPIO_BINTEN = value; // Disable all interrupt.

				*GPIO_BEOI = 0x20; // Clean all previous interrupt

				//OEMWriteDebugByte('H');
	            //OEMWriteDebugByte('\r');
	            //OEMWriteDebugByte('\n'); 

				value = *GPIO_BINTTYPE1;
				value |= 0x20; // edge trigure.
				*GPIO_BINTTYPE1 = value;

				// change direction
				value = *GPIO_BINTTYPE2;
				if( value & 0x20 )
				{
					value &=0xDF; // falling edge
					//OEMWriteDebugByte('R');
					dir = 1;
				}
				else
				{
					value |= 0x20; // Rising edge 
					//OEMWriteDebugByte('F');
					dir = 0;
				}
				*GPIO_BINTTYPE2 = value;
				
				value = *GPIO_BINTEN;
				value |= 0x20; // Enable interrupt
				*GPIO_BINTEN = value;	

				*VIC2_INTCLEAR = INT2_GPIO;
				*VIC2_INTENABLE = INT2_GPIO;
    	        retval = SYSINTR_NOP;


				{
					LARGE_INTEGER ulTime;
					LARGE_INTEGER ulTimeLast;
					int dif =0;
					//int i;
					BOOL bValid = TRUE;
					
					OEMQueryPerformanceCounter( (LARGE_INTEGER*) &ulTime );

					// If this is one valid pulse.
					if( gnWi>0 )
					{
						ulTimeLast = gulIntTime[gnWi-1];
						dif = (int)(ulTime.QuadPart - ulTimeLast.QuadPart);
						if( dif < gnMinInterval ) 
						{
					        //OEMWriteDebugByte('<');
					        bValid = FALSE;
						}
 					    if( dif > gnMaxInterval ) 
						{
					        //OEMWriteDebugByte('>');
							bValid = FALSE;
 					    }
 					    if(bValid)
 					    {
 					    	gnIntDif[gnWi-1]=(dif>1000)?1:0;
 					    	gnKeyCode = (gnKeyCode << 1) | ((dif>1000)?0x1:0x0);
 					    }
					}


					if( bValid )
					{
					    //OEMWriteDebugByte('V');
						gulIntTime[gnWi] = ulTime;
						gnWi++;

						if(gnWi==26)
						{
							int k;

							#if 0
							{
								int j;
								for( j=0; j<25; j++)
								{
									if(gnIntDif[j]==0)
										OEMWriteDebugByte('.');
									else
										OEMWriteDebugByte('*');
								}
							}
							#endif
							
							// tell what key it is before reset key code.
							gstrKeyName = gstrKeyNameTable[10];
							for( k=0; k<10; k++)
								if( gnKeyCode == gnKeyTable[k] )
									gstrKeyName = gstrKeyNameTable[k];									

							gnWi=0;
							gnKeyCode = 0;
							
					        //OEMWriteDebugByte('O');
					        //OEMWriteDebugByte('\r');
					        //OEMWriteDebugByte('\n');
				            retval = SYSINTR_PIO_CIR;

				            //RETAILMSG(1, (TEXT("key: %s \r\n"), gstrKeyName));

						}
					}
					else 
					{
						#if 0
						{
							switch( gnWi )
							{
								case 0:
									OEMWriteDebugByte('0');
									break;
								case 1:
									OEMWriteDebugByte('1');
									break;
								case 2:
									OEMWriteDebugByte('2');
									break;
								case 3:
									OEMWriteDebugByte('3');
									break;
								case 4:
									OEMWriteDebugByte('4');
									break;
								case 5:
									OEMWriteDebugByte('5');
									break;
								case 6:
									OEMWriteDebugByte('6');
									break;
								case 7:
									OEMWriteDebugByte('7');
									break;
								case 8:
									OEMWriteDebugByte('8');
									break;
								case 9:
									OEMWriteDebugByte('9');
									break;
								case 10:
									OEMWriteDebugByte('a');
									break;
								case 11:
									OEMWriteDebugByte('b');
									break;
								case 12:
									OEMWriteDebugByte('c');
									break;
								case 13:
									OEMWriteDebugByte('d');
									break;
								case 14:
									OEMWriteDebugByte('e');
									break;
								case 15:
									OEMWriteDebugByte('f');
									break;
								case 16:
									OEMWriteDebugByte('g');
									break;
								case 17:
									OEMWriteDebugByte('h');
									break;
								case 18:
									OEMWriteDebugByte('i');
									break;
								case 19:
									OEMWriteDebugByte('j');
									break;
								case 20:
									OEMWriteDebugByte('k');
									break;
								case 21:
									OEMWriteDebugByte('l');
									break;
								case 22:
									OEMWriteDebugByte('m');
									break;
								case 23:
									OEMWriteDebugByte('n');
									break;
								case 24:
									OEMWriteDebugByte('o');
									break;
								case 25:
									OEMWriteDebugByte('p');
									break;
								default:
									OEMWriteDebugByte('X');
									break;
							}
						}
						#endif

								
						gnWi = 0;
						gulIntTime[gnWi++] = ulTime;						
						gnKeyCode = 0;
					}
					 //If a complete key process interrupts are captured, trigure interrupt to notify utility.
					 //Else not process is needed.
				}
			}
			else
			{
				*GPIO_BEOI = 0xff; // clean cir interrupt of gpio b
				*GPIO_AEOI = 0xff; // clean cir interrupt of gpio b
			    *VIC2_INTCLEAR = INT2_GPIO;
				*VIC2_INTENABLE = INT2_GPIO;
    	        retval = SYSINTR_NOP;   
			}
		}
#else

        //
        // Check to see if it the IRDA interrupt.
        //
        else if (ulVic2Irq &  INT2_IRDA )
        {
            *VIC2_INTCLEAR = INT2_IRDA;
            retval = SYSINTR_IR;   
        }
#endif
*/
/*	else if (ulVic2Irq & INT2_GPIO )
        {
            *VIC2_INTCLEAR =  INT2_GPIO;
            retval = SYSINTR_GPIO;       
        }*/
        //
        // Check to see if it is the IDE interrupt.
        //
        else if (ulVic2Irq & INT2_EXT3)
        {
            *VIC2_INTCLEAR = INT2_EXT3;
            retval = SYSINTR_IDE;   
        }

        //
        // Check to see if it is the USB slave device.
        //
        else if (ulVic2Irq & INT2_EXT0)
        {
#if EP93XX_USB_SLAVE
            *VIC2_INTCLEAR = INT2_EXT0;
            retval = SYSINTR_USBSLAVE;   
#elif defined(EP93XX_SIMULAT_PS2_KBD)

			BOOL EP93XPS2ISR ( void );
//			DWORD dwStart;

            *VIC2_INTCLEAR = INT2_EXT0;

//			dwStart=*TIM_DEBUGVALUELOW;
			if( EP93XPS2ISR (  ) )
			{/*triger interrupt to notice the driver, when get a whole char*/
//				RETAILMSG(1, (TEXT("triger SYSINTR_PS2_PORT\r\n")));
			
				retval = SYSINTR_PS2_PORT;
			}
			*VIC2_INTENABLE = INT2_EXT0; /*as InterruptDone*/

#endif
		}

        else if(ulVic2Irq & INT2_PCMCIA_IRQ)
        {
            *VIC2_INTCLEAR = INT2_PCMCIA_IRQ;
            // OEMEthISR();
            retval = SYSINTR_PCMCIA_LEVEL;   
        }

        else if((ulVic1Irq & (INT1_PCMCIA_CD1 | INT1_PCMCIA_CD2 | INT1_PCMCIA_BVD1))  || 
                (ulVic2Irq & INT2_PCMCIA_BVD2))
        {
            *VIC1_INTCLEAR = (INT1_PCMCIA_CD1 | INT1_PCMCIA_CD2 | INT1_PCMCIA_BVD1);
            *VIC2_INTCLEAR = INT2_PCMCIA_BVD2;
            retval = SYSINTR_PCMCIA_STATE;   
        }

#ifdef    EP93XX_SD_MMC

		else if(ulVic2Irq & INT2_EXT1)
        {
			volatile unsigned short *v_pSDReg,SDRegValue;

			*VIC2_INTCLEAR = INT2_EXT1;
			v_pSDReg = (volatile unsigned short *) MEM_HOST_REG_BASE_SD_MMC;
			SDRegValue=*(v_pSDReg+0x1);

			if ( ( SDRegValue & 0x8000 ) == 0x8000 )
			{
				SDRegValue=*(v_pSDReg+0x5);

				if ( ( SDRegValue & 0x100 ) == 0x100)
				{
					retval = SYSINTR_CARD_DETECT;
				}
				else
				{
					//RETAILMSG(1,(L"SD_MMC response\n"));
					retval = SYSINTR_CARD_RESPONSE;
				}
			}  
        }

#endif

#if    EP93XX_MS_CARD

		else if(ulVic2Irq & INT2_EXT2)
        {
			volatile unsigned short *v_pSDReg,SDRegValue;

			*VIC2_INTCLEAR = INT2_EXT2;
			v_pSDReg = (volatile unsigned short *)MEM_HOST_REG_BASE_MS;

			SDRegValue=*(v_pSDReg+0x1);

			if ( ( SDRegValue & 0x8000 ) == 0x8000 )
			{
				SDRegValue=*(v_pSDReg+0x3);

				if ( ( SDRegValue & 0x1000 ) == 0x1000)
				{
					retval = SYSINTR_CARD_DETECT;
				}
				else
				{
					retval = SYSINTR_CARD_RESPONSE;
				}
			}
		}
#endif
        else
        {
			*VIC1_INTCLEAR= ulVic1Irq;
			*VIC2_INTCLEAR= ulVic2Irq;
//			NKDbgPrintfW(L"0x%x, 0x%x\r\n", ulVic1Irq, ulVic2Irq);
        }

⌨️ 快捷键说明

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