📄 m803xxint.c
字号:
/* Return type : VOID */
/* Argument : PortPtr-- Port Structure Pointer */
/* PortNo -- Port Number */
/* mbox -- MBOX_PACKET Structure Variable */
/* Addr -- M803xx Base Address */
/* Author/Date : Cao WanMing/2003-1-23 */
/* Note: */
/* */
/*
* Modified history
*------------------------------
* 2006-3-15 14:14 ZhengQishan 整理
*
**/
/*************************************************************************/
LOCAL void Recv_CMD_Result(M803xx_PORT_STATE *PortPtr, UINT8 PortNo, MBOX_PACKET *mbox, UINT32 Addr)
{
int i;
UINT8 /*Index,*/ cmd_class, cmd_type, PinNo;
UINT16 funcode,len,len1;
UINT32 rxBufAddrH,rxBufAddrL;
volatile UINT16 *Cmd_Addr;
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
QueueTxBoxMsg(CMD_CMDREQ, 0, 0, 0, PortNo);
semGive(M803xxQueueSem[PortNo/8]);
len1 = (UINT8)mbox->p0 & 0xFF;
len = (UINT16)ReadFromRegister(RX_FIFO_SIZE,Addr);
if((len == 0)||(len1 == 0))
{
printf("Port %d mbox len = %d,RX_FIFO_SIZE = %d\n",PortNo,len1,len);
return;
}
PinNo = CON_TO_DP[m_port[PortNo].Channel].chip;
/*Index = (UINT8)(mbox->p0>>8);*/
cmd_type = (UINT8)mbox->p1 & 0xFF;
cmd_class = (UINT8)(mbox->p1>>8);
funcode = mbox->p2;
/*
len1 = (UINT16)ReadFromRegister(RX_FIFO_SIZE,Addr);
*/
if(len != len1)
printf("mbox len = %d,RX_FIFO_SIZE = %d\n",len1,len);
Addr += HOST_START_DATA_ADD;
Cmd_Addr = ((UINT16 *)Addr);
for (i = 0; i < (len + 1) / 2; i++)
{
PortPtr->rx_cmd_fifo[i] = Swap_Byte(*(UINT16 *)Cmd_Addr);
}
switch(cmd_class)
{
case Cmd_Class_Statics:
switch(cmd_type)
{
case CMD_TYPE_Rtcp_Statics:
switch(funcode)
{
case FUN_RTCPSTAT:
memcpy(RtcpPkt[PinNo], PortPtr->rx_cmd_fifo, len);
break;
default:
break;
}
break;
/*2006-3-15 15:03 Added by ZhengQishan*/
case CMD_TYPE_FAX_COMBINED_Statics:
/*调用相应的调试打印函数*/
showFaxSttInfo((int)PortNo, (void *)(PortPtr->rx_cmd_fifo));
break;
case CMD_TYPE_CFG_SUMMARY: /* CONFSUM */
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("the CONFSUM information is :\n");
for (i = 0; i < len ; i++)
{
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("The PortNo %d,The %d CONFSUM Word Value-->%x\n", PortNo, i, PortPtr->rx_cmd_fifo[i]);
}
break;
default:
break;
}
break;
case Cmd_Class_Configuration:
switch(cmd_type)
{
case Config_Ack:
switch(funcode)
{
case FUN_VCEOPT:
Command_Ack[PortNo] = 1;
if(PortPtr->rx_cmd_fifo[0] == 0)
{
if(M80320_Debug[PortNo] == 1)M80320_PRINTF(" Port(%d) VCEOPT OK\n", PortNo);
}
else
{
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("*****************Port %d Voice Option Set Failure, %d!\n",
PortNo, PortPtr->rx_cmd_fifo[0]);
}
break;
case FUN_TONEGEN:
Command_Ack[PortNo] = 1;
if(PortPtr->rx_cmd_fifo[0] == 0)
{
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF(" Port(%d) TONEGER OK\n", PortNo);
if (PortPtr->Stop_Tone_Generate_Flag == 1) /* caowm for changsha */
{
PortPtr->Stop_Tone_Generate_Flag = 0;
}
if(((m_port[PortNo].status == CIDStatus)||(m_port[PortNo].status == CIDTalkStatus))&&(m_port[PortNo].CID_Send_Len != 0))
{
M80320_CID_SendDtmf(PortNo);
}
}
else
{
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("********************Port %d Tone Generate Failure, %d!\n", PortNo, PortPtr->rx_cmd_fifo[0]);
if ((PortPtr->rx_cmd_fifo[0] == 1)&&(PortPtr->Stop_Tone_Generate_Flag == 1)) /* caowm for changsha */
{
PortPtr->Stop_Tone_Generate_Flag = 0;
Tone_Err_Disable_Channel_Processing(PortNo);
OpenChannel(PortNo, 2);
PortPtr->Tone_Err_Open_flag = 2;
incCountForToneErr();
}
if(((m_port[PortNo].status == CIDStatus)||(m_port[PortNo].status == CIDTalkStatus))&&(m_port[PortNo].CID_Send_Len != 0))
{
m_port[PortNo].CID_Send_Len--;
M80320_CID_SendDtmf(PortNo);
}
}
break;
case FUN_VOPENA:
Command_Ack[PortNo] = 1;
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("Port(%d) OPEN OK ! OldActiveStatus = %d ExpectActiveStatus = %d\n", PortNo,
PortPtr->OldActiveStatus, PortPtr->ExpectActiveStatus);
if (PortPtr->Tone_Err_Open_flag > 0)
{
if(PortPtr->rx_cmd_fifo[0] == 0)
{
M80320_PRINTF("Port %d Tone Err Ok!\n", PortNo);
}
else
{
M80320_PRINTF("Port %d Tone Err Fail!\n", PortNo);
}
PortPtr->Tone_Err_Open_flag --;
if(PortPtr->Tone_Err_Open_flag == 0)
{
if(Tone_Stop[PortNo] == 0)
{
Tone_Generate_Process(PortPtr->Tone_Type_Temp, PortNo);
}
}
break;
}
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
if( (PortPtr->OldActiveStatus == LFXS_DOWN) && (PortPtr->ExpectActiveStatus == LFXS_UP) )
{
if(PortPtr->rx_cmd_fifo[0] == 0)
{
VoIP_CALL_PRINTF("Port %d Voice Channel Open Ok!\n", PortNo);
if(PortPtr->status == WaitCIDStatus)
{
PortPtr->status = CIDStatus;
}
if(M803xx_Open_Channel_Flag[PortNo] == 1)
{
PortPtr->status = TalkStatus;
/*if(M803xx_Stop_PciReq[PortNo] == 1)
{*/
M803xx_Stop_PciReq[PortNo] = 0;
rxBufAddrH = (UINT32)((UINT32)((UINT8 *)PciReadBuf[m_port[PortNo].Channel]+PACKET_START_SIZE)) >> 16;
rxBufAddrL = (UINT32)((UINT32)((UINT8 *)PciReadBuf[m_port[PortNo].Channel]+PACKET_START_SIZE)) & 0x0000ffff;
QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, PortNo);
/*}*/
}
PortPtr->Active = LFXS_UP;
PortPtr->OldActiveStatus = LFXS_UP;
/*2006-3-22 11:06 modified by ZhengQishan*/
PortPtr->VAD = PortPtr->ExpectServiceType;
PortPtr->OldServiceType = PortPtr->ExpectServiceType;
#ifdef DEBUG
totalUp ++;
UpCount1 ++;
#endif
PortPtr->Recdisch=0;
ChannelWorkStatus[PortNo] = LFXS_UP;
ChannelOperateCount[PortNo].SelfEnablechannelSucceedCount++;
}
else
{
VoIP_CALL_PRINTF("Port %d Voice Channel Open Failure, %d!\n",
PortNo, PortPtr->rx_cmd_fifo[0]);
#ifdef DEBUG
OpenchannelFail ++;
#endif
ChannelOperateCount[PortNo].SelfEnablechannelFailureCount++;
PortPtr->Active = PortPtr->OldActiveStatus;
PortPtr->VAD = PortPtr->OldServiceType;
ChannelWorkStatus[PortNo] = LFXS_DOWN;
}
}
#if 1
else if( (PortPtr->OldActiveStatus == LFXS_UP) && (PortPtr->ExpectActiveStatus == LFXS_DOWN) )
{
if(PortPtr->rx_cmd_fifo[0] == 0)
{
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("Port %d Voice Channel Disable Ok!\n", PortNo);
PortPtr->Active = LFXS_DOWN;
PortPtr->VAD = PortPtr->ExpectServiceType;
PortPtr->OldActiveStatus = LFXS_DOWN;
PortPtr->OldServiceType = PortPtr->ExpectServiceType;
if(PortPtr->status == WaitIdleStatus)
PortPtr->status = IdleStatus;
if(PortPtr->status == CIDWaitIdleStatus)
PortPtr->status = CIDIdleStatus;
PortPtr->callingFialedCnt = 0;
/*Added by ZhengQishan, 有时由于M80320的API接口不能正确返回命令执行状态,
造成软件状态不能切换,所以呼叫结束时先将状态恢复到缺省值
setPortDefaultArg(PortNo);
InitOpenChanQueue(PortNo);*/
#ifdef DEBUG
totalDown ++;
DownCount2 ++;
#endif
ChannelOperateCount[PortNo].SelfDisablechannelSucceedCount++;
ChannelWorkStatus[PortNo] = LFXS_DOWN;
#if 0
M80320_PRINTF("Port %d: Sender_rtpPackets =%ld,Sender_faxPackets =%ld Rcvr_rtpPackets =%ld,Rcvr_faxPackets =%ld!\n",
PortNo, RtpValue[PortNo].Sender_Packets,
FaxValue[PortNo].Fax_Sender_Packets,
RtpValue[PortNo].Rcvr_Packets,
FaxValue[PortNo].Fax_Rcvr_Packets);
#endif
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("Port %d status: now the VAD = %d ,Active = %d!\n",
PortNo, m_port[PortNo].VAD,
m_port[PortNo].Active);
/*
Send_CONFSUM_Cmd(PortNo);
*/
#if 1
QueueTxBoxMsg(CMD_CHRESET, 0x0, 0x0, 0x0, PortNo);
#endif
}
else
{
VoIP_CALL_PRINTF("Port %d Voice Channel Disable Failure, %d!\n",
PortNo, PortPtr->rx_cmd_fifo[0]);
#ifdef DEBUG
ClosechannelFail ++;
#endif
ChannelOperateCount[PortNo].SelfDisablechannelFailureCount++;
PortPtr->Active = PortPtr->OldActiveStatus;
PortPtr->VAD = PortPtr->OldServiceType;
ChannelWorkStatus[PortNo] = LFXS_UP;
}
}
else if( (PortPtr->OldActiveStatus == LFXS_DOWN) && (PortPtr->ExpectActiveStatus == LFXS_DOWN) )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -