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

📄 update.c

📁 umon bootloader source code, support mips cpu.
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
**************************************************************************************
*                            Copyright (c) 2005 vBridge Microsystem, Inc.  
*                                  Unpublished & Not for Publication
*                                        All Rights Reserved                                     
*                                                                         
* Description :  for update system
*             
* Date        :     2006-8-9                                                       
**************************************************************************************
*/
#include "cli.h"
#include "image.h"
#include "boot2cpu.h"
#include "update.h"
#include "flash.h"

#define TEMP_SPACE		0x81800000
#define IMAGE_HEAD_ADDR	0x60000
#define IMAGE_NUMBER		5

static int (*startlinux)(void);
int optind = 1;

extern char *boot_device_name;

long get_offset(e_IMAGE imageid);
	
/*
 * print sizes as "xxx kB", "xxx.y kB", "xxx MB" or "xxx.y MB" as needed;
 * allow for optional trailing string (like "\n")
 */
void print_size (unsigned int size, const char *s)
{
	unsigned int m, n;
	unsigned int d = 1 << 20;		/* 1 MB */
	char  c = 'M';

	if (size < d) {			/* print in kB */
		c = 'k';
		d = 1 << 10;
	}

	n = size / d;

	m = (10 * (size - (n * d)) + (d / 2) ) / d;

	if (m >= 10) {
		m -= 10;
		n += 1;
	}

	printf ("%2ld", n);
	if (m) {
		printf (".%ld", m);
	}
	printf (" %cB%s", c, s);
}

static void
print_type (image_header_t *hdr)
{
	char *os, *arch, *type, *comp;

	switch (hdr->ih_os) {
	case IH_OS_INVALID:	os = "Invalid OS";		break;
	case IH_OS_NETBSD:	os = "NetBSD";			break;
	case IH_OS_LINUX:	os = "Linux";			break;
	case IH_OS_VXWORKS:	os = "VxWorks";			break;
	case IH_OS_QNX:		os = "QNX";			break;
	case IH_OS_U_BOOT:	os = "U-Boot";			break;
	case IH_OS_RTEMS:	os = "RTEMS";			break;
#ifdef CONFIG_ARTOS
	case IH_OS_ARTOS:	os = "ARTOS";			break;
#endif
#ifdef CONFIG_LYNXKDI
	case IH_OS_LYNXOS:	os = "LynxOS";			break;
#endif
	default:		os = "Unknown OS";		break;
	}

	switch (hdr->ih_arch) {
	case IH_CPU_INVALID:	arch = "Invalid CPU";		break;
	case IH_CPU_ALPHA:	arch = "Alpha";			break;
	case IH_CPU_ARM:	arch = "ARM";			break;
	case IH_CPU_I386:	arch = "Intel x86";		break;
	case IH_CPU_IA64:	arch = "IA64";			break;
	case IH_CPU_MIPS:	arch = "MIPS";			break;
	case IH_CPU_MIPS64:	arch = "MIPS 64 Bit";		break;
	case IH_CPU_PPC:	arch = "PowerPC";		break;
	case IH_CPU_S390:	arch = "IBM S390";		break;
	case IH_CPU_SH:		arch = "SuperH";		break;
	case IH_CPU_SPARC:	arch = "SPARC";			break;
	case IH_CPU_SPARC64:	arch = "SPARC 64 Bit";		break;
	case IH_CPU_M68K:	arch = "M68K"; 			break;
	case IH_CPU_MICROBLAZE:	arch = "Microblaze"; 		break;
	case IH_CPU_NIOS:	arch = "Nios";			break;
	case IH_CPU_NIOS2:	arch = "Nios-II";		break;
	default:		arch = "Unknown Architecture";	break;
	}

	switch (hdr->ih_type) {
	case IH_TYPE_INVALID:	type = "Invalid Image";		break;
	case IH_TYPE_STANDALONE:type = "Standalone Program";	break;
	case IH_TYPE_KERNEL:	type = "Kernel Image";		break;
	case IH_TYPE_RAMDISK:	type = "RAMDisk Image";		break;
	case IH_TYPE_MULTI:	type = "Multi-File Image";	break;
	case IH_TYPE_FIRMWARE:	type = "Firmware";		break;
	case IH_TYPE_SCRIPT:	type = "Script";		break;
	default:		type = "Unknown Image";		break;
	}

	switch (hdr->ih_comp) {
	case IH_COMP_NONE:	comp = "uncompressed";		break;
	case IH_COMP_GZIP:	comp = "gzip compressed";	break;
	case IH_COMP_BZIP2:	comp = "bzip2 compressed";	break;
	default:		comp = "unknown compression";	break;
	}

	printf ("%s %s %s (%s)", arch, os, type, comp);
}

void
print_image_hdr (image_header_t *hdr)
{
	printf("Magic: 0x%x: \n",hdr->ih_magic);
	printf ("   Image Name:   %s\n", hdr->ih_name);
	puts ("   Image Type:   "); print_type(hdr);
	printf ("\n   Data Size:    %d Bytes = ", hdr->ih_size);
	print_size (hdr->ih_size, "\n");
	printf ("   Load Address: %08x\n"
		"   Entry Point:  %08x\n",
		 hdr->ih_load,hdr->ih_ep);

	if (hdr->ih_type == IH_TYPE_MULTI) {
		int i;
		unsigned int len;
		unsigned int *len_ptr = (unsigned int *)((unsigned int)hdr + sizeof(image_header_t));

		puts ("   Contents:\n");
		for (i=0; (len = *len_ptr); ++i, ++len_ptr) {
			printf ("   Image %d: %8ld Bytes = ", i, len);
			print_size (len, "\n");
		}
	}
}

void print_warning(void)
{
	//printf();
	puts("  //********************************************************//\n");
	puts("  //***                                                  ***//\n");
	puts("  //***   WARNING:  Update process will erase flash!!!   ***//\n");
	puts("  //***             Please keep power on!!               ***//\n");
	puts("  //***                                                  ***//\n");
	puts("  //********************************************************//\n");
	puts("  \nPress 'y' for update & 'n' cancel: \n");
}

#ifdef VB_update

char *UpdateHelp[] = {
	"Update system image",
	"update [tftpsrv] [imagename]",
	0,
};

/* Update():
 *	Code that handles the user interface.  See UpdateHelp[] below for usage.
 */
int
Update(int argc,char *argv[])
{
	char	*mode, *file, *info, *flags;
	unsigned int addr,data,len,checksum,verify,tftpsize,new_version,i,snum,process,step,rc;
	image_header_t *phead,header;
	short *tmp;
	struct flashinfo *fdev;

	printf("update 1\n");
	fdev = nametofdev(boot_device_name);
	printf("update 2\n");
	//fdev = nametofdev(boot_device_name);

	phead = &header;
	
	//get image file through tftp client
	file = (char *)0;
	info = (char *)0;
	flags = (char *)0;
	mode = "octet";

	//RiscBootRisc1();
	//return 0;
	
	if (argc == 4)
		addr = (unsigned int)strtol(argv[3],0,0);
	else if (argc == 3)
		addr = getAppRamStart();
	else
		return(CMD_PARAM_ERROR);

	puts("\n//============  STEP 1: Download image:\n");
	printf("Downloader update image from %s to 0x%x...\n",argv[1],addr);
	tftpsize = tftpGet(addr,argv[1],mode,argv[2],file,flags,info);
	if(!tftpsize)
		return 0;
	//printf("Downloader OK,CRC check...\n");

	phead = (image_header_t *)addr;
	
	puts("\n//============  STEP 2: File check\n");
	if(phead->ih_magic != IH_MAGIC)
	{
		puts ("Bad Magic Number\n");
		return 0;
	}	

	data = addr;
	len = sizeof(image_header_t);

	checksum = phead->ih_hcrc;
	phead->ih_hcrc = 0;

	if (crc32 (0, (unsigned char *)data, len) != checksum) {
		puts ("Bad Header Checksum\n");
		return 1;
	}

	data = addr + sizeof(image_header_t);
	len  = phead->ih_size;

	verify = 1;
	if (verify) {
		puts ("   Verifying Checksum ... ");
		if (crc32 (0, (unsigned char *)data, len) != phead->ih_dcrc) {
			printf ("Bad Data CRC\n");
			return 1;
		}
		puts ("OK\n");
	}
	
	puts("\n//============  STEP 3: Display image header\n");
	puts("\nNew image:\n");
	print_image_hdr(phead);

	len += sizeof(image_header_t);
	//new_version = phead->ih_version;
	//data = (int *)&header;
/*	
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
	NorFlashRd(IMAGE_HEAD_ADDR, (short *)&header, sizeof(image_header_t)/2+1);
#else
	SflashReadByte(IMAGE_HEAD_ADDR, (char *)&header, sizeof(image_header_t));
#endif

	//phead = 0xa181e000;

	puts("\nOld image:\n");
	print_image_hdr(&header);
*/
	puts("\n//============  STEP 4: Erase & Write flash\n\n");
	print_warning();
	while(1)
	{
		char readchar = (char)getchar();
		if( readchar == 'y') 
		{
			//printf("\nBootloader console...\n");
			break;
		}
		else if(readchar =='n')
		{
			return 0;
		}
		else
			print_warning();
			
	}
	
	puts("\n");
	for(i = IMAGE_START_SEC;i<=IMAGE_END_SEC;i++)
	{
		printf("Erase sector %d...\n",i);
		rc = fdev->flerase(fdev,i);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
		NorFlashErase(i);
#else

		SflashSecErase(i);
#endif
		printf("OK\n");
*/
	}

	printf("\nWrite image from 0x%x to 0x%x:\n",addr,IMAGE_HEAD_ADDR);
	rc = fdev->flwrite(fdev,IMAGE_HEAD_ADDR,(unsigned char *)addr,len);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
	tmp = (short *)addr;
	step = len/200;
	process = 0;
	for(snum=0;snum<=(len+1);snum+=2)
	{
		NorFlashProg(IMAGE_HEAD_ADDR+snum, *tmp++);
		//dest++;
		if(snum>=process)
	  	{
			putchar('*');
			process += step;
	  	}

	}	
#else
	SflashProgWord(IMAGE_HEAD_ADDR,addr, len/4 + 1);
#endif
*/
	printf("OK\n");
	puts("Update successfully,Please restart system!!!\n");


}

#endif


char *UpdateQVHelp[] = {
	"Updateqv system image",
	"updateqv [tftpsrv] [ucos image name] [kernel image name] [romfs image name]",
	"If image name is 'no', Don't update the image !!!",
	0,
};


/* Update():
 *	Code that handles the user interface.  See UpdateHelp[] below for usage.
 */
int
UpdateQV(int argc,char *argv[])
{
	char	*mode, *file, *info, *flags;
	unsigned int addr,data,len,checksum,verify,tftpsize,new_version,i,snum,process,step,rc;
	image_header_t *phead,header;
	short *tmp;
	struct flashinfo *fdev;

//	UPDATE_QV_FLAG = 1; // use UpdateQv to update image 

//	printf("update 1\n");
	fdev = nametofdev(boot_device_name);
//	printf("update 2\n");
	//fdev = nametofdev(boot_device_name);

	phead = &header;
	
	//get image file through tftp client
	file = (char *)0;
	info = (char *)0;
	flags = (char *)0;
	mode = "octet";

	//RiscBootRisc1();
	//return 0;
	
	if (argc == 7)
		addr = (unsigned int)strtol(argv[5],0,0);
	else if (argc == 6)
		addr = getAppRamStart();
	else
		return(CMD_PARAM_ERROR);
	
	//##########   UCOS 
	
	if(strcmp(argv[2],"no")!= 0)
	{	
		
  printf("\n Update UCOS image !!! \n");		
	printf("\n ============ STEP 1: downloading UCOS image to 0x%x ...\n\n",addr);	
	tftpsize = tftpGet(addr,argv[1],mode,argv[2],file,flags,info);
	if(!tftpsize)
		return 0;
	phead = (image_header_t *)addr;
	
	printf("\n ============ STEP 2: file checking ...\n\n");
	if(phead->ih_magic != IH_MAGIC)   //
	{
		puts ("Bad Magic Number\n");
		return 0;
	}	
	if(phead->ih_magic != IH_MAGIC)
	{
		puts ("Bad Magic Number\n");
		return 0;
	}		
	data = addr;
	len = sizeof(image_header_t);

	checksum = phead->ih_hcrc;
	phead->ih_hcrc = 0;

	if (crc32 (0, (unsigned char *)data, len) != checksum) {
		puts ("Bad Header Checksum\n");
		return 1;
	}

	data = addr + sizeof(image_header_t);
	len  = phead->ih_size;

	verify = 1;
	if (verify) {
		puts ("   Verifying Checksum ... ");
		if (crc32 (0, (unsigned char *)data, len) != phead->ih_dcrc) {
			printf ("Bad Data CRC\n");
			return 1;
		}
		puts ("OK\n");
	}
	
	printf("\n ============ STEP 3: display image header \n\n");
	print_image_hdr(phead);
	len += sizeof(image_header_t);
		
	printf("\n ============ STEP 4: Erase & Write flash \n\n");
	print_warning();
	while(1)
	{
		char readchar = (char)getchar();
		if( readchar == 'y') 
		{
			//printf("\nBootloader console...\n");
			break;
		}
		else if(readchar =='n')
		{
			return 0;
		}
		else
			print_warning();
			
	}	
	puts("\n");
	
	for(i = UCOS_IMAGE_START_SEC;i<=UCOS_IMAGE_END_SEC;i++)
	{
		printf("Erase sector %d...",i);
		rc = fdev->flerase(fdev,i);
		printf("OK\n");
	}
	
	printf("\nWrite image from 0x%x to 0x%x:\n",addr,UCOS_IMAGE_START_ADDR);
	rc = fdev->flwrite(fdev,UCOS_IMAGE_START_ADDR,(unsigned char *)addr,len);
	
	printf("OK\n");
	
	}

//########### kernel
	if(strcmp(argv[3],"no") != 0)
	{
	
	printf("\n\n Update Linux kernel image !!! \n");
	
	printf("\n ============ STEP 1: downloading Linux kernel image to 0x%x ...\n\n",addr);	
	tftpsize = tftpGet(addr,argv[1],mode,argv[3],file,flags,info);
	if(!tftpsize)
		return 0;
	phead = (image_header_t *)addr;
	
	printf("\n ============ STEP 2: file checking ...\n\n");
	if(phead->ih_magic != IH_MAGIC)   //
	{
		puts ("Bad Magic Number\n");
		return 0;
	}	
	if(phead->ih_magic != IH_MAGIC)
	{
		puts ("Bad Magic Number\n");
		return 0;
	}		
	data = addr;
	len = sizeof(image_header_t);

	checksum = phead->ih_hcrc;
	phead->ih_hcrc = 0;

	if (crc32 (0, (unsigned char *)data, len) != checksum) {
		puts ("Bad Header Checksum\n");
		return 1;
	}

	data = addr + sizeof(image_header_t);
	len  = phead->ih_size;

	verify = 1;
	if (verify) {
		puts ("   Verifying Checksum ... ");

⌨️ 快捷键说明

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