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

📄 zl5011xtif.c

📁 Zalink50114----TDMoIP芯片驱动源码
💻 C
📖 第 1 页 / 共 4 页
字号:
 Outputs:
   None

 Returns:
   zlStatusE

 Remarks:
   Does not reset the Lock status. To do this call zl5011xTifBerDisableReceiver
   followed by zl5011xTifBerConfigureReceiver

*******************************************************************************/

zlStatusE zl5011xTifBerResetReceiver(zl5011xParamsS *zl5011xParams)
{
   zlStatusE status =  ZL5011X_OK;

   ZL5011X_TRACE(ZL5011X_TIF_FN_ID,
         "zl5011xTifBerResetReceiver:",
         0, 0, 0, 0, 0, 0);

   /* toggle the bits 0 to 1 to reset the receiver */
   status = zl5011xReadModWrite(zl5011xParams, ZL5011X_TIF_BER_RX_REG,
         0,
         ZL5011X_1BIT_MASK << ZL5011X_TIF_BER_RESET_BIT);

   if (status == ZL5011X_OK)
   {
      status = zl5011xReadModWrite(zl5011xParams, ZL5011X_TIF_BER_RX_REG,
            ZL5011X_1BIT_MASK << ZL5011X_TIF_BER_RESET_BIT,
            ZL5011X_1BIT_MASK << ZL5011X_TIF_BER_RESET_BIT);
   }

   return(status);
}

/*******************************************************************************

 Function:
   zl5011xTifBerGetStatsReceiver

 Description:
   Used to get the BER receiver status

 Inputs:
   zl5011xParams   Pointer to the structure for this device instance

 Outputs:
   lock        set to ZL5011X_TRUE when BER is locked, ZL5011X_FALSE otherwise
   errorCount  returns the current error count

 Returns:
   zlStatusE

 Remarks:
   None

*******************************************************************************/

zlStatusE zl5011xTifBerGetStatsReceiver(zl5011xParamsS *zl5011xParams,
      zl5011xBooleanE *lock, Uint16T *errorCount)
{
   Uint32T readValue;
   zlStatusE status =  ZL5011X_OK;

   ZL5011X_TRACE(ZL5011X_TIF_FN_ID,
         "zl5011xTifBerGetStatsReceiver:",
         0, 0, 0, 0, 0, 0);

   /* set the enable bit to 0 to reset the receiver */
   status = zl5011xRead(zl5011xParams, ZL5011X_TIF_BER_STATUS_REG,
         &readValue);

   if ((readValue & (ZL5011X_1BIT_MASK << ZL5011X_TIF_BER_LOCK_BIT)) != 0)
   {
      *lock = ZL5011X_TRUE;
   }
   else
   {
      *lock = ZL5011X_FALSE;
   }

   *errorCount = (Uint16T)((readValue >> ZL5011X_TIF_BER_ERROR_COUNT_BITS) & ZL5011X_TIF_BER_ERROR_COUNT_MASK);

   return(status);
}

/*******************************************************************************

 Function:
   zl5011xTifSetInterfaceType

 Description:
   Sets the TIF options to default settings for the required Wan mode.
   The clock polarities etc. may be changed later.

 Inputs:
   zl5011xParams      Pointer to the structure for this device instance
   wanMode           sets the interface mode for the TDM streams
   wanLiuFreq        the LIU interface speed
   wanLiuFreqHz      the LIU speed if OTHER is selected by the enum

 Outputs:
   None

 Returns:
   zlStatusE

 Remarks:
   None

*******************************************************************************/

zlStatusE zl5011xTifSetInterfaceType(zl5011xParamsS *zl5011xParams,
      zl5011xWanIfTypeE wanMode, zl5011xWanLiuFreqE wanLiuFreqIn, Uint32T wanLiuFreqHz)
{
   zl5011xWanIfSamplePointE sample;
   zl5011xWanIfFramePulseTypeE framePulseType;
   zl5011xPolarityE framePolarity;
   zl5011xWanIfClockRateE clkMultiply;
   zl5011xWanIfDataRateE dataRate;
   zl5011xWanIfConnectionTypeE connectionMode;
   zl5011xBooleanE enableBitStuffing;
   Uint32T numChannels, numStreams;
   zlStatusE status = ZL5011X_OK;
   Uint32T freq;
   zl5011xWanLiuFreqE wanLiuFreq;

   ZL5011X_TRACE(ZL5011X_TIF_FN_ID,
         "zl5011xTifSetInterfaceType: mode %d, liu %d, liu Hz %d",
         wanMode, wanLiuFreq, wanLiuFreqHz, 0, 0, 0);

   if (wanLiuFreqIn == ZL5011X_WAN_LIU_FREQ_OTHER)
   {
      /* using a freely set frequency to determine the stream clock rate.
         So, choose the nearest standard setting so as to determine the
         number of allowed streams etc. */
      if (wanLiuFreqHz <= (2048000 + 1000000))
      {
         wanLiuFreq = ZL5011X_WAN_LIU_FREQ_2_048M;
      }
      else
      {
         if (wanLiuFreqHz <= (8192000 + 1000000))
         {
            wanLiuFreq = ZL5011X_WAN_LIU_FREQ_6_312M;
         }
         else
         {
            if (wanLiuFreqHz <= (zl5011xParams->systemClockFreq / 2))
            {
               wanLiuFreq = ZL5011X_WAN_LIU_FREQ_44_736M;
            }
            else
            {
               /* stream frequency is too high */
               status = ZL5011X_PARAMETER_INVALID;
            }
         }
      }
   }
   else
   {
      wanLiuFreq = wanLiuFreqIn;
   }

   /* translate the LIU rate enum into a number for the bit rate.
      Also, set the number of streams to the values for LIU mode */
   if (status == ZL5011X_OK)
   {
      switch (wanLiuFreq)
      {
         case ZL5011X_WAN_LIU_FREQ_1_544M :
            dataRate = ZL5011X_WAN_DATA_RATE_1_544M;
            freq = 1544000;
            numStreams = zl5011xParams->devLimits.wanNumStreamsDS1;
            break;

         case ZL5011X_WAN_LIU_FREQ_2_048M :
            dataRate = ZL5011X_WAN_DATA_RATE_2_048M;
            freq = 2048000;
            numStreams = zl5011xParams->devLimits.wanNumStreamsE1;
            break;

         case ZL5011X_WAN_LIU_FREQ_6_312M :
            dataRate = ZL5011X_WAN_DATA_RATE_6_312M;
            freq = 6312000;
            numStreams = zl5011xParams->devLimits.wanNumStreamsJ2;
            break;

         case ZL5011X_WAN_LIU_FREQ_34_368M :
            dataRate = ZL5011X_WAN_DATA_RATE_34_368M;
            freq = 34368000;
            numStreams = zl5011xParams->devLimits.wanNumStreamsE3;
            break;

         case ZL5011X_WAN_LIU_FREQ_44_736M :
            dataRate = ZL5011X_WAN_DATA_RATE_44_736M;
            freq = 44736000;
            numStreams = zl5011xParams->devLimits.wanNumStreamsDS3;
            break;

         case ZL5011X_WAN_LIU_FREQ_OTHER :
         default:
            dataRate = 0;
            freq = 0;
            numStreams = 0;
            status = ZL5011X_PARAMETER_INVALID;
      }
   }

   if (status == ZL5011X_OK)
   {
      if (zl5011xParams->devLimits.cesAvailable == ZL5011X_FALSE)
      {
         /* non CES part, so the stream number limit is actually the maximum number of streams */
         numStreams = zl5011xParams->devLimits.wanNumStreamsE1;

         /* also need to set the data rate correspondingly */
         dataRate = ZL5011X_WAN_DATA_RATE_2_048M;
      }
   }

   if (status == ZL5011X_OK)
   {
      if (wanLiuFreqIn == ZL5011X_WAN_LIU_FREQ_OTHER)
      {
         freq = wanLiuFreqHz;
      }

      connectionMode = ZL5011X_WAN_CONNECTION_FRAMED_CLK_SLAVE;
      sample = ZL5011X_WAN_SAMPLE_HALF_BIT;
      clkMultiply = ZL5011X_WAN_CLK_DATA_RATE;
      framePulseType = ZL5011X_WAN_FRAME_FULL_BIT_ALIGNED;
      enableBitStuffing = ZL5011X_FALSE;
      framePolarity = ZL5011X_NEGATIVE;

      switch (wanMode)
      {
         case ZL5011X_WAN_UNFRAMED :
            numChannels = 1;
            connectionMode = ZL5011X_WAN_CONNECTION_UNFRAMED;

            /* if in DS1 or J2 mode then use bit stuffing by default */
            if ((wanLiuFreq == ZL5011X_WAN_LIU_FREQ_1_544M) ||
               (wanLiuFreq == ZL5011X_WAN_LIU_FREQ_6_312M))
            {
               enableBitStuffing = ZL5011X_TRUE;
            }
            break;

         case ZL5011X_WAN_FRAMED_2M :
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed2M;
            numChannels = 32;
            dataRate = ZL5011X_WAN_DATA_RATE_2_048M;
            framePolarity = ZL5011X_POSITIVE;
            break;

         case ZL5011X_WAN_FRAMED_8M :
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed8M;
            numChannels = 128;
            dataRate = ZL5011X_WAN_DATA_RATE_8_192M;
            framePolarity = ZL5011X_POSITIVE;
            break;

         case ZL5011X_WAN_STBUS_2M_X1_CLOCK:
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed2M;
            numChannels = 32;
            dataRate = ZL5011X_WAN_DATA_RATE_2_048M;
            framePulseType = ZL5011X_WAN_FRAME_HALF_BIT;
            break;

         case ZL5011X_WAN_STBUS_2M_X2_CLOCK:
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed2M;
            numChannels = 32;
            dataRate = ZL5011X_WAN_DATA_RATE_2_048M;
            framePulseType = ZL5011X_WAN_FRAME_HALF_BIT;
            clkMultiply = ZL5011X_WAN_CLK_DATA_RATE_X_2;
            break;

         case ZL5011X_WAN_STBUS_8M :
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed8M;
            numChannels = 128;
            dataRate = ZL5011X_WAN_DATA_RATE_8_192M;
            framePulseType = ZL5011X_WAN_FRAME_HALF_BIT;
            clkMultiply = ZL5011X_WAN_CLK_DATA_RATE_X_2;
            break;

         case ZL5011X_WAN_MVIP_2M_X1_CLOCK :
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed2M;
            numChannels = 32;
            dataRate = ZL5011X_WAN_DATA_RATE_2_048M;
            framePulseType = ZL5011X_WAN_FRAME_FULL_BIT_CENTRED;
            break;

         case ZL5011X_WAN_MVIP_2M_X2_CLOCK :
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed2M;
            numChannels = 32;
            dataRate = ZL5011X_WAN_DATA_RATE_2_048M;
            framePulseType = ZL5011X_WAN_FRAME_FULL_BIT_CENTRED;
            clkMultiply = ZL5011X_WAN_CLK_DATA_RATE_X_2;
            break;

         case ZL5011X_WAN_HMVIP_8M :
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed8M;
            numChannels = 128;
            dataRate = ZL5011X_WAN_DATA_RATE_8_192M;
            framePulseType = ZL5011X_WAN_FRAME_2_BITS_CENTRED;
            clkMultiply = ZL5011X_WAN_CLK_DATA_RATE_X_2;
            break;

         case ZL5011X_WAN_H1X0_8M_X1_CLOCK :
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed8M;
            numChannels = 128;
            dataRate = ZL5011X_WAN_DATA_RATE_8_192M;
            framePulseType = ZL5011X_WAN_FRAME_FULL_BIT_CENTRED;
            break;

         case ZL5011X_WAN_H1X0_8M_X2_CLOCK:
            numStreams = zl5011xParams->devLimits.wanNumStreamsFramed8M;
            numChannels = 128;
            dataRate = ZL5011X_WAN_DATA_RATE_8_192M;
            framePulseType = ZL5011X_WAN_FRAME_FULL_BIT_CENTRED;
            clkMultiply = ZL5011X_WAN_CLK_DATA_RATE_X_2;
            break;

         default:
            numChannels = 0;
            status = ZL5011X_PARAMETER_INVALID;
            break;
      }
   }

   if (status == ZL5011X_OK)
   {
      if (numStreams == 0)

      {
         status = ZL5011X_INVALID_MODE;
      }
      else
      {
         /* update the structure, entries may be needed by following functions */
         zl5011xParams->wanIf.wanNumStreams = (Uint8T)numStreams;
         zl5011xParams->wanIf.wanNumChannels = (Uint8T)numChannels;
         zl5011xParams->wanIf.wanMode = wanMode;
         zl5011xParams->wanIf.wanLiuFreq = wanLiuFreq;
         zl5011xParams->wanIf.maxWanFrequency = freq;
      }
   }

   if (status == ZL5011X_OK)
   {
      /* if the interface type is framed, then default the connection mode to
         backplane, since in this mode the clock is generated externally.
         The correct mode will be setup later when the clocks are configured. */
      status = zl5011xTifSetConnectionMode(zl5011xParams, connectionMode);
   }

   if (status == ZL5011X_OK)
   {
      status = zl5011xTifSetClockRate(zl5011xParams, clkMultiply);
   }

   if (status == ZL5011X_OK)
   {
      status = zl5011xTifSetDataRate(zl5011xParams, dataRate);
   }

   if (status == ZL5011X_OK)
   {
      status = zl5011xTifSetDataSampleMode(zl5011xParams, sample);
   }

   if (status == ZL5011X_OK)
   {
      status = zl5011xTifSetFramePulseType(zl5011xParams, framePulseType);
   }

   if (status == ZL5011X_OK)
   {
      status = zl5011xTifSetFramePolarity(zl5011xParams, framePolarity);
   }

   if (status == ZL5011X_OK)
   {
      status = zl5011xTifEnableBitStuffing(zl5011xParams, enableBitStuffing);
   }

   /* if in framed or backplane mode, then set all of the channel enables to
      hi-z */
   if (status == ZL5011X_OK)
   {
      status = zl5011xTifDisableAllChannels(zl5011xParams);
   }

   /* everything has been setup, so enable the outputs */
   if (status == ZL5011X_OK)
   {
      status = zl5011xTifControlOutputs(zl5011xParams, ZL5011X_WAN_OUTPUT_ENABLE);
   }

   /* if any of the functions have failed, then reset the structure to safe values */
   if (status != ZL5011X_OK)
   {
      zl5011xParams->wanIf.wanNumStreams = 0;
      zl5011xParams->wanIf.wanNumChannels = 0;
      zl5011xParams->wanIf.wanMode = ZL5011X_WAN_INVALID_IF;
   }

   if ((status == ZL5011X_INVALID_MODE) && (zl5011xParams->deviceType == ZL_DEVICE_ZL50130))
   {
      /* special case - there is no TDM in this device, but the mode will have
         been detected as invalid above, so just return OK for this device type */
      status = ZL5011X_OK;
   }

   return(status);
}

/*****************   END   ****************************************************/

⌨️ 快捷键说明

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