📄 bootmenu.c
字号:
*cpend = 0; uart_printf("> %s\n", cp); if (bootmenu_command(cp)) return 1; cp = cpend + 1; } while (cpend != NULL); str[0] = 0; break; } } if (bootmenu_command(str)) return 1; }}int bootmenu_command(char *_str){ int i, argc; char str[256], *cp; char *argv[256]; strcpy(str, _str); trim(str); if (str[0] != 0) { // parsing command memset(argv, 0, sizeof argv); argc = 0; for (cp = strtok(str, " "); cp != NULL; cp = strtok(NULL, " ")) argv[argc++] = cp; // lookup the command table for (i = 0; s_cmdtable[i].cmd != NULL; ++i) if (strcmp(argv[0], s_cmdtable[i].cmd) == 0) if (s_cmdtable[i].func(argc, argv)) return 1; } return 0;}//// each menu functions//int bootmenu_help(int argc, char *argv[]){ static char s_helpstr[] = CONFIG_ARCH " boot loader " BOOTLOADER_VERSIONSTR "\n" "Copyright (C) 2002-2007 by Sigma Designs, Inc\n" "\n" "Command List :\n" ;#ifndef CONFIG_DISABLE_HELP_MSGS int i; if (argc == 1) { // help on all uart_puts(s_helpstr); for (i = 0; s_cmdtable[i].cmd != NULL; ++i) if (s_cmdtable[i].helpbrief) uart_puts(s_cmdtable[i].helpbrief); } else { // help on command for (i = 0; s_cmdtable[i].cmd != NULL; ++i) { if (strcmp(s_cmdtable[i].cmd, argv[1]) == 0) { if (s_cmdtable[i].helpbrief) uart_puts(s_cmdtable[i].helpbrief); if (s_cmdtable[i].helpmsg) uart_puts(s_cmdtable[i].helpmsg); return 0; } } uart_puts("Unknown command\n"); }#else uart_puts(s_helpstr); uart_puts(no_help_msg);#endif return 0;}int bootmenu_boot(int argc, char *argv[]){ unsigned int addr = 0; int doboot = 0; if (argc == 1) {#ifndef CONFIG_DISABLE_HELP_MSGS uart_puts(s_help_boot_brief); uart_puts(s_help_boot);#else uart_puts(no_help_msg);#endif return 0; } if (argv[2]) addr = atoi(argv[2]); if (strcmp(argv[1], "rom") == 0) { // boot rom [addr]#ifdef CONFIG_ENABLE_ROMFS2 doboot = doboot_romfs_rom(addr, 1);#else doboot = doboot_romfs_rom(addr);#endif#ifdef CONFIG_ENABLE_ROMFS2 } else if (strcmp(argv[1], "rom2") == 0) { doboot = doboot_romfs_rom(addr, 2);#endif#ifdef CONFIG_ENABLE_CRYPTO } else if (strcmp(argv[1], "romcrypt") == 0) {#ifdef CONFIG_ENABLE_ROMFS2 doboot = doboot_romfs_rom_crypt(addr, 1);#else doboot = doboot_romfs_rom_crypt(addr);#endif#ifdef CONFIG_ENABLE_ROMFS2 } else if (strcmp(argv[1], "rom2crypt") == 0) { doboot = doboot_romfs_rom_crypt(addr, 2);#endif#endif } else if (strcmp(argv[1], "kernel") == 0) { // boot kernel [addr] if (addr == 0) addr = loadaddr_kernel; doboot = 1; uart_printf("Boot kernel @ 0x%08x\n", addr); } else if (strcmp(argv[1], "initrd") == 0) { // boot initrd [addr] if (addr == 0) addr = loadaddr_kernelfs; doboot = 1; uart_printf("Boot kernel @ 0x%08x with INITRD @ 0x%08lx\n", addr, loadaddr_initrd); } else if (strcmp(argv[1], "boot") == 0) { // boot boot addr = 0x118 + loadaddr_boot; doboot = 1; uart_printf(jmp_msg, addr); } else if (argv[1][0] >= '0' && argv[1][0] <= '9') { // boot <addr> addr = atoi(argv[1]); doboot = 1; uart_printf(jmp_msg, addr); } #ifdef CONFIG_ENABLE_FULLFUNCTION else if (strcmp(argv[1], "romfs") == 0) { // boot romfs [addr] doboot = doboot_romfs_ram(addr); }#endif#ifdef CONFIG_ENABLE_IDE else if (strcmp(argv[1], "ide") == 0) { int drive, part, subpart = 0; if (argv[2] == NULL && argv[3] == NULL) { // boot ide [addr] doboot = doboot_idedisk(addr); } else { // boot ide <drive> <part> [subpart] [addr] if ((drive = bootmenu_ide_checkdrive(argv[2], IDE_ATA, 1)) >= 0) if ((part = bootmenu_ide_checkblock(argv[3], 1, 1, drive)) >= 0) { if (argv[4]) subpart = atoi(argv[4]); addr = (argv[5]) ? atoi(argv[5]) : 0; doboot = doboot_ide(drive, part, subpart, addr); } } } else if (strcmp(argv[1], "cd") == 0) { int drive; if (argv[2] == NULL) { // boot cd doboot = doboot_idecd(addr); } else { // boot cd <drive> [addr] if ((drive = bootmenu_ide_checkdrive(argv[2], IDE_ATAPI, 1)) >= 0) { addr = atoi(argv[3]) ? atoi(argv[3]) : 0; doboot = doboot_cd(drive, addr); } } }#ifdef CONFIG_ENABLE_CRYPTO else if (strcmp(argv[1], "cdcrypt") == 0) { int drive; if (argv[2] == NULL) { // boot cd doboot = doboot_idecd_crypt(addr); } else { // boot cd <drive> [addr] if ((drive = bootmenu_ide_checkdrive(argv[2], IDE_ATAPI, 1)) >= 0) { addr = atoi(argv[3]) ? atoi(argv[3]) : 0; doboot = doboot_cd_crypt(drive, addr); } } }#endif // CONFIG_ENABLE_CRYPTO#endif // CONFIG_ENABLE_IDE#ifdef CONFIG_ENABLE_NETWORK else if (strcmp(argv[1], "net") == 0) { if (argv[2]) doboot = doboot_net(addr, argv[2]); else doboot = doboot_net(addr, NULL); }#ifdef CONFIG_ENABLE_CRYPTO else if (strcmp(argv[1], "netcrypt") == 0) { if (argv[2]) doboot = doboot_net_crypt(addr, argv[2]); else doboot = doboot_net_crypt(addr, NULL); }#endif#endif else uart_puts("Unknown boot method\n"); if (doboot) {#ifdef CONFIG_ENABLE_FIP fip_write_text(0, fiptext = "BOOT", FIP_CENTER);#endif do_boot(addr); } return 0;}#if 0static int dcache_write_test(unsigned int dest, unsigned int size, unsigned int pattern){ register int i; volatile unsigned int *c_addr = (volatile unsigned int *)CACHED(dest); volatile unsigned int *uc_addr = (volatile unsigned int *)UNCACHED(dest); volatile unsigned int *ptr; uart_printf("D-CACHE write test: 0x%08lx, size %d, pattern 0x%x\n", dest, size, pattern); for (i = 0, ptr = c_addr; i < size / sizeof(unsigned int); i++, ptr++) *ptr = pattern; em86xx_flush_cache_data(); for (i = 0, ptr = uc_addr; i < size / sizeof(unsigned int); i++, ptr++) { if (*ptr != pattern) return 1; /* failed */ } return 0;}static int dcache_read_test(unsigned int dest, unsigned int size, unsigned int pattern){ register int i; volatile unsigned int *c_addr = (volatile unsigned int *)CACHED(dest); volatile unsigned int *uc_addr = (volatile unsigned int *)UNCACHED(dest); volatile unsigned int *ptr; uart_printf("D-CACHE read test: 0x%08lx, size %d, pattern 0x%x\n", dest, size, pattern); em86xx_flush_cache_data(); for (i = 0, ptr = uc_addr; i < size / sizeof(unsigned int); i++, ptr++) *ptr = pattern; for (i = 0, ptr = c_addr; i < size / sizeof(unsigned int); i++, ptr++) { if (*ptr != pattern) return 1; /* failed */ } return 0;}static int dcache_test(void){ const unsigned int dcache_size = 1024 * 16; /* 16KB */ unsigned int a0_status = __raw_readl(REG_BASE_audio_engine_0 + G2L_RESET_CONTROL); int ret = 0; __raw_writel(3, REG_BASE_audio_engine_0 + G2L_RESET_CONTROL); __raw_writel(2, REG_BASE_audio_engine_0 + G2L_RESET_CONTROL); __raw_writel(1, REG_BASE_audio_engine_0 + G2L_RESET_CONTROL); if (dcache_read_test(DMEM_BASE_audio_engine_0, dcache_size, 0xaaaaaaaa)) ret++; else if (dcache_read_test(DMEM_BASE_audio_engine_0, dcache_size, 0x55555555)) ret++; else if (dcache_read_test(DMEM_BASE_audio_engine_0, dcache_size, 0x0)) ret++; else if (dcache_read_test(DMEM_BASE_audio_engine_0, dcache_size, 0xffffffff)) ret++; else if (dcache_write_test(DMEM_BASE_audio_engine_0, dcache_size, 0xaaaaaaaa)) ret++; else if (dcache_write_test(DMEM_BASE_audio_engine_0, dcache_size, 0x55555555)) ret++; else if (dcache_write_test(DMEM_BASE_audio_engine_0, dcache_size, 0x0)) ret++; else if (dcache_write_test(DMEM_BASE_audio_engine_0, dcache_size, 0xffffffff)) ret++; __raw_writel(a0_status, REG_BASE_audio_engine_0 + G2L_RESET_CONTROL); return ret;}#endifint bootmenu_config(int argc, char *argv[]){ static int s_baudrate = DEFAULT_UART_BAUDRATE; if (argc == 1) {#ifndef CONFIG_DISABLE_HELP_MSGS uart_puts(s_help_config_brief); uart_puts(s_help_config);#else uart_puts(no_help_msg);#endif return 0; } if (strcmp(argv[1], "cmd") == 0) { int i; char cmdline[256]; for (i = 2, cmdline[0] = 0; i < argc; ++i) { strcat(cmdline, argv[i]); strcat(cmdline, " "); } strcpy(g_bootconfig.kernel_cmdline, cmdline); uart_printf("New command line : (%d) %s\n", strlen(cmdline), cmdline); build_kernel_param_tag(); } else if (strcmp(argv[1], "clock") == 0) { uart_printf("Current freq.: %dMHz\n", em86xx_getclockmhz()); if (argv[2]) { int clock = atoi(argv[2]); if (clock < CPU_CLOCK_MIN || clock > CPU_CLOCK_MAX) { uart_printf("Out of valid range (valid range: %d-%d).\n", CPU_CLOCK_MIN, CPU_CLOCK_MAX); } else { em86xx_setclockmhz(clock);#ifdef CONFIG_USE_SYSCLK uart_reset();#endif uart_printf("New freq.: %dMHz\n", em86xx_getclockmhz()); } } } else if (strcmp(argv[1], "serial") == 0) { static int s_validbaudrate[] = { 9600, 19200, 38400, 57600, 115200, 230400, 0 }; int i, baudrate = DEFAULT_UART_BAUDRATE; if (argv[2] == NULL) uart_printf("Setup UART as default baud rate %d\n", baudrate); else { if (strcmp(argv[2], "fast") == 0) baudrate = 115200; else if (strncmp(argv[2], "def", 3) == 0) baudrate = 38400; else baudrate = atoi(argv[2]); for (i = 0; s_validbaudrate[i] != 0; ++i) if (s_validbaudrate[i] == baudrate) break; if (s_validbaudrate[i] == 0) { uart_printf("Invalid baud rate %d\n", baudrate); baudrate = 0; } else uart_printf("Setup UART baud rate: %d\n", baudrate); } if (baudrate) { s_baudrate = baudrate; uart_init_port(DEFAULT_UART_PORT, baudrate, 1); } } #ifdef CONFIG_ENABLE_NETWORK else if (strcmp(argv[1], "net") == 0) { char str[128]; int i; while (1) { uart_printf(" Protocol : (0) None (1) Static IP (2) BOOTP (3) DHCP : (%d) ", g_bootconfig.protocol); uart_gets(str, sizeof str, 0); if ((trim(str))[0] == 0) break; i = atoi(str); if (i >= BOOTNET_NONE && i <= BOOTNET_DHCP) { g_bootconfig.protocol = i; break; } } 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -