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

📄 flash_test.c

📁 NorFlash bootloader(SPANSION_S71WS256ND0) for I.MX27(freescale).
💻 C
字号:
#include <stdio.h>
#include "common.h"
#include "bono_memory_map_defines.h"
#include "MX27_HABTools.h"


U32 FlashAddress (U32 Bank);
U32 BankBlankCheck (U32 Bank);
void FlashEraseIfNotBlank (void);
void EraseFlashMemory (U32 Address, U32 Size, U32 channel);
U32 BankSize (U32 Bank);
void ShowProcessDot (U32 i, U32 mask);

// Spansion Nor flash (WS256N), 256Mbit or 32MB
// Bono CS0 : 0xC000 0000 (Base address)
// End Addr : 0xC1ff ffff
// PSRAM : 128Mbit or 16MB
// Bono CS5 : 0xD600 0000 (Base address)


#define BASE_ADDR	0xC0000000


U32 _gErrorMemoryU32;



U32 MemoryErrorU32(U32 Address)
{
   #ifdef DEBUG
     printf("\nFirst Memory Error at 0x%08X", Address);
   #endif

   _gErrorMemoryU32=1;
   return Address;
}




U32 Flash_ID (void)
{
	U32 Error = 0;
	U16 Manufacturing_ID, Flash_ID1, Flash_ID2, Flash_ID3;

#ifdef DEBUG
	printf ("Flash ID");	
#endif

	lld_AutoselectEntryCmd (BASE_ADDR);
#ifdef DEBUG
	printf ("Manufacturing ID : %04X\n", Manufacturing_ID = (lld_ReadOp(BASE_ADDR, 0x0000)));
	printf ("Device ID, Word1 : %04X\n", Flash_ID1 = (lld_ReadOp(BASE_ADDR, 0x0001)));
	printf ("Device ID, Word2 : %04X\n", Flash_ID2 = (lld_ReadOp(BASE_ADDR, 0x000E)));
	printf ("Device ID, Word3 : %04X\n", Flash_ID3 = (lld_ReadOp(BASE_ADDR, 0x000F)));
#endif

	lld_AutoselectExitCmd(BASE_ADDR);
	lld_ResetCmd(BASE_ADDR);

	if ((Manufacturing_ID==0x0001) 
		&& (Flash_ID1==0x227E)
		&& (Flash_ID2==0x2230)
		&& (Flash_ID3==0x2200))
		Error = 0;
	else
		Error = !0;

#ifdef DEBUG
	printf ("\nResult : %s\n", Error ? "Fail" : "Pass");
#endif

	return (Error);	
}


void FlashWriteU16(U32 StartAddress, U32 ByteSize, U32 StartNumber, U32 PageSizeByte)
{
    U32 i, j, k;

    i=StartAddress;
    k=0;
    j=StartNumber;
    
#ifdef DEBUG   
   	printf ("Memory write [%08X - %08X]\n", StartAddress, StartAddress+ByteSize-1);
#endif
 
    while(i<(StartAddress+ByteSize))
    {
//    	*(P_U16)(i)=j;
    	
    	lld_ProgramOp (BASE_ADDR, (i&0x1ffffff)>>1, j);
    	
//		ShowProcessBar(StartAddress, ByteSize, i, 'W');
    		
		k+=2;
		j++;
        i+=2;	
        
        if(k>=PageSizeByte)
		{  	k=0;
   			j=StartNumber;
		}	
	}
#ifdef DEBUG	
   	printf ("\n");
#endif

}


void FlashMassErase (void)
{
	U32 Error = 0;
#ifdef DEBUG
	printf ("Flash Mass Erase");	
	
	printf ("\n%08X", Error = lld_ChipEraseOp (BASE_ADDR));
#endif

}


void FlashAllSectorErase (void)
{
#ifdef DEBUG
	printf ("Flash Mass Erase");	
#endif
	
	FlashEraseIfNotBlank();

}


void FlashEraseIfNotBlank (void)
{
	U32 i;
	for (i=0; i<=261; i++)
	{
#ifdef DEBUG
		printf ("Erasing sector %03d, Address = %08X\r", i, BASE_ADDR+FlashAddress(i));
#endif

		if (BankBlankCheck(i))
			lld_SectorEraseOp (BASE_ADDR, FlashAddress(i)>>1);
	}
#ifdef DEBUG
	printf ("\nAll Sectors erased.\n");
#endif

}

U32 BankBlankCheck (U32 Bank)
{
	U32 i,j;
	
	i=FlashAddress (Bank);
	j=i+BankSize (Bank);
	
    while(i<j)
    {
    	if(*(P_U16)(BASE_ADDR+i) != 0xffff)
    	  	break;
        i+=2;	
   	}

	return ( (i >= j) ? PASS : FAIL);
}


U32 BlankCheck (U32 StartAddress, U32 ByteSize)
{
	
    U32 i;

    i=StartAddress;

#ifdef DEBUG
	printf ("Flash Blank Check");	
 	printf ("Memory Check [%08X - %08X]\n", StartAddress, StartAddress+ByteSize-1);
#endif
 
    while(i<(StartAddress+ByteSize))
    {
//		ShowProcessBar(StartAddress, ByteSize, i, 'R');

    	if(*(P_U32)(i) != 0xffffffff)
    	{
    	  	MemoryErrorU32(i);
#ifdef DEBUG
		   	printf ("\n");
#endif

    	  	break;
    	}
    		
        i+=4;	
   	}
#ifdef DEBUG
	printf ("\n\nResult :%s\n", ((i>=(StartAddress+ByteSize)) ? "Pass" : "Fail"));
#endif
	
	return (i);

}

U32 FlashBlankCheck (void)
{
	return (BlankCheck (0xC0000000, 0x2000000));
}


// Calculate the bank number for the Flash Address (U8)
// Input : Address (U8)
// Return : Bank number

U32 Bank (U32 Address)
{
	Address = (Address&0x0fffffff)>>1;		// convert to 16 bit word.	
	
	if (((Address>>16) & 0xFF) == 0)
		return (Address>>14);
	else if (((Address>>16) & 0xFF) == 0xFF)
		return (258 + (Address>>14 & 0x3));
	else
		return (3 + (Address>>16 & 0xFF));
}

U32 FlashAddress (U32 Bank)
{
	if (Bank<4)
		return (Bank<<(14+1));
	else if (Bank>257)
		return ((((Bank-258)<<14) | 0xFF0000)<<1);
	else 
		return ((((Bank-3)<<16) )<<1);
}

U32 BankSize (U32 Bank)
{
	if ((Bank<4) || (Bank>257))
		return (32*1024);
	else 
		return (128*1024);
}

// Blank check the memory first. Erase the bank if it is not blank
// Input : Address (U8)
// 

void EraseFlashMemory (U32 Address, U32 Size, U32 channel)
{
	U32 i;
	
	i=Bank(Address);

	do
	{
#ifdef DEBUG
		printf ("\rSector : %03d", i);
#endif

#ifdef HABTOOLKIT_FLASH_LIB
		{
			HAB_flash_status(FLASH_ERASE, i ,channel);		
		}	
#endif
		
		while (BankBlankCheck(i))
			lld_SectorEraseOp (BASE_ADDR, FlashAddress(i)>>1);

		i=i+1;
	
	} while (i<=Bank(Address+Size-1));

#ifdef DEBUG	
	printf ("\n\n");
#endif

}

// Transferring memory from RAM to Flash 
// Input : FlashAddress - Starting Address in Flash
//         RAMAddress - Starting Address in RAM
//         ByteSize - The number of bytes copying to Flash
// Return : Zero : Pass
//			None Zero : Fail


U32 FlashLoader (U32 RAMAddress,  U32 FlashAddress,  U32 ByteSize, U8 channel)
{
	U32 i;
	U32 result;
	
	U32 WordSize;
	
	WordSize = (ByteSize>>1) + (ByteSize & 0x1);
	
	if (ByteSize & 0x1)
		*(volatile P_U8) (RAMAddress + ByteSize) = 0xff;
	
#ifdef DEBUG
	printf ("Erasing Flash memory.\n");
#endif
	
	EraseFlashMemory (FlashAddress, ByteSize, channel);
	
#ifdef DEBUG
	printf ("Programming Flash memory.\n");
#endif

	for (i=0; i<WordSize; i++)
	{
    	lld_ProgramOp (BASE_ADDR, ((FlashAddress & 0x1ffffff)>>1) + i, *(P_U16)(RAMAddress+(i<<1)));
#ifdef DEBUG
    	ShowProcessDot (i, 0xffff);
#endif

#ifdef HABTOOLKIT_FLASH_LIB
		if ((i & 0x3FFF) == 0) 
			HAB_flash_status(FLASH_WRITE, 0x4000,channel);
#endif
	   }



#ifdef DEBUG    
    printf ("\n\n");
	printf ("Verifying Flash memory.\n");
#endif

#ifdef HABTOOLKIT_FLASH_LIB
		HAB_flash_status(FLASH_VERIFY, 4000, channel);
#endif

    result = memcmp (FlashAddress, RAMAddress, ByteSize);
#ifdef DEBUG    
    printf ("\nProgram Complete.\n");
#endif
 
    return (result);

}



void ShowProcessDot (U32 i, U32 mask)
{
	if ((i & mask) == 0) 
#ifdef DEBUG	
	printf (".");
#endif

	;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -