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

📄 flashmanager.c

📁 flash驱动和简单管理程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
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 + -