📄 bootmenu.c
字号:
}int bootmenu_download(int argc, char *argv[]){ static unsigned int addr = 0; int target = DOWNLOAD_NONE; char *filename = NULL; unsigned int checksum = 0;#ifdef CONFIG_ENABLE_IRQHANDLER// unsigned int flags = 0;#endif if (argc == 1) {#ifndef CONFIG_DISABLE_HELP_MSGS uart_puts(s_help_download_brief); uart_puts(s_help_download);#else uart_puts(no_help_msg);#endif goto download_out; } if (argc == 2) { uart_puts("Specify target to download\n"); goto download_out; } else { static struct { int target; char *name; } s_targetlist[] = { { DOWNLOAD_BOOT, "boot" },#ifdef CONFIG_ENABLE_2NDBOOT { DOWNLOAD_2NDBOOT, "2ndboot" },#endif { DOWNLOAD_ROMFS, "romfs" }, { DOWNLOAD_INITRD, "initrd" }, { DOWNLOAD_KERNEL, "kernel" }, { DOWNLOAD_KERNELFS, "kernelfs" }, { DOWNLOAD_MISC, "binary" }, { DOWNLOAD_INSTFILE, "instfile" },#ifdef CONFIG_ENABLE_IRQHANDLER { DOWNLOAD_IRQHANDLER, "irqhandler" },#endif#ifdef CONFIG_ENABLE_BITMAPS { DOWNLOAD_BITMAP, "bitmap" },#endif#ifdef CONFIG_ENABLE_UCODES { DOWNLOAD_UCODE, "ucode" },#endif#ifdef CONFIG_ENABLE_USERPREF { DOWNLOAD_USERPREF, "userpref" },#endif#ifdef CONFIG_ENABLE_VSYNCPARAM { DOWNLOAD_VSYNCPARAM, "vsyncparam" },#endif#ifdef CONFIG_ENABLE_DVI { DOWNLOAD_DVI, "dvi" },#endif { DOWNLOAD_NONE, NULL }, }; int i; for (i = 0; s_targetlist[i].target != DOWNLOAD_NONE; ++i) { if (strcmp(argv[2], s_targetlist[i].name) == 0) { target = s_targetlist[i].target; addr = g_download_info[target].addr; filename = g_download_info[target].filename; break; } } if (target == DOWNLOAD_NONE) { uart_puts("Invalid target\n"); goto download_out; } else if (target == DOWNLOAD_MISC) { if (strncmp(argv[3], "0x", 2) == 0) { addr = atoi(argv[3]); } }#ifdef CONFIG_ENABLE_IRQHANDLER else if (target == DOWNLOAD_IRQHANDLER) { if (g_download_info[target].download != 0) { uart_puts("IRQ handler existed.\n"); goto download_out; } }#endif#ifdef CONFIG_ENABLE_UCODES else if (target == DOWNLOAD_UCODE) { if (g_download_info[target].download != 0) { uart_puts("ucode downloaded already.\n"); goto download_out; } }#endif#ifdef CONFIG_ENABLE_BITMAPS else if (target == DOWNLOAD_BITMAP) { if (g_download_info[target].download != 0) { uart_puts("bitmap downloaded already.\n"); goto download_out; } }#endif#ifdef CONFIG_ENABLE_USERPREF else if (target == DOWNLOAD_USERPREF) { if (g_download_info[target].download != 0) { uart_puts("userpref downloaded already.\n"); goto download_out; } }#endif#ifdef CONFIG_ENABLE_VSYNCPARAM else if (target == DOWNLOAD_VSYNCPARAM) { if (g_download_info[target].download != 0) { uart_puts("vsyncparam downloaded already.\n"); goto download_out; } }#endif#ifdef CONFIG_ENABLE_DVI else if (target == DOWNLOAD_DVI) { if (g_download_info[target].download != 0) { uart_puts("dvi downloaded already.\n"); goto download_out; } }#endif } if (strcmp(argv[1], "serial") == 0) { int len, gzipped = 0; unsigned int origaddr = addr; if (argv[3] && strcmp(argv[3], "gz") == 0) { gzipped = 1; origaddr = addr; addr = loadaddr_temp; }#ifdef CONFIG_ENABLE_FIP downloading = 1;#endif uart_puts("Send uuencoded stream to serial port\n"); if ((len = serial_uudecode((unsigned char *) addr, 0)) >= 0) { uart_printf(recv_msg, len, len, addr); if (gzipped) { uart_printf(unzip_msg, origaddr); len = kunzip((char *) addr, (char *) origaddr, loadaddr_heap_unzip); } g_download_info[target].download = 1; g_download_info[target].len = len; }#ifdef CONFIG_ENABLE_FIP downloading = 0;#endif }#ifdef CONFIG_ENABLE_FULLFUNCTION else if (strcmp(argv[1], "ram") == 0) { if (argv[3] == NULL) uart_puts("Specify address of the image\n"); else if (argv[4] == NULL) uart_puts("Specify size of the image\n"); else { unsigned int imgaddr, imgsize; imgaddr = atoi(argv[3]); imgsize = atoi(argv[4]); memmove((void *) addr, (void *) imgaddr, imgsize); g_download_info[target].download = 1; g_download_info[target].len = imgsize; } }#endif else if (strcmp(argv[1], "romfs") == 0) { int len, gzipped = 0; unsigned int origaddr = addr; char buf[BOOTCONFIG_PATHLEN + 3]; if (filename == NULL) { uart_puts(nofile_msg); goto download_out; } else if (argv[3] && strcmp(argv[3], "gz") == 0) { gzipped = 1; origaddr = addr; addr = loadaddr_temp; } strcpy(buf, filename); if (gzipped) strcat(buf, ".gz"); len = load_romfs_file(buf, addr, LOADER_FLASH_ROMFSADDR, LOADER_FLASH_ROMFSADDR + 0x00040000, 0); if (len > 0) { if (gzipped) { uart_printf(unzip_msg, origaddr); len = kunzip((char *) addr, (char *) origaddr, loadaddr_heap_unzip); } g_download_info[target].download = 1; g_download_info[target].len = len; } }#ifdef CONFIG_ENABLE_NETWORK else if (strcmp(argv[1], "net") == 0) { int len, gzipped = 0; unsigned int origaddr = addr; char buf[BOOTCONFIG_PATHLEN + 3]; if (argv[3]) { if (strcmp(argv[3], "gz") == 0) { gzipped = 1; origaddr = addr; addr = loadaddr_temp; } else { filename = argv[3]; if (argv[4] && strcmp(argv[4], "gz") == 0) { gzipped = 1; origaddr = addr; addr = loadaddr_temp; } } } if (bootmenu_net_up(0) != 0) goto download_out; if (!ipv4_ipaddr_valid(g_bootconfig.server)) { uart_puts("Server address is invalid\n"); goto download_out; } else if (filename == NULL) { uart_puts(nofile_msg); goto download_out; } strcpy(buf, filename); if (gzipped) strcat(buf, ".gz");#ifdef SET_SERVER_IP_FOR_DOWNLOAD fip_write_text(0, fiptext = "LOADING", FIP_CENTER);#endif if (ipv4_tftp(g_bootconfig.server, buf, addr, &len) == 0) { uart_printf(recv_msg, len, len, addr); if (gzipped) { uart_printf(unzip_msg, origaddr); len = kunzip((char *) addr, (char *) origaddr, loadaddr_heap_unzip); } g_download_info[target].download = 1; g_download_info[target].len = len; } else { #ifdef SET_SERVER_IP_FOR_DOWNLOAD fip_write_text(0, fiptext = "LOAD ERR", FIP_CENTER); #endif } }#endif#ifdef CONFIG_ENABLE_USERPREF#ifdef CONFIG_ENABLE_VSYNCPARAM#ifdef CONFIG_ENABLE_FLASH else if ((strcmp(argv[1], "flash") == 0) && (target == DOWNLOAD_VSYNCPARAM)) { if (doload_vsyncparam(g_download_info[target].addr, 1) != 0) g_download_info[target].download = 1; else uart_puts("Invalid vsync image\n"); goto download_out; }#endif#endif#endif else { uart_puts("Unknown media\n"); goto download_out; } if (g_download_info[target].len > 0) uart_printf("Checksum: 0x%x\n", checksum = binfile_crc_check((void *)g_download_info[target].addr, g_download_info[target].len)); else{ #ifdef SET_SERVER_IP_FOR_DOWNLOAD fip_write_text(0, fiptext = "LOAD ERR", FIP_CENTER); #endif goto download_out; } if ((target == DOWNLOAD_INSTFILE) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_installablefile(g_download_info[target].addr, g_download_info[target].len, 0, 0) == 0)) { #ifdef SET_SERVER_IP_FOR_DOWNLOAD fip_write_text(0, fiptext = "LOAD ERR", FIP_CENTER); #endif uart_puts("Invalid installable file.\n"); } g_download_info[target].download = 0; /* Free it up for further download */ g_download_info[target].len = 0; } #ifdef CONFIG_ENABLE_IRQHANDLER if ((target == DOWNLOAD_IRQHANDLER) && (g_download_info[target].len > 0)) {#ifdef CONFIG_ENABLE_VSYNCPARAM if (g_download_info[DOWNLOAD_VSYNCPARAM].download == 0) { uart_puts("No VSYNC parameters loaded: blank structure.\n"); /* clear 32KB */ memset((void *) g_download_info[DOWNLOAD_VSYNCPARAM].addr, 0, MAX_USERPREF_SIZE/2); g_download_info[DOWNLOAD_VSYNCPARAM].download = 1; }#endif if ((checksum != 0) || (doload_irqhandler(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid IRQ handler.\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } }#endif#ifdef CONFIG_ENABLE_UCODES /* Assume ucode file only use top reserved area in DRAM0 */ if ((target == DOWNLOAD_UCODE) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_ucode(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid ucode image\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } } #endif#ifdef CONFIG_ENABLE_BITMAPS if ((target == DOWNLOAD_BITMAP) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_bitmap(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid bitmap\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } } #endif#ifdef CONFIG_ENABLE_DVI if ((target == DOWNLOAD_DVI) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_dvi(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid dvi\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } } #endifdownload_out: return 0;}#ifdef CONFIG_ARCH_TANGO15#ifdef CONFIG_ENABLE_FULLFUNCTIONvoid mac_subwrite(int argc, char *argv[]){ unsigned char buffer[256]; unsigned int addr=0xa4, saddr=0, len=8; int i; if(argc>2) saddr = atoi(argv[2]); if(argc>3) len = atoi(argv[3]); for(i=0;i<len;i++) { if (argc > (i+4)) buffer[i] = htoi(argv[i+4]); else break; } for(i=0;i<len;i++) uart_printf("%02x ",buffer[i]); uart_printf("\naddr=0x%x, subaddr=0x%x, len=0x%x\n",addr, saddr, len); hwi2c_write(addr, saddr, &buffer[0], len, 20);}void mac_dump(int argc, char *argv[]){ unsigned char buffer[256]; unsigned int addr=0xa5, len=256; int i; memset(buffer, 0xff, sizeof(buffer)); if (hwi2c_read_no_subaddr(addr, &buffer[0], len, 200) != 0) { /* ERROR */ uart_printf("mac dump error\n"); } else { /* We have the first 8 bytes in buffer */ uart_printf("0x00: "); for(i=0;i<len;i++) { uart_printf("%02x ",buffer[i]); if((i&0xf) == 0xf) uart_printf("\n0x%02x: ",i+1); } uart_printf("\n"); }}#endif //#ifdef CONFIG_ENABLE_FULLFUNCTION#define SIGN 0x5astatic unsigned int mac_offset=0;int mac_read(char *bufr){ unsigned char buf[256]; unsigned char sum=0; unsigned int offset; int i;#ifdef BOOTLOADER offset = mac_offset;#else offset = 0;#endif hwi2c_read_no_subaddr(0xa5, buf, 256, 20); for(i=0;i<8;i++) sum += buf[offset+i]; if( (sum ==0) && (buf[offset+6] == SIGN) ) { memcpy(bufr,&buf[offset],8); return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -