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