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 + -
显示快捷键?