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

📄 iflashl.c

📁 smdk441f monitor program. 用ADS1.2编译
💻 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 + -