www.pudn.com > LJD2440-II_MON_OK.rar > intel_flash.c


#include "def.h" 
#include "2440lib.h" 
#define	printf	Uart_Printf 
#define	puts	Uart_SendString 
 
 
#include "norflash.h" 
 
//#define	out_l(v, a)	(*(volatile U32 *)(a) = (v)) 
//#define	in_l(a)		(*(volatile U32 *)(a)) 
#define	out_w(v, a)	(*(volatile U16 *)(a) = (v)) 
#define	in_w(a)		(*(volatile U16 *)(a)) 
 
#define	ROM_BASE		0x04000000 
 
static U32 FlashSize; 
 
static void ReadArray(void) 
{ 
	out_w(0x00ff, ROM_BASE); 
} 
 
static void ClrStatus(void) 
{ 
	out_w(0x0050, ROM_BASE); 
} 
 
static int ReadStatus(void) 
{ 
	int ret; 
	 
	out_w(0x0070, ROM_BASE); 
	ret = in_w(ROM_BASE); 
	ReadArray(); 
	return ret; 
} 
/* 
static int GetBlkProtStat(U32 addr) 
{ 
	addr &= ~0x3ffff; 
	out_l(0x00900090, ROM_BASE+addr+8); 
	return in_l(ROM_BASE+addr+8)&0x10001; 
} 
 
static int LockBlk(U32 addr) 
{ 
	int ret; 
	 
	addr &= ~0x3ffff; 
	out_l(0x00600060, ROM_BASE); 
	out_l(0x10001, ROM_BASE+addr); 
	do { 
		ret = ReadStatus(); 
	} while((ret&0x00800080)!=0x00800080); 
	ClrStatus(); 
	 
	printf("Lock Block 0x%x ", addr); 
	if(ret&0x1a) { 
		printf("Fail, status=%x\n", ret); 
		return -1; 
	} 
	puts("OK\n"); 
	return 0; 
} 
*/ 
int UnlockAllBlks(void) 
{ 
	int ret; 
	 
	out_w(0x0060, ROM_BASE); 
	out_w(0x00d0, ROM_BASE); 
	do { 
		ret = ReadStatus(); 
	} while((ret&0x0080)!=0x0080); 
	ClrStatus(); 
	 
	puts("Unprotect All Blocks "); 
	if(ret&0x002a) { 
		printf("Fail, status=%x\n", ret); 
	} 
	puts("OK\n"); 
	return 0; 
} 
 
static int EraseBlk(U32 addr) 
{ 
	int ret; 
	 
	addr &= ~0x1ffff; 
	addr += ROM_BASE; 
	out_w(0x0020, addr); 
	out_w(0x00d0, addr); 
	do { 
		ret = ReadStatus(); 
	} while((ret&0x0080)!=0x0080); 
	ClrStatus(); 
	 
	printf("Erase Block 0x%x ", addr); 
	if(ret&0x006a) { 
		printf("Fail, status=%x\n", ret); 
		return -1;	 
	} 
	puts("OK\n"); 
	return 0; 
} 
 
static int ProgramBlk(U32 addr, U32 src, U32 len) 
{ 
	int ret; 
	U32 i; 
	 
	addr += ROM_BASE; 
	 
/*	for(i=0; i0x20000)?0x20000:len; 
		EraseBlk(addr); 
//		ReadArray(); 
		//printf("data at 0x%x = 0x%x\n", addr, in_w(ROM_BASE+addr)); 
		//printf("data at 0x%x = 0x%x\n", src,  *(U16 *)(src)); 
		if(ProgramBlk(addr, src, prog_len)) 
			break;//return; 
//		ReadArray(); 
		//for(i=0; i