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

📄 aic_drv.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  AIC_DRV.C                                   *
**  COPYRIGHT    :  (c) 2004 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**              2004/10/22                                      *
****************************************************************/
#define AIC_DRV_GLOBAL
#include "includes.h"
#include "hardware.h"
#include "aic_drv.h"

/* defines */

#define  MAX_ISR_ID         18   

/*****************************************************************
    Install an interrupt ,but don't enable the int;
*****************************************************************/
void AIC_Install(INT32U irq_id, INT32U prio, INT32U mode, AIC_ISR_FUNC handler)
{
    INT32U mask;
    AT91PS_AIC     pAic;
    
    if (irq_id > MAX_ISR_ID) return;
    mask  = 1 << irq_id;    
    prio &= 0x0007;  // MAX PRIORY IS 7
    pAic = AT91C_BASE_AIC;
        
    pAic->AIC_IDCR = mask;                      /* disable int */
    pAic->AIC_SVR[irq_id] = (INT32U)AIC_ISR_TBL[irq_id];    /* save handler addr *///(INT32U)TC1_asm_irq_handler;
    
    C_ISR_TBL[irq_id] = handler;
    
    pAic->AIC_SMR[irq_id] = mode | prio;        /* set int mode and prio */
    pAic->AIC_ICCR = mask;                      /* clear int */    
}    

void AIC_Install_Isolate(INT32U irq_id, INT32U prio, INT32U mode,AIC_ISR_FUNC handler)
{
  
    INT32U mask;
    AT91PS_AIC     pAic;
    
    if (irq_id > MAX_ISR_ID) return;
    mask  = 1 << irq_id;    
    prio &= 0x0007;  // MAX PRIORY IS 7
    pAic = AT91C_BASE_AIC;
    
    pAic->AIC_IDCR = mask;                      /* disable int */
    pAic->AIC_SVR[irq_id] = (INT32U)handler;    /* save handler addr */
    pAic->AIC_SMR[irq_id] = mode | prio;        /* set int mode and prio */
    pAic->AIC_ICCR = mask;                      /* clear int */    
}

/*****************************************************************
    close and disable the interrupt
*****************************************************************/
void AIC_Close(INT32U irq_id)
{
    INT32U mask;
    AT91PS_AIC     pAic;
    
    if (irq_id > MAX_ISR_ID) return;
    mask  = 1 << irq_id;
    pAic = AT91C_BASE_AIC;
    
    pAic->AIC_IDCR = mask;                /* disable int level */
    pAic->AIC_ICCR = mask;                /* clear pending int */  
}

/*****************************************************************
*  trigger the interrupt by software
*****************************************************************/
void AIC_Trigger(INT32U irq_id)
{
    INT32U mask;
    AT91PS_AIC     pAic;
    if (irq_id > MAX_ISR_ID) return;    
    mask  = 1 << irq_id;
    
    pAic = AT91C_BASE_AIC;
    pAic->AIC_ISCR = 1 << irq_id;  
}

/*****************************************************************
*  enable the interrupt,The ISR must be install first;
*****************************************************************/
void AIC_Int_Enable(INT32U irq_id)
{
    INT32U mask;
    AT91PS_AIC     pAic;
    if (irq_id > MAX_ISR_ID) return;    
    mask  = 1 << irq_id;
    pAic = AT91C_BASE_AIC;
    
    pAic->AIC_IECR = mask;                /*enable INT*/
}

/*****************************************************************
*  disaable the interrupt
*****************************************************************/    
void AIC_Int_Disable(INT32U irq_id)
{
    INT32U mask;
    AT91PS_AIC     pAic;
    if (irq_id > MAX_ISR_ID) return;    
    mask  = 1 << irq_id;
    pAic = AT91C_BASE_AIC;
        
    pAic->AIC_IDCR = mask;
    pAic->AIC_ICCR = mask;
}

/*****************************************************************
*     clear pending interrupt
*****************************************************************/    
void AIC_Int_Clear(INT32U irq_id)
{
    AT91PS_AIC     pAic;
    if (irq_id > MAX_ISR_ID) return;        
    pAic = AT91C_BASE_AIC;
    pAic->AIC_ICCR = 1 << irq_id;
}

/*****************************************************************
*     return current interrupt status
*****************************************************************/    
INT32U  AIC_State(void)
{
    AT91PS_AIC     pAic;
    pAic = AT91C_BASE_AIC;
    return (pAic->AIC_ISR);
}
    
/*****************************************************************
*     Query a interrupt pending or not
*****************************************************************/    
BOOLEAN AIC_IsPending(INT32U irq_id)
{
    AT91PS_AIC     pAic;    
    if (irq_id > MAX_ISR_ID) return FALSE;
    pAic = AT91C_BASE_AIC;
    if (pAic->AIC_IPR & (1<<irq_id))
       return (TRUE);
    else
       return (FALSE);
}

/*****************************************************************
*     clear pending interrupt
*****************************************************************/    
BOOLEAN AIC_IsActive(INT32U irq_id)
{
    AT91PS_AIC     pAic;    
    if (irq_id > MAX_ISR_ID) return FALSE;
    pAic = AT91C_BASE_AIC;
    if (pAic->AIC_ISR & (1<<irq_id))
        return (TRUE);
    else 
        return (FALSE);
} 

⌨️ 快捷键说明

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