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

📄 sfrreadwriten.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
字号:
/***************************************************************

  NAME: SfrReadWrite
  DESC: To check sfr read/write is possible
  HISTORY:  
  09.19.2007:grmoon
  	- S3C2443 GPIO configuration setup

 ****************************************************************/
#include "System.h"
#include "SfrReadWriten.h"



void RPRINTFn(REGINFOn sReg, unsigned int uPattern, unsigned char uRegStatus, int Nth,unsigned char uInDetail)
{	
	
	if(uInDetail)
		printf("\n%s,0x%X,0x%X,0x%X", sReg.name, sReg.uAddr, uPattern, sReg.rValue);	
	else
	{	
		if(!Nth)	
		printf("\n%s,0x%X\t", sReg.name, sReg.uAddr);
	}
	if(uRegStatus)
	{
		if(uInDetail)
			printf("\t[%d]",Nth);
		else
			printf("%d)",Nth);			
	}
	return;
}

//count = sizeof(sRegInfo)/sizeof(REGINFO)
bool TestSFRn(const REGINFOn* psRegInfo, int count)
{
	volatile unsigned int *pAddr;	
	int i,j,nPattern, nBitMask;
	unsigned int uRegStatus, uWritePatternWithMask, uReadWithMask;	
	REGINFOn sRegInfo;
	unsigned int uRegResetvalue;
	int failnum=0;
	int tempfailnum=0;
	
	
	unsigned int uPatternShitfOneBit[] = 
	{
		0x00000001,		0x00000002,		0x00000004,		0x00000008,		0x00000010,		0x00000020,		0x00000040,		0x00000080,
		0x00000100,		0x00000200,		0x00000400,		0x00000800,		0x00001000,		0x00002000,		0x00004000,		0x00008000,
		0x00010000,		0x00020000,		0x00040000,		0x00080000,		0x00100000,		0x00200000,		0x00400000,		0x00800000,
		0x01000000,		0x02000000,		0x04000000,		0x08000000,		0x10000000,		0x20000000,		0x40000000,		0x80000000,
	};
	
	unsigned int uDefaultBitMask[] =
	{
		0x00000001,		0x00000003,		0x00000007,		0x0000000F,		0x0000001F,		0x0000003F,		0x0000007F,		0x000000FF,
		0x000001FF,		0x000003FF,		0x000007FF,		0x00000FFF,		0x00001FFF,		0x00003FFF,		0x00007FFF,		0x0000FFFF,
		0x0001FFFF,		0x0003FFFF,		0x0007FFFF,		0x000FFFFF,		0x001FFFFF,		0x003FFFFF,		0x007FFFFF,		0x00FFFFFF,
		0x01FFFFFF,		0x03FFFFFF,		0x07FFFFFF,		0x0FFFFFFF,		0x1FFFFFFF,		0x3FFFFFFF,		0x7FFFFFFF,		0xFFFFFFFF,
	};

	//added

	printf("\n\nSFR reset value test entered\n\n");
	for(i=0; i<count; i++)
	{		
		sRegInfo = psRegInfo[i];
	
		pAddr = (unsigned int*)sRegInfo.uAddr;		

		uRegResetvalue = *pAddr;
		if( uRegResetvalue != sRegInfo.uResetValue)
		{
			printf("\n%s reset value -should be: %x, now: %x",sRegInfo.name, sRegInfo.uResetValue, uRegResetvalue);
			failnum++;			
		}
	}
	tempfailnum = failnum;
	if(!tempfailnum) printf("SFR reset test is ok\n");

	//added
	
	printf("\n\nSFR read/write test entered\n\n");	
	for(i=0; i<count; i++)
	{		
		sRegInfo = psRegInfo[i];
	
		pAddr = (unsigned int*)sRegInfo.uAddr;		
		
	
		if(sRegInfo.uFlag == DPDB)
		{		
			if(sRegInfo.uRWType == RW)
			{
				for(j=0; j<= sRegInfo.uBitLen ; j++)
				{			
					uWritePatternWithMask = (uPatternShitfOneBit[j] &uDefaultBitMask[j]);					
					*pAddr = uWritePatternWithMask;					
					
					uReadWithMask = (*pAddr & uDefaultBitMask[j]);	
					sRegInfo.rValue = uReadWithMask;					
					
					uRegStatus = (	uWritePatternWithMask !=uReadWithMask );										
					RPRINTFn(sRegInfo, uPatternShitfOneBit[j], uRegStatus, j, SHOWALL);					
					
					if(uRegStatus) failnum++;
				}
			}
		}		
		else if(sRegInfo.uFlag == DPPB)
		{		
			nPattern = (sizeof(uPatternShitfOneBit)/sizeof(uPatternShitfOneBit[0]));			
			if(sRegInfo.uRWType == RW)
			{
				for(j=0; j<nPattern; j++)
				{
					if(uPatternShitfOneBit[j] & sRegInfo.uPrivateBitMask)
					{
						uWritePatternWithMask = (uPatternShitfOneBit[j] & sRegInfo.uPrivateBitMask);
						*pAddr = uWritePatternWithMask;
						
						uReadWithMask = (*pAddr & sRegInfo.uPrivateBitMask);
						sRegInfo.rValue = uReadWithMask;
						
						uRegStatus = (	uWritePatternWithMask != uReadWithMask );																
						RPRINTFn(sRegInfo, uPatternShitfOneBit[j], uRegStatus, j, SHOWALL);					
						if(uRegStatus) failnum++;
					}
				}
			}			
		}					
	}
	tempfailnum = failnum - tempfailnum;
	if(!tempfailnum) printf("SFR read/write test is ok\n");	
	
	printf("\n\nTest Complete! (failnum: %d)\n\n", failnum);
	printf("if it has too many failnum then check, whether register set by UMON, or the other code\n");
	

	//added
	printf("\n\nSFR reset restore...\n\n");
	for(i=0; i<count; i++)
	{		
		sRegInfo = psRegInfo[i];
	
		pAddr = (unsigned int*)sRegInfo.uAddr;		

		*pAddr = sRegInfo.uResetValue;
	}
	//added
	
	
	if(failnum>0) return 0;
	else return 1;
}

⌨️ 快捷键说明

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