iflashl.c

来自「Dignostic test program for SMDK441f boar」· C语言 代码 · 共 150 行

C
150
字号
#include "def.h"
#include "option.h"
#include <string.h>
#include "k44.h"
#include "k44lib.h"
#include "iflashl.h"

int _ErFlash(int sectorAddr);

#define IFLASH_CYCLE    (1)

#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=0x80|IFLASH_CYCLE;	//CPUHOLD 00000b 2clk
    				//1       00000  ??
    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=0x80|IFLASH_CYCLE;	//CPUHOLD 00000b 2clk
    				//1       00000  ??
    			
    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 + =
减小字号Ctrl + -
显示快捷键?