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

📄 hw_interrupt.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -