📄 hw_interrupt.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : interrupt.c
Desc : Interrupt接口函数的实现
Author : huangxinyu
Date : 2007-05-30
Notes :
$Log: hw_interrupt.c,v $
Revision 1.3 2008/06/19 04:43:31 Administrator
代码整理!
Revision 1.2 2008/05/15 08:01:03 HXY
取消LDK/Porsche宏
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:05 Lingzhaojun
no message
Revision 1.6 2007/10/15 09:37:16 Huangxinyu
根据RK27提交修改driver
Revision 1.5 2007/10/15 09:15:18 Huangxinyu
根据RK27提交修改driver
Revision 1.4 2007/10/11 04:09:20 Huangshilin
System 其他目录。
Revision 1.3 2007/10/08 02:38:43 Lingzhaojun
添加版本自动注释脚本
* huangxinyu 2007-06-01 修改Interrupt接口名称
*********************************************************************/
#include "hw_include.h"
#include "hw_interrupt.h"
#include "hwapi_interrupt.h"
#define INTC_REG_BASE AHB0_INTC_BASE
#ifdef DRIVER_ONLY
INTR_HANDLER irq_vector_table[INTC_MAX_IRQ]; // IRQ controller interrupt handle vector table
/**************************************************************************
* 函数描述: 根据物理IRQ跳转到关联的ISR中
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Intr_Server(void)
{
UINT32 v = ReadReg32(INTC_ISR); // index for interrupt source
WriteReg32(INTC_ICCR, 1 << v);
// branch to the fn saved in irq_vector_table[v]
if (irq_vector_table[v].routine)
{
irq_vector_table[v].routine();
}
}
#else
extern INTR_HANDLER irq_vector_table[INTC_MAX_IRQ]; // IRQ controller interrupt handle vector table
#endif
#define INTC_REG_BASE AHB0_INTC_BASE
/**************************************************************************
* 函数描述: 初始化IRQ中断控制器
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void init_irq_controller(void)
{
int i;
// disable all interrupt
WriteReg32(INTC_IECR, 0);
// clear all interrupt
WriteReg32(INTC_ICCR, 0xFFFFFFFF);
for (i = 0; i < INTC_MAX_IRQ; i++)
{
MaskRegBits32(INTC_SCR(i), SRCTYPE_MASK, HIGH_LEVEL);
}
}
/**************************************************************************
* 函数描述: 中断初始化(初始化中断控制器\使能ARM IRQ)
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Intr_PowerOnInit(void)
{
// initial interrupt controller
init_irq_controller();
#ifdef DRIVER_ONLY
__asm
{
MRS r0, CPSR
BIC r0, r0, #0x80
MSR CPSR_c, r0
}
#endif
}
/**************************************************************************
* 函数描述: 注册中断,将isr与irq关联
* 入口参数: irq -- 物理irq号
* routine -- 注册的isr
* pparam -- 扩展参数
* 出口参数: 无
* 返回值: 无
***************************************************************************/
// 注册中断,将isr与irq关联
InterruptHandler Intr_RegISR(int irq, InterruptHandler routine)
{
InterruptHandler ro = irq_vector_table[irq].routine;
irq_vector_table[irq].routine = routine;
// irq enable
SetRegBits32(INTC_IECR, 0x1 << irq);
// irq set mask
SetRegBits32(INTC_IMR, 0x1 << irq);
return ro;
}
/**************************************************************************
* 函数描述: 使能特定中断
* 入口参数: irq -- 物理irq号
* 出口参数: 无
* 返回值: TRUE -- 使能特定中断成功
* FALSE -- 使能特定中断失败
***************************************************************************/
BOOL Intr_Enable(eIRQ_NUM_t irq)
{
// irq enable
SetRegBits32(INTC_IECR, 0x1 << irq);
// irq set mask
SetRegBits32(INTC_IMR, 0x1 << irq);
return TRUE;
}
/**************************************************************************
* 函数描述: 设置中断优先级
* 入口参数: irq -- 物理irq号
* priority -- 优先级,范围从0~31, 优先级0最高
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Intr_SetPrio(eIRQ_NUM_t irq, int priority)
{
MaskRegBits32(INTC_SCR(irq), ~0xffffff20, priority);
}
/**************************************************************************
* 函数描述: 得到中断优先级
* 入口参数: irq -- 物理irq号
* 出口参数: 无
* 返回值: priority -- 中断优先级
***************************************************************************/
int Intr_GetPrio(eIRQ_NUM_t irq)
{
int priority;
priority = ReadReg32(INTC_SCR(irq)) & BITMASK(5);
return priority;
}
/**************************************************************************
* 函数描述: 中断反初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Intr_PowerOffDeinit(void)
{
#if 0
DisableARMIRQ();
#endif
}
/**************************************************************************
* 函数描述: 禁止特定irq中断
* 入口参数: irq -- 物理irq号
* 出口参数: 无
* 返回值: TRUE -- 禁止成功
* FALSE -- 禁止失败
***************************************************************************/
BOOL Intr_Disable(eIRQ_NUM_t irq)
{
// irq disable
ClrRegBits32(INTC_IECR, 0x1 << irq);
// irq clear mask
ClrRegBits32(INTC_IMR, 0x1 << irq);
return TRUE;
}
/**************************************************************************
* 函数描述: 得到当前中断发生是哪个IRQ产生的状态
* 入口参数: 无
* 出口参数: 无
* 返回值: 当前产生中断的IRQ号
***************************************************************************/
//__inline
int Intr_GetState(void)
{
return(ReadReg32(INTC_ISR));
}
/**************************************************************************
* 函数描述: 清除中断标志
* 入口参数: irq -- 物理irq号
* 出口参数: 无
* 返回值: 无
***************************************************************************/
//__inline
void Intr_ClearFlag(eIRQ_NUM_t irq)
{
WriteReg32(INTC_ICCR, 1 << irq);
}
#if 1
/**************************************************************************
* 函数描述: 设置中断类型
* 入口参数: irq -- 物理irq号
* type -- 中断类型
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void Intr_SetType(eIRQ_NUM_t irq, int type)
{
MaskRegBits32(INTC_SCR(irq), SRCTYPE_MASK, type);
}
/**************************************************************************
* 函数描述: 得到中断类型
* 入口参数: irq -- 物理irq号
* 出口参数: 无
* 返回值: type -- 中断类型
***************************************************************************/
int Intr_GetType(eIRQ_NUM_t irq)
{
int type;
type = ReadReg32(INTC_SCR(irq)) & SRCTYPE_MASK;
return type;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -