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

📄 m803xxint.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
                                        PortNo, PortPtr->rx_cmd_fifo[0]);
                            }
                            break;
                        case RESULT_OF_CID_GENERATION:
                            if(M80320_Debug[PortNo] == 1)
                                 M80320_PRINTF("Port %d, Result of CallerID Generation(0x%x)\n", PortNo, PortPtr->rx_cmd_fifo[0]);
                            break;
                        default:
                            break;
                    }
                    break;

                case Config_Indication:
                    switch(funcode)
                    {
                        case FUN_SSRCVIOL:
                        case FUN_SSRCCHG:
                            M80320_PRINTF("Port %d Receive SSRC 0x%x\n",PortNo, funcode);
                            break;

                        case FUN_TONEDET:
                            if((PortPtr->status != CIDStatus)&&(PortPtr->status != CIDTalkStatus))
                            {
                                 Tone_Detect_Process(PortNo, PortPtr->rx_cmd_fifo, len);
                            }
                            break;

                        case FUN_EVENTDET:
                            Event_Detect_Process(PortNo, PortPtr->rx_cmd_fifo, len);
                            break;

                        case FUN_VINFOIND:
                            if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the voice information  is :\n");
                            for (i = 0; i < (len + 1) / 2; i++)
                                if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the PortNo %d,the %d word value is --> %x",
                                    PortNo, i, PortPtr->rx_cmd_fifo[i]);
                            if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the voice information  OK  !!\n");
                            break;

                       case FUN_FINFOIND:
                            if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the FAX information  is :\n");
                            for (i = 0; i < (len + 1) / 2; i++)
                                if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the PortNo %d,the %d word value is --> %x",
                                    PortNo, i, PortPtr->rx_cmd_fifo[i]);
                            if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the FAX information  OK  !!\n");
                            break;

                        case FUN_FAXSTATE:
                            faxRelayStateChangeProcess(PortNo, PortPtr->rx_cmd_fifo, len);
                            if(M80320_Debug[PortNo] == 1)
                                M80320_PRINTF("the PortNo %d coming TRAINING MESSAGE word value is --> %x\n",PortNo, PortPtr->rx_cmd_fifo[0]);
                            break;
                        default:
                            break;
                    }
                    break;

                case Config_Query_Response:
                    switch(funcode)
                    {
                        case FUN_RTCPSTAT:
                            if(M80320_Debug[PortNo] == 1)M80320_PRINTF("There is Rtcp Statistics query response!\n");
                            memcpy(RtcpPkt[PinNo], PortPtr->rx_cmd_fifo, len);
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }
            break;

        default:
           break;
    }
    memset((void *)PortPtr->rx_cmd_fifo, 0, len);
}

/*************************************************************************/
/* Function name: Recv_Config_Result                                     */
/* Description  :                                                        */
/*************************************************************************/
LOCAL void Recv_Config_Result(M803xx_PORT_STATE *PortPtr, UINT8 PortNo, UINT16 return_msg)
{
    switch(return_msg<<8)
    {
        case CMD_SETSYNC:
            PortPtr->asysynmode = DM_SYNC;
            #if M803xx_DEBUG
            if(M80320_Debug[PortNo] == 1)M80320_PRINTF("Port %d work in SYNC mode!\n", PortNo);
            #endif
            #if 0
            R12_QUERY[PortNo] = 1;
            #endif
            break;

        case CMD_SETASYN:
            PortPtr->asysynmode = DM_ASYN;
            #if M803xx_DEBUG
            if(M80320_Debug[PortNo] == 1)M80320_PRINTF("Port %d work in ASYN mode!\n", PortNo);
            #endif
            break;
       default:
           break;
    }
}

/*************************************************************************/
/* Function name: Recv_Channel_Result                                    */
/* Description  : 当驱动接收到某个通道有错误的命令响应时,将Reset此通道,*/
/*                然后通过此函数判断通道是否正常                         */
/*************************************************************************/
void Recv_Channel_Result(UINT8 Channel, UINT8 result)
{
    UINT8 i, Flag = 0, PinNo;

    PinNo = CON_TO_DP[Channel].chip;
    if(result == 1)
    {
        if (m_port[m_channel[Channel].Port].Active == LFXS_STOP)
        {
            printf("Port %d From Stop To Work\n",m_channel[Channel].Port);
            m_port[m_channel[Channel].Port].Active = LFXS_DOWN;
        }

#if 0
        if( (m_channel[Channel].Active == REPAIR)||(m_channel[Channel].Active == FAIL) )
        {
            m_channel[Channel].Port   = 0xff;
            m_channel[Channel].Active = IDLE;
            m_channel[Channel].Repair_Num = 0;
        }
#endif
    }
    else
    {
        m_port[m_channel[Channel].Port].Active = LFXS_STOP;
        semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
        QueueTxBoxMsg(CMD_CHRESET, 0x0, 0x0, 0x0, m_channel[Channel].Port);
        semGive(M803xxQueueSem[PinNo]);

#if 0
        semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
        if( m_channel[Channel].Active == LFXS_USE )
        {
            m_channel[Channel].Active = REPAIR;
            for( i=(PinNo*PORTS_OF_CHIP); i<((PinNo+1)*PORTS_OF_CHIP); i++ )
            {
                if( m_channel[i].Active == IDLE )
                {
                    
                    if (OK == M80320_checkOpenChanQueue(PinNo, 0x0, 0x0))
                        SendMsgToOpenChannelQueue(CMD_SETTSA|i,
                          (UINT16)(m_port[m_channel[Channel].Port].Slot), 0x0001, 0x0, i);
                    
                    m_port[m_channel[Channel].Port].Channel = i;
                    m_channel[i].Active = LFXS_USE;
                    m_channel[i].Port   = m_channel[Channel].Port;
                    Flag = 1;
                    i = (PinNo+1)*PORTS_OF_CHIP;
                }
            }
            if(Flag == 0)
                m_port[m_channel[Channel].Port].status = ErrStatus;
            QueueTxBoxMsg(CMD_CHRESET, 0x0, 0x0, 0x0, m_channel[Channel].Port);
            m_channel[Channel].Repair_Num++ ;
            m_channel[Channel].Port   = 0xff;
        }
        else
        {
            if( m_channel[Channel].Repair_Num < MAX_REPAIR_NUM )
            {
                m_channel[Channel].Repair_Num++;
                QueueTxBoxMsg(CMD_CHRESET, 0x0, 0x0, 0x0, m_channel[Channel].Port);
            }
            else
                m_channel[Channel].Active = FAIL;
        }
        semGive(M803xxQueueSem[PinNo]);
#endif
    }
}

/*************************************************************************/
/* Function name: ReceiveMBoxMessage                                     */
/* Description  : Receive M803xx Message                                 */
/* Return type  : Void                                                   */
/* Argument     : PinNo -- No. of the specified Pin                      */
/*                Addr  -- Base Address of the M803xx                    */
/*                mbox  -- Pointer to the Message                        */
/* Author/Date  : Cao WanMing/2003-1-22                                  */
/* Note:                                                                 */
/*                                                                       */
/*
* Modified History
*
*------------------------------
* 2006-03-15 Modified by ZhengQishan 
*
*/
/*************************************************************************/

void ReceiveMBoxMessage(UINT8 PinNo, UINT32 p2, UINT32 p1, UINT32 p0, UINT32 message)
{
    MBOX_PACKET tmpbuf;
    UINT8 PortNo,Channel;
    M803xx_PORT_STATE *PortPtr;
    MBOX_PACKET *mbox;
    UINT32 rxBufAddrH,rxBufAddrL;
#if 0
    UINT32 *bufAddr,*buf;
    void *tempAddr;
#endif
    UINT32 Addr;

    Addr = PCIM803xx_BASEADDR[PinNo];

    memset(&tmpbuf,0,sizeof(MBOX_PACKET));
    mbox = (MBOX_PACKET *)(&tmpbuf);

    mbox->p2         = p2;
    mbox->p1         = p1;
    mbox->p0         = p0;
    mbox->message    = message;

    Channel = (mbox->message & 0xFF) + PinNo * PORTS_OF_CHIP;  /* 通道号 */
    PortNo  = m_channel[Channel].Port; /* 端口号 */

    Real_Interrupt_Num[PinNo] ++;

    PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
    
    semTake(M803xxOprSem[PinNo], WAIT_FOREVER);
    
    switch(mbox->message & 0xFF00)
    {
        case CMD_PCIDAT:
            M80320_PciDATA_Num[PortNo]++;
            
            /*2006-3-23 17:08 Added by ZhengQishan*/
            if (m_port[PortNo].VAD == Fax)  /*T38 FAX*/
                receiveT38FaxPkt(PortPtr, PortNo, mbox->p0, Addr, 0);
            else
                ReceiveData(PortPtr, PortNo, mbox->p0, Addr, 0);
            break;
        case CMD_PCIEOF:
            M80320_PciEOF_Num[PortNo]++;
            
            /*2006-3-23 17:08 Added by ZhengQishan*/
            if (m_port[PortNo].VAD == Fax) /*T38 FAX*/
                receiveT38FaxPkt(PortPtr, PortNo, mbox->p0, Addr, 0);
            else
                ReceiveData(PortPtr, PortNo, mbox->p0, Addr, 1);
            break;
            
        case CMD_DATAREQ:
            if(PortPtr->tx_data_requested == 1)
            {
                M80320_ReDataReq_Num[PortNo]++;
                if(M80320_Debug[PortNo] == 1)
                    M80320_PRINTF("Port (%d) DataReq = %d,PciDone = %d,PciEof = %d\n",
                        PortNo,M80320_DataReq_Num[PortNo],
                        M80320_PciDONE_Num[PortNo],
                        Host_PciEOF_Num[PortNo]);
            }
            M80320_DataReq_Num[PortNo]++;
            semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
            PortPtr->tx_data_requested = 1;/*mbox->p0;*/
            semGive(M803xxQueueSem[PinNo]);

            if(mbox->p0 < 1024)
            {
                if(M80320_Debug[PortNo] == 1)
                {
                    M80320_PRINTF("Port %d Receive Datareq Len = %d\n", PortNo, mbox->p0);
                }
            }
            if(Send_Flag[PortNo] == 1)
            {
                pkt_free((packet *)M803xxSendBuf[PortNo]);
                Send_Flag[PortNo] = 0;
            }
            if(PinStatus[PinNo] == TRUE)
            {
                #if SEM_FLAG
                semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
                #endif
                if(SendFlag[PortNo] == 0)
                {
                    SendFlag[PortNo] = 1;
                            
                    /*为什么还要再一次加入tFwdTask任务队列,这不已经是任务级处理了吗?*/
                    if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)PinNo,0,(int)PortNo,0,0))

⌨️ 快捷键说明

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