📄 intl_flash.c
字号:
#include "../inc/def.h"
#include "../inc/config.h"
#include "../inc/utils.h"
#include "../inc/board.h"
#ifdef INTEL_FLASH_SUPPORT
//#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))
static U32 chip_id;
static U16 support;
static U16 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; i<len; i+=4) {
out_l(0x00400040, addr+i);
out_l(*(U32 *)(src+i), addr+i);
do {
ret = ReadStatus();
} while((ret&0x00800080)!=0x00800080);
ClrStatus();
if(ret&0x1e) {
printf("Program addr 0x%x Fail, status=%x\n", addr, ret);
return -1;
}
}
*/
for(i=0; i<len; i+=32) {
int j;
do {
out_w(0x00e8, addr);
ret = in_w(ROM_BASE);//ReadStatus();
} while((ret&0x0080)!=0x0080);
out_w(0x000f, addr);
for(j=0; j<16; j++)
out_w(*(U16 *)(src+i+j*2), addr+i+j*2);
out_w(0x00d0, addr);
do {
ret = ReadStatus();
} while((ret&0x0080)!=0x0080);
ClrStatus();
if(ret&0x001e) {
printf("Program addr 0x%x Fail, status=%x\n", addr, ret);
return -1;
}
}
ReadArray();
for(i=0; i<len; i+=2)
if(in_w(addr+i)!=*(U16 *)(src+i)) {
printf("Program addr 0x%x Fail, wr=0x%x, rd=0x%x\n", addr+i, *(U16 *)(src+i), in_w(addr+i));
return -1;
}
ret = 0;//LockBlk(addr);
return ret;
}
void NorFlashProg(U32 addr, U32 src, U32 len)
{
U32 prog_len, offset;
U8 dat_buf[128*1024];
if((src&1)||(addr&1)) {
puts("Address Must Be 2Bytes aligned\n");
return;
}
if(!len) {
puts("Write 0 Bytes!\n");
return;
}
if(UnlockAllBlks())
return;
// ReadArray();
for(; len; ) {
offset = addr&(0x20000-1);
prog_len = 0x20000-offset;
if(prog_len>len)
prog_len = len;
if(offset)
memcpy(dat_buf, (void *)((addr+ROM_BASE)&~0x1ffff), offset);
if((prog_len+offset)!=0x20000)
memcpy(dat_buf+offset+prog_len, (void *)(addr+prog_len+ROM_BASE), 0x20000-prog_len-offset);
memcpy(dat_buf+offset, (void *)src, prog_len);
EraseBlk(addr);
// ReadArray();
if(ProgramBlk(addr&~0x1ffff, (U32)dat_buf, 0x20000)) {
break;
}
// ReadArray();
addr += prog_len;
src += prog_len;
len -= prog_len;
}
}
void NorFlashInit(void)
{
U16 id;
support = 0;
out_w(0x0090, ROM_BASE);
chip_id = in_w(ROM_BASE);
if(chip_id!=0x0089)
return;
out_w(0x0090, ROM_BASE+2);
chip_id <<= 16;
chip_id |= in_w(ROM_BASE+2);
ReadArray();
id = chip_id&0xffff;
if(id==0x16) {
FlashSize = 4; //4MBytes
} else if(id==0x17) {
FlashSize = 8; //8MBytes
} else if(id==0x18) {
FlashSize = 16; //16MBytes
} else
return;
support = 1;
}
void NorFlashStatusRep(void)
{
printf("Chip ID is 0x%08x\n", chip_id);
if(!support) {
printf("No supported intel flash found!\n");
return;
}
printf("Intel Flash Found With 16 Bits Bus Width\n");
printf("Total FlashSize = %dMBytes\n", FlashSize);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -