📄 bbu_dd_irqadl.c
字号:
/*******************************************************************************
* 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 + -