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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? isr.c

?? s3c2410的源代碼
?? C
字號(hào):
/***************************************************************************\
	Copyright (c) 2004-2007 threewater@up-tech.com, All rights reserved.
	by threewter	2004.5.12
\***************************************************************************/
/***************************************************************************\
    #說(shuō)明:中斷處理函數(shù)
    #接口函數(shù)
	----------------------------------  Bug  --------------------------------------

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

	2004-5-12	1、移植
				2、改變了中斷函數(shù)的定義,添加了一個(gè)標(biāo)志中斷號(hào)的參數(shù)
				3、添加了void ISR_Init(void)函數(shù)定義,系統(tǒng)初始化中斷的時(shí)候調(diào)用

\***************************************************************************/
#include "../inc/reg2410.h"
#include "../uhal/isr.h"
#include "../inc/macro.h"
#include <string.h>
//#include <intrinsics.h>
extern void INTS_OFF(void);
extern void INTS_ON(void);


typedef void (*mask_func_t)(unsigned int);

typedef struct{
	Interrupt_func_t InterruptHandlers;
	void* data;
	int valid;		//設(shè)置中斷1=有效0=無(wú)效
	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---------------------------------//
void INTS_OFF()
{
   asm("mrs   r0, cpsr");          // current CSR
   asm("mov   r1, r0");             //make a copy for masking

   asm("orr   r1, r1, #0xC0");     // mask off int bits
   asm("msr   CPSR_cxsf, r1");     // disable ints (IRQ and FIQ)
   asm("and   r0, r0, #0x80");     // return FIQ bit from original CSR
   asm("mov   pc,lr");             //return
}
void INTS_ON()
{
   asm("mrs   r0, cpsr");           //current CSR
   asm("bic   r0, r0, #0xC0");     // mask on ints r0高兩位清零
   asm("msr   CPSR_cxsf, r0");     // enable ints (IRQ and FIQ)
   asm("mov   pc,lr");             // return
}
/*
static int  fixup_irq_num(int irq)
{
	if (irq < IRQ_EINT4) return irq;
	else return ((irq + 4) - NORMAL_IRQ_OFFSET);
}
*/
/*
static void  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);
        }
}

 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;
}

 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()
{
	//計(jì)算中斷的偏移地址,高位優(yōu)先
	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();
	//cpu_sr = INTS_OFF();
	INTS_OFF();
        //__disable_interrupt();
	InterruptFunc[vector].ack_irq(vector);	//clear pending

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

	InterruptFunc[vector].unmask(vector);	//enable interrupt
        //__enable_interrupt();
	//OS_EXIT_CRITICAL();
	 //if(cpu_sr == 0) INTS_ON();
	 INTS_ON();

	return 0;
}

void Enable_Irq(int vector)
{
	if(vector>NR_IRQS || vector<0)
		return;

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

	InterruptFunc[vector].ack_irq(vector);	//clear pending
	InterruptFunc[vector].unmask(vector);	//enable interrupt
}

void Disable_Irq(int vector)
{
	if(vector>NR_IRQS || vector<0)
		return;

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

	InterruptFunc[vector].mask(vector);	//disable interrupt
}


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();
	INTS_OFF();
        //__disable_interrupt();
	 // Call interrupt service routine
	InterruptFunc[irq].InterruptHandlers(irq, InterruptFunc[irq].data);
	InterruptFunc[irq].ack_irq(irq);	//clear pending
        INTS_ON();
        //__enable_interrupt();
	//OSIntExit();
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
自拍偷在线精品自拍偷无码专区| 久久久91精品国产一区二区精品 | 亚洲日本在线看| 欧美日韩一级片在线观看| 狠狠色综合播放一区二区| 中文字幕一区在线观看| 一区在线观看免费| 欧美一区二区在线免费观看| 97久久精品人人爽人人爽蜜臀 | 97精品久久久久中文字幕 | 国产在线麻豆精品观看| 亚洲一区二区精品3399| 成人免费小视频| 久久久噜噜噜久噜久久综合| 91精品国产综合久久福利| 色婷婷综合五月| 不卡在线视频中文字幕| 国内成人精品2018免费看| 天天综合网天天综合色| 亚洲精品午夜久久久| 国产精品麻豆欧美日韩ww| 久久婷婷一区二区三区| 91精品国产综合久久福利| 欧美区视频在线观看| 日本久久一区二区三区| 成人99免费视频| 粉嫩绯色av一区二区在线观看 | 亚洲欧洲三级电影| 欧美国产在线观看| 国产日韩欧美亚洲| 久久久精品一品道一区| 26uuu精品一区二区三区四区在线| 欧美一级二级三级蜜桃| 欧美精品1区2区3区| 欧美美女一区二区| 欧美日本高清视频在线观看| 欧美日韩久久一区二区| 欧美日韩激情一区二区三区| 欧美日韩和欧美的一区二区| 欧美日精品一区视频| 欧美在线三级电影| 精品视频999| 6080yy午夜一二三区久久| 欧美精品成人一区二区三区四区| 在线电影院国产精品| 日韩午夜精品视频| 欧美精品一区二区不卡 | 国产精品国产精品国产专区不片| 欧美国产日本视频| 综合婷婷亚洲小说| 亚洲狠狠丁香婷婷综合久久久| 亚洲码国产岛国毛片在线| 一区二区视频在线| 亚洲高清免费视频| 日日夜夜免费精品| 麻豆国产一区二区| 国产高清一区日本| 99热这里都是精品| 欧美日韩一区高清| 日韩精品中文字幕在线不卡尤物| 亚洲精品一区二区三区蜜桃下载| 久久久精品综合| 亚洲色图第一区| 亚洲成va人在线观看| 日韩高清不卡一区二区三区| 韩国欧美国产一区| 不卡av在线网| 欧美日韩一二三| 2欧美一区二区三区在线观看视频| 欧美激情一区二区三区全黄| 亚洲午夜在线视频| 91精品啪在线观看国产60岁| 欧美刺激脚交jootjob| 国产日韩精品一区二区三区| 亚洲小说欧美激情另类| 国产精品一区二区无线| 99久久精品国产网站| 在线电影欧美成精品| 国产日韩高清在线| 午夜国产精品影院在线观看| 国产一区二区三区电影在线观看| 一本久久a久久免费精品不卡| 日韩一本二本av| 亚洲视频在线一区观看| 奇米精品一区二区三区在线观看| 成人丝袜18视频在线观看| 欧美电影影音先锋| 1024成人网色www| 激情综合五月婷婷| 欧美性极品少妇| 国产欧美va欧美不卡在线| 五月天久久比比资源色| a亚洲天堂av| 欧美成人一区二区| 亚洲综合自拍偷拍| 成人性生交大合| 欧美大胆一级视频| 一区二区三区美女视频| 国产激情一区二区三区四区 | 日韩欧美国产综合在线一区二区三区| 国产精品理论在线观看| 精品一区二区三区日韩| 欧美色精品天天在线观看视频| 国产欧美日韩在线| 久久精品国产亚洲aⅴ| 欧美亚洲国产一卡| 亚洲色图都市小说| 高清国产午夜精品久久久久久| 4438x亚洲最大成人网| 亚洲精品国产无套在线观| 国产盗摄精品一区二区三区在线| 欧美一区欧美二区| 亚洲午夜精品17c| 91免费版在线看| 国产精品久久三区| 国产精品一区二区黑丝| 日韩一区二区在线观看视频| 亚洲自拍另类综合| 色综合久久久久综合99| 国产精品久久久久aaaa樱花| 国产xxx精品视频大全| 精品黑人一区二区三区久久| 免费成人小视频| 91精品国产色综合久久不卡蜜臀 | 精品欧美一区二区在线观看 | 国产麻豆91精品| 精品久久久久久综合日本欧美| 日韩av不卡一区二区| 欧美日韩国产天堂| 偷拍一区二区三区四区| 欧美三电影在线| 天天av天天翘天天综合网色鬼国产 | 亚洲免费在线观看| 97精品久久久午夜一区二区三区| 国产精品二三区| 91欧美激情一区二区三区成人| 国产精品免费观看视频| 成人黄色av电影| 亚洲色图在线播放| 在线区一区二视频| 午夜影院在线观看欧美| 欧美精品在线视频| 美腿丝袜亚洲一区| 欧美精品一区二| 丁香天五香天堂综合| 中文字幕亚洲在| 在线观看不卡一区| 天天色 色综合| 欧美tk—视频vk| 懂色av一区二区夜夜嗨| 中文字幕在线不卡| 欧洲精品视频在线观看| 午夜精品福利一区二区三区av| 日韩一区国产二区欧美三区| 精品午夜久久福利影院| 国产精品区一区二区三| 一本到不卡免费一区二区| 亚洲v精品v日韩v欧美v专区| 日韩精品一区二区三区蜜臀 | 青青国产91久久久久久| 亚洲精品在线三区| 成人午夜在线免费| 一区二区三区国产| 欧美一级淫片007| 懂色av噜噜一区二区三区av| 一色屋精品亚洲香蕉网站| 欧美日韩亚州综合| 国模套图日韩精品一区二区| 成人欧美一区二区三区视频网页| 在线观看亚洲成人| 久久se这里有精品| 中文字幕亚洲视频| 日韩一级二级三级| 99久久久免费精品国产一区二区| 亚洲国产视频一区| 久久久久久日产精品| 在线观看网站黄不卡| 九色综合狠狠综合久久| 亚洲同性同志一二三专区| 91麻豆精品国产无毒不卡在线观看| 国产精品一区久久久久| 亚洲国产日韩一区二区| 久久久蜜桃精品| 在线观看免费亚洲| 国产精品一区二区视频| 亚洲成av人在线观看| 中文字幕免费一区| 正在播放一区二区| 99久久国产综合色|国产精品| 毛片av一区二区三区| 亚洲免费色视频| 久久久www成人免费无遮挡大片 | 中文字幕av一区 二区| 91精品国产一区二区三区| 色综合欧美在线| 国内精品伊人久久久久av影院 | 精品乱人伦一区二区三区| 91免费观看国产| 国产成人免费网站| 日本不卡在线视频|