?? mt90826cmm.c
字號:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "mt8980.h"
#include "bspspec.h"
#include "mt90826cmm.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)
{
int 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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;
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;
return SDE_OK;
}
static int DisableTs(MT90826CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
int 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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;
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;
MT90826_CR(pCfg->BaseAddr,MT90826_CR_REG)|=pCfg->DataRate;
/*add for cmm */
MT90826_CR(pCfg->BaseAddr,MT90826_DOS0_REG)=pCfg->Dos0;
MT90826_CR(pCfg->BaseAddr,MT90826_DOS1_REG)=pCfg->Dos1;
MT90826_CR(pCfg->BaseAddr,MT90826_DOS2_REG)=pCfg->Dos2;
MT90826_CR(pCfg->BaseAddr,MT90826_DOS3_REG)=pCfg->Dos3;
MT90826_CR(pCfg->BaseAddr,MT90826_DOS4_REG)=pCfg->Dos4;
MT90826_CR(pCfg->BaseAddr,MT90826_DOS5_REG)=pCfg->Dos5;
MT90826_CR(pCfg->BaseAddr,MT90826_DOS6_REG)=pCfg->Dos6;
MT90826_CR(pCfg->BaseAddr,MT90826_DOS7_REG)=pCfg->Dos7;
for (i=0;i<pCfg->DefTsTabEntryNum;i++)
ConfigTs(pCfg, &(cfg->pDefTsTable[i]));
}
static int MT90826ConfigMessageMode(MT90826CfgStruct* pCfg,
MT90826MessageModeStruct *pMsgMode)
{
int 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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;
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)
{
int 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 if(pCfg->DataRate== DATA_RATE_16M)MaxSlotNum=256;
else if(pCfg->DataRate== DATA_RATE_16_8M)MaxSlotNum=256;
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;
}
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_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;
default:
return SDE_UNKNOW_CMD;
}/* end of switch(cmd) */
return SDE_OK;
}
char *MT90826BspInit(int DEV, char *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 + -