📄 mcc.c
字号:
ucTxBufNum - No. of total buffer entries
*/
UWord16 i; // Loop Counter
t_Mcc1BDRings* pstMcc1;
t_MChXtraPRAM* pstMCCmchx;
pstMcc1 = (t_Mcc1BDRings*)(MCC1_BDRINGS_BASE);
//establish pointer to multichannel params area and extra params area
pstMCCmchx = (t_MChXtraPRAM*) (IMM_BASE + MCC1_XTRABASE + (8 * ucChanNum));
//channel number correct?
if (ucChanNum>=MCC1_NUM_CH) asm(" debug");
//Initialise TxBDs:
for(i=0;i<ucTxBufNum;i++)
{
if ((i==ucTxBufNum-1) && pucTxBufIrq[i])
pstMcc1->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xB000; //last BD & I
else if ((i==ucTxBufNum-1) && (!pucTxBufIrq[i]))
pstMcc1->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xA000; //last BD
else if (pucTxBufIrq[i])
pstMcc1->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x9000; //not last BD & I
else //(!pucTxBufIrq[i])
pstMcc1->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x8000; //not last BD
/* HDLC */
#if (MODE == HDLC)
{
/* Set Last and TC(F) Tx CRC for HDLC mode */
pstMcc2->astTxChan[ucChanNum].astBufD[i].usiBdCstatus |= 0x0C00; //not last BD
}
#else
#endif
pstMcc1->astTxChan[ucChanNum].astBufD[i].usiBdLength = pusiTxBufSize[i];
pstMcc1->astTxChan[ucChanNum].astBufD[i].uliBdAddr = LOCAL_SRAM_BASE + puliTxBufPtr[i];
}
//Extra Channel-Specific Parameter RAM Initialization
//Let the MCC1 know where base of TxBDs are for this logical channel
//Note that tbase is an offset from MCC1BASE in the global params.
pstMCCmchx->vusiTBase = MCC1_TX_NUM_BUF * ucChanNum;
pstMCCmchx->vusiTBPtr = pstMCCmchx->vusiTBase; //init "current TxBD ptr"
return;
}
/*****************************************************************************
* FUNCTION: MCC2_InitTxChannel()
* PURPOSE: Set up BD Ring for specific channel
* NOTES: None.
* ENTRY: None
* EXIT: None.
*****************************************************************************/
void MCC2_InitTxChannel(UByte ucChanNum,
UWord32* puliTxBufPtr,
UWord16* pusiTxBufSize,
UByte* pucTxBufIrq,
UByte ucTxBufNum
)
{
/* Memory is allocated in speech frames and then subblocks within
those frames are defined -> So memory blocks assumed contiguous.
For each buffer/sub-buffer a pointer must be provided within TxBufPtr.
ucChanNum - MCC channel number
puliTxBufPtr - Array of Frame/Subf buffer pointers. UWord32 TxBufPtr[TxBufNum]
pusiTxBufSize - Array of Frame/Subf sizes in bytes. UWord16 TxBufSize[TxBufNum]
pucTxBufIrq - Buffers which generate interrupts. UByte TxBufIrq[TxBufNum]
ucTxBufNum - No. of total buffer entries
*/
UWord16 i; // Loop Counter
t_Mcc2BDRings* pstMcc2;
t_MChXtraPRAM* pstMCCmchx;
pstMcc2 = (t_Mcc2BDRings*)(MCC2_BDRINGS_BASE);
//convert to channel numbers 0...127, although the MCC2 normally uses the
//channels 128...255.
ucChanNum &= 0x7F;
//establish pointer to multichannel params area and extra params area
pstMCCmchx = (t_MChXtraPRAM*) (IMM_BASE + MCC2_XTRABASE + 8*ucChanNum);
//channel number correct?
if (ucChanNum>=MCC2_NUM_CH) asm(" debug");
//Initialise TxBDs:
for(i=0;i<ucTxBufNum;i++)
{
if ((i==ucTxBufNum-1) && pucTxBufIrq[i])
pstMcc2->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xB000; //last BD & I
else if ((i==ucTxBufNum-1) && (!pucTxBufIrq[i]))
pstMcc2->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xA000; //last BD
else if (pucTxBufIrq[i])
pstMcc2->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x9000; //not last BD & I
else //(!pucTxBufIrq[i])
pstMcc2->astTxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x8000; //not last BD
/* HDLC */
#if (MODE == HDLC)
{
/* Set Last and TC(F) Tx CRC for HDLC mode */
pstMcc2->astTxChan[ucChanNum].astBufD[i].usiBdCstatus |= 0x0C00; //not last BD
}
#else
#endif
pstMcc2->astTxChan[ucChanNum].astBufD[i].usiBdLength = pusiTxBufSize[i];
pstMcc2->astTxChan[ucChanNum].astBufD[i].uliBdAddr = LOCAL_SRAM_BASE + puliTxBufPtr[i];
}
//Extra Channel-Specific Parameter RAM Initialization
//Let the MCC2 know where base of TxBDs are for this logical channel
//Note that tbase is an offset from MCC2BASE in the global params.
pstMCCmchx->vusiTBase = MCC2_TX_NUM_BUF * ucChanNum;
pstMCCmchx->vusiTBPtr = pstMCCmchx->vusiTBase; //init "current TxBD ptr"
return;
}
/*****************************************************************************
* FUNCTION: MCC1_InitRxChannel()
* PURPOSE: Set up BD Ring for specific channel
* NOTES: None.
* ENTRY: None
* EXIT: None.
*****************************************************************************/
void MCC1_InitRxChannel(UByte ucChanNum,
UWord32* puliRxBufPtr,
UWord16* pusiRxBufSize,
UByte* pucRxBufIrq,
UByte ucRxBufNum
)
{
/* Memory is allocated in speech frames and then subblocks within
those frames are defined -> So memory blocks assumed contiguous.
For each buffer/sub-buffer a pointer must be provided within puliRxBufPtr.
ucChanNum - MCC channel number
puliRxBufPtr - Array of Frame/Subf buffer pointers. UWord32 RxBufPtr[RxBufNum]
pusiRxBufSize - Array of Frame/Subf sizes in bytes. UWord16 RxBufSize[RxBufNum]
pucRxBufIrq - Buffers which generate interrupts. UByte RxBufIrq[RxBufNum]
ucRxBufNum - No. of total buffer entries
*/
UWord16 i; // Loop Counter
t_Mcc1BDRings* pstMcc1;
t_MChPRAM* pstMCCmch;
t_MChXtraPRAM* pstMCCmchx;
pstMcc1 = (t_Mcc1BDRings*)(MCC1_BDRINGS_BASE);
//establish pointer to multichannel params area and extra params area
pstMCCmchx = (t_MChXtraPRAM*) (IMM_BASE + MCC1_XTRABASE + (8 * ucChanNum));
//channel number correct?
if (ucChanNum<MCC1_NUM_CH)
{
pstMCCmch = (t_MChPRAM*) (IMM_BASE + (64 * ucChanNum));
}
else
{
asm(" debug");
}
//Initialise RxBDs:
for(i=0;i<ucRxBufNum;i++)
{
if ((i==ucRxBufNum-1) && pucRxBufIrq[i])
pstMcc1->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xB000; //last BD & I
else if ((i==ucRxBufNum-1) && (!pucRxBufIrq[i]))
pstMcc1->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xA000; //last BD
else if (pucRxBufIrq[i])
pstMcc1->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x9000; //not last BD & I
else //(!pucRxBufIrq[i])
pstMcc1->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x8000; //not last BD
pstMcc1->astRxChan[ucChanNum].astBufD[i].usiBdLength = 0;
pstMcc1->astRxChan[ucChanNum].astBufD[i].uliBdAddr = LOCAL_SRAM_BASE + puliRxBufPtr[i];
}
//Extra Channel-Specific Parameter RAM Initialization
//Let the MCC1 know where base of RxBDs are for this logical channel
//Note that rbase is an offset from MCC1BASE in the global params.
pstMCCmchx->vusiRBase = MCC1_TX_NUM_BUF * MCC1_NUM_CH
+ MCC1_RX_NUM_BUF * ucChanNum;
pstMCCmchx->vusiRBPtr = pstMCCmchx->vusiRBase; //init "current RxBD ptr"
//set number receive bytes per buffer (divisible by 8!):
pstMCCmch->vusiMaxRLen = pusiRxBufSize[0]; //fill whole Buffer
return;
}
/*****************************************************************************
* FUNCTION: MCC2_InitRxChannel()
* PURPOSE: Set up BD Ring for specific channel
* NOTES: None.
* ENTRY: None
* EXIT: None.
*****************************************************************************/
void MCC2_InitRxChannel(UByte ucChanNum,
UWord32* puliRxBufPtr,
UWord16* pusiRxBufSize,
UByte* pucRxBufIrq,
UByte ucRxBufNum
)
{
/* Memory is allocated in speech frames and then subblocks within
those frames are defined -> So memory blocks assumed contiguous.
For each buffer/sub-buffer a pointer must be provided within puliRxBufPtr.
ucChanNum - MCC channel number
puliRxBufPtr - Array of Frame/Subf buffer pointers. UWord32 RxBufPtr[RxBufNum]
pusiRxBufSize - Array of Frame/Subf sizes in bytes. UWord16 RxBufSize[RxBufNum]
pucRxBufIrq - Buffers which generate interrupts. UByte RxBufIrq[RxBufNum]
ucRxBufNum - No. of total buffer entries
*/
UWord16 i; // Loop Counter
t_Mcc2BDRings* pstMcc2;
t_MChPRAM* pstMCCmch;
t_MChXtraPRAM* pstMCCmchx;
pstMcc2 = (t_Mcc2BDRings*)(MCC2_BDRINGS_BASE);
//convert to channel numbers 0...127, although the MCC2 normally uses the
//channels 128...255.
ucChanNum &= 0x7F;
//establish pointer to multichannel params area and extra params area
pstMCCmchx = (t_MChXtraPRAM*) (IMM_BASE + MCC2_XTRABASE + 8*ucChanNum);
//channel number correct?
if (ucChanNum<MCC2_NUM_CH)
{
pstMCCmch = (t_MChPRAM*)(IMM_BASE + 64*(ucChanNum+128));//offset 0x2000...0x3fff
}
else
{
asm(" debug");
}
//Initialise RxBDs:
for(i=0;i<ucRxBufNum;i++)
{
if ((i==ucRxBufNum-1) && pucRxBufIrq[i])
pstMcc2->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xB000; //last BD & I
else if ((i==ucRxBufNum-1) && (!pucRxBufIrq[i]))
pstMcc2->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0xA000; //last BD
else if (pucRxBufIrq[i])
pstMcc2->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x9000; //not last BD & I
else //(!pucRxBufIrq[i])
pstMcc2->astRxChan[ucChanNum].astBufD[i].usiBdCstatus = 0x8000; //not last BD
pstMcc2->astRxChan[ucChanNum].astBufD[i].usiBdLength = 0;
pstMcc2->astRxChan[ucChanNum].astBufD[i].uliBdAddr = LOCAL_SRAM_BASE + puliRxBufPtr[i];
}
//Extra Channel-Specific Parameter RAM Initialization
//Let the MCC2 know where base of RxBDs are for this logical channel
//Note that rbase is an offset from MCC2BASE in the global params.
pstMCCmchx->vusiRBase = MCC2_TX_NUM_BUF * MCC2_NUM_CH
+ MCC2_RX_NUM_BUF * ucChanNum;
pstMCCmchx->vusiRBPtr = pstMCCmchx->vusiRBase; //init "current RxBD ptr"
//set number receive bytes per buffer (divisible by 8!):
pstMCCmch->vusiMaxRLen = pusiRxBufSize[0]; //fill whole Buffer
/* HDLC */
/* For HDLC add 4 bytes for CRC */
// MCCmch->maxrlen = RxBufSize[0]; //fill whole Buffer
return;
}
/*****************************************************************************
* FUNCTION: MCC1_StartChannel()
* PURPOSE: Starts MCC channel using shadow SIRAM capability
* NOTES: None.
* ENTRY: ucChanNum - Channel to be Started
* e_Opcode - What to Start - TX&RX, Rx only or Tx only
* EXIT: None.
*****************************************************************************/
void MCC1_StartChannel(UByte ucChanNum, UByte ucBlockSize, enum e_MCC_CP_CMD_OPCODE e_Opcode)
{
UWord16 usiRxSrc, usiRxDest;
UWord16 usiTxSrc, usiTxDest; //SIRAM original and Shadow indices
UByte ucCh;
t_MChPRAM* pstMCCmch;
t_8101IMM* pstIMM = (t_8101IMM*)IMM_BASE; //pointer to internal memory map.
//msb of channel number must be cleared => only channels 0...127 allowed
ucChanNum &= 0x7f;
//channel number correct?
if ((ucChanNum+ucBlockSize)>MCC1_NUM_CH)
{
asm(" debug");
}
/* Determine active Rx and Tx SIRAM 0=original, 1=shadow */
usiRxSrc = (pstIMM->t_aSIRegs[SI1].vucSIStR & (0x80>>(MCC1_TDM*2)) ) >> ((3-MCC1_TDM)*2+1);
usiRxDest= usiRxSrc ^ 0x0001; //invert lsb
usiTxSrc = (pstIMM->t_aSIRegs[SI1].vucSIStR & (0x40>>(MCC1_TDM*2)) ) >> ((3-MCC1_TDM)*2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -