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

📄 mcc.c

📁 ANSI C 源代码 WISD MSC8101的MCC驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
     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 + -