📄 iflashl.c
字号:
#include "def.h"
#include "option.h"
#include <string.h>
#include "k44.h"
#include "k44lib.h"
#include "iflashl.h"
int _ErFlash(int sectorAddr);
#define SMART_OPTION_ADDR (0xe38)
#define PROTECTION_OPTION_ADDR (0xe3c)
// FMUCON
#define OPTION_SECTOR_ERASE (1<<0)
#define NORMAL_SECTOR_ERASE (1<<1)
#define OPTION_SECTOR_PROGRAM (1<<2)
#define NORMAL_SECTOR_PROGRAM (1<<3)
#define PROGRAM_ERASE_START (1<<7)
#define WR_VERIFY_ON (1)
#define ERASE_VERIFY_ON (1)
#define IFLASH_START_ADDR (0x1f00000)
/////////////////////////////////////////////////
//
//LDC protection, H/W protection has to be tested !!!
//
/////////////////////////////////////////////////
// INPUT: start,end= 0~511
int Iflash_EraseSectors(int start,int end)
{
U32 i;
for(i=start;i<=end;i++)
{
if(!_ErFlash(i<<9))return 0;
}
return 1;
}
int _ErFlash(int sectorAddr)
{
int i,j,error=0;
sectorAddr&=0xfffffe00; //FMADDR[8:0] should be 000000000b
rFMACON=0x82; //CPUHOLD 00000b 2clk
//1 00000 10
rFMADDR=sectorAddr;
for(i=0;i<2;i++)
{
rFMKEY0=0x5a;
rFMKEY1=0xa5;
rFMKEY2=0x5a;
rFMKEY3=0xa5;
rFMUCON=NORMAL_SECTOR_ERASE;
rFMUCON=NORMAL_SECTOR_ERASE|PROGRAM_ERASE_START;
//For CPU working during flash program/erase.
//while(rFMICON&PROGRAM_ERASE_START);
if(rFMERR&0x80){rFMERR=0x0;}
else
{
#if (ERASE_VERIFY_ON)
break;
#else
return 1;
#endif
}
if(i==1)return 0;//when 2nd failure of program operation.
}
#if (ERASE_VERIFY_ON)
for(i=0;i<512;i+=4)
{
j=*((U32 *)(sectorAddr+i+IFLASH_START_ADDR));
if(j!=0xffffffff)
{
Uart_Printf("[EE@%x=%x]",sectorAddr+i,j);
error=1;
}
}
if(error==0)return 1;
else return 0;
#endif
}
int Iflash_WrWord(U32 addr,U32 data)
{
U32 i;
addr&=0x3ffff; //addressses,such as 0x1fxxxxxh or xxxxxh,is allowed.
rFMACON=0x82; //CPUHOLD 00000b 2clk
//1 00000 10
rFMADDR=addr;
rFMDATA=data;
for(i=0;i<2;i++)
{
rFMKEY0=0x5a;
rFMKEY1=0xa5;
rFMKEY2=0x5a;
rFMKEY3=0xa5;
rFMUCON=NORMAL_SECTOR_PROGRAM;
rFMUCON=NORMAL_SECTOR_PROGRAM|PROGRAM_ERASE_START;
//For CPU working during flash program/erase.
//while(rFMICON&PROGRAM_ERASE_START);
if(rFMERR&0x80){rFMERR=0x0;}
else
{
#if (WR_VERIFY_ON)
break;
#else
return 1;
#endif
}
if(i==1)return 0;//when 2nd failure of program operation.
}
#if (WR_VERIFY_ON)
i=*((U32 *)(addr+IFLASH_START_ADDR));
if(i!=data)
{
Uart_Printf("[WE@%x=%x]",addr,i);
return 0;
}
else
return 1;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -