📄 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
};*/
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,//ce0
// 0x20a0c402,
// 0x1051c4B1,//ce0
// 0xffffff0f,//ce1
// 0x1051c401,//ce1
0x20a0c402,//ce1
0x1051c4B1,
0x1051c4B1,//用到CE3
EMIFB_SDCTL_DEFAULT,
EMIFB_SDTIM_DEFAULT,
EMIFB_SDEXT_DEFAULT,
0x00000002,
0x00000002,
0x00000002,
0x00000002
/* 0x00000031,
0x00000031,
0x00000031,
0x00000031 //用到CE3*/
};
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();
//整片擦除
C6416_FLASH_erase(C6416_FLASH_BASE,C6416_FLASH_PAGESIZE);
for(i = 0; i < 0xffff; i++);
//在地址0x64000000处写BOOT
for(i = 0; i < BOOT_SECTION_SIZE; i++)
{
C6416_FLASH_write(boot_addr++,*((unsigned char *)(BOOT_SECTION_ADDRESS+i)));
}
//在地址0x64000400处写ENTRY_POINT
C6416_FLASH_write(boot_addr++,ENTRY_POINT>>24);
C6416_FLASH_write(boot_addr++,ENTRY_POINT>>16);
C6416_FLASH_write(boot_addr++,ENTRY_POINT>>8);
C6416_FLASH_write(boot_addr++,ENTRY_POINT);
//cinit段长度
C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE>>24);
C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE>>16);
C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE>>8);
C6416_FLASH_write(boot_addr++,CINIT_SECTION_SIZE);
//cinit段在RAM中的地址
C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS>>24);
C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS>>16);
C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS>>8);
C6416_FLASH_write(boot_addr++,CINIT_SECTION_ADDRESS);
//cinit段的数据
for(i = 0; i < CINIT_SECTION_SIZE; i++)
{
C6416_FLASH_write(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++)
{
C6416_FLASH_write(boot_addr++,TABLE_END>>24);
C6416_FLASH_write(boot_addr++,TABLE_END>>16);
C6416_FLASH_write(boot_addr++,TABLE_END>>8);
C6416_FLASH_write(boot_addr++,TABLE_END);
}
//从0x64000000地址开始,读出长度为0x1000的数据到DATA
//flash_readm(0x64000000,&data[0],0x1000);
for(;;)
{
printf("flash program is over!");
exit();
}
}
void C6416_FLASH_erase(Uint32 start, Uint32 length)
{
Int16 i;
Uint8 *pdata;
Uint32 sector_base, end;
/* Calculate extents of range to erase */
end = start + length - 1;
/* Walk through each sector, erase any sectors within range */
sector_base = C6416_FLASH_BASE;
for (i = 0; i < C6416_FLASH_SECTORS; i++)
{
if ((start <= sector_base) && (sector_end[i] <= end))
{
/* Start sector erase sequence */
*((Uint8 *)C6416_FLASH_BASE) = 0xaa;
*((Uint8 *)C6416_FLASH_BASE) = 0x55;
*((Uint8 *)C6416_FLASH_BASE) = 0x80;
*((Uint8 *)C6416_FLASH_BASE) = 0xaa;
*((Uint8 *)C6416_FLASH_BASE) = 0x55;
/* Start erase at sector address */
pdata = (Uint8 *)sector_base;
*pdata = 0x30;
/* Wait for erase to complete */
while (1)
{
if (*pdata & 0x80)
{
printf("ok\n");
break;
}
}
/* Put back in read mode */
*((Uint8 *)C6416_FLASH_BASE) = 0xf0;
}
/* Advance to next sector */
sector_base = sector_end[i] + 1;
}
}
void C6416_FLASH_write(Uint32 addr,unsigned char data)
{
*((Uint8 *)C6416_FLASH_BASE) = FLASH_UL1;
*((Uint8 *)C6416_FLASH_BASE) = FLASH_UL2;
*((Uint8 *)C6416_FLASH_BASE) = FLASH_PROGRAM;
*(unsigned char *)addr = data;
while(*(unsigned char *)addr != data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -