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

📄 ui_upgrade.c

📁 某个ARM9板子的实际bootloader 对裁剪
💻 C
字号:
/***************************************************************************** Copyright  Storlink Corp 2005.  All rights reserved.                *--------------------------------------------------------------------------* Name			: ui_upgrade.c* Description	: *		Handle upgrade function for UI** History**	Date		Writer		Description*	-----------	-----------	-------------------------------------------------*	04/21/2005	Gary Chen	Create*****************************************************************************/#include <define.h>#include <board_config.h>#include <Xmodem/Xmodem.h>#include <sys_fis.h>#define UPGRADE_RETRY_TIME		3//#define UPGRADE_COMPARE		1// const char * const upgrade_type_msg[]={"BOOT", "KERNEL", "FULL", "RAM Disk", "Application"};char tftp_ip_str[20], tftp_filename[128];extern int ui_gets(char *buf, int size);extern char *flash_errmsg(int err);extern unsigned char *fis_datap;extern void fis_write_flash(void);extern unsigned long fis_desc_chksum(FIS_T *img);#ifdef MIDWAY#if defined(LEPUS_FPGA) || defined(LEPUS_ASIC)extern void toe_gmac_disable_tx_rx(void);extern void toe_gmac_enable_tx_rx(void);#elseextern void gmac_disable_tx_rx(void);extern void gmac_enable_tx_rx(void);#endifextern void emac_enable_tx_rx(void);extern void emac_disable_tx_rx(void);#endifint ui_download(char *destp, int erase_size, int max_size);#define IMGHDR_SIZE			32#define IMGHDR_NAME_SIZE	16#define IMGHDR_NAME			"SL-BOOT-001"typedef struct {	unsigned char 	name[IMGHDR_NAME_SIZE];	unsigned long	file_size;	unsigned char	reserved[IMGHDR_SIZE-IMGHDR_NAME_SIZE-4-2];	unsigned short	checksum;} IMGHDR_T;extern unsigned short sys_crc16(unsigned short crc, unsigned char *datap, unsigned long len);/*----------------------------------------------------------------------* ui_disable_mac*----------------------------------------------------------------------*/static void ui_disable_mac(void){#ifdef MIDWAY	#if defined(LEPUS_FPGA) || defined(LEPUS_ASIC)	toe_gmac_disable_tx_rx();#else	gmac_disable_tx_rx();#endif	#else	emac_disable_tx_rx();#endif	}/*----------------------------------------------------------------------* ui_enable_mac*----------------------------------------------------------------------*/static void ui_enable_mac(void){#ifdef MIDWAY	#if defined(LEPUS_FPGA) || defined(LEPUS_ASIC)	toe_gmac_enable_tx_rx();#else	gmac_enable_tx_rx();#endif	#else	emac_enable_tx_rx();#endif	}/*----------------------------------------------------------------------* ui_upgrade_boot*	return	0: if quit*			1: X-modem*			2: TFTP*----------------------------------------------------------------------*/static int ui_get_upgrade_method(void){	UINT8 key;		printf("\n\n");	printf("1  : Download by X-modem\n");	printf("2  : Download by TFTP\n");	printf("ESC: Return \n");	printf("==> ");	do	{		key = ui_getc();		if (key == '1')		{			printf("1\n");			return 1;		}		else if (key == '2')		{			printf("2\n");			return 2;		}		else if (key == 0x1b)		{			printf("Quit!\n");			return 0;		}	} while (1);}/*----------------------------------------------------------------------* do_xmodem_download*  return *		TRUE if OK, FALSE if failed*----------------------------------------------------------------------*/int do_xmodem_download(char *bufp, int buf_size, int *size){	int err;		ui_disable_mac();	printf("Start the file transfer of Terminal...\n");	if (Xmodem_open(&err) != 0)	{		Xmodem_terminate(1);		Xmodem_close(&err);		printf("\nError to open X-modem! (%d) %s\n", err, Xmodem_get_error_msg(err));		ui_enable_mac();		return FALSE;	}	*size = Xmodem_read(bufp, buf_size, &err);		if (err < 0 && err != XMODEM_ERR_EOF)	{		Xmodem_terminate(1);		Xmodem_close(&err);		printf("\nFaile to upgrade! (%d) %s!\n", err, Xmodem_get_error_msg(err));		ui_enable_mac();		return FALSE;	}	Xmodem_terminate(0);	Xmodem_close(&err);		printf("\n\nSuccessful to download! Size=%d", *size);		if(*size < 100)	{		printf("No Data Received!\n");			ui_enable_mac();		return FALSE;	}	printf("\n");	ui_enable_mac();	return TRUE;}/*----------------------------------------------------------------------* do_tftp_download*  return *		TRUE if OK, FALSE if failed*----------------------------------------------------------------------*/int do_tftp_download(char *bufp, int buf_size, int *size){	int rc;	UINT32 ipaddr;		printf("TFTP Server IP Address: ");	rc = ui_gets(tftp_ip_str, sizeof(tftp_ip_str));	ipaddr = str2ip(tftp_ip_str);	if (rc == 0 || ipaddr == 0 || ipaddr == 0xffffffff)	{		printf("Illegal IP address!\n");		return FALSE;	}		printf("Image Path and name(e.g. /images/zImage): ");	rc = ui_gets(tftp_filename, sizeof(tftp_filename));	if (rc == 0)	{		printf("Illegal image name!\n");		return FALSE;	}			printf("TFTP Download %s from %d.%d.%d.%d ...",			tftp_filename, IP1(ipaddr), IP2(ipaddr), IP3(ipaddr), IP4(ipaddr));				if ((rc = tftpc_get(tftp_filename, ipaddr, bufp, buf_size, size)) != 0)	{		printf("\n\nFailed for TFTP! (%d) %s\n", rc, tftp_err_msg(rc));    	return FALSE;	}		printf("\n\nSuccessful to download by TFTP! Size=%d", *size);		printf("\n");		return TRUE;}/*----------------------------------------------------------------------* ui_upgrade_boot*	int type: *		0: Boot*		1: Kernel*		2: Full*		3: RAM Disk*		4: Application*----------------------------------------------------------------------*/void ui_upgrade(int type){    char	*destp;    int		erase_size;    int 	max_size;		switch (type)	{		case 0:	// Boot			destp = (char *)BOARD_FLASH_BOOT_ADDR;			max_size = erase_size = BOARD_FLASH_BOOT_SIZE;			break;		case 1:	// Kernel#ifndef LOAD_FROM_IDE					destp = (char *)BOARD_FLASH_KERNEL_ADDR;			max_size = erase_size = BOARD_KERNEL_SIZE;#endif						break;		case 2:	// Full Image#ifndef LOAD_FROM_IDE					destp = (char *)BOARD_FLASH_BASE_ADDR;			max_size = erase_size = BOARD_FLASH_SIZE;#endif						break;		case 3:	// RAM Disk#ifndef LOAD_FROM_IDE					destp = (char *)BOARD_FLASH_RAM_DISK_ADDR;			max_size = erase_size = BOARD_RAM_DISK_SIZE;#endif						break;		case 4:	// Application#ifndef LOAD_FROM_IDE					destp = (char *)BOARD_FLASH_APPS_ADDR;			max_size = erase_size = BOARD_APPS_SIZE;#endif						break;		default:			printf("Unknown upgrade type!\n");			return ;	}		ui_download(destp, erase_size, max_size);}	/*----------------------------------------------------------------------* verify_image_file*	return 	0: checksum OK*			1: Incorrect header*			-1; Checksum error*----------------------------------------------------------------------*/static int verify_image_file(char *datap){	IMGHDR_T 		*img;	unsigned short	crc16;		img = (IMGHDR_T *)datap;	if (strcmp(img->name, IMGHDR_NAME) != 0)		return 1;			datap += IMGHDR_SIZE;	crc16 = 0xffff;	crc16 = sys_crc16(crc16, datap, img->file_size);	crc16 ^= 0xffff;		return (img->checksum == crc16) ? 0 : -1;}/*----------------------------------------------------------------------* ui_download*----------------------------------------------------------------------*/int ui_download(char *destp, int erase_size, int max_size){	int				i, j, stat, tmp=0;    unsigned long	err_addr;	int				buf_size;	int				got_size = 0;	int				err;	int				method;	char			*bufp, *filep, *rbuf;	FIS_T *img;	UINT64	delay_time;	UINT32	delay_ticks;		if (erase_size)		buf_size = erase_size + 1024;	else		buf_size = (BOARD_FLASH_SIZE);	filep = bufp = (char *)malloc(buf_size);	if (!bufp)	{		printf("No free memory to upgrade (0x%x)!\n", destp);		return 0;	}#ifdef UPGRADE_COMPARE	rbuf = (char *)malloc(buf_size);	if (!rbuf)	{		printf("No free memory to compare (0x%x)!\n", destp);		return 0;	}#endif		method = ui_get_upgrade_method();	switch (method)	{		case 1: // Upgrade by X-modem			if (!do_xmodem_download(bufp, buf_size, &got_size))			{				free(bufp);				return 0;			}			break;		case 2: // Upgrade by TFTP			if (!do_tftp_download(bufp, buf_size, &got_size))			{				free(bufp);				return 0;			}			break;		default:			printf("Unknown!\n");			free(bufp);			return 0;	}		if (max_size)	{		if (got_size > max_size)		{			printf("File is too large!\n");			free(bufp);			return 0;		}	}	ui_disable_mac();	if ((unsigned long)destp == BOARD_FLASH_BOOT_ADDR)	{		int rc = verify_image_file(filep);		if (rc == 0)		{			filep += IMGHDR_SIZE;			got_size -= IMGHDR_SIZE;		}		else if (rc < 0)		{			printf("\nChecksum error!!!\n");			free(bufp);			ui_enable_mac();			return 0;		} 		else // if (rc == 1) 		{			printf("\nUnknown image header!!\n");			printf("Are you sure to continue (Y/N) ? ");			if (!ui_get_confirm_key())			{				printf("\nAborted by user!\n");					free(bufp);				ui_enable_mac();				return 0;			}		}	}				printf("\nDo not power-off this device while flash programming is proceeding!!\n");	//printf("Are you sure to program flash 0x%x (Y/N) ? ", destp);	//if (!ui_get_confirm_key())	//{	//	printf("\nAborted by user!\n");		//	free(bufp);	//	ui_enable_mac();	//	return 0;	//}		printf("==> enter ^C to abort program flash 0x%x within %d seconds ...... \n", 			destp, BOARD_BOOT_TIMEOUT);	delay_ticks = (BOARD_BOOT_TIMEOUT * BOARD_TPS);	delay_time = sys_get_ticks() + delay_ticks;		while (sys_get_ticks() < delay_time)	{		unsigned char c;		if (uart_scanc(&c) && c == BOOT_BREAK_KEY)		{				printf("\nAborted by user!\n");					free(bufp);				ui_enable_mac();				return 0;		}	}			printf("\n");		if (erase_size == 0)		erase_size = got_size;	for (i=0, stat=1; i<UPGRADE_RETRY_TIME && stat!=0; i++)	{		printf("Erase flash (0x%x): Size=%u ", destp, erase_size);     	if ((stat = flash_erase((void *)(destp),     							erase_size,    							(unsigned long *)&err_addr)) != 0)    	{			printf(" FAILED at 0x%x: ", err_addr);			printf((char *)flash_errmsg(stat));			printf("\n");     		continue;    	}		printf(" OK!\n"); 		printf("Program flash (0x%x): Size=%u ", destp, got_size);     	if ((stat = flash_program((void *)(destp),     							  (void *)filep,     							  got_size,     							  (unsigned long *)&err_addr)) != 0)    	{			printf(" FAILED at 0x%x: ", err_addr);			printf((char *)flash_errmsg(stat));			printf("\n"); 			continue;    	}    	else			printf(" OK!\n"); #ifdef UPGRADE_COMPARE		printf("Compare (0x%x): Size=%u ", destp, got_size); 			hal_flash_enable();    		memcpy(rbuf, destp, max_size);    		hal_flash_disable();    		for(j=0;j<got_size;j++)    		{    			if((j%0x10000)==0)    				printf(".");    				    			if(*(rbuf+j)!=*(filep+j))    			{    				tmp = 1;    				break;    			}    		}    		if(tmp)    			printf("Compare error at 0x%x:",j);    		else				printf(" OK!\n"); 			free(rbuf);#endif			}#ifndef LOAD_FROM_IDE		//if ((got_size > 0)&&((got_size!=BOARD_FLASH_SIZE)||(got_size!=0x800000)))	if ((got_size > 0)&&(got_size!=BOARD_FLASH_SIZE))	{		//memset((char *)img, 0, FIS_ENTRY_SIZE);		img = (FIS_T *)fis_datap;				for (j=0; j<FIS_MAX_ENTRY; j++, img++)		{			if (img->file.flash_base == destp)			{				img->file.data_length	= got_size;#if 1	// SJC#else				img->file.size			= got_size;#endif				img->desc_cksum			= fis_desc_chksum(img);										}		}		fis_write_flash();	}#endif		    if (stat!=0)    {    	printf("Failed to upgrade (0x%x)!\n", destp);		free(bufp);		ui_enable_mac();    	return 0;    }    else    {    	printf("Successful to upgrade (0x%x)!\n", destp);		free(bufp);		ui_enable_mac();    	return got_size;    }}

⌨️ 快捷键说明

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