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

📄 m803xxint.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*************************************************************************
* Module Name: GAR VOIP                     File Name: M803xxInt.c
* Create Date: 2003/01/22                   Author   : Caowm
* Function   : M803xx Int Functions
* Version    : 1.0
* History    :
* Date        Version  Modifier       Activies
*
*************************************************************************/
#include "vxWorks.h"
#include "ctype.h"
#include "string.h"
#include "sysLib.h"
#include "bootLib.h"
#include "stdio.h"
#include "fioLib.h"
#include "private/vmLibP.h"
#include "taskLib.h"
#include "garlib.h"
#include "inetLib.h"
#include "ioLib.h"
#include "logLib.h"
#include "m803xx.h"
#include "Typedef.h"
#include "RTPMIB.h"
#include "t38Fax.h"
/*#include <protocol/port/vxworks/attache.h>*/

#include MPLIB_H
#include "driver/drvLib/include/drvLib.h"


int VoIP_Call_Printf = 0;
int M80320_Printf = 0;
UINT8 M803xx_Stop_PciReq[64] = {0};
UINT32 BUFNULL = 0;
UINT16 OpenchannelFail = 0;
UINT16 ClosechannelFail =0;
UINT16 totalUp = 0;
UINT16 totalDown = 0;
UINT16 UpCount1 = 0;
UINT16 UpCount2 = 0;
UINT16 UpCount3 = 0;
UINT16 DownCount1 = 0;
UINT16 DownCount2 = 0;
UINT8 Send_Flag[M803XX_MAX_PORT_NUM * MAX_PIN_NUM] = {0};
UINT8 M80320_Loop_Call = 0;
UINT32 M80320_DataReq_Num[64] = {0};
UINT32 M80320_PciReq_Num[64] = {0};
UINT32 M80320_PciEOF_Num[64] = {0};
UINT32 M80320_PciDATA_Num[64] = {0};
UINT32 Host_PciEOF_Num[64] = {0};
UINT32 M80320_PciERR_Num[64] = {0};
UINT32 M80320_PciDONE_Num[64] = {0};
UINT32 M80320_ReDataReq_Num[64] ={0};
UINT8 M803xx_Open_Channel_Flag[64] = {0};
UINT32 RXFIFO_FULL = 0;

UINT32 M80320_CmdReq_Num[64] = {0};
UINT32 Host_CmdReq_Num = 0;
UINT32 Tx_Interrupt_Num[8] = {0};
UINT32 Tx_Cmd_Num[8] = {0};
UINT32 Tx_Data_Num[8] = {0};
UINT32 Tx_Req_Num[8] = {0};
UINT32 Tx_Other_Num[8] = {0};

UINT32 Rx_Other_Num[8] = {0};
int  M80320_OpenChanMsgFlag = 0;
int  drv_DebugPortNo = 0x100;

extern UINT8  Command_Ack[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern UINT8  M80320_Debug[64];
UINT32 OpenChanMsgFull[64] = {0};
extern SEM_ID M803xxOprSem[MAX_PIN_NUM];

/* local defines */
extern void * sysPhysToPci ( void * PhysAddr );
extern void * sysPciToPhys ( void * PciAddr );
extern void * sysVirtToPhys(void *virtAddr);
extern void * sysPhysToVirt(void *physAddr);
extern void*  endPktAlloc();
extern void   endPktFree(char* buff );
extern STATUS b_pciUnitIntEnable(UINT8 pciUnit);
extern STATUS b_pciUnitIntConnect(UINT8 pciUnit,VOIDFUNCPTR routine,int para);
extern STATUS b_pciIntDisable(UINT8 pciIntNum);

extern UINT16 RemainedTxCmdNum[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern M803xx_PORT_STATE m_port[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern CHANNEL m_channel[PORTS_OF_CHIP * MAX_PIN_NUM];
extern UINT32 PCIM803xx_BASEADDR[MAX_PIN_NUM];
void * PciReadBuf[PORTS_OF_CHIP * MAX_PIN_NUM];
void * M803xxSendBuf[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern SEM_ID M803xxQueueSem[8];
UINT32 M80320_ReCmdReq_Num[64] = {0};

UINT16 RtcpPkt[MAX_PIN_NUM][64];
extern BOOL PinStatus[MAX_PIN_NUM];
extern M80320_QUEUE m_txmbox[MAX_PIN_NUM];
extern M803xx_PORT CON_TO_DP[PORTS_OF_CHIP * MAX_PIN_NUM];
extern M80320_QUEUE m_OpenChannelMailboxQueue[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern M80320_QUEUE m_TxDataQueue[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern MBOX_PACKET Receive_Message[MAX_PIN_NUM][MAX_RX_MSG_NUM];
UINT16 Receive_Message_Num[MAX_PIN_NUM] = {0};
extern PortStatusParameter  Parameter[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern unsigned long Swap_DwordM( unsigned long in );

extern RtpSessionValue  RtpValue[MAX_CID_NUM];
extern unsigned long    RecordRTPTimeStamp[MAX_CID_NUM];
UINT8  SendFlag[64] = {0};

UINT8 ChannelWorkStatus[M803XX_MAX_PORT_NUM * MAX_PIN_NUM]; /* LFXS_DOWN MODE, LFXS_UP MODE */
gChannelOperateCount   ChannelOperateCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT8 PinPos[MAX_PIN_NUM] = {0};
void SendMBoxMessage(UINT8 PinNo, int flag, UINT8 PP);

UINT32 Rx_Interrupt_Num[MAX_PIN_NUM] = {0};
int Real_Interrupt_Num[8] = {0};

void initChannelOperateCount(UINT8 slotNum)
{
	if (slotNum > MAX_PIN_NUM)
	{
		return;
	}
	memset(&(ChannelOperateCount[slotNum -1]),0,sizeof(gChannelOperateCount) * M803XX_MAX_PORT_NUM);
}

void voip_driver_check_qos_dscp(UINT32 *dscp)
{
    UINT32 TOS;

    TOS = *dscp;

    if(TOS > VOIP_DRIVER_IP_PRECEDENCE_MAX)
    {
        TOS = VOIP_DRIVER_IP_PRECEDENCE_DEFAULT;
    }
    if((TOS > 0)&&(TOS < 7))
    {
        TOS = (TOS << 3)& 0x3f;
    }

    *(UINT32 *)dscp = TOS;
}

/***********************************************************************
* Function name: ReceiveData                                            
* Description  : Receive RTP/UDP/IP Packet From M803xx                  
* Return type  : void                                                   
* Argument     : PortPtr  -- Port Status                                
*                PortNo   -- No. Of The M803xx Port                     
*                Len      -- Length Of The Data                         
*                Addr     -- Base Address of the M803xx                 
*                Eof      --                                            
* Author/Date  : Cao WanMing/2003-1-22                                  
* Note:                                                                 
*
* Modified History 
*------------------------------
* 2006-3-23 17:03 ZhengQishan, 修改收包处理流程
*                                                                      
*************************************************************************/
LOCAL void ReceiveData(M803xx_PORT_STATE *PortPtr, UINT8 PortNo, UINT16 Len, UINT32 Addr, UINT8 Eof)
{
    #if 1
    UINT16 ipPktLen;
    UINT16 udpPktLen;
    #else
    ipaddr_t Ipaddr[2];
    UINT8    i;
    UINT16   UdpPort[2];
    UINT32   TOS;
    #endif
    UINT32 rxBufAddrH,rxBufAddrL;
    UINT32 *bufAddr,*buf;
    UINT32 Port;
    VOIP_MUX_STRUCT Msg;
    void *tempAddr;
    TRTPHeader* pRTPHdr;
    UINT8   *ip_hdrTemp = NULL;
#if 0
    UINT8   *udp_hdr;
#endif

    #if 0 
    for(i=0; i<MAX_IP_ADDR_LEN; i++)
    {
        Ipaddr[0].addr[i] = Parameter[PortNo].localRtpAddress.ipAddr.addr[i];
        Ipaddr[1].addr[i] = Parameter[PortNo].remoteRtpAddress.ipAddr.addr[i];
    }
    UdpPort[0] = Parameter[PortNo].localRtpAddress.port;
    UdpPort[1] = Parameter[PortNo].remoteRtpAddress.port;
    TOS        = Parameter[PortNo].Tos;
    voip_driver_check_qos_dscp(&TOS);
    #endif
    
    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)||(m_port[PortNo].status == RingGenerateStatus))
    {
        M803xx_ALLOC_PCI_ADDR(bufAddr,tempAddr,buf);
        
        /*如果申请不到缓冲区,将当前缓冲区再给M80320的固件*/
        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;

            /*将当前的缓冲区地址告诉M80320固件*/
            if (MBOX_QUEUE_FULL == QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, PortNo))
            {
                /*如果消息队列满,应该释放缓冲区*/
                printf("Cannot put endBuf into M80320!\n");
            }
            
            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;

        /*将新的缓冲区地址告诉M80320固件*/
        if (MBOX_QUEUE_FULL == QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, PortNo))
        {
            /*如果消息队列满,应该释放缓冲区*/
            printf("Cannot put endBuf into M80320!\n");
        }

        /*取出当前接收数据的缓冲区地址*/
        tempAddr   = PciReadBuf[m_port[PortNo].Channel];

        /*将新的缓冲地址记录下来,以便下次收包使用*/
        PciReadBuf[m_port[PortNo].Channel] = bufAddr;
    }
    else
    {
        M803xx_Stop_PciReq[PortNo] = 1;
        semGive(M803xxQueueSem[PortNo/8]);
        return;
    }
    semGive(M803xxQueueSem[PortNo/8]);
    
    if (m_port[PortNo].status == RingGenerateStatus)
    {
        M803xx_ADDR(tempAddr);
        endPktFree((char *)tempAddr);
        return;
    }

    /*将PCI地址转换成本地虚拟地址*/
    M803xx_ADDR(tempAddr);

    /*如果所接收的数据包长度超过缓冲区长度,直接释放然后返回*/
    if (Len > 2000)
    {
        endPktFree((char *)tempAddr);
        return;
    }
    
    RTCPUpdateTxStatistics(PortNo, Len);

    pRTPHdr = (TRTPHeader*)(((UINT8 *)tempAddr)+PACKET_START_SIZE);

    RecordRTPTimeStamp[PortNo] = Swap_DwordM(pRTPHdr->RTPTimeStamp);

    if(m_port[PortNo].VAD == Voice)
    {
        RtpValue[PortNo].Sender_Packets++;
        RtpValue[PortNo].Sender_Octets += (Len - 12);
    }

    #if 0 
    *(UINT32 *)(PciReadBuf[m_port[PortNo].Channel])=Swap_DwordM((0x45000000 | (((TOS & 0x3F) << 18) & 0xfc0000))+(Len+PACKET_START_SIZE));
    *(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+1)=0x00000000;
    *(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+2)=Swap_DwordM(0x7e110000);
    *(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+3)=
                    Swap_DwordM((UINT32)((((UINT32)(Ipaddr[0].addr[0]))<<24)&0xff000000)
                    +(((Ipaddr[0].addr[1])<<16)&0x00ff0000)
                    +(((Ipaddr[0].addr[2])<<8)&0x0000ff00)
                    +((Ipaddr[0].addr[3])&0x000000ff));
    *(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+4)=
                    Swap_DwordM((UINT32)((((UINT32)(Ipaddr[1].addr[0]))<<24)&0xff000000)
                    +(((Ipaddr[1].addr[1])<<16)&0x00ff0000)
                    +(((Ipaddr[1].addr[2])<<8)&0x0000ff00)+
                    ((Ipaddr[1].addr[3])&0x000000ff));
    *(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+5)=
                    Swap_DwordM(((((UINT32)UdpPort[0])<<16)&0xffff0000)+(((UINT32)UdpPort[1])&0x0000ffff));
    *(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+6)=
                    Swap_DwordM(((UINT32)(Len+8)<<16)&0xffff0000);

    ip_hdr = (UINT8 *)PciReadBuf[m_port[PortNo].Channel];
    #else
    ip_hdrTemp = (UINT8 *)tempAddr;
    

⌨️ 快捷键说明

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