⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds21q50.c

📁 这是单板上DPRAM的驱动程序
💻 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 + -