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

📄 bbu_dd_irqadl.c

📁 本源代码为TI 公司TMS320C6416 DSP芯片自检测程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
* COPYRIGHT (C)             中国普天研究院									   *
********************************************************************************
* 源文件名: BBU_DD_IrqAdl.c                                                    *
* 功能描述:IRQ Operation Module                                               *
* 编写者:louyajun                                                             *
* 版本:1.0.0                                                                  *
* 编制日期:07/16/2004                                                         *
* 说明:                                                                       *
* 修改历史:                                                                   *
*                                                                              *
*******************************************************************************/
#include "BBU_DD_IrqCsl.h"
#include "BBU_DD_HpiCsl.h"
#include "BBU_DD_Post.h"

/******************************************************************************\
* global variable definitions for IRQ module
\******************************************************************************/
#pragma DATA_SECTION(mcbspTxIntFlag,".gvariable");
Uint32  mcbspTxIntFlag;

#pragma DATA_SECTION(mcbspRxIntFlag,".gvariable");
Uint32  mcbspRxIntFlag;

#pragma DATA_SECTION(mcbspRxIntCount,".gvariable");
Uint32  mcbspRxIntCount[3] = {0, 0, 0};

#pragma DATA_SECTION(timerIntCount,".gvariable");
Uint32  timerIntCount[TIMER_DEVICE_CNT];

#pragma DATA_SECTION(emifaSdramIntFlag,".gvariable");
Uint32  emifaSdramIntFlag;

#pragma DATA_SECTION(emifaDpramIntFlag,".gvariable");
Uint32  emifaDpramIntFlag;

#pragma DATA_SECTION(gpio5msFrameIntCount,".gvariable");
Uint32  gpio5msFrameIntCount;

#pragma DATA_SECTION(gpio10msSlotReadyCount,".gvariable");
Uint32  gpio10msSlotReadyCount;

#pragma DATA_SECTION(hpiDspIntFlag,".gvariable");
Uint32  hpiDspIntFlag;

#pragma DATA_SECTION(_IRQ_eventTable,".gvariable");
Uint32 _IRQ_eventTable[IRQ_EVENT_CNT+1] =
    {
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA, IRQ_MASK_NA,
        IRQ_MASK_NA
    };

#pragma DATA_SECTION(_IRQ_intTable,".gvariable");
Uint32 _IRQ_intTable[IRQ_INT_CNT] =
    {
        IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA,
        IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA,
        IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA,
        IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA, IRQ_EVT_NA
    };
/*----------------------------------------------------------------------------*/        

/******************************************************************************\
* IRQ API function declarations
\******************************************************************************/
CSLAPI void   IRQ_map(Uint32 eventId, Uint32 intNum);
CSLAPI void   setMux(Sint32 intNum, Uint32 eventId);
CSLAPI void   mux2Tables();
CSLAPI Uint32 getMux(Sint32 intNum);
CSLAPI void   IRQ_init(void);

interrupt void  IRQ_5msFrameIsr(void);
interrupt void  IRQ_10msSlotReadyIsr(void);
interrupt void  IRQ_edmaIsr(void);         
interrupt void  IRQ_timer0Isr(void);       
interrupt void  IRQ_timer1Isr(void);       
interrupt void  IRQ_timer2Isr(void);       
interrupt void  IRQ_hpiIsr(void);          
interrupt void  IRQ_vcpIsr(void);          
interrupt void  IRQ_tcpIsr(void); 

CSLAPI void EDMA_intDefaultHandler(Sint32 tccNum);
CSLAPI void EDMA_tccXEvt0Handler(Sint32 tccNum);
CSLAPI void EDMA_tccXEvt1Handler(Sint32 tccNum);
CSLAPI void EDMA_tccXEvt2Handler(Sint32 tccNum);
CSLAPI void EDMA_tccREvt0Handler(Sint32 tccNum);
CSLAPI void EDMA_tccREvt1Handler(Sint32 tccNum);
CSLAPI void EDMA_tccREvt2Handler(Sint32 tccNum);
CSLAPI void EDMA_tccWDpramHandler(Sint32 tccNum);
CSLAPI void EDMA_tccRDpramHandler(Sint32 tccNum);
CSLAPI void EDMA_tccWSdramHandler(Sint32 tccNum);
CSLAPI void EDMA_tccRSdramHandler(Sint32 tccNum);
CSLAPI void EDMA_tccVcpREvtHandler(Sint32 tccNum);
CSLAPI void EDMA_tccVcpXEvtHandler(Sint32 tccNum);
CSLAPI void EDMA_tccTcpREvtHandler(Sint32 tccNum);
CSLAPI void EDMA_tccTcpXEvtHandler(Sint32 tccNum); 

/******************************************************************************\
* IRQ API function definitions
\******************************************************************************/
/*******************************************************************************
* 函数名称: IRQ_map      					             			           *
* 函数描述: Mapping an event to CPU interrupt                                  *
* 相关文档:                                                                    *
* 参数描述:  						                    			           *
* 参数名		     类型		输入/输出 	   描述	       			           *
* -------- 		     ---- 		---------	-----------    			           *
* eventId      	    Uint32	       in		event ID for DSP interrupt         *
* intNumber	        Uint32         in		interrupt number                   *
*                                                                              *
* 返回值: 无									                               *
* 说明:			                         		                           *
*******************************************************************************/
CSLAPI void IRQ_map(Uint32 eventId, Uint32 intNum)
{
Uint32 gie;
Sint32 oldIntNum,x,i;

    gie = IRQ_globalDisable(); 
  
    /* Find out which interrupt eventId is currently mapped to then */
    /* wipe out it's entry in the MUX registers and the eventTable. */
    oldIntNum = 31-_lmbd(1,_IRQ_eventTable[eventId]);
    if (oldIntNum >= 0)
    {
        _IRQ_intTable[oldIntNum] = IRQ_EVT_NA;
        setMux(oldIntNum, 0x1F);
    }
  
    /* Also need to unmap any other events that are mapped to this interrupt */
    for (x=0; x<IRQ_EVENT_CNT; x++)
    {
        i = 31-_lmbd(1,_IRQ_eventTable[x]);
        if (i == intNum)
        {
            _IRQ_eventTable[x] = IRQ_MASK_NA;
        } 
    }
  
    /* Now it's ok to go ahead and map the new eventId to intNum */
    _IRQ_intTable[intNum] = eventId;
    _IRQ_eventTable[eventId] = 1<<intNum;
    setMux(intNum, eventId);
  
    IRQ_globalRestore(gie);
}    
/*----------------------------------------------------------------------------*/

/*******************************************************************************
* 函数名称: setMux      					             			           *
* 函数描述: set interrupt multiplexer register to map an event to CPU interrupt*
* 相关文档:                                                                    *
* 参数描述:  						                    			           *
* 参数名		     类型		输入/输出 	   描述	       			           *
* -------- 		     ---- 		---------	-----------    			           *
* intNum      	    Sint32	       in		interrupt number                   *
* eventId	        Uint32         in		event ID for DSP interrupt         *
*                                                                              *
* 返回值: 无									                               *
* 说明:			                         		                           *
*******************************************************************************/
CSLAPI void setMux(Sint32 intNum, Uint32 eventId)
{
Uint32 shift,mask,addr,v;

    if ((intNum >= 4) && (intNum <= 9))
    {
        addr  = IRQ_MUXL_ADDR;
        shift = 5*(intNum-4)+(intNum>6 ? 1: 0);
    }
    else if ((intNum >= 10) && (intNum <= 15))
    {
        addr  = IRQ_MUXH_ADDR;
        shift = 5*(intNum-10)+(intNum>12 ? 1: 0);
    }
    else
    {
        addr = 0xFFFFFFFFu;
    }

    /* Go ahead and update the MUX register to reflect the new mapping */
    if (addr != 0xFFFFFFFFu) 
    {
        mask  = 31<<shift;
        v = *(volatile Uint32*)addr;
        v = v & ~mask;
        v = v | ((eventId<<shift) & mask);
        *(volatile Uint32*)addr = v;
    }  
}
/*----------------------------------------------------------------------------*/

/*******************************************************************************
* 函数名称: mux2Tables      					             			       *
* 函数描述: set the tables _IRQ_eventTable and _IRQ_intTable                   *
* 相关文档:                                                                    *
* 参数描述:无  						                    			           *
* 返回值: 无									                               *
* 说明:			                         		                           *
*******************************************************************************/
CSLAPI void mux2Tables()
{
Sint32 x;
  
    for (x=0; x<IRQ_EVENT_CNT+1; x++)
    {
        _IRQ_eventTable[x] = IRQ_MASK_NA;
    }
  
    for (x=4; x<IRQ_INT_CNT; x++)
    {
        _IRQ_intTable[x] = getMux(x);
        _IRQ_eventTable[_IRQ_intTable[x]] = (1<<x);
    }                              
}
/*----------------------------------------------------------------------------*/

/*******************************************************************************
* 函数名称: getMux      					             			           *
* 函数描述: get the eventID from interrupt multiplexer register                *
* 相关文档:                                                                    *
* 参数描述:  						                    			           *
* 参数名		     类型		输入/输出 	   描述	       			           *
* -------- 		     ---- 		---------	-----------    			           *
* intNum      	    Sint32	       in		interrupt number                   *
*                                                                              *
* 返回值: eventId, event ID for DSP interrupt				                   *
* 说明:			                         		                           *
*******************************************************************************/
CSLAPI Uint32 getMux(Sint32 intNum)
{
Uint32 shift,mask,addr;
Uint32 eventId = 0x1F;

    if ((intNum >= 4) && (intNum <= 9))
    {
        addr  = IRQ_MUXL_ADDR;
        shift = 5*(intNum-4)+(intNum>6 ? 1: 0);
    }
    else if ((intNum >= 10) && (intNum <= 15))
    {
        addr  = IRQ_MUXH_ADDR;
        shift = 5*(intNum-10)+(intNum>12 ? 1: 0);
    }
    else
    {
        addr = 0xFFFFFFFFu;
    }

    /* Go ahead and update the MUX register to reflect the new mapping */
    if (addr != 0xFFFFFFFFu)
    {
        mask  = 31<<shift;
        eventId = ((*(volatile Uint32*)addr) & mask) >> shift;
    }  
    
    return eventId;
}
/*----------------------------------------------------------------------------*/

/*******************************************************************************
* 函数名称: IRQ_init      					             			           *
* 函数描述: Initializing the IRQ module to enable used interrupt               *
* 相关文档:                                                                    *
* 参数描述: 无 						                    			           *
* 返回值: 无                                 				                   *
* 说明:			                         		                           *
*******************************************************************************/
CSLAPI void IRQ_init(void)
{
    
    IRQ_resetAll();
    IRQ_nmiEnable();
    
    IRQ_map(IRQ_EVT_EXTINT4,4);     /* reserved */
    IRQ_map(IRQ_EVT_EXTINT5,5);     /* reserved */
    IRQ_map(IRQ_EVT_EXTINT6,6);     /* 5ms subframe -> INT6 */
    IRQ_map(IRQ_EVT_EXTINT7,7);     /* Slot(TXDSP),10ms frame(CCDSP) and */
                                    /* uplinkDataReady(RXDSP) -> INT7    */
    IRQ_map(IRQ_EVT_EDMAINT,8);     /* EDMA -> INT8 */
    IRQ_map(IRQ_EVT_TINT0,9);       /* Timer0 -> INT9 */
    IRQ_map(IRQ_EVT_TINT1,10);      /* Timer1 -> INT10 */
    IRQ_map(IRQ_EVT_TINT2,11);      /* Timer2 -> INT11 */
    IRQ_map(IRQ_EVT_DSPINT,12);     /* HPI -> INT12 */
    IRQ_map(IRQ_EVT_VCPINT,13);     /* VCP -> INT13 */
    IRQ_map(IRQ_EVT_TCPINT,14);     /* TCP -> INT14 */
    IRQ_map(IRQ_EVT_RINT0,15);      /* reserved */
    
    mux2Tables();
    
    IRQ_disable(IRQ_EVT_EXTINT4);
    IRQ_disable(IRQ_EVT_EXTINT5);
    IRQ_disable(IRQ_EVT_EXTINT6);
    IRQ_disable(IRQ_EVT_EXTINT7);
    IRQ_disable(IRQ_EVT_EDMAINT);
    IRQ_disable(IRQ_EVT_TINT0);
    IRQ_disable(IRQ_EVT_TINT1);

⌨️ 快捷键说明

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