📄 flash_test.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 + -