📄 复件 flash.c
字号:
//***************************************************************************************************
//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 + -