📄 drv_vic.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 + -