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

📄 t38fax.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 4 页
字号:
            /*printf("Port 0x%08x %s FAX Relay %s\n", gPort, pDir, "SEP");*/
                faxDebug(dbgClass, gPort, " %s FAX Relay %s\n", pDir, "SEP (Selective polling)");
            break;

        case T38_FAX_STATE_SUB0:  
        case T38_FAX_STATE_SUB1:    
            /*printf("Port 0x%08x %s FAX Relay %s\n", gPort, pDir, "SUB");*/
                faxDebug(dbgClass, gPort, " %s FAX Relay %s\n", pDir, "SUB (Subaddress)");
            break;

        case T38_FAX_STATE_TSI0:  
        case T38_FAX_STATE_TSI1:    
            /*printf("Port 0x%08x %s FAX Relay %s\n", gPort, pDir, "TSI");*/
                faxDebug(dbgClass, gPort, " %s FAX Relay %s\n", pDir, "TSI (Transmitting subscriber identification)");
            break;

        default :
            break;
        }
    }
    else
    {
        switch(faxRelayState & 0xFF)
        {
            case 0x00:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "Idle");
                break;
            case 0x01:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "No signal message from IP--entered idle");
                break;
            case 0x02:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CNG received from PCM");
                break;
            case 0x03:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CNG sent to PCM from IP");
                break;
            case 0x04:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CED received from PCM");
                break;
            case 0x05:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CED sent to PCM from IP");
                break;
        /* 统计实际协商出的速率的debug信息 */
            case T38_FAX_SPEED_2400_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 2400 demodulation");
                break;

            case T38_FAX_SPEED_2400_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 2400 remodulation");
                break;

            case T38_FAX_SPEED_4800_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 4800 demodulation");
                break;

            case T38_FAX_SPEED_4800_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 4800 remodulation");
                break;

            case T38_FAX_SPEED_7200_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 7200 demodulation");
                break;

            case T38_FAX_SPEED_7200_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 7200 remodulation");
                break;

            case T38_FAX_SPEED_9600_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 9600 demodulation");
                break;

            case T38_FAX_SPEED_9600_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 9600 remodulation");
                break;

            case T38_FAX_SPEED_7200_S_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 short train demodulation");
                break;

            case T38_FAX_SPEED_7200_S_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 short train remodulation");
                break;

            case T38_FAX_SPEED_7200_L_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 long train demodulation (V.33)");
                break;

            case T38_FAX_SPEED_7200_L_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 long train remodulation (V.33)");
                break;

            case T38_FAX_SPEED_9600_S_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 short train demodulation");
                break;

            case T38_FAX_SPEED_9600_S_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 short train remodulation");
                break;

            case T38_FAX_SPEED_9600_L_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 long train demodulation (V.33)");
                break;

            case T38_FAX_SPEED_9600_L_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 long train demodulation (V.33)");
                break;

            case T38_FAX_SPEED_12000_S_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 short train demodulation");
                break;

            case T38_FAX_SPEED_12000_S_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 short train remodulation");
                break;

            case T38_FAX_SPEED_12000_L_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 long train demodulation (V.33)");
                break;

            case T38_FAX_SPEED_12000_L_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 long train remodulation (V.33)");
                break;

            case T38_FAX_SPEED_14400_S_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 short train demodulation");
                break;

            case T38_FAX_SPEED_14400_S_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 short train remodulation");
                break;

            case T38_FAX_SPEED_14400_L_DE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 long train demodulation (V.33)");
                break;

            case T38_FAX_SPEED_14400_L_RE:
                faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 long train remodulation (V.33)");
                break;

            default :
                break;
        }
    }
}

/*-----------------------------
* destroyChannel - 清除一个通道,
*
* Description:
* 
* Argument:
*   int portNo      - portNo = (slot - 1) * 8 (每一个槽位最多8个端口) + port - 1
*
* Return:
*    
* Modified history
*------------------------------
* 2006-3-20 17:13 ZhengaQishan Created.
*
**/
int destroyChannel(int portNo)
{
    int  result = SENDTOM803xxOK;

    result = (int)Disable_Channel_Processing((UINT8)portNo);
    m_port[portNo].status = SWITCH_TYPE;
    

    if (SENDTOM803xxOK == result)
    {
        result = sendSuperMsg(CMD_DESTROY_CHAN | 0xFF, (m_port[portNo].Channel)%PORTS_OF_CHIP, 0,0, (UINT8)portNo);

    }
    else
    {
        printf("destroyChannel:  Disable Channel VOPENA is failed!\n");
    }
    return(result);
}

/*-----------------------------
* createChannel - 创建一个T.38 FAX 通道,
*
* Description:
* 
* Argument:
*   int portNo      - portNo = (slot - 1) * 8 (每一个槽位最多8个端口) + port - 1
*   TYPE_OF_CHANNEL type    - 通道类型
* Return:
*    
* Modified history
*------------------------------
* 2006-3-20 17:13 ZhengaQishan Created.
*
**/
int createChannel(int portNo, TYPE_OF_CHANNEL type)
{
    int  result = SENDTOM803xxOK;
    int chanType;

    if (T38_FAX_CHAN == type)
    {
        gpT38FaxParameter[portNo]->bearerInformation = CODER_TYPE_T38;
        chanType = 0x007;    /*switch to T38 FAX Mode*/
    }
    else if(VOICE_CHAN == type)
    {
        chanType = 0x0002;  /*switch to voice Mode*/
    }
    else
        return (ERROR_ARGUMENT);
    
    result = sendSuperMsg( CMD_CREATE_CHAN | 0xFF, (UINT16)chanType, (m_port[portNo].Channel)%PORTS_OF_CHIP,0, (UINT8)portNo);
    if (SENDTOM803xxOK == result)
    {
        if (T38_FAX_CHAN == type)
        {
            /*通道切换成功后,要使能通道*/
            if (SENDTOM803xxOK == result)
                OpenChannel((UINT8)portNo, 1);
            else
                printf("createChannel: set FAX operation is failed!\n");
        }
    }
    else
        printf("createChannel: create Chan is failed!\n");
    
    if (SENDTOM803xxOK != result)
        printf("createChannel: open chan is failed!\n");
    return(result);

}

/*-----------------------------
* sendMsgForChangeChanType - 切换通道的类型(T.38 FAX or Voice)
*
* Description:
* 
* Argument:
* Argument     : msg   -- Message ID of Message                        
*                p0    -- Parameter 1 of Messge                        
*                p1    -- Parameter 2 of Message                      
*                p2    -- Parameter 3 of Message                       
*                PortNo -- No. Of The Specified Port                   
*
* 说明:
*   以前的驱动代码以portNo为参数,它们之间的关系是: portNo = (slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
* Return:
*    
* Modified history
*------------------------------
* 2006-3-18 10:13 ZhengaQishan Created.
*
**/
int sendSuperMsg(UINT16 msg, UINT16 p0, UINT16 p1, UINT16 p2, UINT8 portNo)
{
    UINT16 put, *TxBoxBase;
    int  Return_Flag = SENDTOM803xxOK;
    
    #if SEM_FLAG
    semTake(M803xxQueueSem[portNo/8], WAIT_FOREVER);
    #endif
    put = m_OpenChannelMailboxQueue[portNo].QPut;

    if(m_OpenChannelMailboxQueue[portNo].QCount < m_OpenChannelMailboxQueue[portNo].QSize)
    {
        TxBoxBase = (UINT16 *)m_OpenChannelMailboxQueue[portNo].QAddr;

        TxBoxBase[put++] = p2;
        TxBoxBase[put++] = p1;
        TxBoxBase[put++] = p0;
        TxBoxBase[put++] = msg;
        if(M80320_Debug[portNo] == 1)
            M80320_PRINTF("channel %d change mode!\n\n",p0);

        /*超过总长,就清0,此队列的消息必须4bytes对齐*/
        if (put >= m_OpenChannelMailboxQueue[portNo].QSize)
            put = 0;

        m_OpenChannelMailboxQueue[portNo].QPut = put;
        m_OpenChannelMailboxQueue[portNo].QCount += 4;
        
        if((M80320_OpenChanMsgFlag == 1) && (drv_DebugPortNo == portNo))
            printf("PortNo(%d) (Snd) Msg: 0x%-8x  P0: 0x%-8x, P1: 0x%-8x, P2: 0x%-8x\n", portNo, msg, p0, p1, p2);

        if((m_port[portNo].tx_cmd_requested == 1)&&
           (PinStatus[CON_TO_DP[m_port[portNo].Channel].chip] == TRUE)&&
           (m_port[portNo].Ackok == 1))
        {
            if(SendFlag[portNo] == 0)
            {
                SendFlag[portNo] = 1;
                if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)(CON_TO_DP[m_port[portNo].Channel].chip)&0xff,0,(int)portNo,0,0))
                {
                    if(M80320_Debug[portNo] == 1)
                        M80320_PRINTF("Port %d JobAdd Err\n", m_port[portNo].Channel);
                }
            }
            else
            {
                if(M80320_Debug[portNo] == 1)
                    M80320_PRINTF("SendMsgToOpenChannelQueue: SendFlag[%d] = 1\n", portNo);
            }
        }
    }
    else
    {
        OpenChanMsgFull[portNo]++;
        printf("PortNo %d is full!\n", portNo);
        Return_Flag = OPEN_QUEUE_FULL;
    }
    #if SEM_FLAG
    semGive(M803xxQueueSem[portNo/8]);
    #endif

    return Return_Flag;
}


/*-----------------------------
* changeChanType - 切换通道的类型(T.38 FAX or Voice)
*
* Description:
* 
* Argument:
*   UINT8 portNo - 等于(slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
*   TYPE_OF_SWITCH type - 改变的类型
*
* 说明:
*   以前的驱动代码以portNo为参数,它们之间的关系是: portNo = (slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
* Return:
*    
* Modified history
*------------------------------
* 2006-3-18 10:13 ZhengaQishan Created.
*
**/
int changeChanType(UINT8 portNo, TYPE_OF_SWITCH type)
{
    UINT16 mode;
    int  result = SENDTOM803xxOK;

    #if 0
    if (((m_port[portNo].ExpectServiceType  == Fax) && (type == SWITCH_TO_T38_FAX)) ||
        ((m_port[portNo].ExpectServiceType  == Voice) && (type == SWITCH_TO_VOICE)))
        return(result);
    #endif
    
    if(m_port[portNo].Active != LFXS_DOWN)
        result = Disable_Channel_Processing(portNo);
    
    switch(type)
    {
        case SWITCH_TO_T38_FAX:
            m_port[portNo].ExpectServiceType = Fax;
            gpT38FaxParameter[portNo]->bearerInformation = CODER_TYPE_T38;  
            mode = 0x0007;
            break;
        case SWITCH_TO_VOICE:
            m_port[portNo].ExpectServiceType = Voice;
            /*切换到语音通道,此参数与用户配置有关*/
            mode = 0x0002;
            break;

⌨️ 快捷键说明

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