?? initm803xx.c
字號:
/*************************************************************************
* 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 隊列信息,每一全槽位對應(yīng)一個隊列,所以用了一個數(shù)組,目前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 隊列,每一個端口對應(yīng)一個隊列*/
M80320_QUEUE m_OpenChannelMailboxQueue[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
/*發(fā)送數(shù)據(jù)隊列,每一個端口對應(yīng)一個隊列*/
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()
{
/*創(chuàng)建一個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)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -