📄 c6000_flash.c
字号:
/*
*/
/***************************************************************************/
/* */
/* flash . C */
/***************************************************************************/
/*Standard C .h-file */
#include <stdio.h> /*Standard IO .h-file For Debug */
#include <errno.h> /*Standard ERROR .h-file For Debug */
#include <math.h> /*Standard math .h-file For calculating */
/*Standard C64XX .h-file */
#include <c6x.h>#include <csl.h>
#include <csl_cache.h>#include <csl_emifa.h>#include <csl_gpio.h>#include <csl_edma.h> #include <csl_irq.h>
#define TEMP_ADDRESS 0xE000
#define FlashCtlAddr1 0x90005555 //Program Control word address of Flash AT29LV010
#define FlashCtlAddr2 0x90002AAA //Program Control word address of Flash AT29LV010
volatile unsigned char *TEMP = ( volatile unsigned char *)TEMP_ADDRESS;
#define FlashMapBaseAddr 0x90000000 //Address of flash
void init(void);
void FlashUnlock(void);
void configEMIF(void);
/* ======== main ======== */
void main()
{
unsigned int i,j,k;
char filename[128];
FILE *fp;
unsigned char *ptr=(unsigned char *)TEMP_ADDRESS;
unsigned int codelengthstart,codelengthend,codelength;
unsigned int NumOfWrCycle;
unsigned char floadtemp;
unsigned char readval;
init();
printf("Please enter the BIN filename:\n");
scanf("%s",filename);
fp = fopen(filename,"rb");
if(fp == NULL)
{
printf("Open this file failed ! Check please!\n");
exit(0);
}
else
{
fseek(fp,0,SEEK_END);
codelengthend = (int)ftell(fp);
fseek(fp,0,SEEK_SET);
codelengthstart = (int)ftell(fp);
codelength = codelengthend-codelengthstart;
}//End of if()
printf("codelength:%d\n",codelength);
NumOfWrCycle =(int)(codelength/128)+1;//文件的大小为NumOfCycle个128字节块
printf("NumOfWrCycle:%d\n",NumOfWrCycle);
printf("Writing...... ! Wait please!\n");
for(i=0;i<NumOfWrCycle;i++)
{
//先把每块128字节读到数据空间暂存
for(j=0;j<128;j++)
{
if( (i*128+j)<codelength )
{
fread(ptr,1,1,fp);//写128个字节
ptr++;
}
else
{
*ptr = 0x00;//最末的128字节块,如果现有的数据不够则追加写0
ptr++;
}
}//End of for(j=0;j<128;j++)
//暂存空间指针归位为初始值
for(j=0;j<128;j++)
{
ptr--;
}
//解锁
FlashUnlock();
for(j=0;j<128;j++)
{
*(volatile unsigned char *)(FlashMapBaseAddr + (i*128+j)) = (TEMP[j] & 0x00FF);
}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
}//End of for(i=0;i<NumOfWrCycle;i++)
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
for (k = 0; k<0x4FFFF; k++){asm("\tNOP");}
FlashUnlock();//解锁
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
//*(volatile unsigned int*)(FlashCtlAddr3) = 0;
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
//*(volatile unsigned int*)(FlashCtlAddr4) = 0;
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
//*(volatile unsigned int*)(FlashCtlAddr3) = BOOTORIGIN>>8;//写BOOT表启动地址高位
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
asm("\tNOP");
fclose(fp); //当前已打开的文件必须关闭
printf("Write Ok ! Begin to Check!\n");
//校验写入的对否
printf("Please enter the BIN filename:\n");
scanf("%s",filename);
fp = fopen(filename,"rb");
if(fp == NULL)
{
printf("Open this file failed ! Check please!\n");
exit(0);
}
else
{
fseek(fp,0,SEEK_END);
codelengthend = (int)ftell(fp);
fseek(fp,0,SEEK_SET);
codelengthstart = (int)ftell(fp);
codelength = codelengthend-codelengthstart;
} //End of if()
i=0;
readval=0;
floadtemp=0;
for(i=0;i<codelength;i++)
{
fread(ptr,1,1,fp);
readval = *(volatile unsigned char*)(FlashMapBaseAddr + i) ;
floadtemp = *ptr;
if( readval != floadtemp )
{
printf("%x:\n",i);
printf("%x:\n",readval);
printf("%x:\n",*ptr);
printf("Check Error,Please write again!\n");
exit(0);
}
}
printf("Program is ok! Verified is ok!\n");
exit(0);
}//End of main()
void FlashUnlock(void)
{
unsigned int i;
*(volatile unsigned char*)FlashCtlAddr1 = 0xAA;
for (i = 0; i<0x20; i++){asm("\tNOP");}
*(volatile unsigned char*)FlashCtlAddr2 = 0x55;
for (i = 0; i<0x20; i++){asm("\tNOP");}
*(volatile unsigned char*)FlashCtlAddr1 = 0xA0;
for (i = 0; i<0x20; i++){asm("\tNOP");}
}
void init(void)
{
CSL_init();//Initialise the CSL library
configEMIF();
return;
}
void configEMIF(void)
{
/* Create Global Control Register field */
unsigned int global_ctl = EMIFA_GBLCTL_DEFAULT;
unsigned int ce0_control = EMIFA_CECTL_DEFAULT;
/* Create CE1 Control Register field */
unsigned int ce1_control = EMIFA_CECTL_RMK(
EMIFA_CECTL_WRSETUP_OF(30),
EMIFA_CECTL_WRSTRB_OF(30),
EMIFA_CECTL_WRHLD_OF(30),
EMIFA_CECTL_RDSETUP_OF(30),
EMIFA_CECTL_RDSTRB_OF(30),
EMIFA_CECTL_MTYPE_ASYNC8,
EMIFA_CECTL_WRHLDMSB_OF(0),
EMIFA_CECTL_RDHLD_OF(30) );
unsigned int ce2_control = EMIFA_CECTL_DEFAULT;
unsigned int ce3_control = EMIFA_CECTL_DEFAULT;
unsigned int sd_control = EMIFA_SDCTL_DEFAULT;
unsigned int sd_timing = EMIFA_SDTIM_DEFAULT;
unsigned int sd_ext = EMIFA_SDEXT_DEFAULT;
unsigned int cesec0_control = EMIFA_CESEC_DEFAULT;
unsigned int cesec1_control = EMIFA_CESEC_DEFAULT;
unsigned int cesec2_control = EMIFA_CESEC_DEFAULT;
unsigned int cesec3_control = EMIFA_CESEC_DEFAULT;
EMIFA_configArgs(
EMIFA_GBLCTL_OF(global_ctl), /* global control */
EMIFA_CECTL_OF(ce0_control), /* CE0 control */
EMIFA_CECTL_OF(ce1_control), /* CE1 control */
EMIFA_CECTL_OF(ce2_control), /* CE2 control */
EMIFA_CECTL_OF(ce3_control), /* CE3 control */
EMIFA_SDCTL_OF(sd_control), /* SDRAM control */
EMIFA_SDTIM_OF(sd_timing), /* SDRAM timing */
EMIFA_SDEXT_OF(sd_ext),
EMIFA_CESEC_OF(cesec0_control),
EMIFA_CESEC_OF(cesec1_control),
EMIFA_CESEC_OF(cesec2_control),
EMIFA_CESEC_OF(cesec3_control)
);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -