gic.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 164 行
C
164 行
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2007
*
* File name : gic.c
* Description : S3F4Ax GIC driver
*
* History :
* 1. Date : August 1, 2007
* Author : Stanimir Bonev
* Description : Create
*
* $Revision: 18083 $
**************************************************************************/
#include <assert.h>
#include "arm_comm.h"
#include "gic.h"
/*************************************************************************
* Function Name: GIC_Init
* Parameters: void *DefaultIntr, void *SpuriousIntr
* Return: none
*
* Description: Init GIC
*
*************************************************************************/
void GIC_Init(void *DefaultIntr, void *SpuriousIntr)
{
Int32U i = 0;
pInt32U vect_addr;
pInt32U vect_cntl;
/* initialize GIC */
GIC_IDCR0 = GIC_IDCR1 = 0xFFFFFFFF; // disable all interrupts' sources
GIC_ICCR0 = GIC_ICCR1 = 0xFFFFFFFF; // clear all pending interrupts
GIC_SPU = (Int32U)SpuriousIntr; // set spurious interrupts handler
// clear interrupt stack
for(i = 8; i; i--)
{
GIC_EOICR = 0;
}
vect_addr = (pInt32U)&GIC_SVR0;
vect_cntl = (pInt32U)&GIC_SMR0;
/* set all the vector to default handler and vector control register */
for ( i = 64; i; i-- )
{
*vect_addr++ = (Int32U)DefaultIntr;
*vect_cntl++ = (((Int32U)POS_EDGE_TRIG)<<4); // Positive edge triggered, IRQ, priority 0
}
}
/*************************************************************************
* Function Name: GIC_InstallIntr
* Parameters: Int32U IntNumber, void *HandlerAddr,
* Int32U Priority, GIC_IntrType_t Mode, Boolean Fiq
* Return: Int32U
*
* Description: Install interrupt
*
*************************************************************************/
Int32U GIC_InstallIntr(Int32U IntNumber, void *HandlerAddr,
Int32U Priority, GIC_IntrType_t Mode, Boolean Fiq)
{
pInt32U vect_addr;
pInt32U vect_cntl;
Int32U Tmp;
assert(IntNumber < 64);
assert(Priority < 8);
vect_addr = ((pInt32U)&GIC_SVR0) + IntNumber; // calculate address of vector register
vect_cntl = ((pInt32U)&GIC_SMR0) + IntNumber; // calculate address of control register
Tmp = *vect_addr; // preserve old handler
*vect_addr = (Int32U)HandlerAddr; // set new handler
// set interrupt control register
*vect_cntl = Priority | (Fiq?1UL<<3:0) | (((Int32U)Mode) << 4);
return(Tmp);
}
/*************************************************************************
* Function Name: GIC_SpuriousIntr
* Parameters: void *HandlerAddr
* Return: Int32U
*
* Description: Set spurious interrupt handler
*
*************************************************************************/
Int32U GIC_SpuriousIntr(void *HandlerAddr)
{
Int32U Tmp = GIC_SPU;
GIC_SPU = (Int32U)HandlerAddr;
return(Tmp);
}
/*************************************************************************
* Function Name: GIC_IntrEnable
* Parameters: Int32U IntNumber
* Return: none
*
* Description: Enable interrupt
*
*************************************************************************/
void GIC_IntrEnable(Int32U IntNumber)
{
pInt32U pReg;
assert(IntNumber<64);
pReg = (IntNumber<32)?(pInt32U)&GIC_IECR0:(pInt32U)&GIC_IECR1;
*pReg = 1UL << (IntNumber % 32);
}
/*************************************************************************
* Function Name: Install_Interrupt
* Parameters: Int32U IntNumber
* Return: none
*
* Description: Disable interrupt
*
*************************************************************************/
void GIC_IntrDisable(Int32U IntNumber)
{
pInt32U pReg;
assert(IntNumber<64);
pReg = (IntNumber<32)?(pInt32U)&GIC_IDCR0:(pInt32U)&GIC_IDCR1;
*pReg = 1UL << (IntNumber % 32);
}
/*************************************************************************
* Function Name: GIC_SetIntr
* Parameters: Int32U IntNumber
* Return: none
*
* Description: Generate interrupt
*
*************************************************************************/
void GIC_SetIntr(Int32U IntNumber)
{
pInt32U pReg;
assert(IntNumber<64);
pReg = (IntNumber<32)?(pInt32U)&GIC_ISCR0:(pInt32U)&GIC_ISCR1;
*pReg = 1UL << (IntNumber % 32);
}
/*************************************************************************
* Function Name: GIC_ClearIntr
* Parameters: Int32U IntNumber
* Return: none
*
* Description: Clear interrupt
*
*************************************************************************/
void GIC_ClearIntr(Int32U IntNumber)
{
pInt32U pReg;
assert(IntNumber<64);
pReg = (IntNumber<32)?(pInt32U)&GIC_ICCR0:(pInt32U)&GIC_ICCR1;
*pReg = 1UL << (IntNumber % 32);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?