📄 flashmanager.c
字号:
/*
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
File Name: Flash_Driver.c
Version: 1.0
Purpose: To provide flash API for video application.
Software: VisualDSP++3.5
Hardware: ADSP-BF533 EZ-KIT Board
Programmer: EricRao
Orgnization: Supcon Company
Date: 2004.6.8-2004.6.15
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
*/
//Note:
//Main Flash:main flash memory (8 sectors:1M bytes)
//Boot Flash:secondary flash memory (4 sectors:64K bytes)
//////////////////////////////////////////////////////////////////////////////
// Map of flash sectors: // //
// //
// FLASH A //
// Type START ADDR END ADDR SECTOR NUM //
// ------- ---------- -------- ---------- //
// Main Flash 0x20000000 0x200FFFFF 00 - 15 //
// Boot Flash 0x20200000 0x2020FFFF 32 - 35 //
// FLASH B //
// Main Flash 0x20100000 0x201FFFFF 16 - 31 //
// Boot Flash 0x20280000 0x2028FFFF 36 - 39 //
// //
//////////////////////////////////////////////////////////////////////////////
#include "Include\FlashManager.h"
#include "defBF533.h"
#include "Include\Error.h"
#include "Include\Led.h"
#include "Include\Def.h"
#include "Include\DMA.h"
#include <stdlib.h>
//Global Variables
char FlashResetFlag =0x0; //Reset flag
int wState =0;
int rState =0;
int nStuffTotalNum =0;
int nStuffPartialNum =0;
int GlobalCounter =0;
const int STUFF_NUM[STUFF_ITEM_NUM] ={CONFIG_PARAM_NUM,RECORD_STRIP_NUM,VIDEO_IMAGE_NUM};
unsigned long FLASH_OFFSET_ADDRESS[FLASH_ITEM_NUM]={PROGRAM_PARTITION_OFFSET_ADDRESS,CONFIG_PARTITION_OFFSET_ADDRESS,RECORD_PARTITION_OFFSET_ADDRESS,VIDEO_PARTITION_OFFSET_ADDRESS,RESERVED_PARTITION_OFFSET_ADDRESS};
unsigned long STUFF_OFFSET_ADDRESS[STUFF_ITEM_NUM]={CONFIG_PARTITION_OFFSET_ADDRESS,RECORD_PARTITION_OFFSET_ADDRESS,VIDEO_PARTITION_OFFSET_ADDRESS};
unsigned long STUFF_SIZE[STUFF_ITEM_NUM] ={CONFIG_PARAM_SIZE,RECORD_STRIP_SIZE,VIDEO_IMAGE_SIZE};
unsigned long STUFF_ERASE_STRIDE[STUFF_ITEM_NUM] ={CONFIG_PARAM_ERASE_STRIDE,RECORD_STRIP_ERASE_STRIDE,VIDEO_IMAGE_ERASE_STRIDE};
unsigned long rStuffCurrentAddress[STUFF_ITEM_NUM]={CONFIG_PARTITION_OFFSET_ADDRESS,RECORD_PARTITION_OFFSET_ADDRESS,VIDEO_PARTITION_OFFSET_ADDRESS};
unsigned long wStuffCurrentAddress[STUFF_ITEM_NUM]={CONFIG_PARTITION_OFFSET_ADDRESS,RECORD_PARTITION_OFFSET_ADDRESS,VIDEO_PARTITION_OFFSET_ADDRESS};
//bool rSemaphore =0;//Reserved
//bool wSemaphore =0;//Reserved
//------------------------------------------------------------------------------//
// Function: LedIndicator //
// //
// Purpose:To indicate what kind of error it is. //
// //
// Returns: //
//------------------------------------------------------------------------------//
ERROR_CODE LedIndicator(ERROR_CODE ErrorCode)
{
int LoopNum=ERROR_LOOP_NUM;
unsigned long ErrorID;
switch(ErrorCode)
{//Important error indication
case POLL_TIMEOUT:
ErrorID=0x0;
break;
case INVALID_SECTOR:
ErrorID=0x1;
break;
case INVALID_BLOCK:
ErrorID=0x2;
break;
case ERASE_ERROR:
ErrorID=0x3;
break;
case READ_ERROR:
ErrorID=0x4;
break;
case WRITE_ERROR:
ErrorID=0x5;
break;
case INVALID_DATA:
ErrorID=0x6;
break;
case FLASH_EMPTY:
ErrorID=0x7;
break;
default:
return NO_ERR;
}
//Show what's the error by LED
Led_Error_Indicator(LoopNum,ErrorID);
return ErrorCode;
}
//------------------------------------------------------------------------------//
// ERROR_CODE SetupForFlash()
//
// Perform necessary setup for the processor to talk to the
// flash such as external memory interface registers, etc.
//
//------------------------------------------------------------------------------//
ERROR_CODE SetupForFlash()
{//Question:The following setup is sure to make the operation of
// writting data to any place in flash chip a and b?
asm("#define EBIU_AMGCTL 0xFFC00A00");
// setup EBIU_AMGCTL reg (enable all banks)
asm("p0.l=EBIU_AMGCTL & 0xFFFF;");
asm("p0.h=(EBIU_AMGCTL>>16)&0xFFFF;");
asm("r0= 0x0f;");
//asm("r0= 0x09;");//EricRao
asm("w[p0] = r0;");
return NO_ERR;
}
//------------------------------------------------------------------------------//
// Function: SectorValityCheck() //
// //
// Purpose: Setup combo buffer for reading to erase //
// //
// Returns: None //
//------------------------------------------------------------------------------//
ERROR_CODE SectorValityCheck(unsigned long ulStart,long lCount,long lStride)
{
int iNumLong=TWO_BYTES;
ERROR_CODE ErrorCode=NO_ERR;
unsigned long ulAccessEndAddress;
unsigned long ulAccessStartAddress;
unsigned long ulIllegalAccessEndAddress;
unsigned long ulIllegalAccessStartAddress;
ulAccessStartAddress=FLASH_BASE_ADDRESS+ulStart;
ulAccessEndAddress=FLASH_BASE_ADDRESS+ulStart+lCount*iNumLong;
ulIllegalAccessEndAddress=FLASH_BASE_ADDRESS+0x280000;
ulIllegalAccessStartAddress=FLASH_BASE_ADDRESS+0x270000;
if(((ulAccessStartAddress<ulIllegalAccessStartAddress)
&&(ulAccessStartAddress<ulIllegalAccessEndAddress)
&&(ulAccessEndAddress>ulIllegalAccessStartAddress)
&&(ulAccessEndAddress<ulIllegalAccessEndAddress))||
((ulAccessStartAddress>ulIllegalAccessStartAddress)
&&(ulAccessStartAddress<ulIllegalAccessEndAddress)
&&(ulAccessEndAddress>ulIllegalAccessStartAddress)
&&(ulAccessEndAddress<ulIllegalAccessEndAddress))||
((ulAccessStartAddress>ulIllegalAccessStartAddress)
&&(ulAccessStartAddress<ulIllegalAccessEndAddress)
&&(ulAccessEndAddress>ulIllegalAccessStartAddress)
&&(ulAccessEndAddress>ulIllegalAccessEndAddress))||
((ulAccessStartAddress<ulIllegalAccessStartAddress)
&&(ulAccessStartAddress<ulIllegalAccessEndAddress)
&&(ulAccessEndAddress>ulIllegalAccessStartAddress)
&&(ulAccessEndAddress>ulIllegalAccessEndAddress)))
{
ErrorCode=INVALID_SECTOR;
}
LedIndicator(ErrorCode);
return ErrorCode;
}
//------------------------------------------------------------------------------//
// Function: enProgramFlash //
// //
// Parameters: ulOffset(flash offset address) // //
// //
// Purpose: Unlock flash for programming on it(Reading and Writing) //
// //
// Returns: None //
//------------------------------------------------------------------------------//
ERROR_CODE enProgramFlash(unsigned long ulOffset)
{ //Enable program flash
unsigned long ulOffsetAddress=ulOffset;
ulOffsetAddress&=0xFFFF0000;
WriteFlash((0x0aaa | ulOffsetAddress), 0xaa);
WriteFlash((0x0554 | ulOffsetAddress), 0x55);
WriteFlash((0x0aaa | ulOffsetAddress), 0xa0);
return NO_ERR;
}
//------------------------------------------------------------------------------//
// Function: WriteFlash //
// //
// Parameters:ulOffset(flash offset address),nVlaue(What value to write) // //
// //
// Purpose: Write data to flash //
// //
// Returns: None //
//------------------------------------------------------------------------------//
ERROR_CODE WriteFlash(unsigned long ulOffset, int nValue)
{
//Flash base address
asm("p2.l = 0x0000;");
asm("p2.h = 0x2000;");
asm("r3 = %0;"::"d"(ulOffset));
asm("r2 = p2;");
asm("r2 = r2 + r3;");
asm("p2 = r2;");
//write the value to the flash
asm("SSYNC;");
asm("w[p2]= %0;"::"d"(nValue));
asm("SSYNC;");
return NO_ERR;
}
//--------------------------------------------------------------//
// ERROR_CODE ReadFlash() //
// //
// Purpose: Read a value from an offset in flash. //
// //
// Inputs: unsigned long ulOffset - offset to read from //
// int pnValue - pointer to store value read from flash//
// //
//--------------------------------------------------------------//
ERROR_CODE ReadFlash( unsigned long ulOffset, int *pnValue )
{
// temp holder
int nValue = 0x0;
// get the offset from the start of flash and put it in a P register
asm ("p2.l = 0x0000;");
asm ("p2.h = 0x2000;");
asm ("r3 = %0;": : "d" (ulOffset) );
asm ("r2 = p2;");
asm ("r2 = r2 + r3;");
asm ("p2 = r2;");
// now place it into memory
asm ("SSYNC;");
asm ("%0 = w[p2] (Z);": "=d" (nValue) : );
asm ("SSYNC;");
// put the value at the location passed in
*pnValue = nValue;
// ok
return NO_ERR;
}
//----------------------------------------------------------//
// ERROR_CODE ResetFlash() //
// //
// Purpose:Sends a "FlashResetFlag" command to the flash. //
// //
// Inputs: None //
//----------------------------------------------------------//
ERROR_CODE ResetFlash(int ResetType)
{
// send the FlashResetFlag command to the flash
ResetType=0;
switch(ResetType)
{
case 0://Flash A:Main Flash
WriteFlash(0x0AAA, 0xf0 );
break;
case 1://Flash A:Boot Flash
WriteFlash(0x0AAA,0xaa );
WriteFlash(0x0554,0x55 );
break;
default:
return NO_ERR;
}
// FlashResetFlag should be complete
return NO_ERR;
}
//----------------------------------------------------------//
// ERROR_CODE PollToggleBit() //
// //
// Purpose:Polls the toggle bit in the flash to see //
// when the operation is complete. //
// //
// Inputs: unsigned long ulOffset - offset in flash //
// //
//----------------------------------------------------------//
ERROR_CODE PollToggleBit(unsigned long ulOffset)
{
ERROR_CODE ErrorCode=NO_ERR; // flag to indicate error
// read from the flash twice and check the toggle bit
asm ("POLL_TOGGLE_BIT:");
asm ("p2.l = 0x0000;");
asm ("p2.h = 0x2000;");
asm ("r2 = r0;"); // ulOffset is passed into PollTogglebit in R0
asm ("r1 = p2;");
asm ("r1 = r1 + r2;");
asm ("p2 = r1;");
asm ("r1 = w[p2] (Z);");
asm ("SSYNC;");
asm ("r2 = w[p2] (Z);");
asm ("SSYNC;");
// set bits in r0 where data toggled
asm("r1 = r1 ^ r2;");
// see if we are still toggling, if not we are done
asm ("cc = bittst(r1, 6);");
asm ("if !cc jump DONE_TOGGLE_BIT;");
// see if there was an error
asm ("cc = bittst(r2, 5);");
asm ("if !cc jump POLL_TOGGLE_BIT;");
// if we get here we detected the error bit set
asm ("r1 = w[p2] (Z);");
asm ("SSYNC;");
asm ("r2 = w[p2] (Z);");
asm ("SSYNC;");
// set bits in r0 where data toggled
asm("r1 = r1 ^ r2;");
// see if we are still toggling, if not we are done
asm ("cc = bittst(r1, 6);");
asm ("if !cc jump DONE_TOGGLE_BIT;");
// else we have failed, restore page, set error flag, and FlashResetFlag
ErrorCode = POLL_TIMEOUT;
FlashResetFlag = 0x1;
ResetFlash(ONE_WRITE_CYCLE);
// we are done toggling
asm ("DONE_TOGGLE_BIT:");
// we can return
return ErrorCode;
}
//----------------------------------------------------------//
// ERROR_CODE GetSectorNumber() //
// //
// Purpose:Gets a sector number based on the offset. //
// //
//----------------------------------------------------------//
ERROR_CODE GetSectorNumber( unsigned long ulOffset, int *pnSector )
{
int nSector = 0;
// sector numbers for the FLASH A boot sectors
if(ulOffset >= 0x200000)
{
if( ulOffset < 0x204000 )//0x20000000+0x00204000
{
nSector = 32;
}
else if( (ulOffset >= 0x204000) && ( ulOffset < 0x206000 ) )
{
nSector = 33;
}
else if( (ulOffset >= 0x206000) && ( ulOffset < 0x208000 ) )
{
nSector = 34;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -