亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? isr.c

?? 最小的嵌入式操作系統
?? C
字號:
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2004.5.12
\***************************************************************************/
/***************************************************************************\
    #說明:中斷處理函數
    #接口函數
	----------------------------------  Bug  --------------------------------------

	----------------------------------  TODO list  --------------------------------------
	2004-5-12	對于邋IO口的多中斷源的共享
	----------------------------------修正--------------------------------------

	2004-5-12	1、移植
				2、改變了中斷函數的定義,添加了一個標志中斷號的參數
				3、添加了void ISR_Init(void)函數定義,系統初始化中斷的時候調用

\***************************************************************************/
#include "../inc/drv/reg2410.h"
#include "isr.h"
#include "includes.h"
#include <string.h>


typedef void (*mask_func_t)(unsigned int);

typedef struct{
	Interrupt_func_t InterruptHandlers;
	void* data;
	int valid;		//設置中斷1=有效0=無效
	mask_func_t mask;
	mask_func_t unmask;
	mask_func_t ack_irq;
}struct_InterruptFunc;

static struct_InterruptFunc InterruptFunc[NR_IRQS]={NULL,};

#define GetISROffsetClr()	rINTOFFSET

#define	ClearPending(x)	do{rSRCPND = (1u << (x));	rINTPND = rINTPND;}while(0)

#define EINT_OFFSET(x)		((x) - NORMAL_IRQ_OFFSET + 4)
#define SUBIRQ_OFFSET(x)	((x) - EXT_IRQ_OFFSET)

#define EXTINT_MASK	0x7

//--------------------------------IRQ for s3c2410---------------------------------//

static int __inline fixup_irq_num(int irq)
{
	if (irq < IRQ_EINT4) return irq;
	else return ((irq + 4) - NORMAL_IRQ_OFFSET);
}

static void __inline set_gpios(int irq, int pullup)
{
	int shift;
	if (irq < 8) {
		shift = 2*irq;
		rGPFCON &= ~(0x3 << shift);
		rGPFCON |= (0x2 << shift);
		//GPFUP &= ~(GRAB_PULLUP(pullup) << irq); modify by threewater
		rGPFUP &= ~(1<< irq);
		rGPFUP |= (GRAB_PULLUP(pullup) << irq);
	} else {
		shift = 2*(irq - 8);
		rGPGCON &= ~(0x3 << shift);
		rGPGCON |= (0x2 << shift);
		//GPGUP &= ~(GRAB_PULLUP(pullup) << (irq - 8));
		rGPGUP &= ~(1<< (irq - 8));
		rGPGUP |= (GRAB_PULLUP(pullup) << (irq - 8));
	} 
}

int set_external_irq(int irq, int edge, int pullup)
{
	int real_irq, reg_ofs, shift;
	volatile U32 *extint = &rEXTINT0;

	if (((irq < IRQ_EINT0) && (irq > IRQ_EINT23)) ||
	    ((irq > IRQ_EINT3) && (irq < IRQ_EINT4)))
		return FAIL;

	real_irq = fixup_irq_num(irq);

	set_gpios(real_irq, pullup);

	reg_ofs = (real_irq / 8);
	shift = 4 * (real_irq - 8 * reg_ofs);
	extint += reg_ofs;

	*extint &= ~(EXTINT_MASK << shift);
	*extint |= (edge << shift);

	if (irq < 4) {
		rSRCPND |= (1 << real_irq);
		rINTPND |= (1 << real_irq);
	} else {
		rEINTPEND |= (1 << real_irq);
	}
	InterruptFunc[irq].valid=1;

	return 0;
}



/*
 * Defined irq handlers
 */
static void ack_irq(unsigned int irq)
{
	rSRCPND = (1 << irq);
	rINTPND = (1 << irq);
}

static void mask_irq(unsigned int irq)
{
	rINTMSK |= (1 << irq);
}

static void unmask_irq(unsigned int irq)
{
	rINTMSK &= ~(1 << irq);
}

/* for EINT? */
static void EINT4_23ack_irq(unsigned int irq)
{
	irq = EINT_OFFSET(irq);
	rEINTPEND = (1 << irq);

	if (irq < EINT_OFFSET(IRQ_EINT8)) {
		ClearPending(SHIFT_EINT4_7);
	} else {
		ClearPending(SHIFT_EINT8_23);
	}
}

static void EINT4_23mask_irq(unsigned int irq)
{
	irq = EINT_OFFSET(irq);
	rEINTMASK |= (1 << irq);
}

static void EINT4_23unmask_irq(unsigned int irq)
{
	rEINTMASK &= ~(1 << EINT_OFFSET(irq));

	if (irq < IRQ_EINT8) {
	  rINTMSK &= ~(1 << SHIFT_EINT4_7);
	} else {
	  rINTMSK &= ~(1 << SHIFT_EINT8_23);
	}
}


/* for sub_IRQ */
static void SUB_ack_irq(unsigned int irq)
{
	rSUBSRCPND = (1 << SUBIRQ_OFFSET(irq));

	if (irq <= IRQ_ERR0){
		ClearPending(IRQ_UART0);
	}else if (irq <= IRQ_ERR1){
		ClearPending(IRQ_UART1);
	}else if (irq <= IRQ_ERR2){
		ClearPending(IRQ_UART2);
	} else {	/* if ( irq <= IRQ_ADC_DONE ) { */
		ClearPending(IRQ_ADCTC);
	}
}

static void SUB_mask_irq(unsigned int irq)
{
	rINTSUBMSK |= (1 << SUBIRQ_OFFSET(irq));
}

static void SUB_unmask_irq(unsigned int irq)
{
	rINTSUBMSK &= ~(1u << SUBIRQ_OFFSET(irq));

	if (irq <= IRQ_ERR0) {
		rINTMSK &= ~(1u << IRQ_UART0); 
        } else if (irq <= IRQ_ERR1) {
		rINTMSK &= ~(1u << IRQ_UART1);
	} else if (irq <= IRQ_ERR2){
	    	rINTMSK &= ~(1u << IRQ_UART2);
        } else {	/* if ( irq <= IRQ_ADC_DONE ) { */
		rINTMSK &= ~(1u << IRQ_ADCTC);
        }
}

__inline unsigned int get_subIRQ(int irq, int begin, int end, int fail_irq) {
	int i;

	for(i=begin; i <= end; i++) {
	  if (irq & (1 << i))
	    return (EXT_IRQ_OFFSET + i);
	}
	return fail_irq;
}

__inline unsigned int get_extIRQ(int irq, int begin, int end, int fail_irq) {
	int i;

	for(i=begin; i <= end; i++) {
	  if (irq & (1 << i))
	    return (NORMAL_IRQ_OFFSET - 4 + i);
	}
	return fail_irq;
}

static unsigned int fixup_irq(int irq) {
    unsigned int ret;
    unsigned long sub_mask, ext_mask;

    switch (irq) {
    case IRQ_UART0:
      sub_mask = rSUBSRCPND & ~rINTSUBMSK;
      ret = get_subIRQ(sub_mask, 0, 2, irq);
      break;
    case IRQ_UART1:
      sub_mask = rSUBSRCPND & ~rINTSUBMSK;
      ret = get_subIRQ(sub_mask, 3, 5, irq);
      break;
    case IRQ_UART2:
      sub_mask = rSUBSRCPND & ~rINTSUBMSK;
      ret = get_subIRQ(sub_mask, 6, 8, irq);
      break;
    case IRQ_ADCTC:
      sub_mask = rSUBSRCPND & ~rINTSUBMSK;
      ret = get_subIRQ(sub_mask, 9, 10, irq);
      break;
    case IRQ_EINT4_7:
      ext_mask = rEINTPEND & ~rEINTMASK;
      ret = get_extIRQ(ext_mask, 4, 7, irq);
      break;
    case IRQ_EINT8_23:
      ext_mask = rEINTPEND & ~rEINTMASK;
      ret = get_extIRQ(ext_mask, 8, 23, irq);
      break;
    default:
      ret = irq;
    }
	
    return ret;
}

void ISR_Init(void)
{
	int irq;

	//FIQ disable and disable all interrupt
	rINTMOD     = 0x0;                     //All=IRQ mode
	rINTMSK     = BIT_ALLMSK;              //All interrupt is masked.
	rINTSUBMSK  = BIT_SUB_ALLMSK;          //All sub-interrupt is masked

	// Define irq handler
	for (irq=0; irq < NORMAL_IRQ_OFFSET; irq++) {
		InterruptFunc[irq].valid = 1;
		InterruptFunc[irq].ack_irq = ack_irq;
		InterruptFunc[irq].mask =  mask_irq;
		InterruptFunc[irq].unmask = unmask_irq;
	}

	InterruptFunc[IRQ_RESERVED6].valid	= 0;
	InterruptFunc[IRQ_RESERVED24].valid	= 0;

	InterruptFunc[IRQ_EINT4_7].valid	= 0;
	InterruptFunc[IRQ_EINT8_23].valid	= 0;

	InterruptFunc[IRQ_EINT0].valid		= 0;
	InterruptFunc[IRQ_EINT1].valid		= 0;
	InterruptFunc[IRQ_EINT2].valid		= 0;
	InterruptFunc[IRQ_EINT3].valid		= 0;

	for (irq=NORMAL_IRQ_OFFSET; irq < EXT_IRQ_OFFSET; irq++) {
		InterruptFunc[irq].valid	= 0;
		InterruptFunc[irq].ack_irq	= EINT4_23ack_irq;
		InterruptFunc[irq].mask	= EINT4_23mask_irq;
		InterruptFunc[irq].unmask	= EINT4_23unmask_irq;
	}

	for (irq=EXT_IRQ_OFFSET; irq < SUB_IRQ_OFFSET; irq++) {
		InterruptFunc[irq].valid	= 1;
		InterruptFunc[irq].ack_irq	= SUB_ack_irq;
		InterruptFunc[irq].mask	= SUB_mask_irq;
		InterruptFunc[irq].unmask	= SUB_unmask_irq;
	}  

}

//--------------------------------IRQ core---------------------------------//

#if 0
int GetISROffsetClr()
{
	//計算中斷的偏移地址,高位優先
	int i,ispr=rI_ISPR,tmp=1<<(MAXHNDLRS-1);//temp bit
	for(i=MAXHNDLRS;i>0;i--){
		if(ispr&tmp){
			return i-1;
		}
		tmp>>=1;
	}
	return -1;
}
#endif

int SetISR_Interrupt(int vector, void (*handler)(int, void*), void* data)
{
#if OS_CRITICAL_METHOD == 3
	OS_CPU_SR  cpu_sr;
#endif

	if(vector>NR_IRQS || vector<0)
		return -1;

	if(!InterruptFunc[vector].valid)
		return -1;

	OS_ENTER_CRITICAL();

	InterruptFunc[vector].ack_irq(vector);	//clear pending

	InterruptFunc[vector].InterruptHandlers = handler;
	InterruptFunc[vector].data = data;

	InterruptFunc[vector].unmask(vector);	//enable interrupt

	OS_EXIT_CRITICAL();

	return 0;
}

void ISR_IrqHandler(void)
{
	unsigned int irq=GetISROffsetClr();	//得到中斷向量的偏移地址

	irq=fixup_irq(irq);

	if(irq>=NR_IRQS)
		return;
	if(InterruptFunc[irq].InterruptHandlers==NULL){
		InterruptFunc[irq].ack_irq(irq);	//clear pending
		return;
	}

	OSIntEnter();
	 // Call interrupt service routine
	InterruptFunc[irq].InterruptHandlers(irq, InterruptFunc[irq].data);
	InterruptFunc[irq].ack_irq(irq);	//clear pending

	OSIntExit();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品制服美女久久| 秋霞影院一区二区| 欧美一二三区精品| 欧美视频一区二区三区四区| jizzjizzjizz欧美| 久久99精品视频| 亚洲 欧美综合在线网络| 最好看的中文字幕久久| 亚洲精品一区二区三区香蕉| 欧美高清激情brazzers| 欧美日韩三级在线| 欧洲精品视频在线观看| 91麻豆国产在线观看| 成人av免费在线播放| 成人激情视频网站| 国产成人小视频| 蜜桃久久av一区| 日韩精品一区第一页| 日韩av在线免费观看不卡| 亚洲精品乱码久久久久| 亚洲精品v日韩精品| √…a在线天堂一区| 国产精品久久久久久亚洲伦 | 91精品国产91久久久久久一区二区| 欧美精品乱码久久久久久| 欧美绝品在线观看成人午夜影视 | 国产欧美一区二区精品性色| 国产精品你懂的在线| 欧美日韩国产高清一区二区| 欧美v国产在线一区二区三区| 久久精品一二三| 欧美tk—视频vk| 国产欧美日韩精品a在线观看| 亚洲天堂中文字幕| 日韩av一区二区三区四区| 国产激情一区二区三区四区| 99精品欧美一区二区三区综合在线| 色哟哟国产精品免费观看| 91麻豆精品久久久久蜜臀| 欧美激情中文不卡| 午夜精品一区二区三区免费视频| 国产一区二区伦理片| 99国产精品久| 日韩免费视频一区二区| 中文字幕一区二区在线观看| 亚洲电影你懂得| 懂色av一区二区三区蜜臀 | 国产午夜亚洲精品理论片色戒| 亚洲伦理在线免费看| 久久99久久99小草精品免视看| 91农村精品一区二区在线| 欧美日韩高清一区二区不卡| 久久久久久9999| 欧美伦理视频网站| 色激情天天射综合网| 欧美成人午夜电影| 亚洲激情综合网| 国精产品一区一区三区mba视频| 欧美这里有精品| 国产亚洲婷婷免费| 日本免费在线视频不卡一不卡二| av电影在线观看一区| 精品国产制服丝袜高跟| 亚洲风情在线资源站| 成人视屏免费看| 日韩免费视频线观看| 亚洲成a人v欧美综合天堂下载| 成人h动漫精品一区二区| 91精品国产综合久久蜜臀| 亚洲精选视频免费看| 国产91精品免费| 精品黑人一区二区三区久久| 亚洲高清中文字幕| 99国产精品国产精品久久| 国产亚洲成年网址在线观看| 久久成人av少妇免费| 欧美高清视频www夜色资源网| 亚洲视频免费在线观看| 成人午夜精品在线| 久久久久久久综合色一本| 蜜臀av一区二区在线免费观看| 欧美性极品少妇| 亚洲欧美日韩国产一区二区三区 | 日韩免费视频一区二区| 性做久久久久久久免费看| 91美女在线视频| 欧美国产视频在线| 国产麻豆视频一区二区| 日韩精品中午字幕| 日本三级亚洲精品| 欧美蜜桃一区二区三区| 亚洲精品国产视频| 91性感美女视频| 亚洲三级在线播放| 99r精品视频| 亚洲欧洲av另类| 91蜜桃在线观看| 亚洲精品日日夜夜| 在线精品视频免费观看| 亚洲激情图片qvod| 91在线观看美女| 亚洲精品大片www| 在线一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美极品美女视频| 不卡电影免费在线播放一区| 综合中文字幕亚洲| 91精品国产一区二区| 欧美性生活大片视频| 欧美精品一区二区三区四区| 国产一区二区三区日韩| 久久久久久免费| 成人性生交大合| 中文字幕一区二区三区四区不卡 | 亚洲免费毛片网站| 一区二区激情视频| 一本到一区二区三区| 亚洲一区精品在线| 国产91精品一区二区麻豆网站 | 国产精品美女久久久久aⅴ| 高清成人免费视频| 国产精品国产三级国产普通话蜜臀| 99热99精品| 亚洲国产成人tv| 欧美一区二区在线不卡| 国产在线精品免费| 欧美国产日韩精品免费观看| 91视视频在线观看入口直接观看www| 亚洲综合在线免费观看| 3d成人动漫网站| 国产在线精品一区二区| 国产精品美女久久久久久久| 欧美曰成人黄网| 久久黄色级2电影| 日本一区二区动态图| 欧洲精品一区二区| 久久成人免费日本黄色| 1024成人网| 91精品欧美久久久久久动漫| 国产精品一区二区在线观看网站 | 国产91色综合久久免费分享| 亚洲欧美日韩中文播放 | 亚洲一卡二卡三卡四卡| 欧美r级电影在线观看| jiyouzz国产精品久久| 日本亚洲免费观看| 国产精品久久久久影院| 51精品视频一区二区三区| 粉嫩一区二区三区性色av| 亚洲综合另类小说| 久久精品一区二区三区不卡牛牛 | 欧美男人的天堂一二区| 国产成人免费xxxxxxxx| 性感美女极品91精品| 久久久久久久久久久黄色| 色婷婷综合久久久中文一区二区| 三级在线观看一区二区| 国产精品动漫网站| 91精品国产福利| 色综合激情久久| 国产原创一区二区| 天天av天天翘天天综合网| 国产精品乱码人人做人人爱| 欧美高清激情brazzers| 成人精品免费网站| 美国欧美日韩国产在线播放| 一区二区三区 在线观看视频 | 蜜臀av在线播放一区二区三区| 亚洲视频一二区| 久久亚洲二区三区| 9191久久久久久久久久久| av中文字幕亚洲| 国产精品综合在线视频| 视频一区在线视频| 一区二区三区四区中文字幕| 中文字幕免费不卡在线| 欧美变态口味重另类| 欧美三级视频在线播放| 99在线精品免费| 成人免费高清在线| 激情综合一区二区三区| 男女视频一区二区| 香港成人在线视频| 亚洲免费色视频| 一色桃子久久精品亚洲| 久久一二三国产| 国产v综合v亚洲欧| 一区二区三区四区在线| 国产精品久久久一本精品| 2020国产精品久久精品美国| 欧美一区二区三区啪啪| 欧美私人免费视频| 在线视频中文字幕一区二区| 97久久超碰国产精品电影| 成人高清视频免费观看| 成人美女视频在线看| 国产91色综合久久免费分享| 国产成人鲁色资源国产91色综| 国产美女在线精品|