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

📄 initm803xx.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*************************************************************************
* Module Name: GAR VOIP                     File Name: InitM803xx.c
* Create Date: 2003/01/15                   Author   : Caowm
* Function   : Init M803xx
* Version    : 1.0
* History    :
* Date        Version  Modifier       Activies
*
*************************************************************************/
#include "vxWorks.h"
#include "tickLib.h"
#include "drv/pci/pciConfigLib.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 "m803xx.h"
#include "Typedef.h"

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

/* 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 ULONG  tickGet();*/
/*extern STATUS pciConfigInLong   (int busNo, int deviceNo, int funcNo, int address,UINT32 * pData);*/
extern STATUS b_ifPciIDToUnitNum(UINT8 pciBus, UINT8 pciId,UINT32 * pUnitNum);
extern void initChannelOperateCount(UINT8 slotNum);
extern TRTCPInfo  RTCPInfo[MAX_CID_NUM];
#if 0
extern STATUS pciFindDevice(
    int    vendorId,    /* vendor ID */
    int    deviceId,    /* device ID */
    int    index,       /* desired instance of device */
    int *  pBusNo,      /* bus number */
    int *  pDeviceNo,   /* device number */
    int *  pFuncNo      /* function number */
    );
extern STATUS pciConfigOutWord
    (
    int busNo,      /* bus number */
    int deviceNo,   /* device number */
    int funcNo,     /* function number */
    int offset,     /* offset into the configuration space */
    short data      /* data written to the offset */
    );
#endif
extern STATUS initT38FaxArgVar(int slot);

extern int M80320_Printf;

LOCAL void Init_Port_Channel(UINT8 PinNo);

unsigned char *bDmFile;
AIF_HEADER aif_header;
M80320_QUEUE m_txmbox[MAX_PIN_NUM];  /*TX  Mail Box 队列信息,每一全槽位对应一个队列,所以用了一个数组,目前MAX_PIN_NUM 的定义是8*/
MBOX_PACKET Receive_Message[MAX_PIN_NUM][MAX_RX_MSG_NUM];
BOOL PinStatus[MAX_PIN_NUM];

CHANNEL m_channel[PORTS_OF_CHIP * MAX_PIN_NUM];
M803xx_PORT CON_TO_DP[PORTS_OF_CHIP * MAX_PIN_NUM];
UINT32 PCIM803xx_BASEADDR[MAX_PIN_NUM];

extern void * PciReadBuf[PORTS_OF_CHIP * MAX_PIN_NUM];
extern UINT16 RemainedTxCmdNum[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
M803xx_PORT_STATE m_port[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];

/*open channel mail box 队列,每一个端口对应一个队列*/
M80320_QUEUE m_OpenChannelMailboxQueue[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];

/*发送数据队列,每一个端口对应一个队列*/
M80320_QUEUE m_TxDataQueue[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
PortStatusParameter  Parameter[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];

TIMER_ID    VoIP_RTCP_1sTimer = 0;
TIMER_ID    M803xx_RTCP_60sTimer = 0;

UINT8 Pci_Id[8] = {20, 25, 19, 24, 18, 23, 17, 22};
UINT8  Tone_Stop[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT8  Command_Ack[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT8  M80320_Debug[64] = {0};
SEM_ID M803xxQueueSem[MAX_PIN_NUM] = {NULL};
SEM_ID M803xxOprSem[MAX_PIN_NUM];

void M80320_Enable_Printf(UINT8 PortNo)
{
    UINT8 i;
    
    if(PortNo>=64)
    {
        printf("PortNo must < 64\n");
        return;
    }
    if(PortNo == 0)
    {
        for(i=0; i<64; i++)
            M80320_Debug[i] = 1;
    }
    else
        M80320_Debug[PortNo] = 1;
}

void M80320_Disable_Printf(UINT8 PortNo)
{
    UINT8 i;
    
    if(PortNo>=64)
    {
        printf("PortNo must < 64\n");
        return;
    }
    if(PortNo == 0)
    {
        for(i=0; i<64; i++)
            M80320_Debug[i] = 0;
    }
    else
        M80320_Debug[PortNo] = 0;
}

unsigned long Swap_Word( unsigned long in )
{
#if INSTALL_ON_BIG_ENDIAN
    return  ((in&0xff000000)>>24)|((in&0x00ff0000)>>8)|
            ((in&0x0000ff00)<<8 )|((in&0x000000ff)<<24);
#else
    return  (in);
#endif
}

UINT16 Swap_Byte( UINT16 in )
{
#if INSTALL_ON_BIG_ENDIAN
    in=((in&0xff00)>>8)|((in&0x00ff)<<8);
#endif
    return  (in);
}

BOOL VOIP_RTCP_InitScanTimer()
{
    /*创建一个1秒定时器*/
    if (ROS_OK != Ros_CreateTimer(&VoIP_RTCP_1sTimer,
                                  CYCLE_TIMER,
                                  MSG_RTCP_TIMEOUT_1S,
                                  100,
                                  0,
                                  0,
                                  0))
    {
        return FALSE;
    }

    if (ROS_OK != Ros_SetTimer(VoIP_RTCP_1sTimer,
                               10,
                               0))
    {
        Ros_DeleteTimer(VoIP_RTCP_1sTimer);
        return FALSE;
    }
#if 0
    if (ROS_OK != Ros_CreateTimer(&M803xx_RTCP_60sTimer,
                                  CYCLE_TIMER,
                                  MSG_RTCP_TIMEOUT_60S,
                                  100,
                                  0,
                                  0,
                                  0))
    {
        return FALSE;
    }

    if (ROS_OK != Ros_SetTimer(M803xx_RTCP_60sTimer,
                               600,
                               0))
    {
        Ros_DeleteTimer(M803xx_RTCP_60sTimer);
        return FALSE;
    }
#endif
    return TRUE;
   
}

LOCAL void aif_open(PAIF_HEADER paif_header)
{
    unsigned long *FirmWare_File_Header;

    FirmWare_File_Header = (unsigned long *)bDmFile;

    M80320_PRINTF("Open Firmware\n");
    paif_header->bl_decompress_code      =  Swap_Word(*(FirmWare_File_Header+0x00));
    paif_header->bl_self_reloc_code      =  Swap_Word(*(FirmWare_File_Header+0x01));
    paif_header->bl_dbg_int_zeroinit     =  Swap_Word(*(FirmWare_File_Header+0x02));
    paif_header->bl_image_entry_point    =  Swap_Word(*(FirmWare_File_Header+0x03));
    paif_header->program_exit_instr      =  Swap_Word(*(FirmWare_File_Header+0x04));
    paif_header->image_readonly_size     =  Swap_Word(*(FirmWare_File_Header+0x05));
    paif_header->image_readwrite_size    =  Swap_Word(*(FirmWare_File_Header+0x06));
    paif_header->image_debug_size        =  Swap_Word(*(FirmWare_File_Header+0x07));
    paif_header->image_zero_init_size    =  Swap_Word(*(FirmWare_File_Header+0x08));
    paif_header->image_debug_type        =  Swap_Word(*(FirmWare_File_Header+0x09));
    paif_header->image_base              =  Swap_Word(*(FirmWare_File_Header+0x0a));
    paif_header->work_space              =  Swap_Word(*(FirmWare_File_Header+0x0b));
    paif_header->address_mode            =  Swap_Word(*(FirmWare_File_Header+0x0c));
    paif_header->data_base               =  Swap_Word(*(FirmWare_File_Header+0x0d));
    paif_header->first_fat               =  Swap_Word(*(FirmWare_File_Header+0x0e));
    paif_header->reserved2               =  Swap_Word(*(FirmWare_File_Header+0x0f));
    paif_header->debug_init_instr        =  Swap_Word(*(FirmWare_File_Header+0x10));
}

unsigned long ReadFromRegister(unsigned char reg_add,unsigned long Addr)
{
    volatile unsigned long *Modem_Addr,result;

    Modem_Addr    = (volatile unsigned long *)(Addr + reg_add);
    result        = Swap_Word(*(Modem_Addr));
    return result;
}

void WriteToRegister(unsigned char reg_add,unsigned long Addr,unsigned short data)
{
    volatile unsigned long *Modem_Addr;

    Modem_Addr    = (unsigned long *)(Addr + reg_add);
    *(Modem_Addr) = Swap_Word(data);
}

/*************************************************************************/
/* Function name: ReadFromMbox                                           */
/* Description  : Read message From M803xx Mailbox                       */
/* Return type  : BOOL                                                   */
/* Argument     : Msg   -- Pointer to the Message                        */
/*                Addr -- Base Address of M803xx                         */
/* Author/Date  : Cao WanMing/2003-1-16 10:15                            */
/* Note:                                                                 */
/*                                                                       */
/*************************************************************************/
BOOL ReadFromMbox(MBOX_PACKET *Msg,unsigned long Addr)
{
    volatile unsigned long *Modem_Addr;
    UINT32 timeout;

    timeout = tickGet() + 5*sysClkRateGet();  /* 5s */
    while(!(ReadFromRegister(FIFO_STA_REG,Addr) & RXM3I_MASK))
    {
        if (tickGet() > timeout)
        {
            return FALSE;
        }
    }

    Modem_Addr    = (unsigned long *)(Addr + RXMAIL0);
    Msg->p2   = Swap_Word(*(Modem_Addr));
    Modem_Addr    = (unsigned long *)(Addr + RXMAIL1);
    Msg->p1   = Swap_Word(*(Modem_Addr));
    Modem_Addr    = (unsigned long *)(Addr + RXMAIL2);
    Msg->p0   = Swap_Word(*(Modem_Addr));
    Modem_Addr    = (unsigned long *)(Addr + RXMAIL3);
    Msg->message = Swap_Word(*(Modem_Addr));


#if M803xx_INIT_DEBUG
    M80320_PRINTF("READ -- P2: %x;  P1: %x;  P0: %x;  Message: %x\n",Msg->p2,Msg->p1,Msg->p0,Msg->message);
#endif
    WriteToRegister(FIFO_STA_REG, Addr, RXM3IAK_MASK);   /*clean rxmail writen status bit */
    return TRUE;
}

/*************************************************************************/
/* Function name: WriteToMbox                                            */
/* Description  : Write message to the M803xx Mailbox                    */
/* Return type  : BOOL                                                   */
/* Argument     : msg   -- Message ID of Message                         */
/*                p0    -- Parameter 1 of Messge                         */
/*                p1    -- parameter 2 of Message                        */
/*                p2    -- Parameter 3 of Message                        */
/*                Addr -- Base Address of M803xx                         */
/* Author/Date  : Cao WanMing/2003-1-16 10:35                            */
/* Note:                                                                 */
/*                                                                       */
/*************************************************************************/
BOOL WriteToMbox(unsigned long p2,unsigned long p1,unsigned long p0,unsigned long msg,unsigned long Addr)
{
    volatile unsigned long *Modem_Addr;
    unsigned long timeout;

    Modem_Addr    = (unsigned long *)(Addr + TXMAIL0);
    *(Modem_Addr) = Swap_Word(p2);
    Modem_Addr    = (unsigned long *)(Addr + TXMAIL1);
    *(Modem_Addr) = Swap_Word(p1);
    Modem_Addr    = (unsigned long *)(Addr + TXMAIL2);
    *(Modem_Addr) = Swap_Word(p0);
    Modem_Addr    = (unsigned long *)(Addr + TXMAIL3);
    *(Modem_Addr) = Swap_Word(msg);

#if M803xx_INIT_DEBUG
    M80320_PRINTF("WRITE -- P2: %lx;  P1: %lx;  P0: %lx;  Message: %lx\n", p2, p1, p0, msg);
#endif

    timeout = tickGet() + 10*sysClkRateGet();  /* 3s */
    while(!(ReadFromRegister(FIFO_STA_REG, Addr)& TXM3I_MASK))
    {
        if (tickGet() > timeout)
            return FALSE;
    }

    WriteToRegister(FIFO_STA_REG, Addr, TXM3IAK_MASK);    /*clean txmail box full interrupt status bit*/
    return TRUE;
}

LOCAL BOOL M803xx_HandShake(unsigned long Addr)
{
    MBOX_PACKET msg;
    volatile unsigned long FIFOStatus;

    if(!ReadFromMbox(&msg,Addr)) return FALSE;
    if ((msg.p0 != 0x4321)||(msg.p1 != 0x8765)||(msg.p2 != 0xCBA9))
        return FALSE;
    FIFOStatus = Swap_Word(*(unsigned long *)(FIFO_STA_REG + Addr));
    if(FIFOStatus & 0x4000)ReadFromMbox(&msg,Addr);
    if ((msg.p0 != 0x4321)||(msg.p1 != 0x8765)||(msg.p2 != 0xCBA9))
        return FALSE;
    if(!WriteToMbox(0x00,0x00,0x00,0x1300,Addr)) return FALSE;

    return TRUE;
}

/*initial the host_fifo control reg*/
/*RXM3IE TXM3IE PCI BUS MASTER ENABLE*/
LOCAL void  M803xx_DMAFIFO_Enable(unsigned long Addr)
{
    volatile unsigned long *Modem_Addr;

    Modem_Addr=(unsigned long *)(Addr + FIFO_CTR_REG);
    *(Modem_Addr) = Swap_Word(0x741b);/* 0x441b */
    Modem_Addr=(unsigned long *)(Addr + TX_FIFO_THRESHOLD_H);
    *(Modem_Addr) = Swap_Word(0x00c0);
    Modem_Addr=(unsigned long *)(Addr + TX_FIFO_THRESHOLD_L);
    *(Modem_Addr) = Swap_Word(0x00c0);
    Modem_Addr=(unsigned long *)(Addr + RX_FIFO_THRESHOLD_H);
    *(Modem_Addr) = Swap_Word(0x00c0);
    Modem_Addr=(unsigned long *)(Addr + RX_FIFO_THRESHOLD_L);
    *(Modem_Addr) = Swap_Word(0x00c0);
}

LOCAL BOOL M803xx_DeviceInit(unsigned long Addr)
{
    MBOX_PACKET msg;

    /*bem_set_clock = 14 */
    if(!WriteToMbox(0x00,0x00,0x0E,0x0C00,Addr)) return FALSE;
    if(!ReadFromMbox(&msg,Addr)) return FALSE;
    if (msg.message != PCI_BRM_CMD_ACK) return FALSE;

    /*BRM_SET_ARM_CLKMODE=3*/
    if(!WriteToMbox(0x00,0x00,0x03,0x1500,Addr)) return FALSE;
    if(!ReadFromMbox(&msg,Addr)) return FALSE;
    if (msg.message != PCI_BRM_CMD_ACK) return FALSE;

    /*brm_set_sdram_params_1*/
    if(!WriteToMbox(0x0411,0x00EA,0xAE9B,0x0D00,Addr)) return FALSE;
    if(!ReadFromMbox(&msg,Addr)) return FALSE;
    if (msg.message != PCI_BRM_CMD_ACK) return FALSE;

    /*brm_set_sdram_params_2*/
    if(!WriteToMbox(0x00,0x00,0x42,0x0E00,Addr)) return FALSE;
    if(!ReadFromMbox(&msg,Addr)) return FALSE;
    if (msg.message != PCI_BRM_CMD_ACK) return FALSE;

    /*brm_set_cs_params*/
    if(!WriteToMbox(0x0b,0x0200,0x0,0x0F00,Addr)) return FALSE;
    if(!ReadFromMbox(&msg,Addr)) return FALSE;
    if (msg.message != PCI_BRM_CMD_ACK) return FALSE;

    /*brm_enable the ICACHE of arm */
    if(!WriteToMbox(0x00,0x00,0x01,0x1A00,Addr)) return FALSE;
    if(!ReadFromMbox(&msg,Addr)) return FALSE;
    if (msg.message != PCI_BRM_CMD_ACK) return FALSE;

    return TRUE;
}

LOCAL void trans_data_tofifo(unsigned long *pw,unsigned long count,unsigned long CSM_addr)
{
    volatile unsigned long *Modem_Addr,i,j;
    for (i=0;i<count;i=i+4)
    {

⌨️ 快捷键说明

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