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