📄 flash_prg.c
字号:
/*****************************************************************************
FILENAME: FLASH_PRG.C
DESIGNER: 戴展波
DATE: 2004/11/10
******************************************************************************/
#include <stdio.h>
#include <csl.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_emifb.h>
#include <csl_irq.h>
#include "flash.h"
#include "flash_timer.h"
static EMIFB_Config MyEmifbConfig =
{
EMIFB_GBLCTL_RMK
(
EMIFB_GBLCTL_EK2RATE_FULLCLK, //1 X EMIF input clock
EMIFB_GBLCTL_EK2HZ_CLK, //eclkout2 continue output during hold
EMIFB_GBLCTL_EK2EN_ENABLE, //eclkout2 enable output
EMIFB_GBLCTL_BRMODE_MRSTATUS, //bus request is memory access or refresh pending/in progress
EMIFB_GBLCTL_NOHOLD_ENABLE,
EMIFB_GBLCTL_EK1HZ_CLK, //eclkout1 continue output during hold
EMIFB_GBLCTL_EK1EN_ENABLE //eclkout1 enable output
),
0x22a28a22,
0xffffff0f,
// 0x20a0c402,
0x22a28a22,
0x22a28a22,
EMIFB_SDCTL_DEFAULT,
EMIFB_SDTIM_DEFAULT,
EMIFB_SDEXT_DEFAULT,
0x00000002,
0x00000002,
0x00000002,
0x00000002
};
unsigned int boot_addr = 0x64000000;
Uint32 k;
extern far void vectors();
void main()
{
unsigned int i;
//初始化CSL
CSL_init();
//配置EMIFA
EMIFB_config(&MyEmifbConfig);
//设置中断矢量表地址
IRQ_setVecs(vectors);
//NMI使能
IRQ_nmiEnable();
//开总中断
IRQ_globalEnable();
//整片擦除
flash_erase(0,0x10);
for(i = 0; i < 0xffff; i++);
//在地址0x64000000处写BOOT
for(i = 0; i < BOOT_SECTION_SIZE; i++)
{
flash_writes(boot_addr++,*((unsigned char *)(BOOT_SECTION_ADDRESS+i)));
}
//在地址0x64000400处写ENTRY_POINT
flash_writes(boot_addr++,ENTRY_POINT>>24);
flash_writes(boot_addr++,ENTRY_POINT>>16);
flash_writes(boot_addr++,ENTRY_POINT>>8);
flash_writes(boot_addr++,ENTRY_POINT);
//cinit段长度
flash_writes(boot_addr++,CINIT_SECTION_SIZE>>24);
flash_writes(boot_addr++,CINIT_SECTION_SIZE>>16);
flash_writes(boot_addr++,CINIT_SECTION_SIZE>>8);
flash_writes(boot_addr++,CINIT_SECTION_SIZE);
//cinit段在RAM中的地址
flash_writes(boot_addr++,CINIT_SECTION_ADDRESS>>24);
flash_writes(boot_addr++,CINIT_SECTION_ADDRESS>>16);
flash_writes(boot_addr++,CINIT_SECTION_ADDRESS>>8);
flash_writes(boot_addr++,CINIT_SECTION_ADDRESS);
//cinit段的数据
for(i = 0; i < CINIT_SECTION_SIZE; i++)
{
flash_writes(boot_addr++,*((unsigned char *)(CINIT_SECTION_ADDRESS+i)));
}
/* //text段长度
flash_writes(boot_addr++,TEXT_SECTION_SIZE>>24);
flash_writes(boot_addr++,TEXT_SECTION_SIZE>>16);
flash_writes(boot_addr++,TEXT_SECTION_SIZE>>8);
flash_writes(boot_addr++,TEXT_SECTION_SIZE);
//cinit段在RAM中的地址
flash_writes(boot_addr++,TEXT_SECTION_ADDRESS>>24);
flash_writes(boot_addr++,TEXT_SECTION_ADDRESS>>16);
flash_writes(boot_addr++,TEXT_SECTION_ADDRESS>>8);
flash_writes(boot_addr++,TEXT_SECTION_ADDRESS);
//cinit段的数据
for(i = 0; i < TEXT_SECTION_SIZE; i++)
{
flash_writes(boot_addr++,*((unsigned char *)(TEXT_SECTION_ADDRESS+i)));
}*/
//table end
for(i = 0; i < 3; i++)
{
flash_writes(boot_addr++,TABLE_END>>24);
flash_writes(boot_addr++,TABLE_END>>16);
flash_writes(boot_addr++,TABLE_END>>8);
flash_writes(boot_addr++,TABLE_END);
}
//从0x64000000地址开始,读出长度为0x1000的数据到DATA
//flash_readm(0x64000000,&data[0],0x1000);
for(;;)
{
printf("flash program is over!");
exit();
}
}
Uint32 flash_erase(Uint32 addr,unsigned char type)
{
Uint32 i,j;
*FLASH_5555 = FLASH_UL1; //first
*FLASH_2AAA = FLASH_UL2; //second
*FLASH_5555 = FLASH_UL3; //third
*FLASH_5555 = FLASH_UL4;
*FLASH_2AAA = FLASH_UL5;
switch(type)
{
case 0x50: //block erase
*(unsigned char *)addr = type;
while((*(unsigned char *)addr & 0x80) != 0x80);
for(i = 0; i < BLOCK_SIZE; i++)
{
if(*(unsigned char *)(addr + i) != 0xffff)
{
j = 0;
break;
}
}
j = 1;
break;
case 0x30: //sector erase
*(unsigned char *)addr = type;
while((*(unsigned char *)addr & 0x80) != 0x80);
for(i = 0; i < SECTOR_SIZE; i++)
{
if(*(unsigned char *)(addr + i) != 0xffff)
{
j = 0;
break;
}
}
j = 1;
break;
case 0x10: //chip erase
*FLASH_5555 = type;
while((*FLASH_5555 & 0x80) != 0x80);
for(i = 0; i < CHIP_SIZE; i++)
{
if(*(unsigned char *)(addr + i) != 0xffff)
{
j = 0;
break;
}
}
j = 1;
break;
default:
break;
}
return (j);
}
void flash_writes(Uint32 addr,unsigned char data)
{
*FLASH_5555 = FLASH_UL1;
*FLASH_2AAA = FLASH_UL2;
*FLASH_5555 = FLASH_PROGRAM;
*(unsigned char *)addr = data;
while(*(unsigned char *)addr != data);
}
void flash_writem(Uint32 addr,unsigned char *ptr,unsigned int length)
{
Uint32 i;
for(i = 0; i < length; i++)
{
flash_writes(addr+i,*(ptr+i));
//for(k = 0; k < 0xfff; k++);
}
}
Uint32 flash_reads(Uint32 addr)
{
return (*(unsigned char *)addr);
}
void flash_readm(Uint32 addr,unsigned char *ptr,unsigned int length)
{
Uint32 i;
for(i = 0; i < length; i++)
{
*(ptr + i) = flash_reads(addr+i);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -