drv_vic.c

来自「ucos 在 arm9 芯片上的移植」· C语言 代码 · 共 248 行

C
248
字号
/*$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 + =
减小字号Ctrl + -
显示快捷键?