📄 bootmenu.c.v1
字号:
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 + -