📄 ds21q50.c
字号:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "bspcomm.h"
#include "bspspec.h"
#include "DS21Q50.h"
const DS21Q50Reg DS21Q50DefaultReg={
0, /* UCHAR VCR1;*/
0, /* UCHAR VCR2;*/
0, /* UCHAR CRCCR1;*/
0, /* UCHAR CRCCR2;*/
0, /* UCHAR EBCR1;*/
0, /* UCHAR EBCR2;*/
0, /* UCHAR FASCR1;*/
0, /* UCHAR FASCR2;*/
0, /* UCHAR RIR*/
0x00, /* UCHAR SSR;*/
0, /* UCHAR SR1;*/
0, /* UCHAR SR2;*/
0,0,0, /* UCHAR Reserved[3];*/
0, /* UCHAR IDR;*/
0x30, /* UCHAR RCR;*/
0x00, /* UCHAR TCR;*/
0x4e, /* UCHAR CCR1;*/
0x14, /* UCHAR CCR2;*/
0x00, /* UCHAR CCR3;*/
0x00, /* UCHAR CCR4;*/
0x10, /* UCHAR CCR5;*/
0x61, /* UCHAR LICR*/
0x00, /* UCHAR IMR1;*/
0x00, /* UCHAR IMR2;*/
0x09, /* UCHAR OUTAC;*/
0x09, /* UCHAR OUTBC;*/
0x00, /* UCHAR IBOR;*/
0xA7, /* UCHAR SCICR*/
0x00, /* UCHAR TEST2;*/
0x00, /* UCHAR TEST3;*/
0x1b, /* UCHAR TAF;*/
0x40, /* UCHAR TNAF;*/
0x00, /* UCHAR TDS0M;*/
0x00, /* UCHAR TIDR;*/
0x00, /* UCHAR TIR1;*/
0x00, /* UCHAR TIR2;*/
0x00, /* UCHAR TIR3;*/
0x00, /* UCHAR TIR4;*/
0x00, /* UCHAR RAF;*/
0x00, /* UCHAR RNAF;*/
0x00, /* UCHAR RDS0M;*/
0x00, /* UCHAR PCLB1*/
0x00, /* UCHAR PCLB2*/
0x00, /* UCHAR PCLB3*/
0x00, /* UCHAR PCLB4*/
0x00 /* UCHAR TEST1*/
};
void DS21Q50Init(void *pDataBuf,DS21Q50CfgStruct *Cfg)
{
int i;
DS21Q50Reg *pRegMap;
DS21Q50CfgStruct *pCfg=(DS21Q50CfgStruct *)pDataBuf;
memcpy(pCfg,Cfg,sizeof(*Cfg));
pRegMap=(DS21Q50Reg *)(pCfg->BaseAddr);
//for(i=0;i<4000;i++);
memset(pRegMap,0,256);
memcpy(pRegMap,&DS21Q50DefaultReg,sizeof(DS21Q50Reg));
pRegMap->CCR4&=~0x60; /*elastic store reset*/
pRegMap->CCR4|=0x60;
pRegMap->CCR4&=~0x60;
pRegMap->CCR5|=0x10;/*reset line interface*/
for(i=0;i<2000;i++);
pRegMap->CCR5&=~0x10;/*reset line interface*/
for(i=0;i<2000;i++);
/*pRegMap->CCR6|=2;reset RECEIVE ELASTIC STORE*/
if(pCfg->SyncIF)
pRegMap->CCR5|=0x20;
else
pRegMap->CCR5&=~0x20;
}
int DS21Q50GetWarning(void *pDataBuf,void *pParam,int maxlen)
{
UCHAR *pReg;
UCHAR RegContext;
DS21Q50CfgStruct *pCfg=(DS21Q50CfgStruct *)(pDataBuf);
DS21Q50WarningStruct *pp=(DS21Q50WarningStruct *)pParam;
/* RegContext=SRead(&(((DS21Q50Reg *)pRegBase)->SR1)); */
pCfg->Timer++;
RegContext=SRead(&(((DS21Q50Reg *)pCfg->BaseAddr)->SR1));
if(RegContext & 0x02) pp->RCL=1;
else pp->RCL=0;
if(RegContext & 0x01) pp->RLOS=1;
else pp->RLOS=0;
RegContext=SRead(&(((DS21Q50Reg *)pCfg->BaseAddr)->RIR));
/*if(RegContext & 0x80)if(++(pp->TPSlipCnt)>=SLIP_TH)pp->TPSlip=1;*/
/*if(RegContext & 0x40)if(++(pp->TNSlipCnt)>=SLIP_TH)pp->TNSlip=1;*/
if(RegContext & 0x10) ++(pCfg->RPSlipCnt);
if(RegContext & 0x08) ++(pCfg->RNSlipCnt);
pp->RPSlip=0;
pp->RNSlip=0;
if(pCfg->Timer>=WARNINGTIMECNT)
{
/*memset(pp,0,sizeof(DS21Q50WarningStruct));*/
pp->RPSlip=(pCfg->RPSlipCnt)>=SLIP_TH ? 1:0;
pp->RNSlip=(pCfg->RNSlipCnt)>=SLIP_TH ? 1:0;
pCfg->RPSlipCnt=0;
pCfg->RNSlipCnt=0;
pCfg->Timer=0;
}
return SDE_OK;
}
int DS21Q50Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
int res;
DS21Q50Reg *pRegMap;
DS21Q50CfgStruct* pCfg =(DS21Q50CfgStruct *)(pDataBuf);
pRegMap=(DS21Q50Reg *)(pCfg->BaseAddr);
switch(cmd) {
case SDC_REINIT:
DS21Q50Init(pDataBuf,pCfg);
res=SDE_OK;
break;
case SDC_DS21Q50_REMOTE_LOOPBACK:
pRegMap->CCR3 |= 0x80;
res=SDE_OK;
break;
case SDC_DS21Q50_REMOTE_UNLOOPBACK:
pRegMap->CCR3 &= ~0x80;
res=SDE_OK;
break;
case SDC_DS21Q50_LOCAL_LOOPBACK:
pRegMap->CCR3 |= 0x40;
res=SDE_OK;
break;
case SDC_DS21Q50_LOCAL_UNLOOPBACK:
pRegMap->CCR3 &= ~0x40;
res=SDE_OK;
break;
case SDC_DS21Q50_FRAMER_LOOPBACK:
pRegMap->CCR1 |= 0x80;
res=SDE_OK;
break;
case SDC_DS21Q50_FRAMER_UNLOOPBACK:
pRegMap->CCR1 &= ~0x80;
res=SDE_OK;
break;
case SDC_DS21Q50_SETSDH:
pRegMap->CCR5|=0x20;
res=SDE_OK;
break;
case SDC_DS21Q50_UNSETSDH:
pRegMap->CCR5&=~0x20;
res=SDE_OK;
break;
case SDC_DS21Q50_GET_CODE_VILATION_COUNT:
res=pRegMap->VCR1<<8;
res|=pRegMap->VCR2;
break;
case SDC_DS21Q50_GET_CRC_COUNT:
res=(pRegMap->CRCCR1&3)<<8;
res|=pRegMap->CRCCR2;
break;
case SDC_DS21Q50_GET_ERR_COUNT:
res=(pRegMap->EBCR1&3)<<8;
res|=pRegMap->EBCR2;
break;
case SDC_DS21Q50_GET_ID:
res=(pRegMap->IDR)& 0xf;
break;
case SDC_DS21Q50_GETWARNING:
if(maxlen!=sizeof(DS21Q50WarningStruct))
res=SDE_INVALID_ARG;
else
res=DS21Q50GetWarning(pCfg,pParam,maxlen);
break;
default:
res=SDE_UNKNOW_CMD;
}
return res;
}
static UCHAR SRead(UCHAR *pReg)
{
/*SR1,SR2,RIR reading
write-read-write mechanism
*/
UCHAR Reg;
*pReg=0xff;
Reg=*pReg;
*pReg=Reg;
return Reg;
}
UCHAR *DS21Q50BspInit(int DEV, char *FreeMemPtr, DS21Q50CfgStruct *cfg)
{
InstallSD(DEV,NULL,NULL,DS21Q50Cntrl,FreeMemPtr);
DS21Q50Init(FreeMemPtr, cfg);
FreeMemPtr += sizeof(DS21Q50CfgStruct);
memcpy(FreeMemPtr,"*DS21Q50",8);
FreeMemPtr += 8;
return FreeMemPtr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -