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

📄 cmd_bootm.c.svn-base

📁 u-boot loader common files, like cpu, clock, environment...etc...
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
	len = strlen(s);	top = (top - (len + 1)) & ~0xF;	cmdline = (char *)top;	debug ("## cmdline at 0x%08lX ", top);	strcpy(cmdline, s);	/* copy bdinfo */	top = (top - sizeof(bd_t)) & ~0xF;	debug ("## bd at 0x%08lX ", top);	kbd = (bd_t *)top;	memcpy(kbd, gd->bd, sizeof(bd_t));	/* first find number of env entries, and their size */	envno = 0;	envsz = 0;	for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {		for (nxt = i; env_get_char(nxt) != '\0'; ++nxt)			;		envno++;		envsz += (nxt - i) + 1;	/* plus trailing zero */	}	envno++;	/* plus the terminating zero */	debug ("## %u envvars total size %u ", envno, envsz);	top = (top - sizeof(char **)*envno) & ~0xF;	fwenv = (char **)top;	debug ("## fwenv at 0x%08lX ", top);	top = (top - envsz) & ~0xF;	s = (char *)top;	ss = fwenv;	/* now copy them */	for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {		for (nxt = i; env_get_char(nxt) != '\0'; ++nxt)			;		*ss++ = s;		for (j = i; j < nxt; ++j)			*s++ = env_get_char(j);		*s++ = '\0';	}	*ss++ = NULL;	/* terminate */	entry = (void (*)(bd_t *, char *, char **, ulong))ntohl(hdr->ih_ep);	(*entry)(kbd, cmdline, fwenv, top);}#endif#if (CONFIG_COMMANDS & CFG_CMD_BOOTD)int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int rcode = 0;#ifndef CFG_HUSH_PARSER	if (run_command (getenv ("bootcmd"), flag) < 0) rcode = 1;#else	if (parse_string_outer(getenv("bootcmd"),		FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0 ) rcode = 1;#endif	return rcode;}U_BOOT_CMD( 	boot,	1,	1,	do_bootd, 	"boot    - boot default, i.e., run 'bootcmd'\n",	NULL);/* keep old command name "bootd" for backward compatibility */U_BOOT_CMD( 	bootd, 1,	1,	do_bootd, 	"bootd   - boot default, i.e., run 'bootcmd'\n",	NULL);#endif#if (CONFIG_COMMANDS & CFG_CMD_IMI)int do_iminfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int	arg;	ulong	addr;	int     rcode=0;	if (argc < 2) {		return image_info (load_addr);	}	for (arg=1; arg <argc; ++arg) {		addr = simple_strtoul(argv[arg], NULL, 16);		if (image_info (addr) != 0) rcode = 1;	}	return rcode;}static int image_info (ulong addr){	ulong	data, len, checksum;	image_header_t *hdr = &header;	printf ("\n## Checking Image at %08lx ...\n", addr);	/* Copy header so we can blank CRC field for re-calculation */	memmove (&header, (char *)addr, sizeof(image_header_t));	if (ntohl(hdr->ih_magic) != IH_MAGIC) {		puts ("   Bad Magic Number\n");		return 1;	}	data = (ulong)&header;	len  = sizeof(image_header_t);	checksum = ntohl(hdr->ih_hcrc);	hdr->ih_hcrc = 0;	if (crc32 (0, (char *)data, len) != checksum) {		puts ("   Bad Header Checksum\n");		return 1;	}	/* for multi-file images we need the data part, too */	print_image_hdr ((image_header_t *)addr);	data = addr + sizeof(image_header_t);	len  = ntohl(hdr->ih_size);	puts ("   Verifying Checksum ... ");	if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {		puts ("   Bad Data CRC\n");		return 1;	}	puts ("OK\n");	return 0;}U_BOOT_CMD(	iminfo,	CFG_MAXARGS,	1,	do_iminfo,	"iminfo  - print header information for application image\n",	"addr [addr ...]\n"	"    - print header information for application image starting at\n"	"      address 'addr' in memory; this includes verification of the\n"	"      image contents (magic number, header and payload checksums)\n");#endif	/* CFG_CMD_IMI */#if (CONFIG_COMMANDS & CFG_CMD_IMLS)/*----------------------------------------------------------------------- * List all images found in flash. */int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	flash_info_t *info;	int i, j;	image_header_t *hdr;	ulong data, len, checksum;	for (i=0, info=&flash_info[0]; i<CFG_MAX_FLASH_BANKS; ++i, ++info) {		if (info->flash_id == FLASH_UNKNOWN)			goto next_bank;		for (j=0; j<CFG_MAX_FLASH_SECT; ++j) {			if (!(hdr=(image_header_t *)info->start[j]) ||			    (ntohl(hdr->ih_magic) != IH_MAGIC))				goto next_sector;			/* Copy header so we can blank CRC field for re-calculation */			memmove (&header, (char *)hdr, sizeof(image_header_t));			checksum = ntohl(header.ih_hcrc);			header.ih_hcrc = 0;			if (crc32 (0, (char *)&header, sizeof(image_header_t))			    != checksum)				goto next_sector;			printf ("Image at %08lX:\n", (ulong)hdr);			print_image_hdr( hdr );			data = (ulong)hdr + sizeof(image_header_t);			len  = ntohl(hdr->ih_size);			puts ("   Verifying Checksum ... ");			if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {				puts ("   Bad Data CRC\n");			}			puts ("OK\n");next_sector:		;		}next_bank:	;	}	return (0);}U_BOOT_CMD(	imls,	1,		1,	do_imls,	"imls    - list all images found in flash\n",	"\n"	"    - Prints information about all images found at sector\n"	"      boundaries in flash.\n");#endif	/* CFG_CMD_IMLS */voidprint_image_hdr (image_header_t *hdr){#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP)	time_t timestamp = (time_t)ntohl(hdr->ih_time);	struct rtc_time tm;#endif	printf ("   Image Name:   %.*s\n", IH_NMLEN, hdr->ih_name);#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP)	to_tm (timestamp, &tm);	printf ("   Created:      %4d-%02d-%02d  %2d:%02d:%02d UTC\n",		tm.tm_year, tm.tm_mon, tm.tm_mday,		tm.tm_hour, tm.tm_min, tm.tm_sec);#endif	/* CFG_CMD_DATE, CONFIG_TIMESTAMP */	puts ("   Image Type:   "); print_type(hdr);	printf ("\n   Data Size:    %d Bytes = ", ntohl(hdr->ih_size));	print_size (ntohl(hdr->ih_size), "\n");	printf ("   Load Address: %08x\n"		"   Entry Point:  %08x\n",		 ntohl(hdr->ih_load), ntohl(hdr->ih_ep));	if (hdr->ih_type == IH_TYPE_MULTI) {		int i;		ulong len;		ulong *len_ptr = (ulong *)((ulong)hdr + sizeof(image_header_t));		puts ("   Contents:\n");		for (i=0; (len = ntohl(*len_ptr)); ++i, ++len_ptr) {			printf ("   Image %d: %8ld Bytes = ", i, len);			print_size (len, "\n");		}	}}static voidprint_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;	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);}#define	ZALLOC_ALIGNMENT	16static void *zalloc(void *x, unsigned items, unsigned size){	void *p;	size *= items;	size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1);	p = malloc (size);	return (p);}static void zfree(void *x, void *addr, unsigned nb){	free (addr);}#define HEAD_CRC	2#define EXTRA_FIELD	4#define ORIG_NAME	8#define COMMENT		0x10#define RESERVED	0xe0#define DEFLATED	8int gunzip(void *dst, int dstlen, unsigned char *src, int *lenp){	z_stream s;	int r, i, flags;	/* skip header */	i = 10;	flags = src[3];	if (src[2] != DEFLATED || (flags & RESERVED) != 0) {		puts ("Error: Bad gzipped data\n");		return (-1);	}	if ((flags & EXTRA_FIELD) != 0)		i = 12 + src[10] + (src[11] << 8);	if ((flags & ORIG_NAME) != 0)		while (src[i++] != 0)			;	if ((flags & COMMENT) != 0)		while (src[i++] != 0)			;	if ((flags & HEAD_CRC) != 0)		i += 2;	if (i >= *lenp) {		puts ("Error: gunzip out of data in header\n");		return (-1);	}	s.zalloc = zalloc;	s.zfree = zfree;#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)	s.outcb = (cb_func)WATCHDOG_RESET;#else	s.outcb = Z_NULL;#endif	/* CONFIG_HW_WATCHDOG */	r = inflateInit2(&s, -MAX_WBITS);	if (r != Z_OK) {		printf ("Error: inflateInit2() returned %d\n", r);		return (-1);	}	s.next_in = src + i;	s.avail_in = *lenp - i;	s.next_out = dst;	s.avail_out = dstlen;	r = inflate(&s, Z_FINISH);	if (r != Z_OK && r != Z_STREAM_END) {		printf ("Error: inflate() returned %d\n", r);		return (-1);	}	*lenp = s.next_out - (unsigned char *) dst;	inflateEnd(&s);	return (0);}#ifdef CONFIG_BZIP2void bz_internal_error(int errcode){	printf ("BZIP2 internal error %d\n", errcode);}#endif /* CONFIG_BZIP2 */static voiddo_bootm_rtems (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],		ulong addr, ulong *len_ptr, int verify){	DECLARE_GLOBAL_DATA_PTR;	image_header_t *hdr = &header;	void	(*entry_point)(bd_t *);	entry_point = (void (*)(bd_t *)) hdr->ih_ep;	printf ("## Transferring control to RTEMS (at address %08lx) ...\n",		(ulong)entry_point);	SHOW_BOOT_PROGRESS (15);	/*	 * RTEMS Parameters:	 *   r3: ptr to board info data	 */	(*entry_point ) ( gd->bd );}#if (CONFIG_COMMANDS & CFG_CMD_ELF)static voiddo_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],		  ulong addr, ulong *len_ptr, int verify){	image_header_t *hdr = &header;	char str[80];	sprintf(str, "%x", hdr->ih_ep); /* write entry-point into string */	setenv("loadaddr", str);	do_bootvx(cmdtp, 0, 0, NULL);}static voiddo_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],		 ulong addr, ulong *len_ptr, int verify){	image_header_t *hdr = &header;	char *local_args[2];	char str[16];	sprintf(str, "%x", hdr->ih_ep); /* write entry-point into string */	local_args[0] = argv[0];	local_args[1] = str;	/* and provide it via the arguments */	do_bootelf(cmdtp, 0, 2, local_args);}#endif /* CFG_CMD_ELF */#ifdef CONFIG_LYNXKDIstatic voiddo_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag,		 int	argc, char *argv[],		 ulong	addr,		 ulong	*len_ptr,		 int	verify){	lynxkdi_boot( &header );}#endif /* CONFIG_LYNXKDI */

⌨️ 快捷键说明

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