📄 initm803xx.c
字号:
* Argument :
* int slot - 物理槽位号,从1-8
*
* Author/Date : Cao WanMing/2003-1-23
* Note:
*
*************************************************************************/
LOCAL void InitTxMboxQueue(int slot)
{
if ((slot < 0) || (slot > MAX_PIN_NUM))
{
printf("InitTxMboxQueue: Error slot number!\n");
return;
}
m_txmbox[slot - 1].QAddr = (UINT8 *)malloc(2*4*TX_MBOX_QSIZE);
/*2006-2-25 Added by Zhengqishan*/
if (NULL == m_txmbox[slot - 1].QAddr)
{
printf("InitTxMboxQueue: Cannot malloc memory for TX MailBox!\n");
taskSuspend(0);
}
m_txmbox[slot - 1].QSize = 4 * TX_MBOX_QSIZE;
m_txmbox[slot - 1].QGet = 0;
m_txmbox[slot - 1].QPut = 0;
m_txmbox[slot - 1].QCount= 0;
}
void InitPortQueue(UINT8 PortNo)
{
UINT16 get, *TxBox, Mem[2];
void *Mem_Addr;
for(;m_TxDataQueue[PortNo].QCount > 0;)
{
TxBox = (UINT16 *)m_TxDataQueue[PortNo].QAddr;
get = m_TxDataQueue[PortNo].QGet;
get = get+4;
Mem[0]=TxBox[get++];
Mem[1]=TxBox[get++];
Mem_Addr = (UINT32 *)((((UINT32)(Mem[1]))<<16) + (UINT32)(Mem[0]));
pkt_free((packet *)Mem_Addr);
if(get >= m_TxDataQueue[PortNo].QSize) get = 0;
m_TxDataQueue[PortNo].QGet = get;
m_TxDataQueue[PortNo].QCount -= 6;
}
m_TxDataQueue[PortNo].QGet = 0;
m_TxDataQueue[PortNo].QPut = 0;
m_TxDataQueue[PortNo].QCount= 0;
}
void InitOpenChanQueue(UINT8 PortNo)
{
int i;
if (PortNo >= (M803XX_MAX_PORT_NUM * MAX_PIN_NUM))
{
printf("InitOpenChanQueue: PortNo is error!!\n");
ASSERT(0);
return;
}
m_OpenChannelMailboxQueue[PortNo].QGet = 0;
m_OpenChannelMailboxQueue[PortNo].QPut = 0;
m_OpenChannelMailboxQueue[PortNo].QCount= 0;
RemainedTxCmdNum[PortNo] = 0;
m_port[PortNo].InCmd = 0;
m_port[PortNo].OutCmd = 0;
for(i = 0; i < MAX_LEN_OF_CMD_FIFO; i++)
m_port[PortNo].tx_cmd_fifo[i] = 0;
}
/*************************************************************************
* Function name: InitM80320Queue
* Description : Initialize M803xx's Queue
* Return type : void
*
* Argument :
* int slot - 物理槽位号,从1-8
*
* Author/Date : Cao WanMing/2003-1-23
* Note:
*
*************************************************************************/
LOCAL void InitM80320Queue(int slot)
{
int i,j;
if ((slot < 0) || (slot > MAX_PIN_NUM))
{
printf("InitM80320Queue: Error slot number!\n");
return;
}
j = slot - 1;
for( i = 0; i < M803XX_MAX_PORT_NUM; i++)
{
m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QAddr = (unsigned char *)malloc(2*4*TX_MBOX_QSIZE);
if ((unsigned char *)NULL == m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QAddr)
{
printf("InitM80320Queue: Cannot malloc memory for M80320 Open channel Queue!\n");
ASSERT(0);
}
m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QSize = 4*TX_MBOX_QSIZE;
m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QGet = 0;
m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QPut = 0;
m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QCount= 0;
m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QAddr = (unsigned char *)malloc(2*6*TX_DATA_QSIZE);
if ((unsigned char *)NULL == m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QAddr)
{
printf("InitM80320Queue: Cannot malloc memory for M80320 TX data Queue!\n");
ASSERT(0);
}
m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QSize = 6*TX_DATA_QSIZE;
m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QGet = 0;
m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QPut = 0;
m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QCount= 0;
Tone_Stop[i+j*M803XX_MAX_PORT_NUM] = 1;
Command_Ack[i+j*M803XX_MAX_PORT_NUM] = 1;
}
}
/************************************************************************
* Function name: InitM80320Mport
* Description : Initialize The m_port Structure
* Return type : void
*
* Argument :
* int slot - 物理槽位号,从1-8
*
* Author/Date : Cao WanMing/2003-1-23
* Note:
*
*************************************************************************/
LOCAL void InitM80320Mport(int slot)
{
int i,j;
if ((slot < 0) || (slot > MAX_PIN_NUM))
{
printf("InitM80320Queue: Error slot number!\n");
return;
}
j = slot - 1;
M803xxQueueSem[j] = semBCreate (SEM_Q_FIFO, SEM_FULL);
M803xxOprSem[j] = semBCreate(SEM_Q_FIFO,SEM_FULL);
if ((M803xxQueueSem[j] == NULL) || (M803xxOprSem[j] == NULL))
{
printf("M80320 Create Sem Error!\n");
taskSuspend(0); /*2006-3-18 Added by ZhengQishan*/
}
for(i=0; i<PORTS_OF_CHIP; i++)
{
m_channel[i+j*PORTS_OF_CHIP].Port = 0xff;
m_channel[i+j*PORTS_OF_CHIP].Active = FAIL;
CON_TO_DP[i+j*PORTS_OF_CHIP].chan = 0xff;
CON_TO_DP[i+j*PORTS_OF_CHIP].chip = j;
}
for(i = 0; i < M803XX_MAX_PORT_NUM; i++)
{
m_port[i+j*M803XX_MAX_PORT_NUM].Channel = 0xff;
m_port[i+j*M803XX_MAX_PORT_NUM].asysynmode = DM_SYNC;
m_port[i+j*M803XX_MAX_PORT_NUM].Dtmf_Receive_Flag = 0;
m_port[i+j*M803XX_MAX_PORT_NUM].Ackok = 1;
m_port[i+j*M803XX_MAX_PORT_NUM].Slot = i;
m_port[i+j*M803XX_MAX_PORT_NUM].ReOpenNum = 0;
m_port[i+j*M803XX_MAX_PORT_NUM].PackLen = 32; /* G729 */
m_port[i+j*M803XX_MAX_PORT_NUM].Active = LFXS_DOWN;
m_port[i+j*M803XX_MAX_PORT_NUM].CallType = LFXS_CALLTYPE_IDLE;
m_port[i+j*M803XX_MAX_PORT_NUM].status = ErrStatus;
m_port[i+j*M803XX_MAX_PORT_NUM].VAD = Voice;
m_port[i+j*M803XX_MAX_PORT_NUM].OldServiceType = Voice;
m_port[i+j*M803XX_MAX_PORT_NUM].OldActiveStatus = LFXS_DOWN;
m_port[i+j*M803XX_MAX_PORT_NUM].ExpectServiceType = Voice;
m_port[i+j*M803XX_MAX_PORT_NUM].Stop_Tone_Generate_Flag = 0;
m_port[i+j*M803XX_MAX_PORT_NUM].Tone_Err_Open_flag = 0;
m_port[i+j*M803XX_MAX_PORT_NUM].Tone_Type_Temp = 0;
m_port[i+j*M803XX_MAX_PORT_NUM].ReceiveRTCPFlag = 0;
m_port[i+j*M803XX_MAX_PORT_NUM].ReceiveRTPFlag = 0;
Parameter[i+j*M803XX_MAX_PORT_NUM].echoCancell = 48; /* ms */
Parameter[i+j*M803XX_MAX_PORT_NUM].VAD = 1; /* User */
Parameter[i+j*M803XX_MAX_PORT_NUM].Tos = VOIP_DRIVER_IP_PRECEDENCE_DEFAULT; /* Tos */
Parameter[i+j*M803XX_MAX_PORT_NUM].CNG = 0; /* No User */
Parameter[i+j*M803XX_MAX_PORT_NUM].InGainValue = 0; /* 0 dB */
Parameter[i+j*M803XX_MAX_PORT_NUM].JitterValue = 20; /* ms */
Parameter[i+j*M803XX_MAX_PORT_NUM].bearerInformation = 15; /* G729 */
Parameter[i+j*M803XX_MAX_PORT_NUM].frameNum = 0; /* 1-5 */
Parameter[i+j*M803XX_MAX_PORT_NUM].DTMF_LEVEL = 300; /* -30 dB */
Parameter[i+j*M803XX_MAX_PORT_NUM].OutAttenuationValue = 0; /* 0 dB */
Parameter[i+j*M803XX_MAX_PORT_NUM].DTMFSendMode = DTMF_IN_BAND_TRANSFER;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[0] = 0xa8;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[1] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[2] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[3] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[0] = 0xa8;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[1] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[2] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[3] = 0x02;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.port = 0x437;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.port = 0x337;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[0] = 0xa8;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[1] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[2] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[3] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[0] = 0xa8;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[1] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[2] = 0x01;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[3] = 0x02;
Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.port = 0x438;
Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.port = 0x338;
InitRTCPInfo((TRTCPInfo *)&RTCPInfo[i+j*M803XX_MAX_PORT_NUM], (i+j*M803XX_MAX_PORT_NUM));
}
}
LOCAL void Init_Port_Channel(UINT8 PinNo)
{
int i,j;
for(i = 0; i< M803XX_MAX_PORT_NUM; i++)
{
for(j = 0; j < PORTS_OF_CHIP; j++)
{
if(m_channel[j + (PinNo * PORTS_OF_CHIP)].Active == IDLE)
{
m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].Channel = j + (PinNo * PORTS_OF_CHIP);
m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].status = IdleStatus;
m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].tx_data_requested = m_channel[j + (PinNo * PORTS_OF_CHIP)].tx_data_requested;
m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].tx_cmd_requested = m_channel[j + (PinNo * PORTS_OF_CHIP)].tx_cmd_requested;
CON_TO_DP[j + (PinNo * PORTS_OF_CHIP)].chan = i;
m_channel[j + (PinNo * PORTS_OF_CHIP)].Port = i + (PinNo * M803XX_MAX_PORT_NUM);
m_channel[j + (PinNo * PORTS_OF_CHIP)].Active = LFXS_USE;
j = PORTS_OF_CHIP;
}
}
}
}
void FindM803xxAddr()
{
int loop, slot;
int BusNo,DeviceNo,FuncNo;
UINT32 result;
for (loop = 0; loop < 8; loop ++)
{
BusNo = 0;
DeviceNo = 0;
FuncNo = 0;
if (OK == pciFindDevice (M803xx_VEN_ID, M803xx_DEV_ID, loop, &BusNo, &DeviceNo, &FuncNo))
{
if (OK == b_ifPciIDToUnitNum(BusNo, DeviceNo,(UINT32 *)&slot))
{
pciConfigOutWord(BusNo, DeviceNo, 0, PCI_CFG_COMMAND_OFFSET,PCI_CFG_CMD_MEM_ENABLE | PCI_CFG_CMD_MASTER_ENABLE );
pciConfigInLong(BusNo, DeviceNo, 0, PCI_MEM_BASE_OFFSET,&result);
result&=PCI_MEM_BASE_MASK;
#if INSTALL_ON_IXP1200
PCIM803xx_BASEADDR[slot-1] = (UINT32)(0x60000000+result);
#else
PCIM803xx_BASEADDR[slot-1] = (UINT32 )(result);
#endif
}
}
else
{
/*向gpDrvCtrl结构添加PCI接口设备不在位信息*/
}
}
}
void PowerOnStart(UINT8 unitNum)
{
int pfile;
if((unitNum > 8) || (unitNum == 0))
{
M80320_PRINTF("unitNum = %d Error\n", unitNum);
return;
}
#if INSTALL_ON_IXP1200
if(PCIM803xx_BASEADDR[unitNum-1] == 0x60000000)
{
return;
}
#else
if(PCIM803xx_BASEADDR[unitNum-1] == 0)
{
return;
}
#endif
initChannelOperateCount(unitNum);
/*2006-3-28 Added by ZhengQishan*/
if (OK != initT38FaxArgVar(unitNum))
taskSuspend(0);
/*ZhengQishan, 把所有全局变量的初始化集中在一起*/
initGlobalVariableForM80320 ();
InitTxMboxQueue(unitNum);
InitM80320Queue(unitNum);
InitM80320Mport(unitNum);
bDmFile = (unsigned char*)malloc(FIRMWARE_MEM_LEN);
if(bDmFile == NULL)
{
printf("firmware not read\n");
return;
}
pfile = open(FIRMWARE_NAME_FILE, O_RDONLY,0);
read(pfile, (char *)bDmFile, FIRMWARE_MEM_LEN);
M803xx_Init(unitNum-1, PCIM803xx_BASEADDR[unitNum-1]);
M803xxPciIntConnect(unitNum);
close(pfile);
free(bDmFile);
}
/*-----------------------------
* setPortDefaultArg - 设置语音通道的缺省状态值
*
* Description:
*
* Argument:
* int PortNo - PortNo = (slot - 1) * 8 (每一个槽位最多8个端口) + port - 1
*
* Modified history
*------------------------------
* 2006-6-15 15:13 ZhengaQishan Created.
*
**/
void setPortDefaultArg(int PortNo)
{
M803xx_PORT_STATE *PortPtr;
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
PortPtr->tx_cmd_requested = 1; /*1 - 初始值(表示命令已经响应,0 - 命令已经发出,还未响应)*/
PortPtr->Ackok = 1; /*1 - 初始值(表示命令已经响应,0 - 命令已经发出,还未响应)*/
PortPtr->tx_data_requested = 1; /*1 - 初始值(表示命令已经响应,0 - 命令已经发出,还未响应)*/
PortPtr->status = CIDIdleStatus;
PortPtr->OldActiveStatus = LFXS_DOWN;
PortPtr->CID_Send_Len = 0;
PortPtr->CID_Len = 0;
PortPtr->RECNum = 0;
PortPtr->PLAYNum = 0;
}
/*===========================DEBUG CODE==============================*/
void ResetM80320(UINT8 slotNum)
{
UINT32 Addr;
unsigned long *Modem_Addr;
if(slotNum <= 0)return;
Addr = PCIM803xx_BASEADDR[slotNum -1];
Modem_Addr=(unsigned long *)(Addr + FIFO_CTR_REG);
*(Modem_Addr) = Swap_Word(0x4400);
taskDelay(100);
Modem_Addr = (unsigned long *)(Addr + FIFO_STA_REG);
*(Modem_Addr) = Swap_Word(RESET_MASK);
taskDelay(100);
PowerOnStart(slotNum);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -