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

📄 bootmenu.c.v1

📁 bootloader源代码
💻 V1
📖 第 1 页 / 共 3 页
字号:
		PrintFormat("Read %d : Addr = %08x, Data = %0*x (%d)\n", len, addr, len * 2, data, data);	} else {		if (argc == 3) {			PrintUart("Specify data\r\n", -1);			return 0;		}		data = atoi(argv[3]);		switch (len) {		case 1 : 			__raw_writeb(data, addr);			break;		case 2 : 			__raw_writew(data, addr);			break;		case 4 : 			__raw_writel(data, addr);			break;		}		PrintFormat("Write %d : Addr = %08x, Data = %0*x (%d)\n", len, addr, len * 2, data, data);	}	return 0;}int bootmenu_memcmp(int argc, char *argv[], unsigned int kload){	unsigned int i, addr1, addr2, len = 0x100;	unsigned char *ptr1, *ptr2;	unsigned int ndiff = 0, firstdiff = 0;	if (argc == 1) {		PrintUart(s_help_memcmp_brief, -1);		PrintUart(s_help_memcmp, -1);		return 0;	}	if (argc < 3) {		PrintUart("Specify addresses to compare\r\n", -1);		return 0;	}	addr1 = atoi(argv[1]);	addr2 = atoi(argv[2]);	if (argc >= 4)		len = atoi(argv[3]);	ptr1 = (unsigned char *) addr1;	ptr2 = (unsigned char *) addr2;		for (i = 0; i < len; ++i) {		if (ptr1[i] != ptr2[i]) {			if (ndiff++ == 0)				firstdiff = i;		}	}	if (ndiff == 0)		PrintUart("No difference\r\n", -1);	else {		PrintFormat("Found %d differences\n", ndiff);		PrintFormat("First difference at %08x : %02x %02x\n", 			firstdiff, ptr1[firstdiff], ptr2[firstdiff]);	}		return 0;}int bootmenu_memcpy(int argc, char *argv[], unsigned int kload){	unsigned int to, from, len = 0x100;	if (argc == 1) {		PrintUart(s_help_memcpy_brief, -1);		PrintUart(s_help_memcpy, -1);		return 0;	}	if (argc < 3) {		PrintUart("Specify addresses to copy\r\n", -1);		return 0;	}	to = atoi(argv[1]);	from = atoi(argv[2]);	if (argc >= 4)		len = atoi(argv[3]);	memcpy((void *) to, (void *) from, len);	PrintUart("Copy completed\r\n", -1);	return 0;}#ifdef SUPPORT_NETWORKint bootmenu_net(int argc, char *argv[], unsigned int kload){	in_addr_t ipaddr;			if (argc == 1) {		PrintUart(s_help_net_brief, -1);		PrintUart(s_help_net, -1);		return 0;	}	if (!net_found()) {		PrintUart("Network device is not exist\r\n", -1);		return 0;	}	if (strcmp(argv[1], "config") == 0) {		int stat, valid;		PrintFormat("Current network configuration\n");		stat = net_found();		PrintFormat("  Status : %s\n", 			(stat == NETDEV_NODEV) ? "No device" :			((stat == NETDEV_DOWN) ? "Down" : "Up"));		if (stat != NETDEV_NODEV) {			valid = ipv4_ipaddr_valid(g_bootconfig.ipaddr);			PrintFormat("  IP Address : %s\n", 				valid ? ipaddr_to_str(g_bootconfig.ipaddr) : "Not assigned");			if (valid) {				PrintFormat("  Netmask    : %s\n", ipaddr_to_str(g_bootconfig.netmask));				PrintFormat("  Gateway    : %s\n", ipaddr_to_str(g_bootconfig.gateway));				PrintFormat("  Server     : %s\n", ipaddr_to_str(g_bootconfig.server));				PrintFormat("  DNS Server : %s\n", ipaddr_to_str(g_bootconfig.dns));				PrintFormat("  Domain     : %s\n", g_bootconfig.domain);			}		}	} else if (strcmp(argv[1], "up") == 0) {		bootmenu_net_up(1);	} else if (strcmp(argv[1], "down") == 0) {		net_dev_down();		PrintUart("Networking is disabled\r\n", -1);	} else if (strcmp(argv[1], "arp") == 0) {		if (bootmenu_net_up(0) != 0)			;		else if (argv[2] == NULL) {			arp_listtable(NULL);		} else {			if (parse_ipaddr(argv[2], &ipaddr) != 0 || !ipv4_ipaddr_valid(ipaddr))				PrintUart("Invalid IP address\r\n", -1);			else {				arptable_t *arp = arp_dorequest(ipaddr);				if (arp)					arp_listtable(arp);			}		}	} else if (strcmp(argv[1], "ping") == 0) {		if (bootmenu_net_up(0) != 0)			;		else if (argv[2] == NULL)			PrintUart("Specify IP address\r\n", -1);		else {			if (parse_ipaddr(argv[2], &ipaddr) != 0 || !ipv4_ipaddr_valid(ipaddr))				PrintUart("Invalid IP address\r\n", -1);			else {				icmp_ping(ipaddr, 1);			}		}	} else if (strcmp(argv[1], "bootp") == 0) {		ipv4_bootp(1);	} else if (strcmp(argv[1], "dhcp") == 0) {		ipv4_bootp(0);	} else if (strcmp(argv[1], "tftp") == 0) {		if (bootmenu_net_up(0) != 0)			;		else if (argv[2] == NULL)			PrintUart("Specify IP address\r\n", -1);		else if (argv[3] == NULL)			PrintUart("Specify filename to download\r\n", -1);		else {			if (parse_ipaddr(argv[2], &ipaddr) != 0 || !ipv4_ipaddr_valid(ipaddr))				PrintUart("Invalid IP address\r\n", -1);			else {				unsigned int addr = DOWNLOAD_ROMFS_ADDRESS;				int len;				if ((ipv4_tftp(ipaddr, argv[3], addr, &len)) == 0) {					g_download_info[DOWNLOAD_MISC].download = 1;					g_download_info[DOWNLOAD_MISC].len = len;					PrintFormat("Received %d (0x%x) bytes at address %08x\n",						len, len, addr);				}			}		}	} else if (strcmp(argv[1], "reg") == 0) {		if (strcmp(argv[2], "ww") == 0) {			PrintUart("EEPROM doesn't exist.\r\n", -1);		} else if (strcmp(argv[2], "rr") == 0) {			PrintUart("EEPROM doesn't exist.\r\n", -1);		} else {			PrintUart("Unknown Net Reg command\r\n", -1);		}	} else if (strcmp(argv[1], "eeprom") == 0) {		if (g_netdev.eeprom_size == 0 || g_netdev.eeprom_readw == NULL) {			PrintUart("EEPROM doesn't exist.\r\n", -1);		} else if (argv[2] == NULL) {			PrintFormat("EEPROM exists. size = %d bytes\n", g_netdev.eeprom_size);		} else if (strcmp(argv[2], "dump") == 0) {			int i;			unsigned short buf[512];/*			for (i = 0; i < ((g_netdev.eeprom_size + 1) >> 1); ++i)				buf[i] = g_netdev.eeprom_readw(&g_netdev, i);*/// Ray Added			for (i = 0; i < ((g_netdev.eeprom_size + 1) >> 1); ++i)			{			   if( i < 8 ) 				buf[i] = default_eeprom[i];			   else				buf[i] = 0x0000;			}			dump_memory(buf, 0, g_netdev.eeprom_size, 1);		} else if (strcmp(argv[2], "ww") == 0) {			int addr, data;						if (g_netdev.eeprom_writew == NULL)				PrintUart("Can't write EEPROM\r\n", -1);			else if (argc < 5)				PrintUart("Specify address and data\r\n", -1);			else {				addr = atoi(argv[3]);				data = atoi(argv[4]);//				g_netdev.eeprom_writew(&g_netdev, addr >> 1, data);//Ray Added				if( addr < 8 ) 					default_eeprom[addr]=data;			}		} else if (strcmp(argv[2], "rr") == 0) {			int addr;						if (g_netdev.eeprom_writew == NULL)				PrintUart("Can't write EEPROM\r\n", -1);			else if (argc < 4)				PrintUart("Specify address\r\n", -1);			else {				addr = atoi(argv[3]);				if( addr < 8 ) 			 	   PrintFormat("Read Reg=%d, Data=0x%x\n", addr, default_eeprom[addr]);			}		} else {			PrintUart("Unknown EEPROM command\r\n", -1);		}	} else if (strcmp(argv[1], "dump") == 0) {		struct sk_buff *skb;		int num = 0;		while ((skb = net_getpacket(0)) != NULL) {			PrintFormat("Packet %d : %d\n", ++num, skb->len);			dump_memory(skb->data, 0, skb->len, 1);			skb_free(skb);		}		if (num == 0)			PrintUart("No packet is ready\r\n", -1);	} else if (strcmp(argv[1], "status") == 0) {		net_device_status();	} else 		PrintUart("Unknown command\r\n", -1);		return 0;}int bootmenu_net_up(int force){	int state;	if ((state = net_found()) == NETDEV_NODEV) {		PrintUart("Network device is not exist\r\n", -1);		return 1;	} else if (state == NETDEV_UP && !force) {		return 0;	} 	if (g_bootconfig.protocol == BOOTNET_NONE) {		PrintUart("Configure network setting first\r\n", -1);		return 2;	} else if (net_dev_up() == 0) {		PrintUart("Networking is enabled\r\n", -1);		return 0;	} else {		PrintUart("Networking failure\r\n", -1);		return 3;	}}#endif#ifdef SUPPORT_FLASH// hidden command : incompleteint bootmenu_update(int argc, char *argv[], unsigned int kload){	int target = DOWNLOAD_NONE;	int flashaddr = 0, ramaddr = 0, len = 0;	char str[128];	if (argc == 1)		return 0;	if (strcmp(argv[1], "boot") == 0) {		target = DOWNLOAD_BOOT;		flashaddr = BOOT_START_ADDRESS;		ramaddr = DOWNLOAD_BOOTLOADER_ADDRESS;		len = (BOOT_END_ADDRESS - BOOT_START_ADDRESS);	}	if (target == DOWNLOAD_NONE)		return 0;	// problem : reading ROM emulator returns wrong value	// specially at address : 0x0, 0xaa, 0xab	// it results in writing wrong image	memcpy((void *) ramaddr, (void *) flashaddr, len);	g_download_info[target].download = 1;	g_download_info[target].len = len;	if (target == DOWNLOAD_BOOT) {		((unsigned char *) ramaddr)[0] = 0x18;		((unsigned char *) ramaddr)[0xaa] = 0x80;		((unsigned char *) ramaddr)[0xab] = 0xe5;	}	PrintUart("Change EMUL/FLASH switch (press Enter when ready) :", -1);	GetString(str, sizeof str, 0);		if (!flash_found()) {		flash_init(FLASH_BASE_ADDRESS, 0);		if (!flash_found())			return 0;	}	PrintUart("Erasing : ", -1);	flash_erase_region(flashaddr, len);	PrintUart("\r\nWriting : ", -1);	flash_write_data(flashaddr, (unsigned char *) ramaddr, len);	PrintUart("\r\n", -1);			return 0;}#endif//// Miscellaneous functions// void dump_memory(void *memptr, unsigned int addr, int num, int unit){	unsigned int i, cur;	unsigned char *ptr;#if 0	for (i = 0; i < num; i += unit) {		if ((i & 0xf) == 0) {			PrintLong(addr + i);			PrintUart(" : ", -1);		}		switch (unit) {		case 1 : PrintByte(*(unsigned char *)(addr + i)); break;		case 2 : PrintShort(*(unsigned short *)(addr + i)); break;		case 4 : PrintLong(*(unsigned long *)(addr + i)); break;		}		PrintUart(" ", -1);		if (((i + unit) & 0x0f) == 0)			PrintUart("\r\n", -1);	}			if ((i & 0x0f) != 0)		PrintUart("\r\n", -1);#else	for (cur = 0; cur < num; cur += 16) {		ptr = (memptr == NULL) ? (unsigned char *) addr + cur : ((unsigned char *) memptr) + cur;		PrintLong(addr + cur);		PrintUart(" : ", -1);		for (i = 0; i < 16; i += unit) {			if ((cur + i) < num) {				switch (unit) {				case 1 : PrintByte(*(unsigned char *)(ptr + i)); break;				case 2 : PrintShort(*(unsigned short *)(ptr + i)); break;				case 4 : PrintLong(*(unsigned long *)(ptr + i)); break;				}				PrintChar(' ');			} else				break;		}		for (; i < 16; i += unit) 			PrintUart("                ", (unit * 2) + 1);		PrintUart("  ", -1);				for (i = 0; (i < 16) && (cur + i) < num; ++i) 			PrintChar((ptr[i] >= 0x20 && ptr[i] <= 0x7e) ? ptr[i] : '.');		PrintUart("\r\n", -1);	}#endif}int bootmenu_mtest ( int argc, char *argv[], unsigned int kload){unsigned int *ptr;int i, j, resValue=0;unsigned int pattern=0x1;unsigned int addr = 0x1000000;unsigned int endaddr = 0x1fffffc;                                                                                   if( argc > 2 ) {	   endaddr = atoi(argv[2]);	   addr = atoi(argv[1]);   }   else if ( argc > 1 ) {	   addr = atoi(argv[1]);   }   PrintFormat("\n\n ===== 16 MB SDRAM Memory Test Begin ===== \n");   for (j=0;j<4;++j)   {        if( j == 0 )             pattern = 0x5a5a5a5a;        if( j == 1 )             pattern = 0x0;        if( j == 2 )             pattern = 0xffffffff;        if( j == 3 )             pattern = 0xa5a5a5a5;	        ptr = (unsigned int *) addr;        PrintFormat("\nStart Memory Write pattern=0x%x\n", pattern );        for (i = addr; i < endaddr; i+=4)        {	   if( i < 0x1300000 || i > 0x130ffff ) {           *ptr = pattern;           if( *ptr != pattern )           {              PrintFormat("\nMemory Test Failure at address 0x%08X(%x)\n", (unsigned int) ptr, *ptr);              resValue = 1;           }           if ((i & 0x0ffff) == 0) PrintFormat("\r%8x", i );	   }           ++ptr;        }   }   if( resValue )         PrintFormat("\n\n ===== 16 MB SDRAM Memory Test FAILED ===== \n");   else         PrintFormat("\n\n ===== 16 MB SDRAM Memory Test PASSED ===== \n");   return 0;}#endif

⌨️ 快捷键说明

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