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

📄 interrupt.c

📁 可以兼容MS-DOS的文件系统和指令的S3C2410平台的DOS部分源代码,加以修改可以使用在S3C2440 S3C44B0等ARM7、ARM9上
💻 C
字号:
/*************************************Seekfor Embedded DOS v1.0***************************************************
 ******                   ***          *****                                    ******     ****     ****** v1.0
**   **                    **         **  **                                     **  **   **  **   **   ** 
**   **                    **         **                                         **   ** **    **  **   ** 
**                         **         **                                         **   ** **    **  **      
 **       *****    *****   ** ****  *******   *****  ********            *****   **   ** **    **   **     
  ***    **   **  **   **  ** **      **     **   **   *** **           **   **  **   ** **    **    ***   
    **   *******  *******  ****       **     **   **   **               *******  **   ** **    **      **  
     **  **       **       *****      **     **   **   **               **       **   ** **    **       ** 
**   **  **       **       ** **      **     **   **   **               **       **   ** **    **  **   ** 
**   **  **   **  **   **  **  **     **     **   **   **               **   **  **  **   **  **   **   ** 
******    *****    *****  ********  ******    *****  ******              *****  ******     ****    ******  
<1)基本描述
	Seekfor Embedded DOS v1.0是嵌入式的一个类DOS操作系统,支持FAT16/FAT32.
<2)文件描述
	文件名:interrupt.c
	功能:中断处理
<3>如需更新版本软件,请联系:
	QQ:82054357
	Mail:Seek_for@163.com
	MSN:sfrad32@hotmail.com
**************************************************************************************************************/
#ifndef __INTERRUPT_C__
#define __INTERRUPT_C__
#include "dos.h"
typedef void(*INTERRUPT)(int code);

static INTERRUPT interrups[32];

static void __irq handle_EINT0()
{
	rSRCPND|=1u<<0;
	rINTPND|=1u<<0;
	if(interrups[0])
	{
		interrups[0](0);
	}
}

static void __irq handle_EINT1()
{
	rSRCPND|=1u<<1;
	rINTPND|=1u<<1;
	if(interrups[1])
		interrups[1](1);
}
static void __irq handle_EINT2()
{
	rSRCPND|=1u<<2;
	rINTPND|=1u<<2;
	if(interrups[2])
		interrups[2](2);
}
static void __irq handle_EINT3()
{
	rSRCPND|=1u<<3;
	rINTPND|=1u<<3;
	if(interrups[3])
		interrups[3](3);
}
static void __irq handle_EINT4_7()
{
	int i=rEINTPEND&0xff;
	rEINTPEND|=0xff;
	rSRCPND|=1u<<4;
	rINTPND|=1u<<4;
	if(interrups[4])
		interrups[4](i);
}
static void __irq handle_EINT8_23()
{
	int i=rEINTPEND;
	int j,k;
	extern int SD_inserted;
	extern int SD_install();
#if(SUPPORT_SD==1)
	if(i&(1u<<18))
	{
		rGPGCON&=~(3u<<20);/*输入状态*/
		for(j=0;j<0x100;j++);
		k=(rGPGDAT>>10)&0x01;
		for(j=0;j<0x100;j++);
		j=(rGPGDAT>>10)&0x01;
		if(j==k)
		{
			SD_inserted=!SD_inserted;
			rEXTINT2&=~(0x0f<<8);
			if(!SD_inserted) /*拔出*/
			{
				rEXTINT2|=0x0a<<8;
				printf("SD Ejected!\n");
			}
			else
			{
				rEXTINT2|=0x0c<<8;
			//	if(SD_install())
				//	printf("install SD OK!\n");
				printf("SD inserted!\n");
			}
		}
	}
	rGPGCON|=2u<<20;
	for(j=0;j<0x100;j++);
#endif
	if(interrups[5])
	{
		interrups[5](i);
	}
	rEINTPEND|=0xffffff00;
	rSRCPND|=1u<<5;
	rINTPND|=1u<<5;
}

static void __irq handle_UNUSED6()
{
	rSRCPND|=1u<<6;
	rINTPND|=1u<<6;
	if(interrups[6])
	{
		interrups[6](0);
	}
}
static void __irq handle_BATFAULT()
{
	rSRCPND|=1u<<7;
	rINTPND|=1u<<7;
	if(interrups[7])
	{
		interrups[7](0);
	}
}
static void __irq handle_TICK()
{
	rSRCPND|=1u<<8;
	rINTPND|=1u<<8;
	if(interrups[8])
	{
		interrups[8](0);
	}
}
static void __irq handle_WDT()
{
	rSRCPND|=1u<<9;
	rINTPND|=1u<<9;
	if(interrups[9])
	{
		interrups[9](0);
	}
}
static void __irq handle_TIMER0()
{
	rSRCPND|=1u<<10;
	rINTPND|=1u<<10;
	if(interrups[10])
	{
		interrups[10](0);
	}
}
static void __irq handle_TIMER1()
{
	rSRCPND|=1u<<11;
	rINTPND|=1u<<11;
	if(interrups[11])
	{
		interrups[11](1);
	}
}
static void __irq handle_TIMER2()
{
	rSRCPND|=1u<<12;
	rINTPND|=1u<<12;
	if(interrups[12])
	{
		interrups[12](2);
	}
}
static void __irq handle_TIMER3()
{
	rSRCPND|=1u<<13;
	rINTPND|=1u<<13;
	if(interrups[13])
	{
		interrups[13](3);
	}
}
static void __irq handle_TIMER4()
{
	rSRCPND|=1u<<14;
	rINTPND|=1u<<14;
	if(interrups[14])
	{
		interrups[14](4);
	}
}
static void __irq handle_UART2()
{
	rSUBSRCPND|=(1u<<8)|(1u<<7)|(1u<<6);
	rSRCPND|=1u<<15;
	rINTPND|=1u<<15;
	if(interrups[15])
	{
		interrups[15](2);
	}
}
static void __irq handle_LCD()
{
	rSRCPND|=1u<<16;
	rINTPND|=1u<<16;
	if(interrups[16])
	{
		interrups[16](0);
	}
}
static void __irq handle_DMA0()
{
	rSRCPND|=1u<<17;
	rINTPND|=1u<<17;
	if(interrups[17])
	{
		interrups[17](0);
	}
}
static void __irq handle_DMA1()
{
	rSRCPND|=1u<<18;
	rINTPND|=1u<<18;
	if(interrups[18])
	{
		interrups[18](1);
	}
}
static void __irq handle_DMA2()
{
	rSRCPND|=1u<<19;
	rINTPND|=1u<<19;
	if(interrups[19])
	{
		interrups[19](2);
	}
}
static void __irq handle_DMA3()
{
	rSRCPND|=1u<<20;
	rINTPND|=1u<<20;
	if(interrups[20])
	{
		interrups[20](3);
	}
}
static void __irq handle_SDI()
{
	rSRCPND|=1u<<21;
	rINTPND|=1u<<21;
	rSDIDSTA|=1u<<9;
	if(interrups[21])
	{
		interrups[21](0);
	}
}
static void __irq handle_SPI0()
{
	rSRCPND|=1u<<22;
	rINTPND|=1u<<22;
	if(interrups[22])
	{
		interrups[22](0);
	}
}
static void __irq handle_UART1()
{
	rSUBSRCPND|=(1u<<5)|(1u<<4)|(1u<<3);
	rSRCPND|=1u<<23;
	rINTPND|=1u<<23;
	if(interrups[23])
	{
		interrups[23](1);
	}
}
static void __irq handle_UNUSED24()
{
	rSRCPND|=1u<<24;
	rINTPND|=1u<<24;
	if(interrups[24])
	{
		interrups[24](0);
	}
}
static void __irq handle_USBD()
{
	rSRCPND|=1u<<25;
	rINTPND|=1u<<25;
	rUSB_INT_REG|=0x07;
	rEP_INT_REG|=0xff;
	if(interrups[25])
	{
		interrups[25](0);
	}
}
static void __irq handle_USBH()
{
	rSRCPND|=1u<<26;
	rINTPND|=1u<<26;
	rUSB_INT_REG|=0x07;
	rEP_INT_REG|=0xff;
	if(interrups[26])
	{
		interrups[26](1);
	}
}
static void __irq handle_IIC()
{
	rSRCPND|=1u<<27;
	rINTPND|=1u<<27;
	if(interrups[27])
	{
		interrups[27](0);
	}
}
static void __irq handle_UART0()
{
	rSUBSRCPND|=(1u<<2)|(1u<<1)|(1u<<0);
	rSRCPND|=1u<<28;
	rINTPND|=1u<<28;
	if(interrups[28])
	{
		interrups[28](0);
	}
}
static void __irq handle_SPI1()
{
	rSRCPND|=1u<<29;
	rINTPND|=1u<<29;
	if(interrups[29])
	{
		interrups[29](1);
	}
}

static void __irq handle_RTC()
{
	rSRCPND|=1u<<30;
	rINTPND|=1u<<30;
	if(interrups[30])
	{
		interrups[30](0);
	}
}
static void __irq handle_ADC()
{
	rSUBSRCPND|=(1u<<10);
	rSRCPND|=1u<<31;
	rINTPND|=1u<<31;
	if(interrups[31])
	{
		interrups[31](0);
	}
}

void _enable()
{
	rINTSUBMSK=(1u<<9);
	rINTMSK=(1u<<6|1u<<24);/*允许除UNUSED6和UNUSED24外所有中断*/
}

void _disable()
{
	rINTSUBMSK=0xffffffff;
	rINTMSK=0xffffffff;
}

void*_getvect(int irq)
{
	if(irq>31) return (void*)0;
	return (void*)interrups[irq];
}

void*_setvect(int irq,void*irq_proc)
{
	void*ret;
	if(irq>31) return (void*)0;
	ret=getvect(irq);
	interrups[irq]=(INTERRUPT)irq_proc;
	return ret;
}

void INTERRUPT_init()
{
	int i;
	rINTMOD=0x00000000;/*全部都是IRQ模式*/
	pISR_EINT0=(unsigned int)handle_EINT0;
	pISR_EINT1=(unsigned int)handle_EINT1;
	pISR_EINT2=(unsigned int)handle_EINT2;
	pISR_EINT3=(unsigned int)handle_EINT3;
	pISR_EINT4_7=(unsigned int)handle_EINT4_7;
	pISR_EINT8_23=(unsigned int)handle_EINT8_23;
	pISR_NOTUSED6=(unsigned int)handle_UNUSED6;
	pISR_BAT_FLT=(unsigned int)handle_BATFAULT;
	pISR_TICK=(unsigned int)handle_TICK;
	pISR_WDT=(unsigned int)handle_WDT;
	pISR_TIMER0=(unsigned int)handle_TIMER0;
	pISR_TIMER1=(unsigned int)handle_TIMER1;
	pISR_TIMER2=(unsigned int)handle_TIMER2;
	pISR_TIMER3=(unsigned int)handle_TIMER3;
	pISR_TIMER4=(unsigned int)handle_TIMER4;
	pISR_UART2=(unsigned int)handle_UART2;
	pISR_LCD=(unsigned int)handle_LCD;
	pISR_DMA0=(unsigned int)handle_DMA0;
	pISR_DMA1=(unsigned int)handle_DMA1;
	pISR_DMA2=(unsigned int)handle_DMA2;
	pISR_DMA3=(unsigned int)handle_DMA3;
	pISR_SDI=(unsigned int)handle_SDI;
	pISR_SPI0=(unsigned int)handle_SPI0;
	pISR_UART1=(unsigned int)handle_UART1;
	pISR_NOTUSED24=(unsigned int)handle_UNUSED24;
	pISR_USBD=(unsigned int)handle_USBD;
	pISR_USBH=(unsigned int)handle_USBH;
	pISR_IIC=(unsigned int)handle_IIC;
	pISR_UART0=(unsigned int)handle_UART0;
	pISR_SPI1=(unsigned int)handle_SPI1;
	pISR_RTC=(unsigned int)handle_RTC;
	pISR_ADC=(unsigned int)handle_ADC;
	
	
	for(i=0;i<32;i++)
		interrups[i]=(INTERRUPT)0;
	enable();
}	


#endif

⌨️ 快捷键说明

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