📄 mt90820.c
字号:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "mt8980.h"
#include "mt90820.h"
#define MT90820_CR_REG 0x0
#define MT90820_IMS_REG 0x1
#define MT90820_FAR_REG 0x2
#define MT90820_FOR0_REG 0x3
#define MT90820_FOR1_REG 0x4
#define MT90820_FOR2_REG 0x5
#define MT90820_FOR3_REG 0x6
#define MT90820_CR(ba,cr) REG16(ba+(cr<<1))
#define MT90820_CH(ba,ch) REG16(ba +0x100+(ch<<1))
static int ConfigTs(MT90820CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
UCHAR MaxSlotNum;
if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if( pTs->StreamOut>15 || pTs->StreamIn>15
|| pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
return SDE_INVALID_ARG;
MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
=pTs->StreamOut|0x0010;
MT90820_CH(pCfg->BaseAddr,pTs->ChanOut)
=(pTs->StreamIn<<7)|pTs->ChanIn|0x4800;
return SDE_OK;
}
/* Following added by maold */
static int Check_Connection(MT90820CfgStruct* pCfg, SDCConfigTsStruct *pTs)
{
UCHAR MaxSlotNum;
unsigned short * ADDR;
unsigned short re_val,input;
if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if( pTs->StreamOut>15 || pTs->StreamIn>15
|| pTs->ChanOut>MaxSlotNum-1 || pTs->ChanIn>MaxSlotNum-1)
return SDE_INVALID_ARG;
MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
=pTs->StreamOut;
MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
&=0xFFEF;
input= (pTs->StreamIn<<7)+pTs->ChanIn+0x4800;
re_val = MT90820_CH(pCfg->BaseAddr,pTs->ChanOut);
if(re_val==input)
return SDE_OK;
else
return SDE_CONN_CHEK_ERR;
}
static void MT90820Init(void *pDataBuf, MT90820CfgStruct *cfg )
{
volatile ULONG i;
MT90820CfgStruct *pCfg = (MT90820CfgStruct *)(pDataBuf);
/*-------------------------<< Initial data >>-------------------------------*/
memmove(pCfg,cfg,sizeof(MT90820CfgStruct));
/* 配置所有的输出使能有效*/
MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)=MT90820_MEMORY_BLOCK_PROGRAM;
/* LPBK=0,V/C=1,MC=0,CSTo=0,OE=1,BPE=1 */
MT90820_CR(pCfg->BaseAddr,MT90820_IMS_REG)=0x0138|pCfg->DataRate;
for(i=65535;i>0;i--){
if((MT90820_CR(pCfg->BaseAddr,MT90820_IMS_REG)&0x10)==0)break;
}
/*完成一些初始化链路的配置*/
for(i=0; i< pCfg->ValidConfigTsNum;i++)
ConfigTs(pCfg,&(pCfg->ConfigTsTable[i]));
}
static int MT90820ConfigMessageMode(MT90820CfgStruct* pCfg,
MT90820MessageModeStruct *pMsgMode)
{
UCHAR MaxSlotNum;
if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if((pMsgMode->Stream>15)||(pMsgMode->Chan>MaxSlotNum-1))
return SDE_INVALID_ARG;
MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)=(USHORT)pMsgMode->Stream;
MT90820_CH(pCfg->BaseAddr,pMsgMode->Chan)=(USHORT)pMsgMode->Value|0x6800;
return SDE_OK;
}
static int MT90820CheckMsg(MT90820CfgStruct* pCfg,
MT90820MessageModeStruct *pMsgMode)
{
UCHAR MaxSlotNum;
if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if((pMsgMode->Stream>15)||(pMsgMode->Chan>MaxSlotNum-1))
return SDE_INVALID_ARG;
MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
=(USHORT)pMsgMode->Stream|MT90820_MS_DATAM;
if(pMsgMode->Value!=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan))
{
pMsgMode->Value=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan);
return SDE_CHK_MSG_ERR;
}
pMsgMode->Value=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan);
return SDE_OK;
}
static int MT90820GetMsg(MT90820CfgStruct* pCfg,
MT90820MessageModeStruct *pMsgMode)
{
UCHAR MaxSlotNum;
if(pCfg->DataRate==RATE_2M_90820)MaxSlotNum=32;
else if(pCfg->DataRate== RATE_4M_90820)MaxSlotNum=64;
else if(pCfg->DataRate== RATE_8M_90820)MaxSlotNum=128;
else return SDE_INVALID_ARG;
if((pMsgMode->Stream>15)||(pMsgMode->Chan>MaxSlotNum-1))
return SDE_INVALID_ARG;
MT90820_CR(pCfg->BaseAddr,MT90820_CR_REG)
=(USHORT)pMsgMode->Stream|MT90820_MS_DATAM;
pMsgMode->Value=(char)MT90820_CH(pCfg->BaseAddr, pMsgMode->Chan);
return SDE_OK;
}
static int MT90820SetDelay(MT90820CfgStruct* pCfg,
SlotDelayStruct *pDelay)
{
int ForReg;
if(pDelay->Stream<0)
return SDE_INVALID_ARG;
else if(pDelay->Stream<4)
ForReg=MT90820_FOR0_REG;
else if(pDelay->Stream<8)
ForReg=MT90820_FOR1_REG;
else if(pDelay->Stream<12)
ForReg=MT90820_FOR2_REG;
else if(pDelay->Stream<16)
ForReg=MT90820_FOR3_REG;
else
return SDE_INVALID_ARG;
if((pDelay->Delay<0)||(pDelay->Delay>9))
return SDE_INVALID_ARG;
MT90820_CR(pCfg->BaseAddr,ForReg)
&=~(0xF<<((pDelay->Stream%4)*4));
MT90820_CR(pCfg->BaseAddr,ForReg)
|=(pDelay->Delay<<((pDelay->Stream%4)*4));
return SDE_OK;
}
static int MT90820Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
int rc;
MT90820CfgStruct* pCfg =(MT90820CfgStruct *)(pDataBuf);
SDCConfigTsStruct *pTs;
switch(cmd)
{
case SDC_REINIT:
MT90820Init(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(MT90820MessageModeStruct))
return SDE_INVALID_ARG;
rc=MT90820ConfigMessageMode(pCfg,(MT90820MessageModeStruct*)pParam);
return rc;
case SDC_CHECK_MSG:
if(maxlen!=sizeof(MT90820MessageModeStruct))
return SDE_INVALID_ARG;
rc=MT90820CheckMsg(pCfg, (MT90820MessageModeStruct *)pParam);
return rc;
case SDC_GET_MSG:
if(maxlen!=sizeof(MT90820MessageModeStruct))
return SDE_INVALID_ARG;
rc=MT90820GetMsg(pCfg, (MT90820MessageModeStruct *)pParam);
return rc;
case SDC_SET_DELAY:
if(maxlen!=sizeof(SlotDelayStruct))
return SDE_INVALID_ARG;
rc=MT90820SetDelay(pCfg,(SlotDelayStruct*)pParam);
return rc;
case SDC_CHK_CONNECT:
if(maxlen!=sizeof(SDCConfigTsStruct))return SDE_INVALID_ARG;
pTs = (SDCConfigTsStruct *)pParam;
rc=Check_Connection(pCfg, pTs);
return rc;
default:
return SDE_UNKNOW_CMD;
}/* end of switch(cmd) */
return SDE_OK;
}
UCHAR *MT90820BspInit(int DEV, UCHAR *FreeMemPtr, MT90820CfgStruct *cfg)
{
InstallSD(DEV,NULL,NULL,MT90820Cntrl,FreeMemPtr);
MT90820Init(FreeMemPtr, cfg);
FreeMemPtr += sizeof(MT90820CfgStruct);
memcpy(FreeMemPtr,"90820Dat",8);
FreeMemPtr += 8;
return FreeMemPtr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -