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

📄 m803xxint.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 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 + -