⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 burn_flash.c

📁 于TI DSP TMS320C67XX实现的嵌入式系统FLASH引导的实现。程序控制一片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 + -