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

📄 update.c~

📁 umon bootloader source code, support mips cpu.
💻 C~
📖 第 1 页 / 共 3 页
字号:
			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 = FILE_IMAGE_START_SEC;i<=FILE_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,FILE_IMAGE_START_ADDR);
	rc = fdev->flwrite(fdev,FILE_IMAGE_START_ADDR,(unsigned char *)addr,len);
	
	printf("OK\n");
	
	}
	
	
	//################ jffs2 file system
	if(strcmp(argv[5],"no") != 0)
	{
		
	printf("\n Update Jffs2 File system image !!! \n");	
		
		printf("\n ============ STEP 1: downloading jffs2 File system image to 0x%x ...\n\n",addr);	
	tftpsize = tftpGet(addr,argv[1],mode,argv[5],file,flags,info);
	if(!tftpsize)
		return 0;
//	phead = (image_header_t *)addr;
//	printf("\n tftpsize is %d \n",tftpzize);
	len = tftpsize;
/*	
	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 2: 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 = JFFS2_IMAGE_START_SEC;i<=JFFS2_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,JFFS2_IMAGE_START_ADDR);
	rc = fdev->flwrite(fdev,JFFS2_IMAGE_START_ADDR,(unsigned char *)addr,len);
	
	printf("OK\n");
	
	}
	
	
	puts("Update successfully,Please restart system!!!\n");
	
}


		
// by shunzi 

/*	get_offset()
*	get image offset relative whole image.
*/
long get_offset(e_IMAGE imageid)
{
	unsigned int i, ptrs,pos,size,rc;
	char p[100];//*p = malloc(sizeof(image_header_t) + 4*IMAGE_NUMBER);
	unsigned int offset[IMAGE_NUMBER],*data;
	image_header_t *hdr,header;
	struct flashinfo *fdev;

	fdev = nametofdev(boot_device_name);
	
	
	if(imageid == UCOS)
		{
//			printf("dev name = %s, dest = 0x%x, addr = 0x%x\n",fdev->device_name,p,IMAGE_HEAD_ADDR);
			rc = fdev->flread(fdev,p,UCOS_IMAGE_START_ADDR,sizeof(image_header_t));
			hdr = (image_header_t *)p;
			
			switch(hdr->ih_comp)
				{
					case IH_COMP_NONE:
						printf("\nload %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
						rc = fdev->flread(fdev,hdr->ih_ep,UCOS_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);

						printf("OK\n");
						break;
				case IH_COMP_GZIP:
						printf("\nload %s to address 0x%x...",hdr->ih_name,data);
						rc = fdev->flread(fdev,TEMP_SPACE,UCOS_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);

						printf("OK\n");
						printf("Uncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
						unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
						printf("OK\n");
						break;
				case IH_COMP_BZIP2:
						break;
				default:
						printf("read image error\n");
						break;
					}
			
			return hdr->ih_ep;
			
		}
		else if(imageid == KERNEL)
			{
				rc = fdev->flread(fdev,p,KERNEL_IMAGE_START_ADDR,sizeof(image_header_t));
				hdr = (image_header_t *)p;
			
				switch(hdr->ih_comp)
				{
					case IH_COMP_NONE:
						printf("\nload %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
						rc = fdev->flread(fdev,hdr->ih_ep,KERNEL_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);

						printf("OK\n");
						break;
				case IH_COMP_GZIP:
						printf("\nload %s to address 0x%x...",hdr->ih_name,data);
						rc = fdev->flread(fdev,TEMP_SPACE,KERNEL_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);

						printf("OK\n");
						printf("\nUncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
						unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
						printf("OK\n");
						break;
				case IH_COMP_BZIP2:
						break;
				default:
						printf("read image error\n");
						break;
					}
			
			return hdr->ih_ep;
			}
			else if(imageid == ROOTFS)
				{
					rc = fdev->flread(fdev,p,FILE_IMAGE_START_ADDR,sizeof(image_header_t));
				hdr = (image_header_t *)p;
			
				switch(hdr->ih_comp)
				{
					case IH_COMP_NONE:
						printf("\nload %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
						rc = fdev->flread(fdev,hdr->ih_ep,FILE_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);

						printf("OK\n");
						break;
					case IH_COMP_GZIP:
						printf("\nload %s to address 0x%x...",hdr->ih_name,data);
						rc = fdev->flread(fdev,TEMP_SPACE,FILE_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);

						printf("OK\n");
						printf("\nUncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
						unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
						printf("OK\n");
						break;
					case IH_COMP_BZIP2:
						break;
					default:
						printf("read image error\n");
						break;
					}
			
					return hdr->ih_ep;
				}
				
			}
	
	
// by shunzi

#ifdef vb_get_offset   // cut off 

/*	get_offset()
*	get image offset relative whole image.
*/
long get_offset(e_IMAGE imageid)
{
	unsigned int i, ptrs,pos,size,rc;
	char p[100];//*p = malloc(sizeof(image_header_t) + 4*IMAGE_NUMBER);
	unsigned int offset[IMAGE_NUMBER],*data;
	image_header_t *hdr,header;
	struct flashinfo *fdev;

	fdev = nametofdev(boot_device_name);
	//fdev = nametofdev(boot_device_name);
	//fbnk->flread();
	printf("dev name = %s, dest = 0x%x, addr = 0x%x\n",fdev->device_name,p,IMAGE_HEAD_ADDR);
	rc = fdev->flread(fdev,p,IMAGE_HEAD_ADDR,sizeof(image_header_t)+ 4*IMAGE_NUMBER);
/*	
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
	NorFlashRd(IMAGE_HEAD_ADDR, (short *)p, (sizeof(image_header_t)+ 4*IMAGE_NUMBER)/2 + 1);
#else
	SflashReadByte(IMAGE_HEAD_ADDR,p, sizeof(image_header_t)+ 4*IMAGE_NUMBER);
#endif
*/
	hdr = (image_header_t *)p;
	//print_image_hdr(hdr);

	unsigned long *len_ptr = (unsigned long *) (
			(unsigned long)hdr + sizeof(image_header_t)
			);

	/* determine number of images first (to calculate image offsets) */
	for (i=0; len_ptr[i]; ++i)	/* null pointer terminates list */
			;
	ptrs = i;		/* null pointer terminates list */
	//printf("Image size:0x%x\n",sizeof(image_header_t));
	pos = sizeof(image_header_t) + ptrs * sizeof(long);
	for (i=0; len_ptr[i]; ++i) {
		size = len_ptr[i];
		offset[i] = IMAGE_HEAD_ADDR + pos+4;
		/* copy_file() will pad the first files to even word align */
		size += 3;
		size &= ~3;
		pos += size;
	}
	rc = fdev->flread(fdev,p,offset[imageid],sizeof(image_header_t));
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
	NorFlashRd(offset[imageid], (short *)p, sizeof(image_header_t)/2 + 1);
#else
	SflashReadByte(offset[imageid],p, sizeof(image_header_t));
#endif
*/
	print_image_hdr(hdr);
	//data = 0xa181e000;
	data = TEMP_SPACE;
	switch(hdr->ih_comp)
	{
		case IH_COMP_NONE:
			printf("load %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
			rc = fdev->flread(fdev,hdr->ih_ep,offset[imageid] + sizeof(image_header_t),hdr->ih_size);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
			NorFlashRd(offset[imageid] + sizeof(image_header_t), (short *)hdr->ih_ep, hdr->ih_size/2 + 1);
#else
			SflashReadWord(offset[imageid] + sizeof(image_header_t), (int *)hdr->ih_ep, hdr->ih_size/4 + 1);
#endif
*/
			printf("OK\n");
			break;
		case IH_COMP_GZIP:
			printf("load %s to address 0x%x...",hdr->ih_name,data);
			rc = fdev->flread(fdev,TEMP_SPACE,offset[imageid] + sizeof(image_header_t),hdr->ih_size);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
			NorFlashRd(offset[imageid] + sizeof(image_header_t), (short *)TEMP_SPACE, hdr->ih_size/2 + 1);
#else
			SflashReadWord(offset[imageid] + sizeof(image_header_t), (int *)TEMP_SPACE, hdr->ih_size/4 + 1);
#endif
*/
			//SflashReadWord(offset[imageid] + sizeof(image_header_t), data, hdr->ih_size/4 + 1);
			printf("OK\n");
			printf("Uncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
			unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
			printf("OK\n");
			break;
		case IH_COMP_BZIP2:
			break;
		default:
			printf("read image error\n");
			break;
	}
			
	return hdr->ih_ep;
	
}

#endif

/* 	RiscBootRisc1
*	Boot Risc1 from Risc0
*/

void RiscBootRisc1(void)
{
   	 unsigned int *pTmp;	    	
    	unsigned int i, tmp;	

    	// copy "jump" to risc1 start address   
    	printf("\ncopy entry instrc to risc1 start address\n");	    
    	//pTmp = (unsigned int *)Risc1Entry;    
    	for(i = 0; i < 10; i++) {
       	 *(unsigned int *)(0xa0000000 + i*4) = *pTmp++;    // no need flush cache because 0xa0000000 area is used
    	}          	
   
	printf("\nLoading UCOS..\n");
	get_offset(0);
	
    	printf("\nboot ucos...\n");

    	//CommInqSendString(0, "\r\nset daisy chain...\r\n");	    
    	tmp = *(unsigned int *)0xa8010010;
    	tmp |= 0x10;
    	*(unsigned int *)0xa8010010 = tmp;
    
    	//CommInqSendString(0, "\r\nset sdram as risc0 boot source...\r\n");	
    	*(unsigned int *)0xa8000000 = 0x4;
}

char *StartLinuxHelp[] = {
	"Start Linux",
	"-[aqv:] {address} [arg1] [arg2] ...",
	" -a       pass (argc,argv) function",
	" -q       quiet mode",
	" -v {var} put return val in varname",
	0,
};

/*  RiscSemUnLock
*    Description: post the semaphore.
*/
void RiscSemUnLock(int SemID)
{
    *(volatile unsigned *)(0xa8000020 + SemID * 4) = 1;
}

/* Startlinux():
 *	start linux from flash.
 */
int
StartLinux(int argc,char *argv[])
{
	long linux_entry;
	char	*varname;
	long	args[10];
	int		i, j, ret, opt, useargc, quiet;
	int		(*func)(long,long,long,long,long,long,long,long,long,long);

	//RiscBootRisc1();
	//return;

	//RiscSemUnLock(6);  // cut by shunzi fot linux first
	printf("\n");

	linux_entry = get_offset(KERNEL);
	//return;
	get_offset(ROOTFS);

	//docommand("call 0xa0300000", 0);
	quiet = 0;
	useargc = 0;
	varname = (char *)0;
	while((opt=getopt(argc,argv,"aqv:")) != -1) {
		switch(opt) {
		case 'a':
			useargc = 1;
			break;
		case 'q':
			quiet = 1;
			break;
		default:
			return(CMD_PARAM_ERROR);
		}
	}

	//if ((argc < optind+1) || (argc > optind+11))
	//	return(CMD_PARAM_ERROR);

	func = (int(*)(long,long,long,long,long,long,long,long,long,long))linux_entry;

	//if ((func == 0) && (isdigit(argv[optind][0]) == 0)) {
	//	return(CMD_PARAM_ERROR);
	//}

	/* If useargc flag is not set, then retrieve and convert
	 * args from command line.  If the first character of the
	 * argument is an ampersand (&), then a pointer to the argument
	 * is passed; otherwise, the argument is converted to a long
	 * integer using strtol()...
	 */
	if (!useargc) {
		for(j=0,i=optind;i<argc;i++,j++) {
			if (argv[i][0] == '&')
				args[j] = (unsigned long)&argv[i][1];
			else
				args[j] = strtol(argv[i],(char **)0,0);
		}
	}

	//ctxAPP();
	//EnableBreakInterrupt();
	if (useargc) {
		ret = func(argc-optind,(long)&argv[optind],0,0,0,0,0,0,0,0);
	}
	else {
		ret = func(args[0],args[1],args[2],args[3],args[4],args[5],args[6],
			args[7],args[8],args[9]);
	}
	//DisableBreakInterrupt();
	//ctxMON();

	if (!quiet)
		printf("Returned: %d (0x%x)\n",ret,ret);
	return(CMD_SUCCESS);
	
}

⌨️ 快捷键说明

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