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

📄 initm803xx.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
* Argument     : 
*     int slot - 物理槽位号,从1-8
*
* Author/Date  : Cao WanMing/2003-1-23                                  
* Note:                                                                 
*                                                                       
*************************************************************************/
LOCAL void InitTxMboxQueue(int slot)
{
    if ((slot < 0) || (slot > MAX_PIN_NUM))
    {
        printf("InitTxMboxQueue: Error slot number!\n");
        return;
    }
    
    m_txmbox[slot - 1].QAddr = (UINT8 *)malloc(2*4*TX_MBOX_QSIZE);

    /*2006-2-25 Added by Zhengqishan*/
    if (NULL == m_txmbox[slot - 1].QAddr)
    {
        printf("InitTxMboxQueue: Cannot malloc memory for TX MailBox!\n");
        taskSuspend(0);
    }
    m_txmbox[slot - 1].QSize = 4 * TX_MBOX_QSIZE;
    m_txmbox[slot - 1].QGet  = 0;
    m_txmbox[slot - 1].QPut  = 0;
    m_txmbox[slot - 1].QCount= 0;
}

void InitPortQueue(UINT8 PortNo)
{
    UINT16 get, *TxBox, Mem[2];
    void *Mem_Addr;

    for(;m_TxDataQueue[PortNo].QCount > 0;)
    {
        TxBox = (UINT16 *)m_TxDataQueue[PortNo].QAddr;
        get = m_TxDataQueue[PortNo].QGet;

        get = get+4;
        Mem[0]=TxBox[get++];
        Mem[1]=TxBox[get++];
        Mem_Addr = (UINT32 *)((((UINT32)(Mem[1]))<<16) + (UINT32)(Mem[0]));
        pkt_free((packet *)Mem_Addr);

        if(get >= m_TxDataQueue[PortNo].QSize)  get = 0;
        m_TxDataQueue[PortNo].QGet = get;
        m_TxDataQueue[PortNo].QCount -= 6;
    }
    m_TxDataQueue[PortNo].QGet  = 0;
    m_TxDataQueue[PortNo].QPut  = 0;
    m_TxDataQueue[PortNo].QCount= 0;

}

void InitOpenChanQueue(UINT8 PortNo)
{
    int i;

    if (PortNo >= (M803XX_MAX_PORT_NUM * MAX_PIN_NUM))
    {
        printf("InitOpenChanQueue: PortNo is error!!\n");
        ASSERT(0);
        return;
    }
    m_OpenChannelMailboxQueue[PortNo].QGet  = 0;
    m_OpenChannelMailboxQueue[PortNo].QPut  = 0;
    m_OpenChannelMailboxQueue[PortNo].QCount= 0;
    RemainedTxCmdNum[PortNo] = 0;
    m_port[PortNo].InCmd = 0;
    m_port[PortNo].OutCmd = 0;
    for(i = 0; i < MAX_LEN_OF_CMD_FIFO; i++)
        m_port[PortNo].tx_cmd_fifo[i] = 0;

}

/*************************************************************************
* Function name: InitM80320Queue                                              
* Description  : Initialize M803xx's Queue                                
* Return type  : void                                                   
*
* Argument     : 
*     int slot - 物理槽位号,从1-8
*
* Author/Date  : Cao WanMing/2003-1-23                                  
* Note:                                                                 
*                                                                       
*************************************************************************/
LOCAL void InitM80320Queue(int slot)
{
    int i,j;

    if ((slot < 0) || (slot > MAX_PIN_NUM))
    {
        printf("InitM80320Queue: Error slot number!\n");
        return;
    }

    j = slot - 1;
    
    for( i = 0; i < M803XX_MAX_PORT_NUM; i++)
    {
        m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QAddr = (unsigned char *)malloc(2*4*TX_MBOX_QSIZE);

        if ((unsigned char *)NULL == m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QAddr)
        {
            printf("InitM80320Queue: Cannot malloc memory for M80320 Open channel Queue!\n");
            ASSERT(0);
        }
        
        m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QSize = 4*TX_MBOX_QSIZE;
        m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QGet  = 0;
        m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QPut  = 0;
        m_OpenChannelMailboxQueue[i+j*M803XX_MAX_PORT_NUM].QCount= 0;

        m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QAddr = (unsigned char *)malloc(2*6*TX_DATA_QSIZE);
        
        if ((unsigned char *)NULL == m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QAddr)
        {
            printf("InitM80320Queue: Cannot malloc memory for M80320 TX data Queue!\n");
            ASSERT(0);
        }
        m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QSize = 6*TX_DATA_QSIZE;
        m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QGet  = 0;
        m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QPut  = 0;
        m_TxDataQueue[i+j*M803XX_MAX_PORT_NUM].QCount= 0;
        Tone_Stop[i+j*M803XX_MAX_PORT_NUM] = 1;
        Command_Ack[i+j*M803XX_MAX_PORT_NUM] = 1;
    }
}

/************************************************************************
* Function name: InitM80320Mport                                              
* Description  : Initialize The m_port Structure                        
* Return type  : void                                                   
*
* Argument     : 
*     int slot - 物理槽位号,从1-8
*
* Author/Date  : Cao WanMing/2003-1-23                                  
* Note:                                                                 
*                                                                       
*************************************************************************/
LOCAL void  InitM80320Mport(int slot)
{
    int i,j;

    if ((slot < 0) || (slot > MAX_PIN_NUM))
    {
        printf("InitM80320Queue: Error slot number!\n");
        return;
    }

    j = slot - 1;
    M803xxQueueSem[j] = semBCreate (SEM_Q_FIFO, SEM_FULL);
    M803xxOprSem[j] = semBCreate(SEM_Q_FIFO,SEM_FULL);
    if ((M803xxQueueSem[j] == NULL) || (M803xxOprSem[j] == NULL))
    {
        printf("M80320 Create Sem Error!\n");
        taskSuspend(0); /*2006-3-18 Added by ZhengQishan*/
    }

    for(i=0; i<PORTS_OF_CHIP; i++)
    {
        m_channel[i+j*PORTS_OF_CHIP].Port = 0xff;
        m_channel[i+j*PORTS_OF_CHIP].Active = FAIL;
        CON_TO_DP[i+j*PORTS_OF_CHIP].chan = 0xff;
        CON_TO_DP[i+j*PORTS_OF_CHIP].chip = j;
    }

    for(i = 0; i < M803XX_MAX_PORT_NUM; i++)
    {
        m_port[i+j*M803XX_MAX_PORT_NUM].Channel        = 0xff;
        m_port[i+j*M803XX_MAX_PORT_NUM].asysynmode     = DM_SYNC;
        m_port[i+j*M803XX_MAX_PORT_NUM].Dtmf_Receive_Flag = 0;
        m_port[i+j*M803XX_MAX_PORT_NUM].Ackok = 1;
        m_port[i+j*M803XX_MAX_PORT_NUM].Slot = i;
        m_port[i+j*M803XX_MAX_PORT_NUM].ReOpenNum = 0;
        m_port[i+j*M803XX_MAX_PORT_NUM].PackLen = 32;  /* G729 */

        m_port[i+j*M803XX_MAX_PORT_NUM].Active = LFXS_DOWN;
        m_port[i+j*M803XX_MAX_PORT_NUM].CallType = LFXS_CALLTYPE_IDLE;
        m_port[i+j*M803XX_MAX_PORT_NUM].status = ErrStatus;
        m_port[i+j*M803XX_MAX_PORT_NUM].VAD    = Voice;
        m_port[i+j*M803XX_MAX_PORT_NUM].OldServiceType = Voice;
        m_port[i+j*M803XX_MAX_PORT_NUM].OldActiveStatus = LFXS_DOWN;
        m_port[i+j*M803XX_MAX_PORT_NUM].ExpectServiceType = Voice;

        m_port[i+j*M803XX_MAX_PORT_NUM].Stop_Tone_Generate_Flag = 0;
        m_port[i+j*M803XX_MAX_PORT_NUM].Tone_Err_Open_flag = 0;
        m_port[i+j*M803XX_MAX_PORT_NUM].Tone_Type_Temp = 0;
            
        m_port[i+j*M803XX_MAX_PORT_NUM].ReceiveRTCPFlag = 0;
        m_port[i+j*M803XX_MAX_PORT_NUM].ReceiveRTPFlag = 0;
        Parameter[i+j*M803XX_MAX_PORT_NUM].echoCancell = 48;         /* ms */
        Parameter[i+j*M803XX_MAX_PORT_NUM].VAD = 1;                  /* User */
        Parameter[i+j*M803XX_MAX_PORT_NUM].Tos = VOIP_DRIVER_IP_PRECEDENCE_DEFAULT;                  /* Tos */
        Parameter[i+j*M803XX_MAX_PORT_NUM].CNG = 0;                  /* No User */
        Parameter[i+j*M803XX_MAX_PORT_NUM].InGainValue = 0;          /* 0 dB */
        Parameter[i+j*M803XX_MAX_PORT_NUM].JitterValue = 20;         /* ms */
        Parameter[i+j*M803XX_MAX_PORT_NUM].bearerInformation = 15;   /* G729 */
        Parameter[i+j*M803XX_MAX_PORT_NUM].frameNum = 0;             /* 1-5 */
        Parameter[i+j*M803XX_MAX_PORT_NUM].DTMF_LEVEL = 300;         /* -30 dB */
        Parameter[i+j*M803XX_MAX_PORT_NUM].OutAttenuationValue = 0;  /* 0 dB */
        Parameter[i+j*M803XX_MAX_PORT_NUM].DTMFSendMode = DTMF_IN_BAND_TRANSFER;

        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[0] = 0xa8;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[1] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[2] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.ipAddr.addr[3] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[0] = 0xa8;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[1] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[2] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.ipAddr.addr[3] = 0x02;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtpAddress.port = 0x437;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtpAddress.port = 0x337;

        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[0] = 0xa8;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[1] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[2] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.ipAddr.addr[3] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[0] = 0xa8;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[1] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[2] = 0x01;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.ipAddr.addr[3] = 0x02;
        Parameter[i+j*M803XX_MAX_PORT_NUM].remoteRtcpAddress.port = 0x438;
        Parameter[i+j*M803XX_MAX_PORT_NUM].localRtcpAddress.port = 0x338;

        InitRTCPInfo((TRTCPInfo *)&RTCPInfo[i+j*M803XX_MAX_PORT_NUM], (i+j*M803XX_MAX_PORT_NUM));
    }
}

LOCAL void Init_Port_Channel(UINT8 PinNo)
{
    int i,j;

    for(i = 0; i< M803XX_MAX_PORT_NUM; i++)
    {
        for(j = 0; j < PORTS_OF_CHIP; j++)
        {
            if(m_channel[j + (PinNo * PORTS_OF_CHIP)].Active == IDLE)
            {
                m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].Channel = j + (PinNo * PORTS_OF_CHIP);
                m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].status  = IdleStatus;
                m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].tx_data_requested = m_channel[j + (PinNo * PORTS_OF_CHIP)].tx_data_requested;
                m_port[i + (PinNo * M803XX_MAX_PORT_NUM)].tx_cmd_requested = m_channel[j + (PinNo * PORTS_OF_CHIP)].tx_cmd_requested;
                CON_TO_DP[j + (PinNo * PORTS_OF_CHIP)].chan = i;
                m_channel[j + (PinNo * PORTS_OF_CHIP)].Port = i + (PinNo * M803XX_MAX_PORT_NUM);
                m_channel[j + (PinNo * PORTS_OF_CHIP)].Active = LFXS_USE;
                j = PORTS_OF_CHIP;
            }
        }
    }
}

void FindM803xxAddr()
{
    int loop, slot;
    int BusNo,DeviceNo,FuncNo;
    UINT32 result;

    for (loop = 0; loop < 8; loop ++)
    {
        BusNo = 0;
        DeviceNo = 0;
        FuncNo  = 0;

        if (OK == pciFindDevice (M803xx_VEN_ID, M803xx_DEV_ID, loop, &BusNo, &DeviceNo, &FuncNo))
        {
            if (OK == b_ifPciIDToUnitNum(BusNo, DeviceNo,(UINT32 *)&slot))
            {
                pciConfigOutWord(BusNo, DeviceNo, 0, PCI_CFG_COMMAND_OFFSET,PCI_CFG_CMD_MEM_ENABLE  |  PCI_CFG_CMD_MASTER_ENABLE );
                pciConfigInLong(BusNo,  DeviceNo, 0, PCI_MEM_BASE_OFFSET,&result);
                result&=PCI_MEM_BASE_MASK;

                #if INSTALL_ON_IXP1200
                    PCIM803xx_BASEADDR[slot-1] = (UINT32)(0x60000000+result);
                #else
                    PCIM803xx_BASEADDR[slot-1] = (UINT32 )(result);
                #endif
            }
        }
        else
        {
            /*向gpDrvCtrl结构添加PCI接口设备不在位信息*/
        }
    }
}

void PowerOnStart(UINT8 unitNum)
{
    int pfile;

    if((unitNum > 8) || (unitNum == 0))
    {
        M80320_PRINTF("unitNum = %d Error\n", unitNum);
        return;
    }

    #if INSTALL_ON_IXP1200
    if(PCIM803xx_BASEADDR[unitNum-1] == 0x60000000)
    {
        return;
    }
    #else
    if(PCIM803xx_BASEADDR[unitNum-1] == 0)
    {
        return;
    }
    #endif

    initChannelOperateCount(unitNum);
    /*2006-3-28  Added by ZhengQishan*/
    if (OK != initT38FaxArgVar(unitNum))
        taskSuspend(0);

    /*ZhengQishan, 把所有全局变量的初始化集中在一起*/
    initGlobalVariableForM80320 ();

    InitTxMboxQueue(unitNum);
    
    InitM80320Queue(unitNum);
    
    InitM80320Mport(unitNum);

    bDmFile = (unsigned char*)malloc(FIRMWARE_MEM_LEN);
    if(bDmFile == NULL)
    {
        printf("firmware not read\n");
        return;
    }
    pfile = open(FIRMWARE_NAME_FILE, O_RDONLY,0);
    read(pfile, (char *)bDmFile, FIRMWARE_MEM_LEN);

    M803xx_Init(unitNum-1, PCIM803xx_BASEADDR[unitNum-1]);
    M803xxPciIntConnect(unitNum);
    close(pfile);
    free(bDmFile);
}


/*-----------------------------
* setPortDefaultArg - 设置语音通道的缺省状态值
*
* Description:
* 
* Argument:
*   int PortNo      - PortNo = (slot - 1) * 8 (每一个槽位最多8个端口) + port - 1
*
* Modified history
*------------------------------
* 2006-6-15 15:13 ZhengaQishan Created.
*
**/
void setPortDefaultArg(int PortNo)
{
    M803xx_PORT_STATE *PortPtr;

    PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
    
    PortPtr->tx_cmd_requested = 1;   /*1 - 初始值(表示命令已经响应,0 - 命令已经发出,还未响应)*/
    PortPtr->Ackok = 1;              /*1 - 初始值(表示命令已经响应,0 - 命令已经发出,还未响应)*/
    PortPtr->tx_data_requested = 1;  /*1 - 初始值(表示命令已经响应,0 - 命令已经发出,还未响应)*/
    PortPtr->status = CIDIdleStatus;
    PortPtr->OldActiveStatus = LFXS_DOWN;
    PortPtr->CID_Send_Len = 0;
    PortPtr->CID_Len = 0;
    PortPtr->RECNum = 0;
    PortPtr->PLAYNum = 0;
}

/*===========================DEBUG CODE==============================*/

void ResetM80320(UINT8 slotNum)
{
    UINT32 Addr;
    unsigned long *Modem_Addr;

    if(slotNum <= 0)return;
    Addr = PCIM803xx_BASEADDR[slotNum -1];

    Modem_Addr=(unsigned long *)(Addr + FIFO_CTR_REG);
    *(Modem_Addr) = Swap_Word(0x4400);

    taskDelay(100);

    Modem_Addr    = (unsigned long *)(Addr + FIFO_STA_REG);
    *(Modem_Addr) = Swap_Word(RESET_MASK);

    taskDelay(100);

    PowerOnStart(slotNum);
}




⌨️ 快捷键说明

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