📄 burn_flash.c
字号:
#include "datatype.h"
#include "c6701_hw.h"
#define PROMGRAM_IPRAM_FILENAME "ipram_bootcode.dat"
#define PROMGRAM_IDRAM_FILENAME "idram_bootcode.dat"
#define PROMGRAM_SRAM_FILENAME "sram_bootcode.dat"
INT32U read_program_file(INT8S *filename, INT8U *pcode, INT32U *pbytes);
void verify_data(INT32U *p_unknown, INT16U *p_known, INT32U cnt);
void flash_write_once(INT32U *pflash, INT16U *pdata, INT32U cnt);
void flash_sector_write(INT32U * pflash_sector_addr, INT16U *pdata);
// for simple boot program.
void main0()
{
INT8S *ipram_filename, *idram_filename;
INT32U *pflash_ipram_prog, *pflash_idram_prog;
INT8U *pdata_ipram_prog, *pdata_idram_prog;
INT32U ipram_prog_bytes, idram_prog_bytes;
INT32U err = 0;
ipram_filename = PROMGRAM_IPRAM_FILENAME;
idram_filename = PROMGRAM_IDRAM_FILENAME;
pdata_ipram_prog = (INT8U *)SRAM_BASE_ADDR;
pdata_idram_prog = (INT8U *)(SRAM_BASE_ADDR + 0x10000);
// pdata_ipram_prog = (INT8U *)(IDRAM_ADDR+0x3000);
// pdata_idram_prog = (INT8U *)(IDRAM_ADDR+0x3000);
pflash_ipram_prog = (INT32U *)FLASH_BASE_ADDR;
pflash_idram_prog = (INT32U *)FLASH_DRAM_ADDR;
// C6701_EMIF_init();
emif_config();
//read ipram file;
printf("\nread ipram file from hard disk...\n");
err = read_program_file(ipram_filename, pdata_ipram_prog, &ipram_prog_bytes);
if(err)
{
printf("ERROR: call read_program_file() in main()");
return;
}
printf(" ipram file size(byte):0x%08x\n", ipram_prog_bytes);
flash_write_once(pflash_ipram_prog, (INT16U *)pdata_ipram_prog, ipram_prog_bytes/2);
printf("verify data...\n");
verify_data(pflash_ipram_prog, (INT16U *)pdata_ipram_prog, ipram_prog_bytes/2);
//read ipram file;
printf("\nread idram file from hard disk...\n");
err = read_program_file(idram_filename, pdata_idram_prog, &idram_prog_bytes);
if(err)
{
printf("ERROR: call read_program_file() in main()");
return;
}
printf(" idram file size(byte):0x%08x\n", idram_prog_bytes);
flash_sector_write(pflash_idram_prog, (INT16U *)pdata_idram_prog);
printf("verify data...\n");
verify_data(pflash_idram_prog, (INT16U *)pdata_idram_prog, idram_prog_bytes/2);
printf("\nSUCCED: load program to flash\n");
}
// for boot to SRAM
void main()
{
INT8S *ipram_filename, *idram_filename, *SRAM_filename;
INT32U *pflash_ipram_prog, *pflash_idram_prog, *pflash_sram_prog;
INT8U *pdata_ipram_prog, *pdata_idram_prog, *pdata_sram_prog;
INT32U ipram_prog_bytes, idram_prog_bytes, sram_prog_bytes;
INT32U err = 0;
ipram_filename = PROMGRAM_IPRAM_FILENAME;
idram_filename = PROMGRAM_IDRAM_FILENAME;
SRAM_filename = PROMGRAM_SRAM_FILENAME;
pdata_ipram_prog = (INT8U *)SRAM_BASE_ADDR;
pdata_idram_prog = (INT8U *)(SRAM_BASE_ADDR + 0x10000);
pdata_sram_prog = (INT8U *)(SRAM_BASE_ADDR + 0x20000);
pflash_ipram_prog = (INT32U *)FLASH_BASE_ADDR;
pflash_idram_prog = (INT32U *)FLASH_DRAM_ADDR;
pflash_sram_prog = (INT32U *)FLASH_SRAM_ADDR;
// C6701_EMIF_init();
emif_config();
//read sram file;
printf("\nread sram file from hard disk...\n");
err = read_program_file(SRAM_filename, pdata_sram_prog, &sram_prog_bytes);
if(err)
{
printf("ERROR: call read_program_file() in main()");
return;
}
printf(" sram file size(byte):0x%08x\n", sram_prog_bytes);
flash_write_once(pflash_sram_prog, (INT16U *)pdata_sram_prog, sram_prog_bytes/2);
printf("verify data...\n");
verify_data(pflash_sram_prog, (INT16U *)pdata_sram_prog, sram_prog_bytes/2);
//read ipram file;
printf("\nread ipram file from hard disk...\n");
err = read_program_file(ipram_filename, pdata_ipram_prog, &ipram_prog_bytes);
if(err)
{
printf("ERROR: call read_program_file() in main()");
return;
}
printf(" ipram file size(byte):0x%08x\n", ipram_prog_bytes);
flash_sector_write(pflash_ipram_prog, (INT16U *)pdata_ipram_prog);
printf("verify data...\n");
verify_data(pflash_ipram_prog, (INT16U *)pdata_ipram_prog, ipram_prog_bytes/2);
//read idram file;
printf("\nread idram file from hard disk...\n");
err = read_program_file(idram_filename, pdata_idram_prog, &idram_prog_bytes);
if(err)
{
printf("ERROR: call read_program_file() in main()");
return;
}
printf(" idram file size(byte):0x%08x\n", idram_prog_bytes);
flash_sector_write(pflash_idram_prog, (INT16U *)pdata_idram_prog);
printf("verify data...\n");
verify_data(pflash_idram_prog, (INT16U *)pdata_idram_prog, idram_prog_bytes/2);
printf("\nSUCCED: load program to flash\n");
}
// for boot loader
void main1()
{
INT8S *ipram_filename;
INT32U *pflash_ipram_prog;
INT8U *pdata_ipram_prog;
INT32U ipram_prog_bytes;
INT32U err = 0;
ipram_filename = PROMGRAM_IPRAM_FILENAME;
pdata_ipram_prog = (INT8U *)SRAM_BASE_ADDR;
pflash_ipram_prog = (INT32U *)FLASH_BASE_ADDR;
// C6701_EMIF_init();
emif_config();
//read ipram file;
printf("\nread ipram file from hard disk...\n");
err = read_program_file(ipram_filename, pdata_ipram_prog, &ipram_prog_bytes);
if(err)
{
printf("ERROR: call read_program_file() in main()");
return;
}
printf(" ipram file size(byte):0x%08x\n", ipram_prog_bytes);
flash_sector_write(pflash_ipram_prog, (INT16U *)pdata_ipram_prog);
printf("verify data...\n");
verify_data(pflash_ipram_prog, (INT16U *)pdata_ipram_prog, ipram_prog_bytes/2);
printf("\nSUCCED: load boot loader program to flash\n");
}
INT32U read_program_file(INT8S *filename, INT8U *pcode, INT32U *pbytes)
{
FILE *fp;
INT32U file_bytes;
fp = fopen(filename, "rb");
if( fp==NULL )
{
printf("ERROR: cannot open file %s\n", filename);
return 1;
}
// get file size
fseek(fp, 0, SEEK_END);
file_bytes = ftell(fp);
fseek(fp, 0, SEEK_SET);
// rewind(fp);
fread(pcode, 1, file_bytes, fp);
fclose(fp);
*pbytes = file_bytes;
return 0;
}
void verify_data(INT32U *p_unknown, INT16U *p_known, INT32U cnt)
{
INT32U i;
INT16U temp;
for(i=0; i<cnt; i++)
{
temp = (INT16U)p_unknown[i];
if( temp != p_known[i] )
{
printf("ERROR: data verify fail: addr(0x%08x) should be 0x%08x, but is 0x%08x\n", p_unknown+i*4, p_known[i], p_unknown[i] );
exit(1);
}
}
return;
}
void flash_sector_write(INT32U * pflash_sector_addr, INT16U *pdata)
{
printf("\nBegin to erase flash sector address 0x%08x\n", (INT32U)pflash_sector_addr);
flash_sector_erase(pflash_sector_addr);
printf("\nflash sector program begin...\n");
flash_program(pflash_sector_addr, pdata, 0x8000);
return;
}
void flash_write_once(INT32U *pflash, INT16U *pdata, INT32U cnt)
{
INT32U *pflash_base_addr;
pflash_base_addr = (INT32U *)FLASH_BASE_ADDR;
printf("\nFlash chip erase begin...\n");
flash_chip_erase(pflash_base_addr);
printf("\nFlash program begin...\n");
flash_program(pflash, pdata, cnt);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -