void cmd_walk_and_expand (queue_t *qb) { queue_t *q; queue_t newq; ui_token_t *t; int alias_check = TRUE; int insquote = FALSE; char *envstr; q_init(&newq); while ((t = (ui_token_t *) q_deqnext(qb))) { if (t->token == '\'') { alias_check = FALSE; insquote = !insquote; /* Check to see if we should try to expand this token */ } else if (!insquote) { if (alias_check && !strchr(tokenbreaks,t->token) && (envstr = env_getenv(&(t->token)))) { /* Aliases: stick into token stream if no environment found */ cmd_append_tokens(&newq,envstr); KFREE(t); t = NULL; } else if (t->token == '$') { /* non-aliases: remove from token stream if no env found */ envstr = env_getenv(&(t->token)+1); if (envstr) cmd_append_tokens(&newq,envstr); KFREE(t); t = NULL; } else { /* Drop down below, keep this token as-is and append */ } } /* * If token was not removed, add it to the new queue */ if (t) { q_enqueue(&newq,&(t->qb)); alias_check = is_command_separator(t); } } /* * Put everything back on the original list. */ while ((q = q_deqnext(&newq))) { q_enqueue(qb,q); } }
void board_device_init(void) { uint64_t syscfg; int promice_boot; /* * Boot ROM */ syscfg = SBREADCSR(A_SCD_SYSTEM_CFG); promice_boot = ptswarm_startflags[(G_SYS_CONFIG(syscfg)/8) & 0x07] & \ PTSWARM_PROMICE_BOOT; /* * Don't remap chip select 0 when using PromICE, since * PromICE only emulates 2 Meg and we set ALT_BOOTROM * to 2 Meg */ if (!promice_boot) { cs0_remap(); /* Expand CS0 -- this is bootrom and flash */ bootrom_add(BOOTROM_PHYS); alt_bootrom_add(ALT_BOOTROM_PHYS); } else { cs1_remap(); /* Expand CS1 -- it's all flash */ alt_bootrom_add(BOOTROM_PHYS); bootrom_add(ALT_BOOTROM_PHYS); } cfe_add_device(&sb1250_24lc128eeprom,BIGEEPROM_SMBUS_CHAN,BIGEEPROM_SMBUS_DEV,0); /* * MACs - must init after environment, since the hw address is stored there */ cfe_add_device(&sb1250_ether,A_MAC_BASE_0,0,env_getenv("ETH0_HWADDR")); #ifndef _PTSWARM_DIAG_CFG_ cfe_add_device(&sb1250_ether,A_MAC_BASE_1,1,env_getenv("ETH1_HWADDR")); cfe_add_device(&sb1250_ether,A_MAC_BASE_2,2,env_getenv("ETH2_HWADDR")); #endif /* * Set variable that contains CPU speed, spit out config register */ syscfg = SBREADCSR(A_SCD_SYSTEM_CFG); printf("Config switch: %d\n",G_SYS_CONFIG(syscfg)); /* * Display CPU status */ sb1250_show_cpu_type(); }
void cfe_command_loop() { char buffer[300]; int status; char *prompt; SETLEDS("CFE "); for (;;) { if (recovery_button_status()) { xprintf("recovery\n"); recovery_op(); } prompt = env_getenv("PROMPT"); #if CFG_RAMAPP SETLEDS("CFE*"); if (!prompt) prompt = "CFE_RAM> "; #else if (!prompt) prompt = "CFE> "; #endif console_readline(prompt,buffer,sizeof(buffer)); status = ui_docommands(buffer); if (status != CMD_ERR_BLANK) { xprintf("*** command status = %d\n", status); } } }
int setenv(const char *name, const char *value, int overwrite) { /* No guarantees about state, always assume volatile */ if (overwrite || (env_getenv(name) == NULL)) return(env_setenv(name, EV_VOLATILE, value, NULL, NULL)); return(0); }
char * getenv(const char *name) { struct env_var *ev; /* Set but no value gives empty string */ if ((ev = env_getenv(name)) != NULL) { if (ev->ev_value != NULL) return(ev->ev_value); return(""); } return(NULL); }
//#define BOOTROM_PHYS 0x1FC00000 //#define BOOTROM_SIZE 2*1024*1024 void board_device_init(void) { cfe_add_device(&newflashdrv, BOOTROM_PHYS, (BOOTROM_SIZE) | FLASH_FLG_BUS8 | FLASH_FLG_DEV16, NULL); #if CFG_NETWORK cfe_add_device(&sb1250_x1240eeprom,X1240_SMBUS_CHAN,X1240_SMBUS_DEV,0); cfe_set_envdevice("eeprom0"); /* Connect NVRAM subsystem to EEPROM */ cfe_add_device(&sb1250_ether,A_MAC_BASE_0,0,env_getenv("ETH0_HWADDR")); #endif }
static void cfe_autostart(void) { char *env; int noauto = 0; char ch = 0; uint64_t now; uint64_t timeout; int delay = 1; /* 1s */ env = env_getenv("STARTUP"); if (!env) return; leds_on(); xprintf("Auto boot\n"); now = _getticks(); timeout = now + delay *(cfe_cpu_speed/(CPUCFG_CYCLESPERCPUTICK)); while(now < timeout) { while (console_status()) { console_read(&ch,1); if (ch == 3) noauto = TRUE; /* Ctrl-C means no auto */ } if (recovery_button_status()) { noauto = TRUE; } if (noauto == TRUE) break; now = _getticks(); } leds_off(); if (noauto) { xprintf("Startup canceled\n"); return; } ui_docommands(env); }
void board_device_init(void) { uint64_t syscfg; /* Boot ROM */ #ifndef _C3_DIAG_CFG_ cfe_add_device(&newflashdrv, BOOTROM_PHYS, (BOOTROM_SIZE*K64) | FLASH_FLG_BUS8 | FLASH_FLG_DEV16, NULL); cfe_add_device(&newflashdrv, ALT_BOOTROM_PHYS, (ALT_BOOTROM_SIZE*K64) | FLASH_FLG_BUS8 | FLASH_FLG_DEV16, NULL); #endif #ifdef _C3H_ /* Host Mode */ #if CFG_PCI /* * Add some sample PCI devices */ cfe_add_device(&pciidedrv,0,IDE_PROBE_MASTER_TYPE(IDE_DEVTYPE_DISK),NULL); cfe_add_device(&dc21143drv,0,0,env_getenv("TULIP0_HWADDR")); #if CFG_DOWNLOAD /* Access to bcm1250 in PCI device mode */ cfe_add_device(&bcm1250drv,0,0,NULL); #endif #endif #else /* Device Mode */ /* * Host download interface. */ cfe_add_device(&sb1250_pcihost,0,0,NULL); #endif /* _C3H_ */ syscfg = SBREADCSR(A_SCD_SYSTEM_CFG); printf("SysCfg: %016llX [PLL_DIV: %d, IOB0_DIV: %s, IOB1_DIV: %s]\n", syscfg, (int)G_SYS_PLL_DIV(syscfg), (syscfg & M_SYS_IOB0_DIV) ? "CPUCLK/3" : "CPUCLK/4", (syscfg & M_SYS_IOB1_DIV) ? "CPUCLK/2" : "CPUCLK/3"); if (G_SYS_PLL_DIV(syscfg) == 0) { printf("PLL_DIV of zero found, assuming 6 (300MHz)\n"); } }
int unsetenv(const char *name) { struct env_var *ev; int err; err = 0; if ((ev = env_getenv(name)) == NULL) { err = ENOENT; } else { if (ev->ev_unsethook != NULL) err = ev->ev_unsethook(ev); if (err == 0) { env_discard(ev); } } return(err); }
/* * Some notes: * * If the EV_VOLATILE flag is set, a copy of the variable is made. * If EV_DYNAMIC is set, the the variable has been allocated with * malloc and ownership transferred to the environment. * If (value) is NULL, the variable is set but has no value. */ int env_setenv(const char *name, int flags, const void *value, ev_sethook_t sethook, ev_unsethook_t unsethook) { struct env_var *ev, *curr, *last; if ((ev = env_getenv(name)) != NULL) { /* * If there's a set hook, let it do the work (unless we are working * for one already. */ if ((ev->ev_sethook != NULL) && !(flags & EV_NOHOOK)) return(ev->ev_sethook(ev, flags, value)); } else { /* * New variable; create and sort into list */ ev = alloc(sizeof(struct env_var)); ev->ev_name = strdup(name); ev->ev_value = NULL; /* hooks can only be set when the variable is instantiated */ ev->ev_sethook = sethook; ev->ev_unsethook = unsethook; /* Sort into list */ ev->ev_prev = NULL; ev->ev_next = NULL; /* Search for the record to insert before */ for (last = NULL, curr = environ; curr != NULL; last = curr, curr = curr->ev_next) { if (strcmp(ev->ev_name, curr->ev_name) < 0) { if (curr->ev_prev) { curr->ev_prev->ev_next = ev; } else { environ = ev; } ev->ev_next = curr; ev->ev_prev = curr->ev_prev; curr->ev_prev = ev; break; } } if (curr == NULL) { if (last == NULL) { environ = ev; } else { last->ev_next = ev; ev->ev_prev = last; } } } /* If there is data in the variable, discard it */ if (ev->ev_value != NULL) free(ev->ev_value); /* If we have a new value, use it */ if (flags & EV_VOLATILE) { ev->ev_value = strdup(value); } else { ev->ev_value = (void *) value; } /* Keep the flag components that are relevant */ ev->ev_flags = flags & (EV_DYNAMIC); return(0); }
/* * board_final_init() * * Do any final initialization, such as adding commands to the * user interface. * * If you don't want a user interface, put the startup code here. * This routine is called just before CFE starts its user interface. * * Input parameters: * nothing * * Return value: * nothing */ void board_final_init(void) { char *addr, *mask, *wait_time; char buf[512], *cur = buf; #ifdef CFG_ROMBOOT char *laddr = NULL; #endif #if !CFG_SIM char *boot_cfg = NULL; char *go_cmd = "go;"; #endif int commit = 0; uint32 ncdl; #if CFG_WL && CFG_WLU && CFG_SIM char *ssid; #endif ui_init_bcm947xxcmds(); /* Force commit of embedded NVRAM */ commit = restore_defaults; /* Set the SDRAM NCDL value into NVRAM if not already done */ if ((getintvar(NULL, "sdram_ncdl") == 0) && ((ncdl = si_memc_get_ncdl(sih)) != 0)) { sprintf(buf, "0x%x", ncdl); nvram_set("sdram_ncdl", buf); commit = 1; } /* Set the bootloader version string if not already done */ sprintf(buf, "CFE %s", EPI_VERSION_STR); if (strcmp(nvram_safe_get("pmon_ver"), buf) != 0) { nvram_set("pmon_ver", buf); commit = 1; } /* Set the size of the nvram area if not already done */ sprintf(buf, "%d", MAX_NVRAM_SPACE); if (strcmp(nvram_safe_get("nvram_space"), buf) != 0) { nvram_set("nvram_space", buf); commit = 1; } #ifdef RTL8365MB int ret = -1, retry = 0; rtk_port_mac_ability_t pa; GPIO_INIT(); for(retry = 0; ret && retry < 10; ++retry) { ret = rtk_switch_init(); if(ret) cfe_usleep(10000); else break; } printf("rtl8354mb initialized(%d)(retry %d) %s\n", ret, retry, ret?"failed":""); ret = rtk_port_phyEnableAll_set(1); if(ret) printf("rtk port_phyEnableAll Failed!(%d)\n", ret); else printf("rtk port_phyEnableAll ok\n"); /* configure & set GMAC ports */ pa.forcemode = MAC_FORCE; pa.speed = SPD_1000M; pa.duplex = FULL_DUPLEX; pa.link = 1; pa.nway = 0; pa.rxpause = 0; pa.txpause = 0; ret = rtk_port_macForceLinkExt_set(EXT_PORT0, MODE_EXT_RGMII, &pa); if(ret) printf("rtk port_macForceLink_set ext_Port0 Failed!(%d)\n", ret); else printf("rtk port_macForceLink_set ext_Port0 ok\n"); /* asic chk */ rtk_uint32 retVal, retVal2; rtk_uint32 data, data2; if((retVal = rtl8367c_getAsicReg(0x1311, &data)) != RT_ERR_OK || (retVal2 = rtl8367c_getAsicReg(0x1305, &data2)) != RT_ERR_OK) { printf("get failed(%d)(%d). (%x)(supposed to be 0x1016)\n", retVal, retVal2, data); } else { /* get ok, then chk reg*/ printf("get ok, chk 0x1311:%x(0x1016), 0x1305:%x(b4~b7:0x1)\n", data, data2); if(data != 0x1016){ printf("\n!! rtl reg 0x1311 error: (%d)(get %x)\n", retVal, data); } if((data2 & 0xf0) != 0x10) { printf("\n!! rtl reg 0x1305 error: (%d)(get %x)\n", retVal, data2); } } /* reset tx/rx delay */ retVal = rtk_port_rgmiiDelayExt_set(EXT_PORT0, 1, 4); if (retVal != RT_ERR_OK) printf("\n!! rtl set delay failed (%d)\n", retVal); #endif #if CFG_FLASH || CFG_SFLASH || CFG_NFLASH #if !CFG_SIM /* Commit NVRAM only if in FLASH */ if ( #ifdef BCMNVRAMW !nvram_inotp() && #endif commit) { printf("Committing NVRAM..."); nvram_commit(); printf("done\n"); if (restore_defaults) { #ifdef BCM_DEVINFO /* devinfo nvram hash table sync */ devinfo_nvram_sync(); #endif printf("Waiting for wps button release..."); reset_release_wait(); printf("done\n"); } } /* Reboot after restoring defaults */ if (restore_defaults) si_watchdog(sih, 1); #endif /* !CFG_SIM */ #else if (commit) printf("Flash not configured, not commiting NVRAM...\n"); #endif /* CFG_FLASH || CFG_SFLASH || CFG_NFLASH */ /* * Read the wait_time NVRAM variable and set the tftp max retries. * Assumption: tftp_rrq_timeout & tftp_recv_timeout are set to 1sec. */ if ((wait_time = nvram_get("wait_time")) != NULL) { tftp_max_retries = atoi(wait_time); if (tftp_max_retries > MAX_WAIT_TIME) tftp_max_retries = MAX_WAIT_TIME; else if (tftp_max_retries < MIN_WAIT_TIME) tftp_max_retries = MIN_WAIT_TIME; } #ifdef CFG_ROMBOOT else if (board_bootdev_rom(sih)) { tftp_max_retries = 10; } #endif /* Configure network */ if (cfe_finddev("eth0")) { int res; if ((addr = nvram_get("lan_ipaddr")) && (mask = nvram_get("lan_netmask"))) sprintf(buf, "ifconfig eth0 -addr=%s -mask=%s", addr, mask); else sprintf(buf, "ifconfig eth0 -auto"); res = ui_docommand(buf); #ifdef CFG_ROMBOOT /* Try indefinite netboot only while booting from ROM * and we are sure that we dont have valid nvram in FLASH */ while (board_bootdev_rom(sih) && !addr) { char ch; cur = buf; /* Check if something typed at console */ if (console_status()) { console_read(&ch, 1); /* Check for Ctrl-C */ if (ch == 3) { if (laddr) MFREE(osh, laddr, MAX_SCRIPT_FSIZE); xprintf("Stopped auto netboot!!!\n"); return; } } if (!res) { char *bserver, *bfile, *load_ptr; if (!laddr) laddr = MALLOC(osh, MAX_SCRIPT_FSIZE); if (!laddr) { load_ptr = (char *) 0x00008000; xprintf("Failed malloc for boot_script, Using :0x%x\n", (unsigned int)laddr); } else { load_ptr = laddr; } bserver = (bserver = env_getenv("BOOT_SERVER")) ? bserver:"192.168.1.1"; if ((bfile = env_getenv("BOOT_FILE"))) { int len; if (((len = strlen(bfile)) > 5) && !strncmp((bfile + len - 5), "cfesh", 5)) { cur += sprintf(cur, "batch -raw -tftp -addr=0x%x -max=0x%x %s:%s;", (unsigned int)load_ptr, MAX_SCRIPT_FSIZE, bserver, bfile); } if (((len = strlen(bfile)) > 3)) { if (!strncmp((bfile + len - 3), "elf", 3)) { cur += sprintf(cur, "boot -elf -tftp -max=0x5000000 %s:%s;", bserver, bfile); } if (!strncmp((bfile + len - 3), "raw", 3)) { cur += sprintf(cur, "boot -raw -z -tftp -addr=0x00008000" " -max=0x5000000 %s:%s;", bserver, bfile); } } } else { /* Make last effort */ cur += sprintf(cur, "batch -raw -tftp -addr=0x%x -max=0x%x %s:%s;", (unsigned int)load_ptr, MAX_SCRIPT_FSIZE, bserver, "cfe_script.cfesh"); cur += sprintf(cur, "boot -elf -tftp -max=0x5000000 %s:%s;", bserver, "boot_file.elf"); cur += sprintf(cur, "boot -raw -z -tftp -addr=0x00008000" " -max=0x5000000 %s:%s;", bserver, "boot_file.raw"); } ui_docommand(buf); cfe_sleep(3*CFE_HZ); } sprintf(buf, "ifconfig eth0 -auto"); res = ui_docommand(buf); } #endif /* CFG_ROMBOOT */ } #if CFG_WL && CFG_WLU && CFG_SIM if ((ssid = nvram_get("wl0_ssid"))) { sprintf(buf, "wl join %s", ssid); ui_docommand(buf); } #endif #if !CFG_SIM /* Try to run boot_config command if configured. * make sure to leave space for "go" command. */ if ((boot_cfg = nvram_get("boot_config"))) { if (strlen(boot_cfg) < (sizeof(buf) - sizeof(go_cmd))) cur += sprintf(cur, "%s;", boot_cfg); else printf("boot_config too long, skipping to autoboot\n"); } /* Boot image */ cur += sprintf(cur, go_cmd); #endif /* !CFG_SIM */ /* Startup */ if (cur > buf) env_setenv("STARTUP", buf, ENV_FLG_NORMAL); }
void board_device_init(void) { uint64_t syscfg; /* * Boot ROM */ #if !defined(_CSWARM_DIAG_CFG_) cfe_add_device(&newflashdrv, BOOTROM_PHYS, (BOOTROM_SIZE*K64) | FLASH_FLG_BUS8 | FLASH_FLG_DEV16, NULL); cfe_add_device(&newflashdrv, ALT_BOOTROM_PHYS, (ALT_BOOTROM_SIZE*K64) | FLASH_FLG_BUS8 | FLASH_FLG_DEV16, NULL); #endif cfe_add_device(&sb1250_24lc128eeprom,BIGEEPROM_SMBUS_CHAN,BIGEEPROM_SMBUS_DEV,0); /* * MACs - must init after environment, since the hw address is stored there */ cfe_add_device(&sb1250_ether,A_MAC_BASE_0,0,env_getenv("ETH0_HWADDR")); #ifndef _CSWARM_DIAG_CFG_ cfe_add_device(&sb1250_ether,A_MAC_BASE_1,1,env_getenv("ETH1_HWADDR")); cfe_add_device(&sb1250_ether,A_MAC_BASE_2,2,env_getenv("ETH2_HWADDR")); #endif /* * IDE disks and PCMCIA */ #if !defined(_CSWARM_DIAG_CFG_) && !defined(_CSWARM_DIAG3E_CFG_) /* * Uncomment to enable IDE disks * * cfe_add_device(&idedrv,IDE_PHYS+(0x1F0<<5), * IDE_PROBE_MASTER_TYPE(IDE_DEVTYPE_DISK) | * IDE_PROBE_SLAVE_TYPE(IDE_DEVTYPE_NOPROBE), * NULL); */ /* * Uncomment to enable PCMCIA support * * cfe_add_device(&pcmciadrv,PCMCIA_PHYS,0,NULL); */ #endif #if CFG_PCI /* * Add some sample PCI devices */ if (cfe_startflags & CFE_INIT_PCI) { cfe_add_device(&pciidedrv,0,IDE_PROBE_MASTER_TYPE(IDE_DEVTYPE_DISK),NULL); cfe_add_device(&dc21143drv,0,0,env_getenv("TULIP0_HWADDR")); } #endif /* * Set variable that contains CPU speed, spit out config register */ syscfg = SBREADCSR(A_SCD_SYSTEM_CFG); printf("Config switch: %d\n",G_SYS_CONFIG(syscfg)); #ifdef _MAGICWID_ printf("Reference Clock: %dMhz\n",(uint32_t)SB1250_REFCLK); #endif sb1250_show_cpu_type(); }
/* * board_final_init() * * Do any final initialization, such as adding commands to the * user interface. * * If you don't want a user interface, put the startup code here. * This routine is called just before CFE starts its user interface. * * Input parameters: * nothing * * Return value: * nothing */ void board_final_init(void) { char *addr, *mask, *wait_time; char buf[512], *cur = buf; #ifdef CFG_ROMBOOT char *laddr = NULL; #endif #if !CFG_SIM char *boot_cfg = NULL; char *go_cmd = "go;"; #endif int commit = 0; uint32 ncdl; #if CFG_WL && CFG_WLU && CFG_SIM char *ssid; #endif ui_init_bcm947xxcmds(); /* Force commit of embedded NVRAM */ // commit = restore_defaults; commit = 0; /* Set the SDRAM NCDL value into NVRAM if not already done */ if ((getintvar(NULL, "sdram_ncdl") == 0) && ((ncdl = si_memc_get_ncdl(sih)) != 0)) { sprintf(buf, "0x%x", ncdl); nvram_set("sdram_ncdl", buf); commit = 1; } /* Set the bootloader version string if not already done */ sprintf(buf, "CFE %s", EPI_VERSION_STR); if (strcmp(nvram_safe_get("pmon_ver"), buf) != 0) { nvram_set("pmon_ver", buf); commit = 1; } /* Set the size of the nvram area if not already done */ sprintf(buf, "%d", MAX_NVRAM_SPACE); if (strcmp(nvram_safe_get("nvram_space"), buf) != 0) { nvram_set("nvram_space", buf); commit = 1; } #if CFG_FLASH || CFG_SFLASH || CFG_NFLASH #if !CFG_SIM /* Commit NVRAM only if in FLASH */ if ( #ifdef BCMNVRAMW !nvram_inotp() && #endif commit) { printf("Committing NVRAM..."); nvram_commit(); printf("done\n"); if (restore_defaults) { printf("Waiting for reset button release..."); reset_release_wait(); printf("done\n"); } } /* Reboot after restoring defaults */ if (restore_defaults) si_watchdog(sih, 1); #endif /* !CFG_SIM */ #else if (commit) printf("Flash not configured, not commiting NVRAM...\n"); #endif /* CFG_FLASH || CFG_SFLASH || CFG_NFLASH */ /* * Read the wait_time NVRAM variable and set the tftp max retries. * Assumption: tftp_rrq_timeout & tftp_recv_timeout are set to 1sec. */ if ((wait_time = nvram_get("wait_time")) != NULL) { tftp_max_retries = atoi(wait_time); if (tftp_max_retries > MAX_WAIT_TIME) tftp_max_retries = MAX_WAIT_TIME; else if (tftp_max_retries < MIN_WAIT_TIME) tftp_max_retries = MIN_WAIT_TIME; } #ifdef CFG_ROMBOOT else if (board_bootdev_rom(sih)) { tftp_max_retries = 10; } #endif /* Configure network */ if (cfe_finddev("eth0")) { int res; if ((addr = nvram_get("lan_ipaddr")) && (mask = nvram_get("lan_netmask"))) sprintf(buf, "ifconfig eth0 -addr=%s -mask=%s", addr, mask); else sprintf(buf, "ifconfig eth0 -auto"); res = ui_docommand(buf); #ifdef CFG_ROMBOOT /* Try indefinite netboot only while booting from ROM * and we are sure that we dont have valid nvram in FLASH */ while (board_bootdev_rom(sih) && !addr) { char ch; cur = buf; /* Check if something typed at console */ if (console_status()) { console_read(&ch, 1); /* Check for Ctrl-C */ if (ch == 3) { if (laddr) MFREE(osh, laddr, MAX_SCRIPT_FSIZE); xprintf("Stopped auto netboot!!!\n"); return; } } if (!res) { char *bserver, *bfile, *load_ptr; if (!laddr) laddr = MALLOC(osh, MAX_SCRIPT_FSIZE); if (!laddr) { load_ptr = (char *) 0x00008000; xprintf("Failed malloc for boot_script, Using :0x%x\n", (unsigned int)laddr); } else { load_ptr = laddr; } bserver = (bserver = env_getenv("BOOT_SERVER")) ? bserver:"192.168.1.1"; if ((bfile = env_getenv("BOOT_FILE"))) { int len; if (((len = strlen(bfile)) > 5) && !strncmp((bfile + len - 5), "cfesh", 5)) { cur += sprintf(cur, "batch -raw -tftp -addr=0x%x -max=0x%x %s:%s;", (unsigned int)load_ptr, MAX_SCRIPT_FSIZE, bserver, bfile); } if (((len = strlen(bfile)) > 3)) { if (!strncmp((bfile + len - 3), "elf", 3)) { cur += sprintf(cur, "boot -elf -tftp -max=0x5000000 %s:%s;", bserver, bfile); } if (!strncmp((bfile + len - 3), "raw", 3)) { cur += sprintf(cur, "boot -raw -z -tftp -addr=0x00008000" " -max=0x5000000 %s:%s;", bserver, bfile); } } } else { /* Make last effort */ cur += sprintf(cur, "batch -raw -tftp -addr=0x%x -max=0x%x %s:%s;", (unsigned int)load_ptr, MAX_SCRIPT_FSIZE, bserver, "cfe_script.cfesh"); cur += sprintf(cur, "boot -elf -tftp -max=0x5000000 %s:%s;", bserver, "boot_file.elf"); cur += sprintf(cur, "boot -raw -z -tftp -addr=0x00008000" " -max=0x5000000 %s:%s;", bserver, "boot_file.raw"); } ui_docommand(buf); cfe_sleep(3*CFE_HZ); } sprintf(buf, "ifconfig eth0 -auto"); res = ui_docommand(buf); } #endif /* CFG_ROMBOOT */ } #if CFG_WL && CFG_WLU && CFG_SIM if ((ssid = nvram_get("wl0_ssid"))) { sprintf(buf, "wl join %s", ssid); ui_docommand(buf); } #endif #if !CFG_SIM /* Try to run boot_config command if configured. * make sure to leave space for "go" command. */ if ((boot_cfg = nvram_get("boot_config"))) { if (strlen(boot_cfg) < (sizeof(buf) - sizeof(go_cmd))) cur += sprintf(cur, "%s;", boot_cfg); else printf("boot_config too long, skipping to autoboot\n"); } /* Boot image */ cur += sprintf(cur, go_cmd); #endif /* !CFG_SIM */ /* Startup */ if (cur > buf) env_setenv("STARTUP", buf, ENV_FLG_NORMAL); }
int console_readline(char *prompt,char *str,int maxlen) { int reading = 1; int ch; int idx = 0; int len = 0; int t; int klen; int recall; int nosave = 0; char *x; char env[10]; console_inreadline++; recall = console_nextsave; if (console_savedlines[console_nextsave]) { KFREE(console_savedlines[console_nextsave]); console_savedlines[console_nextsave] = NULL; } console_savedlines[console_nextsave] = strdup(""); if (prompt && *prompt) console_write(prompt,strlen(prompt)); POLL(); while (reading) { /* * If someone used console_log (above) or hit Control-C (below), * redisplay the prompt and the string we've got so far. */ if (console_redisplay) { if (prompt && *prompt) console_write(prompt,strlen(prompt)); console_write(str,idx); console_redisplay = 0; continue; } #if defined(CONFIG_MIPS_BRCM) /* * If a background process has set the global g_console_abort flag, stop * reading from the keyboard. */ if (g_console_abort) { g_console_abort = 0; break; } #endif /* * if nobody's typed anything, keep polling */ if (console_status() == 0) { POLL(); continue; } /* * Get the char from the keyboard */ ch = console_readkey(); if (ch < 0) break; if (ch == 0) continue; /* * And dispatch it. Lots of yucky character manipulation follows */ switch (ch) { case CTRL('C'): /* Ctrl-C - cancel line */ console_write("^C\r\n",4); console_redisplay = 1; nosave = 1; idx = 0; break; case 0x7f: /* Backspace, Delete */ case CTRL('H'): if (idx > 0) { nosave = 0; len--; idx--; console_write("\b",1); if (len != idx) { for (t = idx; t < len; t++) str[t] = str[t+1]; console_write(&str[idx],len-idx); console_whiteout(1); console_backspace(len-idx); } else { console_whiteout(1); } } break; case CTRL('D'): /* Ctrl-D */ if ((idx >= 0) && (len != idx)) { nosave = 0; len--; for (t = idx; t < len; t++) str[t] = str[t+1]; console_write(&str[idx],len-idx); console_whiteout(1); console_backspace(len-idx); } break; case CTRL('B'): /* cursor left */ case VKEY_LEFT: if (idx > 0) { idx--; console_backspace(1); } break; case CTRL('F'): /* cursor right */ case VKEY_RIGHT: if (idx < len) { console_write(&str[idx],1); idx++; } break; case CTRL('A'): /* cursor to BOL */ console_backspace(idx); idx = 0; break; case CTRL('E'): /* cursor to EOL */ if (len-idx > 0) console_write(&str[idx],len-idx); idx = len; break; case CTRL('K'): /* Kill to EOL */ if (idx != len) { str[len] = '\0'; if (console_killbuffer) KFREE(console_killbuffer); console_killbuffer = strdup(&str[idx]); console_whiteout(len-idx); len = idx; nosave = 0; } break; case CTRL('Y'): /* Yank killed data */ if (console_killbuffer == NULL) break; klen = strlen(console_killbuffer); if (klen == 0) break; if (len + klen > maxlen) break; nosave = 0; for (t = len + klen; t > idx; t--) { str[t-1] = str[t-klen-1]; } for (t = 0; t < klen; t++) str[t+idx] = console_killbuffer[t]; len += klen; console_write(&str[idx],len-idx); idx += klen; console_backspace(len-idx-1); break; case CTRL('R'): /* Redisplay line */ str[len] = 0; console_crlf(); console_write(prompt,strlen(prompt)); console_write(str,len); console_backspace(len-idx); break; case CTRL('U'): /* Cancel line */ console_backspace(idx); console_eraseeol(); if (len > 0) nosave = 1; idx = 0; len = 0; break; case CTRL('M'): /* terminate */ case CTRL('J'): console_crlf(); reading = 0; break; case CTRL('P'): case VKEY_UP: /* recall previous line */ t = recall; t--; if (t < 0) t = MAXSAVELINES-1; if (console_savedlines[t] == NULL) break; recall = t; console_backspace(idx); strcpy(str,console_savedlines[recall]); len = idx = strlen(console_savedlines[recall]); console_eraseeol(); console_write(str,len); nosave = (t == ((console_nextsave - 1) % MAXSAVELINES)); break; case CTRL('N'): case VKEY_DOWN: /* Recall next line */ t = recall; t++; if (t == MAXSAVELINES) t = 0; if (console_savedlines[t] == NULL) break; recall = t; console_backspace(idx); strcpy(str,console_savedlines[recall]); len = idx = strlen(console_savedlines[recall]); console_eraseeol(); console_write(str,len); nosave = 1; break; case VKEY_F1: case VKEY_F2: case VKEY_F3: case VKEY_F4: case VKEY_F5: case VKEY_F6: case VKEY_F7: case VKEY_F8: case VKEY_F9: case VKEY_F10: case VKEY_F11: case VKEY_F12: sprintf(env,"F%d",ch-VKEY_F1+1); x = env_getenv(env); if (x) { console_backspace(idx); strcpy(str,x); idx = len = strlen(str); console_eraseeol(); console_write(str,len); console_crlf(); reading = 0; nosave = 1; } /* * If F12 is undefined, it means "repeat last command" */ if (ch == VKEY_F12) { t = recall; t--; if (t < 0) t = MAXSAVELINES-1; if (console_savedlines[t] == NULL) break; recall = t; console_backspace(idx); strcpy(str,console_savedlines[recall]); len = idx = strlen(console_savedlines[recall]); console_eraseeol(); console_write(str,len); console_crlf(); reading = 0; nosave = 1; } break; default: /* insert character */ if (ch >= ' ') { if (idx < (maxlen-1)) { nosave = 0; for (t = len; t > idx; t--) { str[t] = str[t-1]; } str[idx] = ch; len++; if (len != idx) { console_write(&str[idx],len-idx); console_backspace(len-idx-1); } idx++; } } break; } } POLL(); console_inreadline--; str[len] = 0; if ((len != 0) && !nosave) { if (console_savedlines[console_nextsave]) { KFREE(console_savedlines[console_nextsave]); } console_savedlines[console_nextsave] = strdup(str); console_nextsave++; if (console_nextsave == MAXSAVELINES) console_nextsave = 0; } return len; }
void cfe_main(int a,int b) { /* * By the time this routine is called, the following things have * already been done: * * 1. The processor(s) is(are) initialized. * 2. The caches are initialized. * 3. The memory controller is initialized. * 4. BSS has been zeroed. * 5. The data has been moved to R/W space. * 6. The "C" Stack has been initialized. */ cfe_bg_init(); /* init background processing */ cfe_attach_init(); cfe_timer_init(); /* Timer process */ cfe_bg_add(cfe_device_poll,NULL); /* * Initialize the memory allocator */ SETLEDS("KMEM"); KMEMINIT((unsigned char *) (uintptr_t) mem_heapstart, ((CFG_HEAP_SIZE)*1024)); /* * Initialize the console. It is done before the other devices * get turned on. The console init also sets the variable that * contains the CPU speed. */ SETLEDS("CONS"); board_console_init(); /* * Set up the exception vectors */ cfe_setup_exceptions(); /* * Say hello. */ SETLEDS("CIOK"); cfe_say_hello(); /* * Initialize the other devices. */ SETLEDS("AREN"); #if CFG_XIP xprintf("CFE XIP\n"); #endif xprintf("Init Arena\n"); cfe_arena_init(); #if CFG_PCI if (cfe_startflags & CFE_INIT_PCI) { pci_flags_t flags = PCI_FLG_NORMAL | PCI_FLG_LDT_PREFETCH; #ifndef EB332 char *str; extern cons_t pci_optnames[]; flags = PCI_FLG_NORMAL | PCI_FLG_LDT_PREFETCH; #if CFG_LDT_REV_017 flags |= PCI_FLG_LDT_REV_017; #endif str = env_getenv("PCI_OPTIONS"); setoptions(pci_optnames,str,&flags); xprintf("Initializing PCI. [%s]\n",str ? str : "normal"); #endif pci_configure(flags); } #endif SETLEDS("DEVI"); xprintf("Init Devs.\n"); board_device_init(); cfe_startup_info(); SETLEDS("ENVI"); cfe_setup_default_env(); xprintf("\n"); cfe_init_ui(); board_final_init(); cfe_autostart(); cfe_command_loop(); }