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

📄 39vf160.c

📁 通过三星ARM7芯片S3C44B0
💻 C
字号:
//#include "console.h"
//#include "DataType.h"

#define	ROM_BASE	0
#define	CMD_ADDR0	*((volatile unsigned short *)(0x555*2+ROM_BASE))
#define	CMD_ADDR1	*((volatile unsigned short *)(0x2aa*2+ROM_BASE))

static unsigned char state = 0;

void Check_Toggle_Ready (unsigned short  *Dst)
{
        unsigned int Loop = 1;
        unsigned short PreData;
        unsigned short CurrData;
        unsigned long TimeOut = 0;

        PreData = *Dst;
        PreData = PreData & 0x40;
        while ((TimeOut< 0x7FFFFFFF) && (Loop))
        {
            CurrData = *Dst;
            CurrData = CurrData & 0x40;
            if (PreData == CurrData)
                    Loop = 0;   /* ready to exit the while loop */
            PreData = CurrData;
            TimeOut++;
        }
}



void Check_Data_Polling (unsigned short  *Dst,       unsigned short TrueData)
{
        unsigned int Loop = 1;
        unsigned short CurrData;
        unsigned long TimeOut = 0;

        TrueData = TrueData &  0x80;
        while ((TimeOut< 0x7FFFFFFF) && (Loop))
        {
                CurrData = *Dst;
                CurrData = CurrData & 0x80;
                if (TrueData == CurrData)
                        Loop = 0;   /* ready to exit the while loop  */
                TimeOut++;
        }
}


static void CFIQueryExit(void)
{
	CMD_ADDR0 = 0xaa;
	CMD_ADDR1 = 0x55;
	CMD_ADDR0 = 0xf0;
	state &= 0xfc;	
}

static void SWPIDExit(void)
{
	CMD_ADDR0 = 0xf0;
	state &= 0xfc;
}

static void CFIQueryEntry(void)
{
	if(state&1)
	{
		if(state&2)
			SWPIDExit();
		else
			return;
	}
	
	CMD_ADDR0 = 0xaa;
	CMD_ADDR1 = 0x55;
	CMD_ADDR0 = 0x90;
	state |= 1;	
}

static void SWPIDEntry(void)
{
	if(state&1)
	{
		if(state&2)
			return;
		else
			CFIQueryExit();
	}

	CMD_ADDR0 = 0xaa;
	CMD_ADDR1 = 0x55;
	CMD_ADDR0 = 0x90;
	state |= 3;
}

unsigned int GetFlashID(void)
{
	unsigned int i;
	
	SWPIDEntry();
	i  = *(unsigned short *)(0+ROM_BASE);
	i |= (*(unsigned short *)(2+ROM_BASE))<<16;
	SWPIDExit();
	return i;	
}

void GetFlashCFI(unsigned short *DataPtr)
{
	unsigned short i;
	
	CFIQueryEntry();
	for(i = 0x10; i<0x35; DataPtr++, i++)
		*DataPtr = *(unsigned short *)(i*2+ROM_BASE);	
	CFIQueryExit();
}

void ChipErase(void)
{
	if(state&1)
	{
		if(state&2)
			SWPIDExit();
		else
			CFIQueryExit();						
	}
	
	CMD_ADDR0 = 0xaa;
	CMD_ADDR1 = 0x55;
	CMD_ADDR0 = 0x80;
	CMD_ADDR0 = 0xaa;
	CMD_ADDR1 = 0x55;
	CMD_ADDR0 = 0x10;

	while(1)
	{
//		unsigned short i;
//		i = *((volatile unsigned short *)0x6666)&0x40;
//		if(i!=*((volatile unsigned short *)0x6666)&0x40)	//D6 == D6
//			continue;
		if(*((volatile unsigned short *)0x8888)&0x80)	
			break;						//D7 == 1
	}		
}

void SectorErase(unsigned int sector)
{
	if(state&1)
	{
		if(state&2)
			SWPIDExit();
		else
			CFIQueryExit();						
	}
	
	SWPIDExit();
	
	sector += ROM_BASE;	
	
	CMD_ADDR0 = 0xaa;
	CMD_ADDR1 = 0x55;
	CMD_ADDR0 = 0x80;
	CMD_ADDR0 = 0xaa;
	CMD_ADDR1 = 0x55;
	*(volatile unsigned short *)sector = 0x30;

	/*
	while(1)
	{
		unsigned short i;
		i = *((volatile unsigned short *)sector)&0x40;
		if(i!=*((volatile unsigned short *)sector)&0x40)	//D6 == D6
			continue;
			*/
		Check_Toggle_Ready((unsigned short *)sector);
		Check_Data_Polling((unsigned short *)sector, 0xffff);

/*
		if(*((volatile unsigned short *)sector)&0x80)	
			break;								//D7 == 1
	}
	*/
	
//	printf("Erase sector 0x%x	ok\n", sector-ROM_BASE);
//	printf("%x\n", *((unsigned short *)sector));

}

void FlashProg(unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt)
{
	unsigned short i, j;	
	
	ProgStart += ROM_BASE;
	
	for( ; WordCnt; ProgStart+=2, DataPtr++, WordCnt--)
	{	
		j = *DataPtr;
		CMD_ADDR0 = 0xaa;
		CMD_ADDR1 = 0x55;
		CMD_ADDR0 = 0xa0;
		*(volatile unsigned short *)ProgStart = j;	

		Check_Toggle_Ready((unsigned short *)ProgStart);
		Check_Data_Polling((unsigned short *)ProgStart, j);

		/*
		while(1)
		{
			i = *(volatile unsigned short *)ProgStart&0x40;
			if(i!=*(volatile unsigned short *)ProgStart&0x40)		//D6 == D6
				continue;
			if((*(volatile unsigned short *)ProgStart&0x80)==(j&0x80))	
				break;					//D7 == D7
		}
		*/
		
		if (*(unsigned short *)ProgStart != *DataPtr)
		{
			while(1);
		}
//			printf("Verify error!");
	}
	
}

void FlashRead(unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size)
{
	int i;
	
	ReadStart += ROM_BASE;
	
	for(i=0; i<Size/2; i++)
		*(DataPtr+i) = *((unsigned short *)ReadStart+i);	
	
}

int SectorProg(unsigned int begin, unsigned short *data, unsigned int size)
{		
	unsigned int tmp = 0x10000-(begin&0xffff);
	//printf("size = %x\n", size);
	
	if(tmp>size)
		tmp = size;
	
	//printf("tmp = %x\n", tmp);
	for(; size;)
	{	
		SectorErase(begin&0xffff0000);	//4K Bytes boudary		
		FlashProg(begin, data, tmp/2);
//		puts("Program ok\n");
		
		size  -= tmp;
		begin += tmp;
		data  += tmp/2;
		tmp = (size>0x10000)?0x10000:size;
//		printf("size = %x, begin = %x, tmp = %x\n", size, begin, tmp);				
	}
	return 0;			
}

⌨️ 快捷键说明

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