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

📄 m803xxint.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    /*拷贝IP + UDP头*/
    memcpy(ip_hdrTemp, Parameter[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;

    #endif

    #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

    #if 0 /*暂时不需要校验和*/
    udp_hdr = PciReadBuf[m_port[PortNo].Channel]+20;

    {
        UINT8 pseudo_hdr[SIZEOF_IP_PSEUDO_HEADER];
        MEMSET(pseudo_hdr, 0, sizeof(pseudo_hdr));
        MEMCPY(PTR_IP_PSEUDO_HEADER_DESTINATION_ADDRESS(pseudo_hdr),
        PTR_IPADDR_BITS(&Ipaddr[1]), SIZEOF_IP_ADDRESS);
        MEMCPY(PTR_IP_PSEUDO_HEADER_SOURCE_ADDRESS(pseudo_hdr),
        PTR_IPADDR_BITS(&Ipaddr[0]), SIZEOF_IP_ADDRESS);
        SET_IP_PSEUDO_HEADER_PROTOCOL(pseudo_hdr, IP_PROTOCOL_is_UDP);
        SET_IP_PSEUDO_HEADER_PAYLOAD_LENGTH(pseudo_hdr, Len + 8);
        SET_UDP_HEADER_CHECKSUM(udp_hdr, SWAP16(GLUE_CKSUM(pseudo_hdr,
              SIZEOF_IP_PSEUDO_HEADER >> 1)));
        SET_UDP_HEADER_CHECKSUM(udp_hdr, SWAP16(~GLUE_CKSUM(udp_hdr,
                            (Len + 8 + 1) >> 1)));
        if (GET_UDP_HEADER_CHECKSUM(udp_hdr) == 0)
              SET_UDP_HEADER_CHECKSUM(udp_hdr, 0xFFFF);
    }

    #endif /*0*/

    Msg.mestype = RTP_PACKET;
    Msg.portno  = Port; /* 全局端口号 */
    Msg.msgLen  = Len+PACKET_START_SIZE;
    Msg.mesptr  = (UINT32 *)tempAddr;
    M803xxMsgProcess((VOIP_MUX_STRUCT *)&Msg);
}

/*-----------------------------
* M80320_checkOpenChanQueue - 检查Open channel队列是否有空闲处理下一个消息
* 
* Argument:
*   UINT8 PortNo - 等于(slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
*   UINT16 msgFIFOLen - 此消息要写入FIFO的字节数
*   UINT16 funID - 要执行的命令的ID号
*
* 说明:
*   
* Return:
*    OK - 有能力处理下一个消息
*    ERROR - 没有能力处理下一个消息
*
* Modified history
*------------------------------
* 2006-6-2 10:13 ZhengaQishan Created.
*
*
*/
STATUS M80320_checkOpenChanQueue(UINT8 PortNo, UINT16 msgFIFOLen, UINT16 funID)
{
    if((RemainedTxCmdNum[PortNo] + (msgFIFOLen + 1) / 2) > MAX_LEN_OF_CMD_FIFO)
    {
        printf("Functin ID: 0x%x, Port %d Add Cmd FIFO is FULL\n", funID, PortNo);
        return ERROR;
    }
    if(m_OpenChannelMailboxQueue[PortNo].QCount >= m_OpenChannelMailboxQueue[PortNo].QSize)
    {
        printf("Functin ID: 0x%x, Port %d Open Channel Mailbox Queue is FULL\n", funID, PortNo);
        OpenChanMsgFull[PortNo]++;
        return ERROR;
    }

    return OK;
}

/*************************************************************************/
/* Function name: SendMsgToOpenChannelQueue                              */
/* Description  : Write Message To The M803xx's Open Channel Queue       */
/* Return type  : void                                                   */
/* 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                    */
/* Author/Date  : Cao WanMing/2003-1-25                                  */
/* Note:                                                                 */
/*                                                                       */
/*************************************************************************/
UINT8 SendMsgToOpenChannelQueue(UINT16 msg, UINT16 p0, UINT16 p1, UINT16 p2, UINT8 PortNo)
{
    UINT16 loop, loopCnt, InCmd;
    UINT16 put, *TxBoxBase;
    UINT8  Return_Flag = SENDTOM803xxOK;

    put = m_OpenChannelMailboxQueue[PortNo].QPut;
    TxBoxBase = (UINT16 *)m_OpenChannelMailboxQueue[PortNo].QAddr;
    TxBoxBase[put++] = p2;
    TxBoxBase[put++] = p1;
    TxBoxBase[put++] = p0;
    TxBoxBase[put++] = msg|((m_port[PortNo].Channel)%PORTS_OF_CHIP);

    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: %04x %04x %04x %04x ", PortNo, msg, p0, p1, p2);
        InCmd = m_port[PortNo].InCmd;

        /*p0 中的消息长度是以字节为单位,FIFO是以双字节存放的*/
        loopCnt = ((p0 & 0xFF) + 1)/2 ; 

        /*FIFO是以环方式存放的*/
        /*InCmd 是数组下标,从0开始,loopCnt是记数器,从1开始*/
        if (InCmd >= (loopCnt -1))
            InCmd -= loopCnt;
        else
            InCmd = MAX_LEN_OF_CMD_FIFO + 2 -loopCnt;
        
        for (loop = 0; loop < loopCnt; loop ++)
        {
            printf("%04x ", m_port[PortNo].tx_cmd_fifo[InCmd]);
            if( ++InCmd >= MAX_LEN_OF_CMD_FIFO)  
                InCmd = 0;
        }
        printf("\n");
    }

    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);
                /* 需要如何处理 */
                ASSERT(0);
                Return_Flag = ADD_FWD_TASK_ERR;
            }
        }
        else
        {
            if(M80320_Debug[PortNo] == 1)
                M80320_PRINTF("SendMsgToOpenChannelQueue: SendFlag[%d] = 1\n", PortNo);
        }
    }

    return Return_Flag;
}

/*************************************************************************/
/* Function name: SendMsgToTxDataQueue                                   */
/* Description  : Write Message To The M803xx's Tx Data Queue            */
/* Return type  : void                                                   */
/* Argument     : Addr   -- Tx Data Addr                                 */
/*                Len    -- Tx Data Len                                  */
/*                PortNo -- No. Of The Specified Port                    */
/* Author/Date  : Cao WanMing/2003-1-25                                  */
/* Note:                                                                 */
/*                                                                       */
/*************************************************************************/
void SendMsgToTxDataQueue(UINT32 Addr, UINT16 Len, UINT8 PortNo, packet * p)
{
    UINT16 put, *TxBoxBase;
    UINT32 txBufAddrH,txBufAddrL;
    UINT32 *tempAddr1 = NULL;
    put = m_TxDataQueue[PortNo].QPut;
    TxBoxBase = (UINT16 *)m_TxDataQueue[PortNo].QAddr;
  
    /*M803xx_PCI_ADDR(((UINT32 *)Addr));*/
    tempAddr1 = (UINT32 *)Addr;
    M803xx_PCI_ADDR(tempAddr1);
    Addr = (UINT32)tempAddr1;
    
    txBufAddrH = (Addr >> 16) & 0xFFFF;
    txBufAddrL = Addr & 0x0000ffff;
    TxBoxBase[put++] = txBufAddrL;
    TxBoxBase[put++] = txBufAddrH;
    TxBoxBase[put++] = Len;
    TxBoxBase[put++] = CMD_PCIEOF|((m_port[PortNo].Channel)%PORTS_OF_CHIP);
    txBufAddrH = (((UINT32)p) >> 16) & 0xFFFF;
    txBufAddrL = ((UINT32)p) & 0x0000ffff;
    TxBoxBase[put++] = txBufAddrL;
    TxBoxBase[put++] = txBufAddrH;

    if (put == m_TxDataQueue[PortNo].QSize)
        put = 0;

    m_TxDataQueue[PortNo].QPut = put;
    m_TxDataQueue[PortNo].QCount += 6;

    if((m_port[PortNo].tx_data_requested != 0)&&(PinStatus[CON_TO_DP[m_port[PortNo].Channel].chip] == TRUE))
    {
        if(SendFlag[PortNo] == 0)
        {
            SendFlag[PortNo] = 1;
            if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)(CON_TO_DP[m_port[PortNo].Channel].chip),0,(int)PortNo,0,0))
            {
                if(M80320_Debug[PortNo] == 1)
                    M80320_PRINTF("Port %d JobAdd Err\n", m_port[PortNo].Channel);
                /* 需要如何处理 */
            }
        }
    }
}

/************************************************************************
* Function name: QueueTxBoxMsg                                          
* Description  : Write Message To The M803xx's Cmd Queue                
* Return type  : void                                                   
* 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 
* Author/Date  : Cao WanMing/2003-1-22                                  
* Note:                                                                 
*                                                                       
*************************************************************************/
UINT8 QueueTxBoxMsg(UINT32 msg, UINT32 p0, UINT32 p1, UINT32 p2, UINT8 PortNo)
{
    UINT16 put;
    UINT16 *TxBoxBase;
    UINT8 PinNo;
    UINT8  Return_Flag = SENDTOM803xxOK;

    #if 0
    if(M80320_Debug[PortNo] == 1)
        M80320_PRINTF("Port %d QueueTxBoxMsg msg = %x, p0 = %x, p1 = %x, p2 = %x\n", PortNo, msg, p0, p1, p2);
    #endif
    PinNo = CON_TO_DP[m_port[PortNo].Channel].chip;

    put = m_txmbox[PinNo].QPut;

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

        TxBoxBase[put++] = p2;
        TxBoxBase[put++] = p1;
        TxBoxBase[put++] = p0;
        TxBoxBase[put++] = msg|((m_port[PortNo].Channel)%PORTS_OF_CHIP);

        if (put == m_txmbox[PinNo].QSize)
            put = 0;

        m_txmbox[PinNo].QPut = put;
        m_txmbox[PinNo].QCount += 4;
    }
    else
    {
        printf("Port %d Message Queue Full, Msg: %x\n", PortNo, msg);
        Return_Flag = MBOX_QUEUE_FULL;
    }

    if(SendFlag[PortNo] == 0)
    {
        SendFlag[PortNo] = 1;
        if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)(PinNo)&0xff,0,(int)PortNo,0,0))
        {
            if(M80320_Debug[PortNo] == 1)
            {
                M80320_PRINTF("JobAdd Err\n");
            }
            /* 需要如何处理 */
        }
    }
	
    return Return_Flag;
}

/*************************************************************************/
/* Function name: Recv_CMD_Result                                        */
/* Description  : After Command Has Been Sent To M803xx, Command Result  */
/*                Can Be Read From Mailbox And Fifo To Check The Command */
/*                Issue Has Succeeded Or Failed.                         */

⌨️ 快捷键说明

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