?? interrupt.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 + -