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

📄 t38fax.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    faxDebug(dbgClass, gPort, " packet %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", Rtp_Head[0],Rtp_Head[1],Rtp_Head[2],Rtp_Head[3],Rtp_Head[4],Rtp_Head[5],Rtp_Head[6],Rtp_Head[7],Rtp_Head[8],Rtp_Head[9],Rtp_Head[10],Rtp_Head[11]);
}

/*-----------------------------
* receiveT38FaxPkt - T.38 FAX收包处理
*
* Description:
* 
* Argument: 
*                PortPtr  -- Port Status                                
*                portNo   -- No. Of The M803xx Port                     
*                Len      -- Length Of The Data                         
*                Addr     -- Base Address of the M803xx                 
*                Eof      -- 1 - end of frame                                           
* 
* Return:
*    void
*
* Modified history
*------------------------------
* 2006-3-23 15:13 ZhengaQishan Created.
*
**/
void receiveT38FaxPkt(M803xx_PORT_STATE *PortPtr, UINT8 portNo, UINT16 Len, UINT32 Addr, UINT8 Eof)
{
    UINT16 ipPktLen;
    UINT16 udpPktLen;
    /*UINT32 tmpValue;*/
    UINT32 rxBufAddrH,rxBufAddrL;
    UINT32 Port;
    VOIP_MUX_STRUCT Msg;
    UINT32 *bufAddr     = (UINT32 *)NULL;
    UINT32 *buf         = (UINT32 *)NULL;
    UINT32 *tempAddr    = (UINT32 *)NULL;
    TRTPHeader *pRTPHdr = (TRTPHeader*)NULL;
    UINT8   *ip_hdrTemp     = (UINT8 *)NULL;
    UINT8   Rtp_Head[100] , i=0;
    UINT32 gPort;
    int dbgClass = 0;

    memset(Rtp_Head,0,sizeof(Rtp_Head));
    if(m_port[portNo].CallType == LFXS_CALLTYPE_IN)
    {
        dbgClass = /*faxrelaypacket|*/ faxrelaypacketcalled;
    }
    else if(m_port[portNo].CallType == LFXS_CALLTYPE_OUT)
    {
        dbgClass = /*faxrelaypacket |*/ faxrelaypacketcalling;
    }

    gPort = (((UINT32)((CON_TO_DP[m_port[portNo].Channel].chan)+1))<<16)+(UINT32)((CON_TO_DP[m_port[portNo].Channel].chip+1)<<24);  /* 全局端口号 */
    

    if(M80320_Debug[portNo] == 1)
        M80320_PRINTF("port(%d) rcv data %d bytes!\n", portNo, Len);
    
    /* 全局端口号 */
    Port = (((UINT32)((CON_TO_DP[m_port[portNo].Channel].chan) + 1) << 16))+((CON_TO_DP[m_port[portNo].Channel].chip + 1) << 24);  
    semTake(M803xxQueueSem[portNo / 8], WAIT_FOREVER);
    if((m_port[portNo].status == TalkStatus))
    {
        M803xx_ALLOC_PCI_ADDR(bufAddr,tempAddr,buf);
        if (buf == NULL)
        {
            
            rxBufAddrH = ((UINT32)((UINT8 *)PciReadBuf[m_port[portNo].Channel] + PACKET_START_SIZE)) >> 16;
            rxBufAddrL = ((UINT32)((UINT8 *)PciReadBuf[m_port[portNo].Channel] + PACKET_START_SIZE)) & 0x0000ffff;
            
        
            QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, portNo);
            printf("!!!!!!!!!!!!!!M803xx PktAlloc Fail\n");
            BUFNULL++;
            semGive(M803xxQueueSem[portNo / 8]);
            return;
        }
        rxBufAddrH = ((UINT32)((UINT8 *)bufAddr + PACKET_START_SIZE)) >> 16;
        rxBufAddrL = ((UINT32)((UINT8 *)bufAddr + PACKET_START_SIZE)) & 0x0000ffff;

        QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, portNo);
    }
    else
    {
        M803xx_Stop_PciReq[portNo] = 1;
        semGive(M803xxQueueSem[portNo / 8]);
        return;
    }
    semGive(M803xxQueueSem[portNo / 8]);
    
    M803xx_ADDR(PciReadBuf[m_port[portNo].Channel]);

    pRTPHdr = (TRTPHeader*)(((UINT8 *)PciReadBuf[m_port[portNo].Channel]) + PACKET_START_SIZE);

    RecordRTPTimeStamp[portNo] = Swap_DwordM(pRTPHdr->RTPTimeStamp);
    
    ip_hdrTemp = (UINT8 *)PciReadBuf[m_port[portNo].Channel];
    
    /*拷贝IP + UDP头*/
    memcpy(ip_hdrTemp, gpT38FaxParameter[portNo]->t38FaxArg.ipUdpHeader, PACKET_START_SIZE);

    /*insert IP length*/
    ipPktLen = Len + UDP_HEADER_LEN + IPV4_HEADER_LEN;
    *(ip_hdrTemp + IPV4_PKT_LEN_OFFSET) = (ipPktLen >> 8)& 0xFF;
    *(ip_hdrTemp + IPV4_PKT_LEN_OFFSET + 1) = (ipPktLen)& 0xFF;

    /*Inser UDP length*/
    udpPktLen = Len + UDP_HEADER_LEN;
    *(ip_hdrTemp + UDP_PKT_LEN_OFFSET) = (udpPktLen >> 8)& 0xFF;
    *(ip_hdrTemp + UDP_PKT_LEN_OFFSET + 1) = (udpPktLen)& 0xFF;

    #if 0
    SET_IP_HEADER_HEADER_CHECKSUM(ip_hdr, 0);
    SET_IP_HEADER_HEADER_CHECKSUM(ip_hdr, SWAP16(~GLUE_CKSUM(ip_hdr,
                       (GET_IP_HEADER_HEADER_LENGTH(ip_hdr) << 1))));
    #else
    SET_IP_HEADER_HEADER_CHECKSUM (ip_hdrTemp, 0);
    SET_IP_HEADER_HEADER_CHECKSUM (ip_hdrTemp,
                      ROS_HTONS(~GLUE_CKSUM(ip_hdrTemp,(GET_IP_HEADER_HEADER_LENGTH(ip_hdrTemp) << 1))) );
    #endif

    /*暂时不需要校验和*/

    Msg.mestype = RTP_PACKET;   /* 应该是UDPTL包 */
    Msg.portno  = Port;         /* 全局端口号 */
    Msg.msgLen  = ipPktLen;
    Msg.mesptr  = (UINT32 *)PciReadBuf[m_port[portNo].Channel];

    /*add for T.38 fax收包的debug信息*/
    faxDebug(dbgClass, gPort, " Send packet %d bytes!", Len);
    if (Len>100)
    {
        Len = 100;
    }
    for(i=0; i<Len; i++)
    {
        Rtp_Head[i] = (UINT8)(((UINT8 *)PciReadBuf[m_port[portNo].Channel])[UDP_HEADER_LEN+IPV4_HEADER_LEN+i]);
    }
    faxDebug(dbgClass, gPort, " packet %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", Rtp_Head[0],Rtp_Head[1],Rtp_Head[2],Rtp_Head[3],Rtp_Head[4],Rtp_Head[5],Rtp_Head[6],Rtp_Head[7],Rtp_Head[8],Rtp_Head[9],Rtp_Head[10],Rtp_Head[11]);
    /*end add*/
    M803xxMsgProcess((VOIP_MUX_STRUCT *) &Msg);

    semTake(M803xxQueueSem[portNo / 8], WAIT_FOREVER);
    PciReadBuf[m_port[portNo].Channel] = bufAddr;
    semGive(M803xxQueueSem[portNo / 8]);
}

/*-----------------------------
* showFaxSttInfo - 查看T.38 FAX所有统计计数
*
* Description:
* 
* Argument:
*   int slot - 槽位号,取值范围从1 到 8
*   int port - 端口号,取值范围从1 到 8
*
* Modified history
*------------------------------
* 2006-3-15 15:13 ZhengaQishan Created.
*
**/
void Send_T38FaxStatics_Cmd(int slot, int port)
{
    int portNo;
    
    portNo = 8 * (slot - 1) + port - 1;
    
    /*只有当芯片工作在传真模式时才能执行此操作,否则会将芯片状态机搞乱*/
    if (m_port[portNo].VAD != Fax)
    {
        printf("No T.38 FAX mode!\n");
        return;
    }
    semTake(M803xxQueueSem[portNo/8], WAIT_FOREVER);
    #if SendOpenChannelMsgFirst
        if (OK == M80320_checkOpenChanQueue((UINT8)portNo, 0x0, FUN_FINFOIND))
            SendMsgToOpenChannelQueue((UINT16)(CMD_CMDDAT |(port - 1)) , 0xfd00, 0x0100 | CMD_TYPE_FAX_COMBINED_Statics, FUN_FINFOIND, (UINT8)portNo);
        
    #else
        QueueTxBoxMsg(CMD_CMDDAT, 0xfd00, 0x010f, FUN_FINFOIND, portNo);
    #endif
    semGive(M803xxQueueSem[portNo/8]);
}

/*-----------------------------
* showFaxSttInfo - 回显T.38 FAX所有统计计数
*
* Description:
* 
* Argument:
*   portNo   -- No. Of The M803xx Port                     
*   void *pBuf - 统计信息存放的buffer
*
* Modified history
*------------------------------
* 2006-3-15 16:13 ZhengaQishan Created.
*
**/
void showFaxSttInfo(int portNo, void *pBuf)
{
    T38_FAX_STATISTIC *pStt = (T38_FAX_STATISTIC *)pBuf;
    
    if ((void *)NULL == pBuf)
        return;
    printf("portNo = %d\n", portNo);
    
    printf("formatVer         = %d\n", pStt->formatVer);         
    printf("callTimer         = %d\n", pStt->callTimer);         
    printf("currPlayOutDelay  = %d\n", pStt->currPlayOutDelay);  
    printf("minPlayOutDelay   = %d\n", pStt->minPlayOutDelay);   
    printf("maxPlayOutDelay   = %d\n", pStt->maxPlayOutDelay);   
    printf("bufOverFlow       = %d\n", pStt->bufOverFlow);       
    printf("bufUnderFlow      = %d\n", pStt->bufUnderFlow);      
    printf("TxPkt             = %d\n", pStt->TxPkt);             
    printf("TxDuration        = %d\n", pStt->TxDuration);        
    printf("RxPkt             = %d\n", pStt->RxPkt);             
    printf("RxDuration        = %d\n", pStt->RxDuration);        
    printf("TxPage            = %d\n", pStt->TxPage);            
    printf("RxPage            = %d\n", pStt->RxPage);            
    printf("pktOutOfSequence  = %d\n", pStt->pktOutOfSequence);  
    printf("badProtocolHeader = %d\n", pStt->badProtocolHeader); 
    printf("dataPumpMode      = %d\n", pStt->dataPumpMode);      
    printf("rxLevel           = %d\n", pStt->rxLevel);           
    printf("phaseJitter       = %d\n", pStt->phaseJitter);       
    printf("freqOffset        = %d\n", pStt->freqOffset);        
    printf("eyeQualityMonitor = %d\n", pStt->eyeQualityMonitor); 
    printf("pktLossConceament = %d\n", pStt->pktLossConceament);
    printf("TxBytes           = %d\n", pStt->TxBytes);
    printf("RxBytes           = %d\n", pStt->RxBytes);
    printf("hsModulation      = %d\n", pStt->hsModulation);
}


/*==============================DEBUG CODE======================================*/
/*-----------------------------
* showT38FaxCfgArg - 显示T.38 FAX的接口配置参数
*
* Description:
* 
* Argument:
*   int slot - 槽位号,取值范围从1 到 8
*   int port - 端口号,取值范围从1 到 8
*
* Modified history
*------------------------------
* 2006-3-25 16:13 ZhengaQishan Created.
*
**/
void showT38FaxCfgArg(int slot, int port)
{
    int portNo;
    T38_FAX_ARG_T *pFaxOper = (T38_FAX_ARG_T *)NULL;
    
    portNo = 8 * (slot -1) + port - 1;
    
    if ((PortStatusParameter  *)NULL == gpT38FaxParameter[portNo])
    {
        printf (" Slot (%d) Port (%d) is not exist!\n", slot, port);
        return;
    }
    pFaxOper = &(gpT38FaxParameter[portNo]->t38FaxArg.chipArg);

    printf (" Slot(%d) port(%d) T38 FAX Argument(user config):\n\n", slot, port);
    printf (" Address of Arg:              0x%x\n", (UINT32)gpT38FaxParameter[portNo]);
    printf (" bearerInformation:           %d\n", gpT38FaxParameter[portNo]->bearerInformation);
    printf (" FAX mode (0 - T38, 1 - pass through):  %d\n", gpT38FaxParameter[portNo]->faxMode);
    printf (" Packet Loss Concealment:     %d\n (0 - No, 1 - replaced by white lines, 2 - replaced by last good lines)\n", pFaxOper->lossPktConcealment);
    printf (" ECM(0 - allow, 1 - Prevent): %d \n", pFaxOper->ECMFlag);
    printf (" Fax Page Data Redundancy:    %d\n", pFaxOper->redundancyNumOfPageData);
    printf (" T.30 MSG Redundancy:         %d\n", pFaxOper->redundancyNumOfT30Msg);
    printf (" Speed limited:               %d\n", pFaxOper->speed);
    printf (" Error Recovery Method:       %d\n", pFaxOper->errRecoverMethod);
    printf (" TCF procedure(0 - TCF pass across IP network, 1 - no):    %d\n", pFaxOper->tcfPassThroughIpNetwork);
    printf (" FAX signal level:           -%d dBm\n", pFaxOper->level);
    printf (" Src UDP Port No:             %d\n", gpT38FaxParameter[portNo]->localRtpAddress.port);
    printf (" Des UDP Port No:             %d\n", gpT38FaxParameter[portNo]->remoteRtpAddress.port);
    printf (" Src IP address:              %d.%d.%d.%d\n", gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[0],
            gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[1],
            gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[2],
            gpT38FaxParameter[portNo]->localRtpAddress.ipAddr.addr[3]);
    printf (" Des IP address:              %d.%d.%d.%d\n", gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[0],
            gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[1],
            gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[2],
            gpT38FaxParameter[portNo]->remoteRtpAddress.ipAddr.addr[3]);
    printf (" The pointer to IP Header:    0x%x\n", (int)gpT38FaxParameter[portNo]->t38FaxArg.ipUdpHeader);
}

void getVoiceCodecID(int capId, char *pCoderStr)
{
    switch(capId)
    {
        case CODER_TYPE_G711Alaw:
            strcpy(pCoderStr, "G711Alaw");
            break;
        case CODER_TYPE_G711Ulaw:
            strcpy(pCoderStr, "G711Ulaw");
            break;
        case CODER_TYPE_G723:
            strcpy(pCoderStr, "G723");
            break;
        case CODER_TYPE_G728:
            strcpy(pCoderStr, "G728");
            break;
        case CODER_TYPE_G729:
            strcpy(pCoderStr, "G729");
            break;
        case CODER_TYPE_G729a:
            strcpy(pCoderStr, "G729a");
            break;
        case CODER_TYPE_G729wb:
            strcpy(pCoderStr, "G729wb");
            break;
        case CODER_TYPE_G729awb:
            strcpy(pCoderStr, "G729awb");
            break;
        default:
            strcpy(pCoderStr, "Error CodecID");
            break;
    }
}

/*-----------------------------
* showVoiceCfgArg - 显示Voice的接口配置参数
*
* Description:
* 
* Argument:
*   int slot - 槽位号,取值范围从1 到 8
*   int port - 端口号,取值范围从1 到 8
*
* Modified history
*------------------------------
* 2006-4-06 16:13 ZhengaQishan Created.
*
**/
void showVoiceCfgArg(int slot, int port)
{
    int portNo;
    char coderStr[25];
    
    portNo = 8 * (slot -1) + port - 1;
    
    getVoiceCodecID(Parameter[portNo].bearerInformation, coderStr);
    
    printf (" Slot(%d) port(%d) VOICE Argument(user config):\n\n", slot, port);
    printf (" Address of Arg:              0x%x\n", (UINT32)(&Parameter[portNo]));
    printf (" FAX mode (0 - T38, 1 - pass through):  %d\n", Parameter[portNo].faxMode);
    printf (" CODEC Mode:                  %s\n", coderStr);
    printf (" Jitter Value:                %d\n", Parameter[portNo].JitterValue);
    printf (" Src UDP Port No:             %d\n", Parameter[portNo].localRtpAddress.port);
    printf (" Des UDP Port No:             %d\n", Parameter[portNo].remoteRtpAddress.port);
    printf (" Src IP address:              %d.%d.%d.%d\n", Parameter[portNo].localRtpAddress.ipAddr.addr[0],
            Parameter[portNo].localRtpAddress.ipAddr.addr[1],
            Parameter[portNo].localRtpAddress.ipAddr.addr[2],
            Parameter[portNo].localRtpAddress.ipAddr.addr[3]);
    printf (" Des IP address:              %d.%d.%d.%d\n", Parameter[portNo].remoteRtpAddress.ipAddr.addr[0],
            Parameter[portNo].remoteRtpAddress.ipAddr.addr[1],
            Parameter[portNo].remoteRtpAddress.ipAddr.addr[2],
            Parameter[portNo].remoteRtpAddress.ipAddr.addr[3]);
}




⌨️ 快捷键说明

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