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

📄 sys_fis.c

📁 某个ARM9板子的实际bootloader 对裁剪
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** Copyright  Storlink Corp 2005.  All rights reserved.                *--------------------------------------------------------------------------* Name			: sys_fis.c* Description	: *		Handle FLASH Image System (FIS)* History**	Date		Writer		Description*	-----------	-----------	-------------------------------------------------*	08/01/2005	Gary Chen	Create*****************************************************************************/#include <define.h>#include <board_config.h>#include <sl2312.h>#include <sys_fis.h>#ifdef BOARD_SUPPORT_FIS//static unsigned char *fis_datap;unsigned char *fis_datap;static void fis_create_default(void);//static unsigned long fis_desc_chksum(FIS_T *img);unsigned long fis_desc_chksum(FIS_T *img);static FIS_T *fis_get_free_image(void);//static void fis_write_flash(void);void fis_write_flash(void);#ifdef BOARD_SUPPORT_TWO_CPUextern char     _exception_handlers[];extern char     _exception_handlers_end[];#endif/*----------------------------------------------------------------------* sys_fis_init*	looking for BOOT-1, BOOT-2, Kernel & RAM-Disk file image.*	If Kernel & RAM-DISK files are found, return 0*	If not found, create FIS with default Boot-1 and Boot-2 *	return -1 if error*----------------------------------------------------------------------*/int sys_fis_init(void) {	int i;	FIS_T *img;	char *datap;	UINT32 ipaddr, netmask, gateway;		fis_datap = (unsigned char *)sys_malloc(FIS_TOTAL_SIZE);	if (!fis_datap)	{		printf("sys_fis_init: No free memory!\n");		return -1;	}		// get image files from FLASH	hal_flash_enable();	memcpy(fis_datap, BOARD_FLASH_FIS_ADDR, FIS_TOTAL_SIZE);	hal_flash_disable();		// check FIS existed or not	// create one if not found	// check kernel	img = fis_find_image(BOARD_FIS_BOOT_NAME);	if (!img)	{		printf("FIS is not found! Create a default FIS!\n");		fis_create_default();		return -1;	}		// get IP address	datap = img->data;	ipaddr = str2ip(datap);	datap += strlen(datap) + 1;	netmask = str2ip(datap);	datap += strlen(datap) + 1;	gateway = str2ip(datap);	sys_set_ip_addr(ipaddr);	sys_set_ip_netmask(netmask);	sys_set_ip_gateway(gateway);		// check kernel	img = fis_find_image(BOARD_FIS_KERNEL_NAME);	if (!img || !img->file.mem_base || !img->file.entry_point)	{		printf("Cound not load the Kernel!\n");		return -1;	}#if 1	// SJC	img->file.size = BOARD_KERNEL_SIZE;	img->desc_cksum = fis_desc_chksum(img);#endif	// check ram disk#if (BOARD_RAM_DISK_SIZE != 0)	img = fis_find_image(BOARD_FIS_RAM_DISK_NAME);	if (!img || !img->file.mem_base)	{		printf("Cound not load the RAM Disk!\n");		return -1;	}#endif			return 0;}/*----------------------------------------------------------------------* fis_load_images* load image to dram*----------------------------------------------------------------------*/void fis_load_images(void){	FIS_T *img;	int i, j;    unsigned long old_ints;    unsigned long *dest, *srce, size;    void (*apps_routine)(void);    unsigned int    value;#ifdef BOARD_SUPPORT_TWO_CPU	unsigned char *p ;	unsigned char *tgt0 ;#endif  	    HAL_DISABLE_INTERRUPTS(old_ints);    HAL_ICACHE_INVALIDATE_ALL();    HAL_DCACHE_INVALIDATE_ALL();    HAL_ICACHE_ENABLE();    HAL_DCACHE_ENABLE();    	apps_routine = NULL;	img = (FIS_T *)fis_datap;	for (i=0; i<FIS_MAX_ENTRY; i++, img++)	{		if (img->file.name[0] != 0xff && img->file.name[0] != 0x00 &&			img->desc_cksum == fis_desc_chksum(img) &&			img->file.flash_base && img->file.mem_base)		{			if ((strncasecmp(img->file.name, BOARD_FIS_BOOT_NAME) == 0)				|| (strncasecmp(img->file.name, BOARD_FIS_DIRECTORY_NAME) == 0))			{				continue;			}			if (!apps_routine && img->file.entry_point)				apps_routine = (void *)img->file.entry_point;				    		srce=(unsigned long *)img->file.flash_base;    		dest=(unsigned long *)img->file.mem_base;    		//size = ((img->file.size + 3) & ~3)/ 4;			printf("Load %s image from 0x%x to 0x%x size %d\n",					img->file.name, img->file.flash_base, img->file.mem_base, img->file.size);						hal_flash_enable();			value = REG32(SL2312_FLASH_CTRL_BASE + 0x0c) & 0x1f00;				if((value&0x1000)==0x1000)			{				size = img->file.size;				sys_memcpy(dest, srce, size );			}			else			{				size = ((img->file.size + 3) & ~3)/ 4;    			for (j = 0; j < size; j++)    				*dest++=*srce++;			}			hal_flash_disable();		}			}#ifdef BOARD_SUPPORT_TWO_CPU#if (CPU2_BOOT_OFFSET != 0)		// install vector	//memset(dest,0xE1A00000,0x2000000);	// set 32MB as nop for safe	size = (unsigned int)(&_exception_handlers_end[0] - &_exception_handlers[0]);	p = (unsigned char *)(&_exception_handlers[0]);	tgt0 = (unsigned char *)BOARD_DRAM_CPU2_ADDR;	while(size--) {		*tgt0 = *p;		tgt0++; p++;	}#endif		HAL_ICACHE_INVALIDATE_ALL();	HAL_DCACHE_INVALIDATE_ALL();    	printf("Start the 2nd CPU!\n");	REG32(0x66000040) = CPU2_RAM_BASE + CPU2_RAM_SIZE;	REG32(GLOBAL_CTRL_CPU1_REG) &= ~CPU1_RESET_BIT_MASK;	#endif		if (apps_routine)	{		hal_interrupt_mask_all();		HAL_DISABLE_INTERRUPTS(old_ints);    	//HAL_ICACHE_INVALIDATE_ALL();    	//HAL_DCACHE_INVALIDATE_ALL();    	//HAL_ICACHE_DISABLE();    	//HAL_DCACHE_DISABLE();    		sys_run_apps(apps_routine);	}		HAL_RESTORE_INTERRUPTS(old_ints);    HAL_ICACHE_INVALIDATE_ALL();    HAL_DCACHE_INVALIDATE_ALL();    HAL_ICACHE_ENABLE();}/*----------------------------------------------------------------------* sys_fis_list*----------------------------------------------------------------------*/void fis_ui_list(int type){	FIS_T *img;	int i;		if (!fis_datap)	{		printf("No FIS!\n");		return;	}	printf("Name              FLASH addr           Mem addr    Datalen     Entry point\n");	img = (FIS_T *)fis_datap;	for (i=0; i<FIS_MAX_ENTRY; i++, img++)	{		if (img->file.name[0] != 0xff && img->file.name[0] != 0x00 &&			img->desc_cksum == fis_desc_chksum(img))		{			printf("%-16s  0x%08lX-%08lX  0x%08lX  0x%08lX  0x%08lX\n",					img->file.name,					img->file.flash_base,					(img->file.size) ? img->file.flash_base+img->file.size-1 : img->file.flash_base,					img->file.mem_base,					img->file.data_length,					img->file.entry_point);		}	}}/*----------------------------------------------------------------------* fis_desc_chksum*	do file descriptor check sum*----------------------------------------------------------------------*/unsigned long fis_desc_chksum(FIS_T *img){	unsigned char *cp;	unsigned long sum = 0;	int i;		cp  = (unsigned char *)img;	for (i=0; i<(FIS_ENTRY_SIZE - 8); i++, cp++) // not include chksum field		sum += *cp & 0xff;		return sum;}	/*----------------------------------------------------------------------* fis_find_image*----------------------------------------------------------------------*/FIS_T *fis_find_image(char *filename){	FIS_T *img;	int i;		img = (FIS_T *)fis_datap;		for (i=0; i<FIS_MAX_ENTRY; i++, img++)	{		if (img->file.name[0] == 0xff)			break;					if ((strncasecmp(filename, img->file.name) == 0) && 			(img->desc_cksum == fis_desc_chksum(img)))		{			return img;		}	}	return NULL;}/*----------------------------------------------------------------------* fis_get_free_image*----------------------------------------------------------------------*/static FIS_T *fis_get_free_image(void){	FIS_T *img;	int i;		img = (FIS_T *)fis_datap;		for (i=0; i<FIS_MAX_ENTRY; i++, img++)	{		if (img->file.name[0] == 0xff || img->file.name[0] == 0			|| img->desc_cksum != fis_desc_chksum(img))			return img;	}	return NULL;}/*----------------------------------------------------------------------* fis_create_default*----------------------------------------------------------------------*/static void fis_create_default(void){	FIS_T	*img;	UINT32 ipaddr, netmask, gateway;	char *datap;		img = (FIS_T *)fis_datap;		memset((char *)fis_datap, -1, FIS_TOTAL_SIZE);		// boot-1	memset((char *)img, 0, FIS_ENTRY_SIZE);	strcpy(img->file.name, BOARD_FIS_BOOT_NAME);	img->file.flash_base	= BOARD_FLASH_BOOT_ADDR;	img->file.mem_base		= 0;//BOARD_FLASH_BOOT_ADDR;	img->file.size			= BOARD_FLASH_BOOT_SIZE;	img->file.entry_point	= 0; //BOARD_FLASH_BOOT_ADDR;	img->file.data_length	= BOARD_FLASH_BOOT_SIZE;		ipaddr = sys_get_ip_addr();	netmask = sys_get_ip_netmask();	gateway = sys_get_ip_gateway();	datap = img->data;	sprintf(datap, "%d.%d.%d.%d",			IP1(ipaddr), IP2(ipaddr), IP3(ipaddr), IP4(ipaddr));	datap += strlen(datap) + 1;	sprintf(datap, "%d.%d.%d.%d",			IP1(netmask), IP2(netmask), IP3(netmask), IP4(netmask));	datap += strlen(datap) + 1;	sprintf(datap, "%d.%d.%d.%d",			IP1(gateway), IP2(gateway), IP3(gateway), IP4(gateway));		img->desc_cksum			= fis_desc_chksum(img);	img++;		// FIS directory	memset((char *)img, 0, FIS_ENTRY_SIZE);	strcpy(img->file.name, BOARD_FIS_DIRECTORY_NAME);	img->file.flash_base	= BOARD_FLASH_FIS_ADDR;	img->file.mem_base		= BOARD_FLASH_FIS_ADDR;	img->file.size			= BOARD_FLASH_FIS_SIZE;	img->file.entry_point	= 0;	img->file.data_length	= FIS_TOTAL_SIZE;	img->desc_cksum			= fis_desc_chksum(img);	img++;		// kernel	memset((char *)img, 0, FIS_ENTRY_SIZE);	strcpy(img->file.name, BOARD_FIS_KERNEL_NAME);	img->file.flash_base	= BOARD_FLASH_KERNEL_ADDR;	img->file.mem_base		= BOARD_DRAM_KERNEL_ADDR;	img->file.size			= BOARD_KERNEL_SIZE;//	img->file.entry_point	= BOARD_DRAM_KERNEL_ADDR;	img->file.entry_point	= BOARD_DRAM_KERNEL_START_ADDR;	img->file.data_length	= BOARD_KERNEL_SIZE;	img->desc_cksum			= fis_desc_chksum(img);	img++;	#if 1	// SJC#else	// Ram Disk	memset((char *)img, 0, FIS_ENTRY_SIZE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -