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

📄 ds21354.c

📁 这是单板上DPRAM的驱动程序
💻 C
字号:
#include <psos.h>
#include "board.h"
#include "sdev.h"
#include "bspcomm.h"
#include "bspspec.h"
#include "ds21354.h"


const DS21x54Reg DS21x54DefaultReg={
	0,/* UCHAR VCR1;*/
	0,/* UCHAR VCR2;*/
	0,/* UCHAR CRCCR1;*/
	0,/* UCHAR CRCCR2;*/
	0,/* UCHAR EBCR1;*/
	0,/* UCHAR EBCR2;*/
	0,/* UCHAR SR1;*/
	0,/* UCHAR SR2;*/
	0,/* UCHAR RIR*/
	0,0,0,0,0,0,/* UCHAR Reserved6[6];*/
	0,/* UCHAR IDR;*/
	0x20,/* UCHAR RCR1;*/
	0x06,/* UCHAR RCR2;*/
	0x00,/* UCHAR TCR1;*/
	0x00,/* UCHAR TCR2;*/
	0x4c,/* UCHAR CCR1;*/
	0x00,/* UCHAR TEST1;*/
	0x00,/* UCHAR IMR1;*/
	0x00,/* UCHAR IMR2;*/
	0x40,/* UCHAR LICR*/
	0x98,/* UCHAR TEST2;*/
	0x14,/* UCHAR CCR2;*/
	0x02,/* UCHAR CCR3;*/
	0x00,/* UCHAR TSaCR;*/
	0x00,/* UCHAR CCR6;*/
	0x00,/* UCHAR SSR;*/
	0x00,/* UCHAR RNAF;*/
	0x1b,/* UCHAR TAF;*/
	0x40,/* UCHAR TNAF;*/
	0x00,/* UCHAR TCBR1;*/
	0x00,/* UCHAR TCBR2;*/
	0x00,/* UCHAR TCBR3;*/
	0x00,/* UCHAR TCBR4;*/
	0x00,/* UCHAR TIR1;*/
	0x00,/* UCHAR TIR2;*/
	0x00,/* UCHAR TIR3;*/
	0x00,/* UCHAR TIR4;*/
	0x00,/* UCHAR TIDR;*/
	0x00,/* UCHAR RCBR1;*/
	0x00,/* UCHAR RCBR2;*/
	0x00,/* UCHAR RCBR3;*/
	0x00,/* UCHAR RCBR4;*/
	0x00,/* UCHAR RAF;*/
	0x00,/* UCHAR RS1;*/
	0x00,/* UCHAR RS2;*/
	0x00,/* UCHAR RS3;*/
	0x00,/* UCHAR RS4;*/
	0x00,/* UCHAR RS5;*/
	0x00,/* UCHAR RS6;*/
	0x00,/* UCHAR RS7;*/
	0x00,/* UCHAR RS8;*/
	0x00,/* UCHAR RS9;*/
	0x00,/* UCHAR RS10;*/
	0x00,/* UCHAR RS11;*/
	0x00,/* UCHAR RS12;*/
	0x00,/* UCHAR RS13;*/
	0x00,/* UCHAR RS14;*/
	0x00,/* UCHAR RS15;*/
	0x00,/* UCHAR RS16;*/
	0x00,/* UCHAR TS1;*/
	0x00,/* UCHAR TS2;*/
	0x00,/* UCHAR TS3;*/
	0x00,/* UCHAR TS4;*/
	0x00,/* UCHAR TS5;*/
	0x00,/* UCHAR TS6;*/
	0x00,/* UCHAR TS7;*/
	0x00,/* UCHAR TS8;*/
	0x00,/* UCHAR TS9;*/
	0x00,/* UCHAR TS10x00;*/
	0x00,/* UCHAR TS11;*/
	0x00,/* UCHAR TS12;*/
	0x00,/* UCHAR TS13;*/
	0x00,/* UCHAR TS14;*/
	0x00,/* UCHAR TS15;*/
	0x00,/* UCHAR TS16;*/
	0x00,/* UCHAR TSiAF;*/
	0x00,/* UCHAR TSiNAF;*/
	0x00,/* UCHAR TRA;*/
	0x00,/* UCHAR TSa4;*/
	0x00,/* UCHAR TSa5;*/
	0x00,/* UCHAR TSa6;*/
	0x00,/* UCHAR TSa7;*/
	0x00,/* UCHAR TSa8;*/
	0x00,/* UCHAR RSiAF;*/
	0x00,/* UCHAR RSiNAF;*/
	0x00,/* UCHAR RRA;*/
	0x00,/* UCHAR RSa4;*/
	0x00,/* UCHAR RSa5;*/
	0x00,/* UCHAR RSa6;*/
	0x00,/* UCHAR RSa7;*/
	0x00,/* UCHAR RSa8;*/
	0x00,/* UCHAR TC1;*/
	0x00,/* UCHAR TC2;*/
	0x00,/* UCHAR TC3;*/
	0x00,/* UCHAR TC4;*/
	0x00,/* UCHAR TC5;*/
	0x00,/* UCHAR TC6;*/
	0x00,/* UCHAR TC7;*/
	0x00,/* UCHAR TC8;*/
	0x00,/* UCHAR TC9;*/
	0x00,/* UCHAR TC10x00;*/
	0x00,/* UCHAR TC11;*/
	0x00,/* UCHAR TC12;*/
	0x00,/* UCHAR TC13;*/
	0x00,/* UCHAR TC14;*/
	0x00,/* UCHAR TC15;*/
	0x00,/* UCHAR TC16;*/
	0x00,/* UCHAR TC17;*/
	0x00,/* UCHAR TC18;*/
	0x00,/* UCHAR TC19;*/
	0x00,/* UCHAR TC20x00;*/
	0x00,/* UCHAR TC21;*/
	0x00,/* UCHAR TC22;*/
	0x00,/* UCHAR TC23;*/
	0x00,/* UCHAR TC24;*/
	0x00,/* UCHAR TC25;*/
	0x00,/* UCHAR TC26;*/
	0x00,/* UCHAR TC27;*/
	0x00,/* UCHAR TC28;*/
	0x00,/* UCHAR TC29;*/
	0x00,/* UCHAR TC30x00;*/
	0x00,/* UCHAR TC31;*/
	0x00,/* UCHAR TC32;*/
	0x00,/* UCHAR RC1;*/
	0x00,/* UCHAR RC2;*/
	0x00,/* UCHAR RC3;*/
	0x00,/* UCHAR RC4;*/
	0x00,/* UCHAR RC5;*/
	0x00,/* UCHAR RC6;*/
	0x00,/* UCHAR RC7;*/
	0x00,/* UCHAR RC8;*/
	0x00,/* UCHAR RC9;*/
	0x00,/* UCHAR RC10x00;*/
	0x00,/* UCHAR RC11;*/
	0x00,/* UCHAR RC12;*/
	0x00,/* UCHAR RC13;*/
	0x00,/* UCHAR RC14;*/
	0x00,/* UCHAR RC15;*/
	0x00,/* UCHAR RC16;*/
	0x00,/* UCHAR RC17;*/
	0x00,/* UCHAR RC18;*/
	0x00,/* UCHAR RC19;*/
	0x00,/* UCHAR RC20x00;*/
	0x00,/* UCHAR RC21;*/
	0x00,/* UCHAR RC22;*/
	0x00,/* UCHAR RC23;*/
	0x00,/* UCHAR RC24;*/
	0x00,/* UCHAR RC25;*/
	0x00,/* UCHAR RC26;*/
	0x00,/* UCHAR RC27;*/
	0x00,/* UCHAR RC28;*/
	0x00,/* UCHAR RC29;*/
	0x00,/* UCHAR RC30x00;*/
	0x00,/* UCHAR RC31;*/
	0x00,/* UCHAR RC32;*/
	0x00,/* UCHAR TCC1;*/
	0x00,/* UCHAR TCC2;*/
	0x00,/* UCHAR TCC3;*/
	0x00,/* UCHAR TCC4;*/
	0x00,/* UCHAR RCC1;*/
	0x00,/* UCHAR RCC2;*/
	0x00,/* UCHAR RCC3;*/
	0x00,/* UCHAR RCC4;*/
	0x00,/* UCHAR CCR4;*/
	0x00,/* UCHAR TDS0M;*/
	0x00,/* UCHAR CCR5;*/
	0x00,/* UCHAR RDS0M;*/
	0,/* UCHAR TEST3;*/
	0x00,0x00,0x00,/* UCHAR Reserved3[3];*/
	0x00,/* UCHAR HCR;*/
	0x00,/* UCHAR HSR;*/
	0x00,/* UCHAR HIMR;*/
	0x00,/* UCHAR RHIR;*/
	0x00,/* UCHAR RHFR;*/
	0x00,/* UCHAR IBO;*/
	0x00,/* UCHAR THIR;*/
	0x00,/* UCHAR THFR;*/
	0x00,/* UCHAR RDC1;*/
	0x00,/* UCHAR RDC2;*/
	0x00,/* UCHAR TDC1;*/
	0x00,/* UCHAR TDC2;*/
	0x00,0x00,0x00,0x00/* UCHAR Reserved4[4];*/
};

void DS21x54Init(void *pDataBuf,DS21x54CfgStruct *Cfg)
{
	int i;
	DS21x54Reg *pRegMap;
	DS21x54CfgStruct *pCfg=(DS21x54CfgStruct *)pDataBuf;
	memcpy(pCfg,Cfg,sizeof(*Cfg));
	pRegMap=(DS21x54Reg *)(pCfg->BaseAddr);
	//for(i=0;i<4000;i++); 
	memset(pRegMap,0,256);
	
	memcpy(pRegMap,&DS21x54DefaultReg,sizeof(DS21x54Reg));
	pRegMap->CCR5&=~0x60;
	pRegMap->CCR5|=0x60;
	pRegMap->CCR5&=~0x60;
	
	pRegMap->CCR5|=0x80;/*reset line interface*/
	for(i=0;i<2000;i++); 
	pRegMap->CCR5&=~0x80;/*reset line interface*/
	for(i=0;i<2000;i++); 
	pRegMap->CCR6|=2;/*reset RECEIVE ELASTIC STORE*/
	if(pCfg->SyncIF)
		pRegMap->CCR6|=0x20;
	else
		pRegMap->CCR6&=~0x20;	
	
} 
int DS21x54GetWarning(void *pDataBuf,void *pParam,int maxlen)
{
	UCHAR *pReg;
	UCHAR RegContext;
	DS21x54CfgStruct *pCfg=(DS21x54CfgStruct *)(pDataBuf);
	DS21x54WarningStruct *pp=(DS21x54WarningStruct *)pParam;
	
	/* RegContext=SRead(&(((DS21x54Reg *)pRegBase)->SR1)); */
		
		pCfg->Timer++;
		RegContext=SRead(&(((DS21x54Reg *)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(&(((DS21x54Reg *)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(DS21x54WarningStruct));*/
		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 DS21x54Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
	int res;
	DS21x54Reg *pRegMap;
	
	DS21x54CfgStruct* pCfg =(DS21x54CfgStruct *)(pDataBuf);
	pRegMap=(DS21x54Reg *)(pCfg->BaseAddr);
	switch(cmd) {
		case SDC_REINIT:
			DS21x54Init(pDataBuf,pCfg);
			res=SDE_OK; 
			break;
		case SDC_DS21x54_REMOTE_LOOPBACK:
            pRegMap->CCR4 |= 0x80;
            res=SDE_OK; 
            break;
        case SDC_DS21x54_REMOTE_UNLOOPBACK:    
        	pRegMap->CCR4 &= ~0x80;       
        	res=SDE_OK;
        	break;
        case SDC_DS21x54_LOCAL_LOOPBACK:
            pRegMap->CCR4 |= 0x40;       
            res=SDE_OK;
        	break;
		case SDC_DS21x54_LOCAL_UNLOOPBACK:
            pRegMap->CCR4 &= ~0x40;       
            res=SDE_OK;
        	break;
		case SDC_DS21x54_FRAMER_LOOPBACK:
            pRegMap->CCR1 |= 0x80;       
            res=SDE_OK;
        	break;
        case SDC_DS21x54_FRAMER_UNLOOPBACK:    
        	pRegMap->CCR1 &= ~0x80;       
        	res=SDE_OK;
        	break;
        case SDC_DS21x54_SETSDH:    
        	pRegMap->CCR6|=0x20;
        	res=SDE_OK;
        	break;
        case SDC_DS21x54_UNSETSDH:
        	pRegMap->CCR6&=~0x20;
        	res=SDE_OK;
        	break;
    	case SDC_DS21x54_GET_CODE_VILATION_COUNT:
    		res=pRegMap->VCR1<<8;
    		res|=pRegMap->VCR2;
    		break;
    	case SDC_DS21x54_GET_CRC_COUNT:
    		res=(pRegMap->CRCCR1&3)<<8;
    		res|=pRegMap->CRCCR2;
    		break;
    	case SDC_DS21x54_GET_ERR_COUNT:
    		res=(pRegMap->EBCR1&3)<<8;
    		res|=pRegMap->EBCR2;
    		break;
    	case SDC_DS21x54_GET_ID:
    		res=(pRegMap->IDR)& 0xf;
    		break;	
    	case SDC_DS21x54_GETWARNING:
    		if(maxlen!=sizeof(DS21x54WarningStruct))
    			res=SDE_INVALID_ARG;
    		else 
    			res=DS21x54GetWarning(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 *DS21x54BspInit(int DEV, char *FreeMemPtr, DS21x54CfgStruct *cfg)
{
    InstallSD(DEV,NULL,NULL,DS21x54Cntrl,FreeMemPtr);
    DS21x54Init(FreeMemPtr, cfg); 
    FreeMemPtr += sizeof(DS21x54CfgStruct);
    memcpy(FreeMemPtr,"*DS21x54",8);
    FreeMemPtr += 8;
    return FreeMemPtr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -