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