📄 le1veapp.c
字号:
/* le1veApp.c - LE1VE card application resoure file
*
* Copyright 2004-2007 ZTE, Inc.
* author: ZhengQishan
* date: 2004.02
*
* modification history
*------------------------------
*
*/
#include "zl5011x.h"
#include "zl5011xRdWr.h"
#include "zl5011xDpr.h"
#include "zl5011xInterrupts.h"
#include "zl5011xApi.h"
#include "zl5011xInit.h"
#include "zl5011xTdm.h"
#include "zl5011xLan.h"
#include "zl5011xMisc.h"
#include "zl5011xPacket.h"
#include "zl5011xError.h"
#include "le1veLib.h"
#include "le1veApp.h"
zl5011xParamsS *le1ve_Zl5011xParams[MAX_IF_CARD_NUM] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
LOCAL zlStatusE initLe1veCard(zl5011xSysInitS *sysInit);
#if 0
LOCAL void populateHeader(Uint32T context, UINT8 *macAddress, Uint8T *header, Uint8T *headerLength, zl5011xProtocolTypeE *protocol);
#endif
/*-----------------------------
* zl5011xModuleInit - init Zl5011X data structure
*
*Argument: void
*
*Return: zlStatusE - the status of init
*/
zlStatusE zl5011xModuleInit(int slot)
{
int loop;
zl5011xCreateDeviceS createDevice;
zl5011xSysInitS sysInit;
zl5011xWanConfigureSyncS wanConfigureSync;
zl5011xLanConfigureS lanConfigure;
zl5011xLanQueueConfigureS lanQueueConfigure;
zlStatusE result = ZL5011X_OK;
UINT8 *pMacAddress;
zl5011xParamsS *pZl5011xParams;
if (slot > 8 || slot < 1)
{
printf("Error slot number !\n");
return(ZL5011X_ERROR_SLOT_NUM);
}
if (le1ve_Zl5011xParams[slot - 1] != NULL)
{
printf("slot %d zl5011xModuleInit have been called!\n", slot);
return(ZL5011X_DEVICE_HAVE_BEEN_INIT);
}
/* create the device structure and OS objects */
result = zl5011xCreateDeviceStructInit(&createDevice);
if (result == ZL5011X_OK)
{
createDevice.baseAddress = IF_CARD_CPU_REG_BASE(slot);
result = zl5011xCreateDevice(&pZl5011xParams, &createDevice);
if (result != ZL5011X_OK)
{
printf("Init (slot %d) Zl50114 failed!\n", slot );
return(result);
}
le1ve_Zl5011xParams[slot - 1] = pZl5011xParams;
le1ve_Zl5011xParams[slot - 1]->slotNum = slot;
}
/* get ready to initialise the device. Default the structure entries to default
values and then set up any required values */
if (result == ZL5011X_OK)
{
result = zl5011xSysInitStructInit(pZl5011xParams, &sysInit);
/*指定所用芯片类型,新添加*/
sysInit.init.deviceType = ZL_DEVICE_ZL50114;
/*TDM接口的时钟由硬件决定*/
sysInit.wanInit.ifType = ZL5011X_WAN_HMVIP_8M; /*ZL5011X_WAN_STBUS_2M_X2_CLOCK;*/
/*2倍默认值大小*/
sysInit.wanInit.txQueueMaxNumberOfGranules = 10000;
#if 0 /*默认2.048M 恢复时钟涉及*/
/*add by shf 2005.7.13 */
if( b_physIfType(slot) == CARD_TMD_OVER_IP_4_1_T1)
{
sysInit.wanInit.liuFreq= ZL5011X_WAN_LIU_FREQ_1_544M;
}
/*end*/
#endif
/*LE1VE 有8Mbyte 的extern memory*/
sysInit.configureMemory.extMemChipSize= ZL5011X_EXT_MEM_SIZE_4MB;
/*颗粒的多少主要取决于内存的多少,? 每一个颗粒由于64字节的数据区和16字节的描述区组成。
颗粒的大小暂定为20000*/
/*sysInit.configureMemory.numberGranules= 40000;让芯片自己选择*/
}
/*用sysInit参数初始化Le1ve单板*/
if (result == ZL5011X_OK)
{
result = initLe1veCard(&sysInit);
}
/* Initialise the device */
if (result == ZL5011X_OK)
{
printf("ZL50114 Device Initialise\n");
result = zl5011xSysInit(pZl5011xParams, &sysInit);
}
/* setup the TDM interface - in this example sync clocks */
if (result == ZL5011X_OK)
{
result = zl5011xWanConfigureSyncStructInit(pZl5011xParams, &wanConfigureSync);
if (result == ZL5011X_OK)
{
/*add by shf 2005.7.13 */
if( b_physIfType(slot) == CARD_TMD_OVER_IP_4_1)
{
wanConfigureSync.primaryRef.refFreq = ZL5011X_WAN_REF_FREQ_2_048M;
wanConfigureSync.secondaryRef.refFreq = ZL5011X_WAN_REF_FREQ_2_048M;
}
else
{
wanConfigureSync.primaryRef.refFreq = ZL5011X_WAN_REF_FREQ_1_544M;
wanConfigureSync.secondaryRef.refFreq = ZL5011X_WAN_REF_FREQ_1_544M;
}
#if 0
/*end*/
wanConfigureSync.dpllConnection = ZL5011X_DPLL_SLAVE_CONNECTION;/*ZL5011X_DPLL_MASTER_CONNECTION;*/
wanConfigureSync.dpllMasterOutputEnable = ZL5011X_FALSE; /*ZL5011X_TRUE;*/
wanConfigureSync.framePulsePolarity = ZL5011X_NEGATIVE ; /*ZL5011X_POSITIVE;*/
wanConfigureSync.framePulseWidth = ZL5011X_WAN_FRAME_2_BITS_CENTRED;/*ZL5011X_WAN_FRAME_FULL_BIT_CENTRED;*/
#endif
#if 0
/*slave or master*/
wanConfigureSync.dpllConnection = ZL5011X_DPLL_MASTER_CONNECTION; /* enableDPLL, drive TDM_CLKo and TDM_FRMo outputs */
wanConfigureSync.dpllMasterOutputEnable = ZL5011X_TRUE; /* enable the PLL_PRI and PLL_SEC outputs */
wanConfigureSync.primaryRef.source = ZL5011X_WAN_STREAM_REF; /* Take CLKi0 (connected to CLKo0) as DPLL reference input */
wanConfigureSync.primaryRef.stream = (Uint8T)0x00;
wanConfigureSync.primaryRef.refFreq = ZL5011X_WAN_REF_FREQ_2_048M;
wanConfigureSync.secondaryRef.source = ZL5011X_WAN_STREAM_REF; /*secondary input, for backup only. */
wanConfigureSync.secondaryRef.stream = (Uint8T)0x01;
wanConfigureSync.secondaryRef.refFreq = ZL5011X_WAN_REF_FREQ_2_048M;
wanConfigureSync.refPriority = ZL5011X_DPLL_PRIMARY_PRIORITY;
wanConfigureSync.refPolarity = ZL5011X_POSITIVE;
#endif
/* For default values for structure wanConfigureSync, see the function
zl5011xWanConfigureSyncStructInit() in file zl5011xTdm.c */
result = zl5011xWanConfigureSync(pZl5011xParams, &wanConfigureSync);
/*ZL50114 */
#if 0
zl5011xTifReverseBitOrder(pZl5011xParams, ZL5011X_TRUE);
#endif
}
}
/* Configure the LAN interface - Packet Tx, Packet Rx and MAC */
if (result == ZL5011X_OK)
{
pMacAddress = pZl5011xParams->macAddress[0];
Ros_GetMacBase(b_FetchSerial(),pMacAddress);
pMacAddress = pZl5011xParams->macAddress[1];
Ros_GetMacBase(b_FetchSerial(),pMacAddress);
/*两以太接口的MAC地址不一样*/
pZl5011xParams->macAddress[1][ZL5011X_MAC_SIZE - 1] += 0x40;
result = zl5011xLanConfigureStructInit(pZl5011xParams, &lanConfigure);
lanConfigure.macType = ZL5011X_MAC_TYPE_MII; /* alternatively ZL5011X_MAC_TYPE_GMII */
}
if (result == ZL5011X_OK)
{
result = zl5011xLanQueueConfigureStructInit(pZl5011xParams, &lanQueueConfigure);
}
/* set up 2 LAN ports */
for (loop = 0; loop < 2; loop++)
{
lanQueueConfigure.portNum = loop;
if (result == ZL5011X_OK)
{
/* set up the LAN queues */
result = zl5011xLanQueueConfigure(pZl5011xParams, &lanQueueConfigure);
}
if (result == ZL5011X_OK)
{
/* set up the LAN ports. Set the low byte of the MAC address to be the
port number itself. That is port 1 becomes xx:xx:xx:xx:xx:01 */
lanConfigure.portNum = loop;
/* set the ethernet MAC address */
bcopy (pZl5011xParams->macAddress[loop], lanConfigure.macAddress, ZL5011X_MAC_SIZE);
result = zl5011xLanConfigure(pZl5011xParams, &lanConfigure);
}
}
#if 0
if (firstTime == OK)
{
/* Interrupts are required for the differential mode of operation. So, must
initialise the interrupts before CET */
if (result == ZL5011X_OK)
{
result = zl5011xIsrInitialiseStructInit(pZl5011xParams, &isrInit);
isrInit.apiPhysIntr = 0;
isrInit.appPhysIntr = 0;
if (result == ZL5011X_OK)
{
result = zl5011xIsrInitialise(pZl5011xParams, &isrInit);
}
}
firstTime = ERROR;
}
/* The interrupt is now initialised, so add the device to the list to be serviced */
if (result == ZL5011X_OK)
{
result = zl5011xIsrAddDeviceStructInit(pZl5011xParams, &isrAddDevice);
if (result == ZL5011X_OK)
{
result = zl5011xIsrAddDevice(pZl5011xParams, &isrAddDevice);
}
}
#endif
return(result);
}
LOCAL zlStatusE initLe1veCard(zl5011xSysInitS *sysInit)
{
zlStatusE result = ZL5011X_OK;
return (result);
}
#if 0
/*-----------------------------
* le1veCreatContext - create context
*
*Argument:
* UINT32 gPort - global port
* UINT32 timeSlot - 该通道所占的时隙数,每一位表示一个时隙
*
* 说明:LE1VE最多只创建两个context,而且context创建后,不为其分配通道(时隙)也不会工作,LE1VE的驱动
* 在初始化时直接先创建两个context,在使用时再为其动态分配通道及配置接口属性。
*
*Return:
* OK or ERROR if something is wrong
*/
zlStatusE le1veCreatRxContext(int slot)
{
int contextLoop, context, stream, channelLoop;
zl5011xParamsS *pZl5011xParams;
zl5011xContextCreateS contextCreate;
zl5011xContextAddChannelRxS addChannelRx;
zl5011xWanRxPayloadConfigS wanRxPayload;
zl5011xPacketTxSetHeaderS packetTxHeader;
zl5011xContextS contextInfo;
zl5011xWanRxGetPayloadLengthS payloadLength;
Uint8T *packetHeader;
zlStatusE result = ZL5011X_OK;
pZl5011xParams = le1ve_Zl5011xParams[slot - 1];
/*Create the TDM input contexts (WAN Rx contexts)*/
for (contextLoop = FIRST_CONTEXT;
(contextLoop < (FIRST_CONTEXT + NUM_CONTEXTS)) && (result == ZL5011X_OK);
contextLoop++)
{
printf("context %3d: TDM input create\n", contextLoop);
result = zl5011xContextCreateStructInit(pZl5011xParams, &contextCreate);
/* For default values for structure contextCreate, see the function
zl5011xContextCreateStructInit() in file zl5011xTdm.c */
if (NULL == (packetHeader = (Uint8T*)malloc(100)))
result = ZL5011X_ERROR;
else
{
pZl5011xParams->pPktTxHeader[contextLoop] = packetHeader;
}
if (result == ZL5011X_OK)
{
contextCreate.context = contextLoop;
contextCreate.flow = ZL5011X_FLOW_WAN_PE_PKT;
result = zl5011xContextCreateRx(pZl5011xParams, &contextCreate);
}
}
#if 1 /*正式版本中将删除这段代码,要求实现通道的动态增加/删除*/
/* Add channels to the TDM input contexts (structured mode only) */
for (contextLoop = FIRST_CONTEXT;
(contextLoop < FIRST_CONTEXT + NUM_CONTEXTS) && (result == ZL5011X_OK);
contextLoop++)
{
context = contextLoop;
for (channelLoop = 1 ; (channelLoop < 32) && (result == ZL5011X_OK); channelLoop++)
{
/* simply assign 32 channels to each context. */
stream = context;
result = zl5011xContextAddChannelRxStructInit(pZl5011xParams, &addChannelRx);
/* the structure addChannelRx is used to associate with the context
stream & channel numbers and some other properties For default
values for structure addChannelRx, see the function
zl5011xContextAddChannelRxStructInit() in file zl5011xTdm.c */
if (result == ZL5011X_OK)
{
addChannelRx.context = context;
addChannelRx.tdm.stream = 0;
addChannelRx.tdm.channel = channelLoop * 4 + stream;
result = zl5011xContextAddChannelRx(pZl5011xParams, &addChannelRx);
}
}
}
#endif /*1*/
/* Setup the packet size for the TDM Input contexts (WAN Rx contexts) */
for (contextLoop = FIRST_CONTEXT;
(contextLoop < FIRST_CONTEXT + NUM_CONTEXTS) && (result == ZL5011X_OK);
contextLoop++)
{
context = contextLoop;
printf("context %3d: TDM input configure payload\n", context);
result = zl5011xWanRxPayloadConfigStructInit(pZl5011xParams, &wanRxPayload);
if (result == ZL5011X_OK)
{
wanRxPayload.context = context;
wanRxPayload.numberOfFrames = 8;
result = zl5011xWanRxPayloadConfig(pZl5011xParams, &wanRxPayload);
}
}
/* Configure the Packet Transmit header */
for (contextLoop = FIRST_CONTEXT;
(contextLoop < FIRST_CONTEXT + NUM_CONTEXTS) && (result == ZL5011X_OK);
contextLoop++)
{
printf("context %3d: TDM input setup header\n", contextLoop);
/* Using a ETHERNET->IPv4->UDP->RTP->PW header */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -