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

📄 bootmenu.c

📁 1. 8623L平台
💻 C
📖 第 1 页 / 共 5 页
字号:
                        *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 + -