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

📄 drv_vic.c

📁 ucos 在 arm9 芯片上的移植
💻 C
字号:
/*$Id: DRV_VIC.c,v 1.3 2008-05-09 01:32:24 xuhongliang Exp $ *//************************************************************************ * * Title		:DRV_VIC.h * * Summary		:vectored interrupt controller  * * Author		:xhl * Date         :2008-03-27 * Copyright (c) Pioneer Corporation **************************************************************************/#include "cp15.h"#include "sfr.h"#include "DRV_VIC.h"volatile LC_VIC* lcVIC = (volatile LC_VIC*)VIC_BASE_ADDR;/******************************************************************* Function Name*    DRV_VIC_init* Prototype*    DRV_VIC_RESULT DRV_VIC_init( void );** Inputs*    None** Outputs*    None** Return Codes*    DRV_VIC_OK*    DRV_VIC_FAIL** Description*    ******************************************************************/DRV_VIC_RESULT DRV_VIC_Init(void){	uInt32 i;	ARM_disableIRQ();    ARM_disableFIQ();       	lcVIC->VICProtection	= 0x00000001UL;     // VICProtection Protection enable register, 1: only privileged mode accesses	lcVIC->VICIntSelect 	= 0x00000000UL;     // IRQ interupt only   	lcVIC->VICIntEnClear	= 0xffffffffUL;     	lcVIC->VICSoftIntClear	= 0xffffffffUL;	lcVIC->VICDefVectAddr	= 0x00000000UL;	lcVIC->VICVectAddr		= 0x00000000UL;	for(i=0; i<16; i++)	{		lcVIC->VICVectCntls[i] = 0;		lcVIC->VICVectAddrs[i] = 0;	}        // enable ARM IRQ, FIQ interrupt    ARM_enableIRQ();    ARM_enableFIQ();    	return DRV_VIC_OK;}/******************************************************************* Function Name*    DRV_VIC_Enable* Prototype*    DRV_VIC_RESULT DRV_VIC_Enable( INT_ID intID, BOOL enable )** Inputs*    intID:		Interrupt ID*	 enable:	Enable or Disable** Outputs*    None** Return Codes*    DRV_VIC_OK*    DRV_VIC_FAIL** Description*   ******************************************************************/DRV_VIC_RESULT DRV_VIC_Enable( INT_ID intID, BOOL enable ){	if(intID >= INT_MAX1)		return DRV_VIC_INVALID_INPUT;	if(enable)	{		lcVIC->VICIntEnable = (0x00000001UL << intID);	}	else	{		lcVIC->VICIntEnClear = (0x00000001UL << intID);	}	return DRV_VIC_OK;}/******************************************************************* Function Name*    DRV_VIC_SetIntAsIRQ* Prototype*    DRV_VIC_RESULT DRV_VIC_SetIntAsIRQ( INT_ID intID )** Inputs*    intID:		Interrupt ID** Outputs*    None** Return Codes*    DRV_VIC_OK*    DRV_VIC_FAIL** Description*   ******************************************************************/DRV_VIC_RESULT DRV_VIC_SetIntAsIRQ( INT_ID intID ){	if(intID >= INT_MAX1)		return DRV_VIC_INVALID_INPUT;	lcVIC->VICIntSelect &= ~(0x00000001UL << intID);	return DRV_VIC_OK;}/******************************************************************* Function Name*    DRV_VIC_SetIntAsFIQ* Prototype*    DRV_VIC_RESULT DRV_VIC_SetIntAsFIQ( INT_ID intID )** Inputs*    intID:		Interrupt ID** Outputs*    None** Return Codes*    DRV_VIC_OK*    DRV_VIC_FAIL** Description*   ******************************************************************/DRV_VIC_RESULT DRV_VIC_SetIntAsFIQ( INT_ID intID ){	if(intID >= INT_MAX1)		return DRV_VIC_INVALID_INPUT;	lcVIC->VICIntSelect |= (0x00000001UL << intID);	return DRV_VIC_OK;}/******************************************************************* Function Name*    DRV_VIC_SetIntAsFIQ* Prototype*    DRV_VIC_RESULT DRV_VIC_SetIntAsFIQ( INT_ID intID )** Inputs*    intID:		Interrupt ID** Outputs*    None** Return Codes*    DRV_VIC_OK*    DRV_VIC_FAIL** Description*   ******************************************************************/DRV_VIC_RESULT DRV_VIC_IsIntIRQ( INT_ID intID, BOOL* bIrq ){	if(intID >= INT_MAX1)		return DRV_VIC_INVALID_INPUT;	*bIrq = lcVIC->VICIntSelect & (0x00000001UL << intID);	return DRV_VIC_OK;}DRV_VIC_RESULT DRV_VIC_GetIntFIQStatus( INT_ID intID, BOOL* bFiqStu ){	if(intID >= INT_MAX1)		return DRV_VIC_INVALID_INPUT;	*bFiqStu = lcVIC->VICFIQStatus & (0x00000001UL << intID);	return DRV_VIC_OK;}DRV_VIC_RESULT DRV_VIC_GetIntIRQStatus( INT_ID intID, BOOL* bIrqStu ){	if(intID >= INT_MAX1)		return DRV_VIC_INVALID_INPUT;	*bIrqStu = lcVIC->VICIRQStatus & (0x00000001UL << intID);	return DRV_VIC_OK;}DRV_VIC_RESULT DRV_VIC_AttachISR( uInt8 vicID, INT_ID intID, INTC_ISR isr) {    if(isr==NULL || intID >= INT_MAX1)        return DRV_VIC_INVALID_INPUT;	if(lcVIC->VICVectCntls[vicID] & 0x00000020UL)		return DRV_VIC_FAIL;    	lcVIC->VICVectCntls[vicID] =  intID | 0x00000020UL;	lcVIC->VICVectAddrs[vicID] = (unsigned long)isr;        return DRV_VIC_OK;}DRV_VIC_RESULT DRV_VIC_DetachISR( uInt8 vicID) {    if(vicID >= INT_MAX1)        return DRV_VIC_INVALID_INPUT;	if(!(lcVIC->VICVectCntls[vicID] & 0x00000020UL))		return DRV_VIC_FAIL;	lcVIC->VICVectCntls[vicID] &= ~0x00000020UL;    return DRV_VIC_OK;}

⌨️ 快捷键说明

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