www.pudn.com > ADS_s3c2440a.rar > Eint.c
/***************************************** NAME: eint.c DESC: External interrupt test HISTORY: 2001.04.03:purnnamu: draft ver 0.0 2003.05.xx:DonGo: modifed for 2440 ver 0.1 *****************************************/ #include#include "def.h" #include "option.h" #include "2440addr.h" #include "2440lib.h" #include "2440slib.h" #include "eint.h" static void __irq Eint0Int(void) { ClearPending(BIT_EINT0); Uart_Printf("EINT0 interrupt is occurred.\n"); } static void __irq Eint2Int(void) { ClearPending(BIT_EINT2); Uart_Printf("EINT2 interrupt is occurred.\n"); } static void __irq Eint11_19(void) { if(rEINTPEND==(1<<11)) { Uart_Printf("EINT11 interrupt is occurred.\n"); rEINTPEND=(1<<11); } else if(rEINTPEND==(1<<19)) { Uart_Printf("EINT19 interrupt is occurred.\n"); rEINTPEND=(1<<19); } else { Uart_Printf("rEINTPEND=0x%x\n",rEINTPEND); rEINTPEND=(1<<19)|(1<<11); } ClearPending(BIT_EINT8_23); } // SMDK2440 EINT S/W // EINT0/2/11/19 void Test_Eint(void) { int i; int extintMode; Uart_Printf("[External Interrupt Test through PF0/2/11/19]\n"); Uart_Printf("1.L-LEVEL 2.H-LEVEL 3.F-EDGE 4.R-EDGE 5.B-EDGE\n"); Uart_Printf("Select the external interrupt type.\n"); extintMode=Uart_Getch(); //extintMode='3'; rGPFCON = (rGPFCON & 0xffcc)|(1<<5)|(1<<1); //PF0/2 = EINT0/2 rGPGCON = (rGPGCON & 0xff3fff3f)|(1<<23)|(1<<7); //PG3/11 = EINT11/19 switch(extintMode) { case '1': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x0<<8 | 0x0<<0; //EINT0/2=low level triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x0<<12; //EINT11=low level triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x0<<12; //EINT19=low level triggered break; case '2': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x1<<8 | 0x1<<0; //EINT0/2=high level triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x1<<12; //EINT11=high level triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x1<<12; //EINT19=high level triggered break; case '3': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x2<<8 | 0x2<<0; //EINT0/2=falling edge triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x2<<12; //EINT11=falling edge triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x2<<12; //EINT19=falling edge triggered break; case '4': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x4<<8 | 0x4<<0; //EINT0/2=rising edge triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x4<<12; //EINT11=rising edge triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x4<<12; //EINT19=rising edge triggered break; case '5': rEXTINT0 = (rEXTINT0 & ~((7<<8) | (0x7<<0))) | 0x6<<8 | 0x6<<0; //EINT0/2=both edge triggered rEXTINT1 = (rEXTINT1 & ~(7<<12)) | 0x6<<12; //EINT11=both edge triggered rEXTINT2 = (rEXTINT2 & ~(7<<12)) | 0x6<<12; //EINT19=both edge triggered break; default: break; } Uart_Printf("Press the EINT0/2/11/19 buttons or Press any key to exit.\n"); pISR_EINT0=(U32)Eint0Int; pISR_EINT2=(U32)Eint2Int; pISR_EINT8_23=(U32)Eint11_19; rEINTPEND = 0xffffff; rSRCPND = BIT_EINT0|BIT_EINT2|BIT_EINT8_23; //to clear the previous pending states rINTPND = BIT_EINT0|BIT_EINT2|BIT_EINT8_23; rEINTMASK=~( (1<<11)|(1<<19) ); rINTMSK=~(BIT_EINT0|BIT_EINT2|BIT_EINT8_23); Uart_Getch(); rEINTMASK=0xffffff; rINTMSK=BIT_ALLMSK; }