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

📄 bootmenu.c.v1

📁 bootloader源代码
💻 V1
📖 第 1 页 / 共 3 页
字号:
				if (g_bootconfig.protocol != BOOTNET_NONE) {			struct {				char *title;				int common;				unsigned int *addr;			} asklist[] = {				{ "IP Address ", 0, &g_bootconfig.ipaddr },				{ "Netmask    ", 0, &g_bootconfig.netmask },				{ "Gateway    ", 0, &g_bootconfig.gateway },				{ "DNS        ", 0, &g_bootconfig.dns },				{ "Server     ", 1, &g_bootconfig.server },				{ NULL, 0, NULL },			};			in_addr_t ipaddr = g_bootconfig.ipaddr, newipaddr = ipaddr;			in_addr_t netmask = g_bootconfig.netmask;			int class = ipv4_get_ipaddr_class(ipaddr), newclass = class;			unsigned int addr;			unsigned char *cp;						for (i = 0; asklist[i].title != NULL; ++i) {				if (g_bootconfig.protocol != BOOTNET_STATIC && !asklist[i].common)					continue;				while (1) {					// if the class of IP address has changed 					// or the current netmask value is invalid,					// validate the netmask as default					if (i == 1) {						if (netmask == INADDR_ANY || netmask == INADDR_BROADCAST ||							(ipaddr != newipaddr && class != newclass && ipv4_ipaddr_valid(newipaddr))) {							g_bootconfig.netmask = ipv4_get_default_netmask(newipaddr);						}					}					addr = htonl(*asklist[i].addr);					cp = (unsigned char *) &addr;										// Get the string					PrintFormat("  %s : (%d.%d.%d.%d) ", 						asklist[i].title,						cp[0], cp[1], cp[2], cp[3]);					GetString(str, sizeof str, 0);					if ((trim(str))[0] == 0)						break;					// Parse the string					if (parse_netaddr(str, cp, 4) == 0) {						addr = ntohl(addr);						// if IP address class has changed, adjust netmask						if (i == 0) {							if (!ipv4_ipaddr_valid(addr))								continue;							newipaddr = addr;							newclass = ipv4_get_ipaddr_class(newipaddr);						}						*asklist[i].addr = addr;						break;					}				}			}		}	} else if (strcmp(argv[1], "file") == 0) {		struct {			char *title;			unsigned char *value;		} asklist[] = {			{ "boot loader", g_bootconfig.loader_filename },			{ "ROM filesystem", g_bootconfig.romfs_filename },			{ "Kernel", g_bootconfig.kernel_filename },			{ NULL, NULL },		};		int i;		unsigned char str[BOOTCONFIG_PATHLEN];				for (i = 0; asklist[i].title != NULL; ++i) {			PrintFormat("  %s filename : (%s) ", asklist[i].title, asklist[i].value);			GetString(str, sizeof str, 0);			if ((trim(str))[0] != 0)				strcpy(asklist[i].value, str);		}	} #endif	else 		PrintUart("Unknown configuration\r\n", -1);	// auto save configuration	if (memcmp(&curconfig, &g_bootconfig, sizeof(bootconfig_t)) != 0) 		bootconfig_save();	return 0;}int bootmenu_download(int argc, char *argv[], unsigned int kload){	static unsigned int addr = DOWNLOAD_ROMFS_ADDRESS;	int target = DOWNLOAD_ROMFS;	char *filename = NULL;	unsigned int flashaddr=0, start, end, blocksize; // Ray Added	if (argc == 1) {		PrintUart(s_help_download_brief, -1);		PrintUart(s_help_download, -1);		return 0;	}	if (argc >= 3) {		if (strcmp(argv[2], "boot") == 0) {			target = DOWNLOAD_BOOT;			addr = DOWNLOAD_BOOTLOADER_ADDRESS;			flashaddr =  BOOT_START_ADDRESS;			filename = g_bootconfig.loader_filename;		} else if (strcmp(argv[2], "romfs") == 0) {			target = DOWNLOAD_ROMFS;			addr = DOWNLOAD_ROMFS_ADDRESS;			flashaddr =  ROMFS_START_ADDRESS;			filename = g_bootconfig.romfs_filename;		} else if (strcmp(argv[2], "kernel") == 0) {			target = DOWNLOAD_KERNEL;			addr = KERNEL_LOAD_ADDRESS;			filename = g_bootconfig.kernel_filename;		} else {			if (strcmp(argv[1], "serial") == 0) {				if (argv[2][0] >= '0' && argv[2][0] <= '9') {					target = DOWNLOAD_MISC;					addr = atoi(argv[2]);				} else {					PrintFormat("Unknown target %s\n", argv[2]);					return 0;				}			} #ifdef SUPPORT_NETWORK			else if (strcmp(argv[1], "net") == 0) {				filename = argv[2];				target = DOWNLOAD_MISC;				addr = DOWNLOAD_ROMFS_ADDRESS;			}#endif		}	} 	if (strcmp(argv[1], "serial") == 0) {		int len;		PrintUart("Send uuencoded stream to serial port\r\n", -1);		if ((len = serial_uudecode((unsigned char *) addr, 0)) >= 0) {			PrintFormat("Received %d (0x%x) bytes at address %08x\n", len, len, addr);			g_download_info[target].download = 1;			g_download_info[target].len = len;		}// Ray Added Begin		DELAY(5000000);		PrintFormat("Received %d (0x%x) bytes at address %08x\n", len, len, addr);		if( addr != KERNEL_LOAD_ADDRESS ) {		PrintFormat("This will write data on RAM 0x%08x into flash 0x%08x\n", addr, flashaddr);					flash_calcblock(flashaddr, &start, &blocksize); 		flash_calcblock(flashaddr + g_download_info[target].len - 1, &end, &blocksize);		end += blocksize - 1;		PrintFormat("  0x%08x - 0x%08x will be erased\n", start, end);		PrintFormat("  0x%08x - 0x%08x will be written\n", flashaddr, flashaddr + g_download_info[target].len - 1);					PrintUart("Erasing : ", -1);		if( g_download_info[target].len > (0x200000-0x10000) )		{		   PrintUart("\r\nErase Flash 0 ....\n", -1);		   flash_erase_region(flashaddr, 0x200000-0x10000);		   PrintUart("\r\nErase Flash 1 ....\n", -1);		   flash_erase_region(0x200000, g_download_info[target].len-0x200000+0x10000);		}		else {		    flash_erase_region(flashaddr, g_download_info[target].len);		}		PrintUart("\r\nWriting : ", -1);		if( g_download_info[target].len > (0x200000-0x10000) )		{		   PrintFormat("\nWrite Flash 0 ...mem=0x%x\n", addr );		   flash_write_data(flashaddr, (unsigned char *) addr, 0x200000-0x10000);		   addr = DOWNLOAD_ROMFS_ADDRESS;		   PrintFormat("\nWrite Flash 1 ...mem=0x%x\n", addr+0x200000-0x10000 );		   flash_write_data(0x200000, (unsigned char *) (addr+0x200000-0x10000), g_download_info[target].len-0x200000+0x10000);		}		else {		   flash_write_data(flashaddr, (unsigned char *) addr, g_download_info[target].len);		}		PrintUart("\r\n", -1);// Ray Added end		}		return 0;	} #ifdef SUPPORT_NETWORK	else if (strcmp(argv[1], "net") == 0) {		int len;				if (bootmenu_net_up(0) != 0)			return 0;		if (!ipv4_ipaddr_valid(g_bootconfig.server)) {			PrintUart("Server address is invalid\r\n", -1);			return 0;		} else if (filename == NULL) {			PrintUart("Specify file to download\r\n", -1);			return 0;		}						if (ipv4_tftp(g_bootconfig.server, filename, addr, &len) == 0) {			g_download_info[target].download = 1;			g_download_info[target].len = len;			PrintFormat("Received %d (0x%x) bytes at address %08x\n",				len, len, addr);		}	}#endif	else 		PrintFormat("Unknown media : %s\n", argv[1]);	return 0;}int bootmenu_dump(int argc, char *argv[], unsigned int kload){	static unsigned int addr = 0;	int i;	unsigned int num = 0x100, unit = 1;	for (i = 1; (i < argc) && (argv[i][0] == '-'); ++i) {		switch (argv[i][1]) {		case 'd' : unit = 4; break;		case 'w' : unit = 2; break;		case 'b' : unit = 1; break;		}	}				if (argc > i)		addr = atoi(argv[i++]);	if (argc > i)		num = atoi(argv[i++]);	dump_memory(NULL, addr, num, unit);	// addr += num;		return 0;}#ifdef SUPPORT_FLASHint bootmenu_flash(int argc, char *argv[], unsigned int kload){	char str[128];	int flash_inited = 0;	if (argc > 1 && strcmp(argv[1], "probe") == 0) {		unsigned int addr = FLASH_BASE_ADDRESS;		if (argc > 2)			addr = atoi(argv[2]);		flash_init(addr, 1);		return 0;	} else if (!flash_found()) {		flash_inited = 1;		flash_init(FLASH_BASE_ADDRESS, 0);		if (!flash_found())			return 0;	}		if (argc == 1) {		if (!flash_inited) {			PrintUart(s_help_flash_brief, -1);			PrintUart(s_help_flash, -1);		}		return 0;	}	if (strcmp(argv[1], "list") == 0) {		flash_list(NULL);	} else if (strcmp(argv[1], "erase") == 0) {		unsigned int addr, start, end, len = 0, blocksize;		if (argc == 2) {			PrintUart("Specify address and length to erase\r\n", -1);			return 0;		}		addr = atoi(argv[2]);		if (argc > 3)			len = atoi(argv[3]);		flash_calcblock(addr, &start, &blocksize); 		if (len == 0)			end = start + blocksize - 1;		else {			flash_calcblock(addr + len - 1, &end, &blocksize);			end += blocksize - 1;		}				PrintFormat("This will erase 0x%08x - 0x%08x. Are you sure? (y/N) ", start, end);		GetString(str, sizeof str, 0);		if (str[0] == 'Y' || str[0] == 'y') {			PrintUart("Erasing : ", -1);			if (len == 0)				flash_erase_oneblock(start);			else				flash_erase_region(start, len);			PrintUart("\r\n", -1);		}	} else if (strcmp(argv[1], "eraseall") == 0) {		PrintUart("This will erase entire flash. Are you sure? (y/N) ", -1);		GetString(str, sizeof str, 0);		if (str[0] == 'Y' || str[0] == 'y') {			PrintUart("Erasing : ", -1);			flash_erase_all();			PrintUart("\r\n", -1);		}	} else if (strcmp(argv[1], "writeb") == 0) {		unsigned int addr, data;		if (argc < 4) {			PrintUart("Specify address and data to be written\r\n", -1);			return 0;		}				addr = atoi(argv[2]);		data = atoi(argv[3]);				PrintFormat("%08x : %02x => ", addr, *(volatile unsigned char *) addr);		if (flash_write_onebyte(addr, data) != 0)			PrintUart("(FAULT) ", -1);		PrintFormat("%02x\n", *(volatile unsigned char *) addr);	} else if (strcmp(argv[1], "writew") == 0) {		unsigned int addr, data;		if (argc < 4) {			PrintUart("Specify address and data to be written\r\n", -1);			return 0;		}				addr = atoi(argv[2]) & ~0x01;		data = atoi(argv[3]);				PrintFormat("%08x : %04x => ", addr, *(volatile unsigned short *) addr);		if (flash_write_oneword(addr, data) != 0)			PrintUart("(FAULT) ", -1);		PrintFormat("%04x\n", *(volatile unsigned short *) addr);	} else if (strcmp(argv[1], "write") == 0) {		unsigned int to, from, len;		if (argc < 5) {			PrintUart("Specify addresses and size to be written\r\n", -1);			return 0;		}				to = atoi(argv[2]);		from = atoi(argv[3]);		len = atoi(argv[4]);		PrintUart("Writing : ", -1);		if (flash_write_data(to, (unsigned char *) from, len) != 0)			PrintUart("Erase first before writing", -1);		PrintUart("\r\n", -1);	} else if (strcmp(argv[1], "boot") == 0 || strcmp(argv[1], "romfs") == 0) {		int target = argv[1][0] == 'b' ? DOWNLOAD_BOOT : DOWNLOAD_ROMFS;		unsigned int ramaddr = (target == DOWNLOAD_BOOT) ? DOWNLOAD_BOOTLOADER_ADDRESS : DOWNLOAD_ROMFS_ADDRESS;		unsigned int flashaddr = (target == DOWNLOAD_BOOT) ? BOOT_START_ADDRESS : ROMFS_START_ADDRESS;		unsigned int start, end, blocksize;//Ray		g_download_info[target].download=1;		g_download_info[target].download=1;		if (!g_download_info[target].download) 			PrintFormat("Download %s to RAM first\n", (target == DOWNLOAD_BOOT) ? "boot loader" : "romfs");		else {			PrintFormat("This will write data on RAM 0x%08x into flash 0x%08x\n", ramaddr, flashaddr);						g_download_info[target].len=atoi(argv[2]);			flash_calcblock(flashaddr, &start, &blocksize); 			flash_calcblock(flashaddr + g_download_info[target].len - 1, &end, &blocksize);			end += blocksize - 1;			PrintFormat("  0x%08x - 0x%08x will be erased\n", start, end);			PrintFormat("  0x%08x - 0x%08x will be written\n", flashaddr, flashaddr + g_download_info[target].len - 1);						PrintUart("Erasing : ", -1);			flash_erase_region(flashaddr, g_download_info[target].len);			PrintUart("\r\nWriting : ", -1);			flash_write_data(flashaddr, (unsigned char *) ramaddr, g_download_info[target].len);			PrintUart("\r\n", -1);		}	} else 		PrintUart("Invalid command\r\n", -1);			return 0;}#endifint bootmenu_mem(int argc, char *argv[], unsigned int kload){	int read, len;	unsigned int addr, data = 0;	if (argc == 1) {		PrintUart(s_help_memcmp_brief, -1);		PrintUart(s_help_memcmp, -1);		return 0;	}	switch (argv[1][0]) {	case 'r' : 		read = 0; 		break;	case 'w' : 		read = 1; 		break;	default : 		read = -1; 		break;	}	switch (argv[1][1]) {	case 'b' : 		len = 1; 		break;	case 'w' : 		len = 2; 		break;	case 'l' : 		len = 4; 		break;	default : 		len = -1; 		break;	}	if (read == -1 || len == -1 || argv[1][2] != 0) {		PrintUart("Invalid operation\r\n", -1);		return 0;	}	if (argc == 2) {		PrintUart("Specify address\r\n", -1);		return 0;	}	addr = atoi(argv[2]);							if (read == 0) {		switch (len) {		case 1 : 			data = __raw_readb(addr);			break;		case 2 : 			data = __raw_readw(addr);			break;		case 4 : 			data = __raw_readl(addr);			break;		}

⌨️ 快捷键说明

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