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

📄 复件 flash.c

📁 三星4510 BOOTLOADER全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//***************************************************************************************************
//Institute of Automation, Chinese Academy of Sciences
//Beijing Magcube Technology Co.,Ltd  
//File Name:	Flash.c
//Description: 	Flash Erase and Write. 
//Author:	Lee JuGuang
//Date:		2004-1-4
//***************************************************************************************************	

#include 	"Flash.h"
#include 	"uart.h"

extern void download(void);
extern void Update_Bootloader(void);
static void flash_erase_Bootloader(void);
static void Flash_Unlock(void);
static void flash_prg_bootloader(int CNT);

static void flash_prg(int CNT);
static void flash_erase(int CNT);

//*******************************************************************
//Here,we use 4 sectors at the beginning of flash(total 64KB) 
//as bootloader area. 
//*******************************************************************
unsigned int FLASH_SECTOR_BOOT[]= {0x1000000,0x1004000,0x1006000,0x1008000,0x1010000};

/************************************************************************/
/*Function Name:		Update_Bootloader()			*/
/*Function Description:	Update the bootloader			*/
/*Date:			2003-12-2				*/
/************************************************************************/
void Update_Bootloader()
{
	char ch;
	i_printf("\r\n>>>Are You Sure?(Y/N)---");
	ch=get_char(0);
	if((ch!='Y')&&(ch!='y'))
		{i_printf("\r\n");
		return;}
	put_char(0, ch);
	i_printf("\r\n>>>Please Send the New Bootloader to Board by Xmodem Protocol...");
	if (XModemReceive((char *)0x900000, 0xfffff) == -1)
		{i_printf("\nTRANSFER FAILURE");	exit(0);}
	i_printf(",...OK!\r\n");	

	flash_erase_Bootloader();

	i_printf(">>>Bootloader Flash Area Program,Please Wait...");
	flash_prg_bootloader(64);
	i_printf(",OK!\r\n");
	i_printf("\n\r>>>Bootloader Update Successfully, Please Reset the System. Thank you!\r\n"); 
}


/************************************************************************/
/*Function Description:	bootloader program			*/
/*Date:			2003-12-9				*/
/************************************************************************/
static void flash_prg_bootloader(int CNT)
{
		
	volatile unsigned short *from_add,*to_add;
	int i;
	to_add= (unsigned short*)0x1000000;
	from_add=(unsigned short *)0x00900000;
	Delay(50000);
	
	i=*to_add;
	for(i=0;i<CNT*1024/2;i++)
	{
		*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
		*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
		*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_SETUP_WRITE; 
  		*to_add = *from_add;
		Delay(10);
		while(*to_add!=*from_add)
			{
			Delay(10);
			}
		to_add++;
		from_add++;

		//*to_add++ =*from_add++ ;
		//Delay(500);
	}

	/*******Here, we verify the program data.**********/
	i_printf(",Verify...");
	to_add= (unsigned short*)0x1000000;
	from_add=(unsigned short *)0x900000;
	for(i=0;i<CNT*1024/2;i++)
		{
		if(*to_add!=*from_add)
			{i_printf("Data Program Error!\r\n");exit(0);}
		to_add++;from_add++;
		}
}





/************************************************************************/
/*Function Description:	Erase bootloader area			*/
/*Date:			2003-12-5				*/
/************************************************************************/
static void flash_erase_Bootloader()
{

	unsigned short *address;
/************************************************************************/
	i_printf(">>>Erase Bootloader Flash Area S1,Please Wait...");
	Flash_Unlock();
	*((volatile unsigned short *)FLASH_SECTOR_BOOT[0]) = AM_SECTOR_ERASE;	//0x3030
	i_printf(",Blank Check...");
CHKB1:	         	
	Delay(50000);
         for(address=(unsigned short *)FLASH_SECTOR_BOOT[0];address<(unsigned short *)FLASH_SECTOR_BOOT[1];address++)
		{
		if(*address!=0xffff)
			{goto CHKB1;}
		}
	i_printf(", OK!\r\n");    

/************************************************************************/
	i_printf(">>>Erase Bootloader Flash Area S2,Please Wait...");
	Flash_Unlock();
  	*((volatile unsigned short *)FLASH_SECTOR_BOOT[1]) = AM_SECTOR_ERASE;	//0x3030
  	i_printf(",Blank Check...");
CHKB2:
       	Delay(50000);
	for(address=(unsigned short *)FLASH_SECTOR_BOOT[1];address<(unsigned short *)FLASH_SECTOR_BOOT[2];address++)
		{
		if(*address!=0xffff)
			{goto CHKB2;}
		}
	i_printf(", OK!\r\n");   

/************************************************************************/
	i_printf(">>>Erase Bootloader Flash Area S3,Please Wait...");
	Flash_Unlock();
	*((volatile unsigned short *)FLASH_SECTOR_BOOT[2]) = AM_SECTOR_ERASE;	//0x3030
	i_printf(",Blank Check...");

CHKB3:
       	Delay(50000);
	for(address=(unsigned short *)FLASH_SECTOR_BOOT[2];address<(unsigned short *)FLASH_SECTOR_BOOT[3];address++)
		{
		if(*address!=0xffff)
			{goto CHKB3;}
		}
	i_printf(", OK!\r\n");   
	
/************************************************************************/
	i_printf(">>>Erase Bootloader Flash Area S4,Please Wait...");
	Flash_Unlock();
	*((volatile unsigned short *)FLASH_SECTOR_BOOT[3]) = AM_SECTOR_ERASE;	//0x3030
	i_printf(",Blank Check...");
CHKB4:
         Delay(50000);
	for(address=(unsigned short *)FLASH_SECTOR_BOOT[3];address<(unsigned short *)FLASH_SECTOR_BOOT[4];address++)
		{
		if(*address!=0xffff)
			{goto CHKB4;}
		}
	i_printf(", OK!\r\n");   
}


/************************************************************************/
/*Function Description:	Flash Sector Unlock.			*/
/*Date:			2003-12-2				*/
/************************************************************************/
static void Flash_Unlock(void)
{
	*((volatile unsigned short *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;	//0xaaaa  
	*((volatile unsigned short *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;	//0x5555	
	*((volatile unsigned short *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_SETUP_ERASE;  //0x8080  
    	*((volatile unsigned short *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1; //0xaaaa    
	*((volatile unsigned short *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;	//0x5555	
}




//*************************************************************************************************
//*Function Name:		flash_prg()
//*Function Description:	Flash Program					
//*Date:			2003-12-2					
//*************************************************************************************************
static void flash_prg(int CNT)
{
		
	volatile unsigned short *from_add,*to_add;
	int i;
	to_add= (unsigned short*)0x1010000;
	from_add=(unsigned short *)0x00900000;
	for(i=0;i<CNT*1024/2;i++)
	{
		*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;       
		*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
		*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_SETUP_WRITE; 
  		
  		*to_add = *from_add;
		Delay(10);
		while(*to_add!=*from_add)
			{
			Delay(10);
			}
		to_add++;
		from_add++;
	}

//*********************************************************	
//****	Here, we verify the program data.
//*********************************************************
	i_printf(",Verify...");
	to_add= (unsigned short*)0x1010000;
	from_add=(unsigned short *)0x900000;
	for(i=0;i<CNT*1024/2;i++)
		{
		if(*to_add!=*from_add)
			{i_printf("Data Program Error!\r\n");exit(0);}
		to_add++;from_add++;
		}
	
}

//*************************************************************************************************
//*Function Description:							
//*Date:			2003-12-2					
//*************************************************************************************************
void download()
{
	char size[10];
	char i,j;
	static int length;
	char flag;
	static int CNT;
	flag=1;
	length=0;
	i=0;
	j=0;

//*********************************************************
//****	Here we input the size of binary program,the unit 
//****	is KB.then we change the ASCII charactors into 
//****	binary number.The maximum size of binary program is 
//****	1920KB. 
//*********************************************************
	i_printf(">>>Please Input the Size of Program...\n\r");
	i_printf(">>>(Unit: KB)---");
	size[0]=get_char(0);
	
	do{
		i_printf("%c",size[i]);
		if(size[i]>'9'||size[i]<'0')
			{
			i_printf("\r\n\r\nSorry,Input Error!\r\n\r\n");
			return;
			}
		i++;
		size[i]=get_char(0);
	}while(size[i]!=0x0d);
	
	if(flag)
		{
		for(j=0;j<i;j++)
			{
			 if(is_xdigit(size[j]))
				{
			  	if(size[j]>='0'&&size[j]<='9')
					length = length * 10 + size[j]-'0';
         			else if(size[j]>='a'&&size[j]<='f')             /* 'A' - 'F' */
				         length = length * 16 + 10+size[j]-'a';
			         else if(size[j]>='A'&&size[j]<='F')             /* 'A' - 'F' */
				         length = length * 16 + 10+size[j]-'A';
        				}
			}
		if(length>1920) 	/* The maxium size of user program.*/
			{
			i_printf("\r\n\r\nSorry,The Size of File cann't Exceed 1920KB!\r\n\r\n");
			return;	
			}
		CNT=length;
		length=0;
		put_char(0, 0x0d);

//*********************************************************
//****	Here,we transfer the binary program to SDRAM by 
//****	Xmodem and then write it to Flash memory.
//*********************************************************
		i_printf("\r\n>>>Please Send File to Board by Xmodem Protocol...");
		if (XModemReceive((char *)0x900000, 0x1fffff) == -1)
			{i_printf("\nTRANSFER FAILURE");	exit(0);}
		i_printf(",...OK!\r\n");	
		
		flash_erase(CNT);
		
	        i_printf(">>>Flash Program,Please Wait...");
		flash_prg(CNT);
		i_printf(",OK!\r\n");
		i_printf("\n\r>>>Flash Program Successfully. Thank you!\r\n"); 
		}
}


/************************************************************************/
/*Function Name:		flash_erase()				*/		
/*Function Description:	Flash User Program Areas.			*/
/*Date:			2003-12-5				*/
/************************************************************************/
static void flash_erase(int CNT)

{
	unsigned short *address;

/**********************************User Flash S1 *********************************************/
	if(CNT>64*0)
		{
		i_printf(">>>Erase User Flash Area S1,Please Wait...");
		Flash_Unlock();
		*((unsigned short *)AM_SECTOR_ADDR_1) = AM_SECTOR_ERASE;	//0x3030	
		i_printf(",Blank Check...");

EUS1:	
		Delay(50000);		         
		for(address=(unsigned short *)AM_SECTOR_ADDR_1;address<(unsigned short *)AM_SECTOR_ADDR_2;address++)
			{
			if(*address!=0xffff)
				{goto EUS1;}
			}
		i_printf(", OK!\r\n");    
		}

/**********************************User Flash S2 *********************************************/
        if(CNT>64*1)
		{
		i_printf(">>>Erase User Flash Area S2,Please Wait...");
		Flash_Unlock();
		*((unsigned short *)AM_SECTOR_ADDR_2) = AM_SECTOR_ERASE;	//0x3030
		i_printf(",Blank Check...");
EUS2:
	        	Delay(50000);         
		for(address=(unsigned short *)AM_SECTOR_ADDR_2;address<(unsigned short *)AM_SECTOR_ADDR_3;address++)
			{
			if(*address!=0xffff)
				{goto EUS2;}
			}
		i_printf(", OK!\r\n");    
		}

/**********************************User Flash S3 *********************************************/
        if(CNT>64*2)
		{
		i_printf(">>>Erase User Flash Area S3,Please Wait...");
		Flash_Unlock();
		*((unsigned short *)AM_SECTOR_ADDR_3) = AM_SECTOR_ERASE;	//0x3030
   		i_printf(",Blank Check...");
EUS3:
		Delay(50000);        
		for(address=(unsigned short *)AM_SECTOR_ADDR_3;address<(unsigned short *)AM_SECTOR_ADDR_4;address++)
			{
			if(*address!=0xffff)
				{goto EUS3;}
			}
		i_printf(", OK!\r\n");    

		}

/**********************************User Flash S4 *********************************************/
	if(CNT>64*3)
		{


		i_printf(">>>Erase User Flash Area S4,Please Wait...");
		Flash_Unlock();
		*((unsigned short *)AM_SECTOR_ADDR_4) = AM_SECTOR_ERASE;	//0x3030
	       	i_printf(",Blank Check...");
EUS4:
	         Delay(50000);
		for(address=(unsigned short *)AM_SECTOR_ADDR_4;address<(unsigned short *)AM_SECTOR_ADDR_5;address++)
			{
			if(*address!=0xffff)
				{goto EUS4;}
			}
		i_printf(", OK!\r\n");    

		}

/**********************************User Flash S5*********************************************/
	
	if(CNT>64*4)
		{

		i_printf(">>>Erase User Flash Area S5,Please Wait...");
		Flash_Unlock();
		*((unsigned short *)AM_SECTOR_ADDR_5) = AM_SECTOR_ERASE;	//0x3030
		i_printf(",Blank Check...");
EUS5:
         	Delay(50000);         
		for(address=(unsigned short *)AM_SECTOR_ADDR_5;address<(unsigned short *)AM_SECTOR_ADDR_6;address++)
			{
			if(*address!=0xffff)
				{goto EUS5;}
			}
		i_printf(", OK!\r\n");    

		}

 /**********************************User Flash S6 *********************************************/        
         if(CNT>64*5)
		{

		i_printf(">>>Erase User Flash Area S6,Please Wait...");
		Flash_Unlock();
		*((unsigned short *)AM_SECTOR_ADDR_6) = AM_SECTOR_ERASE;	//0x3030
	         i_printf(",Blank Check...");
EUS6:
         	Delay(50000);
		for(address=(unsigned short *)AM_SECTOR_ADDR_6;address<(unsigned short *)AM_SECTOR_ADDR_7;address++)
			{
			if(*address!=0xffff)
				{goto EUS6;}
			}
		i_printf(", OK!\r\n");    

		}
/**********************************User Flash S7 *********************************************/
	if(CNT>64*6)
		{

		i_printf(">>>Erase User Flash Area S7,Please Wait...");
		Flash_Unlock();
		*((unsigned short *)AM_SECTOR_ADDR_7) = AM_SECTOR_ERASE;	//0x3030
	         i_printf(",Blank Check...");
 EUS7:
         	Delay(50000);
		for(address=(unsigned short *)AM_SECTOR_ADDR_7;address<(unsigned short *)AM_SECTOR_ADDR_8;address++)
			{
			if(*address!=0xffff)
				{goto EUS7;}
			}
		i_printf(", OK!\r\n");    

		}

/**********************************User Flash S8 *********************************************/
	if(CNT>64*7)

⌨️ 快捷键说明

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