?? mt90826.c
字號:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "mt8980.h"
#include "bspspec.h"
#include "mt90826.h"
#define MT90826_CR_REG 0x0
/* #define MT90826_IMS_REG 0x1 */
#define MT90826_FAR_REG 0x1
#define MT90826_DOS0_REG 0x2
#define MT90826_DOS1_REG 0x3
#define MT90826_DOS2_REG 0x4
#define MT90826_DOS3_REG 0x5
#define MT90826_DOS4_REG 0x6
#define MT90826_DOS5_REG 0x7
#define MT90826_DOS6_REG 0x8
#define MT90826_DOS7_REG 0x9
#define MT90826_FOR0_REG 0x0a
#define MT90826_FOR1_REG 0xb
#define MT90826_FOR2_REG 0xc
#define MT90826_FOR3_REG 0xd
#define MT90826_MEMORY_BLOCK_PROGRAM 0x0020
#define MT90826_MS_DATAM 0x0010
#define MT90826_CR(ba,cr) REG16(ba+(cr<<1))
static int ConfigTs(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
UCHAR MaxSlotNum;
unsigned short * ADDR;
unsigned short re_val,input,temp,i; //add by zhou
if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if( pTs->StreamOut>31 || pTs->StreamIn>31
|| pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
return SDE_INVALID_ARG;
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
ADDR = (unsigned short *)(pCfg->BaseAddr+0x4000+((pTs->StreamOut<<8)
+pTs->ChanOut)*2);
*ADDR = 0xA000 + (pTs->StreamIn<<8)+pTs->ChanIn;
//add code here by zhou
//delay
//for(i=0;i<1000;i++)
// {;}
input=0xA000 + (pTs->StreamIn<<8)+pTs->ChanIn;
re_val=*ADDR;
if(re_val==input)
return SDE_OK;
else
return SDE_FAIL;
//END
}
////////////////////////////////////////////////////////////////////////////
/* Following added by zhou*/
static int Check_Connection(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
UCHAR MaxSlotNum;
unsigned short * ADDR;
unsigned short re_val,input,temp,i;
if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if( pTs->StreamOut>31 || pTs->StreamIn>31
|| pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
return SDE_INVALID_ARG;
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
ADDR = (unsigned short *)(pCfg->BaseAddr+0x4000+((pTs->StreamOut<<8)+pTs->ChanOut)*2);
input=0xA000 + (pTs->StreamIn<<8)+pTs->ChanIn;
re_val=*ADDR;
if(re_val==input)
return SDE_OK;
else
return SDE_FAIL;
}
/*above add by zhou 7-6*/
////////////////////////////////////////////////////////////////////////
static int DisableTs(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
UCHAR MaxSlotNum;
unsigned short * ADDR;
if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if( pTs->StreamOut>31 || pTs->StreamIn>31
|| pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
return SDE_INVALID_ARG;
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
ADDR = (unsigned short *)(pCfg->BaseAddr+0x4000+((pTs->StreamOut<<8)
+pTs->ChanOut)*2);
(*ADDR) &= 0xdfff;
return SDE_OK;
}
static void MT90826Init(void *pDataBuf, MT90826CfgStruct *cfg )
{
int i;
unsigned short * ADDR;
MT90826CfgStruct *pCfg = (MT90826CfgStruct *)(pDataBuf);
/*-------------------------<< Initial data >>-------------------------------*/
memmove(pCfg,cfg,sizeof(MT90826CfgStruct));
SetLLDat(&pCfg->Rst,0);
for(i=0;i<12;i++);
SetLLDat(&pCfg->Rst,1);
for(i=0;i<19;i++);
ADDR= (unsigned short *)(pCfg->BaseAddr);
for (i=0;i<18;i++)
*(ADDR+i) = 0x0;
memset(pCfg->BaseAddr+0x4000,0,0x3fff);
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)|=pCfg->DataRate;
for (i=0;i<pCfg->DefTsTabEntryNum;i++)
ConfigTs(pCfg, &(cfg->pDefTsTable[i]));
}
static int MT90826ConfigMessageMode(MT90826CfgStruct* pCfg,
MT90826MessageModeStruct *pMsgMode)
{
UCHAR MaxSlotNum;
unsigned short * ADDR;
if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if((pMsgMode->Stream>31)||(pMsgMode->Chan>MaxSlotNum-1))
return SDE_INVALID_ARG;
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
ADDR = (USHORT *)(pCfg->BaseAddr+0x4000
+((pMsgMode->Stream<<8)+pMsgMode->Chan)*2);
*ADDR = 0x6000 +(USHORT)pMsgMode->Value;
return SDE_OK;
}
static int MT90826CheckMsg(MT90826CfgStruct* pCfg,
MT90826MessageModeStruct *pMsgMode)
{
UCHAR MaxSlotNum;
unsigned short * ADDR;
int i,val1,val2;
if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if((pMsgMode->Stream>31)||(pMsgMode->Chan>MaxSlotNum-1))
return SDE_INVALID_ARG;
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)&=0xffef;
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)|=0x0010;
ADDR = (USHORT *)(pCfg->BaseAddr+0x4000
+((pMsgMode->Stream<<8)+pMsgMode->Chan)*2) ;
val1 = *ADDR;
for(i=0;i<10;i++)
{
val1 = *ADDR;
val2 = *ADDR;
if(val1==val2) break;
}
if(i==10) return SDE_CHK_MSG_FALSE;
pMsgMode->Value=val1;
return SDE_OK;
}
/*FLOW ADD BY MAOLD 2004-2-13*/
static int SETPRBS(MT90826CfgStruct* pCfg,SDCConfigTsStruct *pTs) //set 90826 to bit error test mode and start test
{
int rc;
unsigned short *ADDR;
unsigned short * CMADDR;
unsigned short * BISR;
UCHAR MaxSlotNum;
if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if( pTs->StreamOut>31 || pTs->StreamIn>31
|| pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
return SDE_INVALID_ARG;
// ConfigTs(pCfg, pTs);
//set output StreamNum and ChannelNum and Output Enable
CMADDR = (unsigned short *)(0x30004000 + ((pTs->StreamOut<<8) + pTs->ChanOut)*2);
*CMADDR = 0xe000;
//set input StreamNum and ChannelNum which are set in BISR rigister
BISR = (unsigned short *)(0x30000022);
*BISR = 0x0000+ (pTs->StreamIn<<8) + pTs->ChanIn ;
ADDR = (unsigned short *)(0x30000000); //0x30000000 is 90826_control register CR
*ADDR = *ADDR & 0xF9FF; //bit SBER=0 and bit CBER=0
ADDR = (unsigned short *)(0x30000000);
*ADDR = *ADDR | 0x0600; //bit CBER=1 SBER=1
//CBER(0 TO 1)resets the bit error count register and the internal bit error counter.
//SBER(0 TO 1)initiates the bit error test and enables the internal bit error counter.
ADDR = (unsigned short *)(0x30000000);
*ADDR = *ADDR & 0xfbff; //bit CBER=0 to end clear bit error count
ADDR = (unsigned short *)(0x30000000);
*ADDR = *ADDR | 0x0200; //bit SBER=1 to START TEST
return SDE_OK;
}
int PRBSEC(void) //get the test error count number
{
int val;
unsigned short *ADDR;
ADDR = (unsigned short *)(0x30000000);
*ADDR = *ADDR & 0xfdff; //6 bit SBER=0 :TEST STOP
ADDR = (unsigned short *)(0x30000024); //read the error count number
val = *ADDR;
ADDR = (unsigned short *)(0x30000000); //90826_control register CR
*ADDR = *ADDR | 0x0400; //bit CBER=1
ADDR = (unsigned short *)(0x30000000);
*ADDR = *ADDR & 0xfbff; //CBER=0 to end clear BERR
ADDR = (unsigned short *)(0x30000000);
*ADDR = *ADDR | 0x0200; //bit SBER=1 to START TEST
return val;
}
int STOPPRBS(MT90826CfgStruct* pCfg,SDCConfigTsStruct *pTs) //stop prbs test
{
unsigned short *ADDR;
UCHAR MaxSlotNum;
if(pCfg->DataRate==DATA_RATE_2M)MaxSlotNum=32;
else if(pCfg->DataRate== DATA_RATE_4M)MaxSlotNum=64;
else if(pCfg->DataRate== DATA_RATE_8M)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if( pTs->StreamOut>31 || pTs->StreamIn>31
|| pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
return SDE_INVALID_ARG;
ADDR = (unsigned short *)(0x30000000);
*ADDR = *ADDR & 0xfdff; //6 bit SBER=0 :TEST STOP
ADDR = (unsigned short *)(0x30004000 + ((pTs->StreamOut<<8) + pTs->ChanOut)*2);
*ADDR &= 0x1fff; //clean CM
return SDE_OK;
}
static int MT90826Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
int rc;
MT90826CfgStruct* pCfg =(MT90826CfgStruct *)(pDataBuf);
SDCConfigTsStruct *pTs;
switch(cmd)
{
case SDC_REINIT:
MT90826Init(pDataBuf, pCfg);
break;
case SDC_SET_MTCH:
if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
pTs = (SDCConfigTsStruct *)pParam;
rc=ConfigTs(pCfg, pTs);
return rc;
case SDC_CHK_CONNECT:
if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
pTs = (SDCConfigTsStruct *)pParam;
rc=Check_Connection(pCfg, pTs);
return rc;
case SDC_MESSAGE_MODE:
if(maxlen!=sizeof(MT90826MessageModeStruct))
return SDE_INVALID_ARG;
rc=MT90826ConfigMessageMode(pCfg,(MT90826MessageModeStruct*)pParam);
return rc;
case SDC_CHECK_MSG:
if(maxlen!=sizeof(MT90826MessageModeStruct))
return SDE_INVALID_ARG;
rc=MT90826CheckMsg(pCfg, (MT90826MessageModeStruct *)pParam);
return rc;
case SDC_SET_UNCONNECT:
if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
pTs = (SDCConfigTsStruct *)pParam;
rc=DisableTs(pCfg, pTs);
return rc;
/*flow add by maold 2004-2-13*/
case SDC_PRBS_MODE:
pTs = (SDCConfigTsStruct *)pParam;
rc=SETPRBS(pCfg,pTs);
return rc;
case SDC_PRBSEC_READ:
rc=PRBSEC();
return rc;
case SDC_PRBS_STOP:
pTs = (SDCConfigTsStruct *)pParam;
rc=STOPPRBS(pCfg,pTs);
return rc;
default:
return SDE_UNKNOW_CMD;
}/* end of switch(cmd) */
return SDE_OK;
}
UCHAR *MT90826BspInit(int DEV, UCHAR *FreeMemPtr, MT90826CfgStruct *cfg)
{
MT90826CfgStruct *pCfg;
InstallSD(DEV,NULL,NULL,MT90826Cntrl,FreeMemPtr);
MT90826Init(FreeMemPtr, cfg);
pCfg=(MT90826CfgStruct*)FreeMemPtr;
FreeMemPtr += sizeof(MT90826CfgStruct);
pCfg->pDefTsTable=(SDCConfigTsStruct*)FreeMemPtr;
memcpy(FreeMemPtr,cfg->pDefTsTable,cfg->DefTsTabEntryNum*
sizeof(SDCConfigTsStruct));
FreeMemPtr +=cfg->DefTsTabEntryNum*sizeof(SDCConfigTsStruct);
memcpy(FreeMemPtr,"90826Dat",8);
FreeMemPtr += 8;
return FreeMemPtr;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -