]> git.sur5r.net Git - u-boot/blobdiff - arch/sandbox/cpu/start.c
Merge branch 'master' of git://git.denx.de/u-boot-spi
[u-boot] / arch / sandbox / cpu / start.c
index 4d5569e6476725d1f2a099a07369e40bd5237914..42353d80a847bc51eade86f414e72238a8a4916f 100644 (file)
@@ -5,7 +5,9 @@
 
 #include <common.h>
 #include <os.h>
+#include <cli.h>
 #include <asm/getopt.h>
+#include <asm/io.h>
 #include <asm/sections.h>
 #include <asm/state.h>
 
@@ -37,7 +39,7 @@ int sandbox_early_getopt_check(void)
 
        max_arg_len = 0;
        for (i = 0; i < num_options; ++i)
-               max_arg_len = max(strlen(sb_opt[i]->flag), max_arg_len);
+               max_arg_len = max((int)strlen(sb_opt[i]->flag), max_arg_len);
        max_noarg_len = max_arg_len + 7;
 
        for (i = 0; i < num_options; ++i) {
@@ -75,6 +77,8 @@ int sandbox_main_loop_init(void)
 
        /* Execute command if required */
        if (state->cmd) {
+               cli_init();
+
                run_command_list(state->cmd, -1, 0);
                if (!state->interactive)
                        os_exit(state->exit_type);
@@ -110,14 +114,8 @@ SANDBOX_CMDLINE_OPT_SHORT(interactive, 'i', 0, "Enter interactive mode");
 static int sandbox_cmdline_cb_jump(struct sandbox_state *state,
                                   const char *arg)
 {
-       state->jumped = 1;
-
-       /*
-        * TODO(sjg@chromium.org): Note this causes problems for gdb which
-        * wants to read debug data from the image.
-        *
-        * os_unlink(arg);
-        */
+       /* Remember to delete this U-Boot image later */
+       state->jumped_fname = arg;
 
        return 0;
 }
@@ -132,7 +130,8 @@ static int sandbox_cmdline_cb_memory(struct sandbox_state *state,
        state->write_ram_buf = true;
        state->ram_buf_fname = arg;
 
-       if (os_read_ram_buf(arg)) {
+       err = os_read_ram_buf(arg);
+       if (err) {
                printf("Failed to read RAM buffer\n");
                return err;
        }
@@ -142,6 +141,15 @@ static int sandbox_cmdline_cb_memory(struct sandbox_state *state,
 SANDBOX_CMDLINE_OPT_SHORT(memory, 'm', 1,
                          "Read/write ram_buf memory contents from file");
 
+static int sandbox_cmdline_cb_rm_memory(struct sandbox_state *state,
+                                       const char *arg)
+{
+       state->ram_buf_rm = true;
+
+       return 0;
+}
+SANDBOX_CMDLINE_OPT(rm_memory, 0, "Remove memory file after reading");
+
 static int sandbox_cmdline_cb_state(struct sandbox_state *state,
                                    const char *arg)
 {
@@ -184,9 +192,38 @@ static int sandbox_cmdline_cb_show_lcd(struct sandbox_state *state,
 SANDBOX_CMDLINE_OPT_SHORT(show_lcd, 'l', 0,
                          "Show the sandbox LCD display");
 
+static const char *term_args[STATE_TERM_COUNT] = {
+       "raw-with-sigs",
+       "raw",
+       "cooked",
+};
+
+static int sandbox_cmdline_cb_terminal(struct sandbox_state *state,
+                                      const char *arg)
+{
+       int i;
+
+       for (i = 0; i < STATE_TERM_COUNT; i++) {
+               if (!strcmp(arg, term_args[i])) {
+                       state->term_raw = i;
+                       return 0;
+               }
+       }
+
+       printf("Unknown terminal setting '%s' (", arg);
+       for (i = 0; i < STATE_TERM_COUNT; i++)
+               printf("%s%s", i ? ", " : "", term_args[i]);
+       puts(")\n");
+
+       return 1;
+}
+SANDBOX_CMDLINE_OPT_SHORT(terminal, 't', 1,
+                         "Set terminal to raw/cooked mode");
+
 int main(int argc, char *argv[])
 {
        struct sandbox_state *state;
+       gd_t data;
        int ret;
 
        ret = state_init();
@@ -201,6 +238,16 @@ int main(int argc, char *argv[])
        if (ret)
                goto err;
 
+       /* Remove old memory file if required */
+       if (state->ram_buf_rm && state->ram_buf_fname)
+               os_unlink(state->ram_buf_fname);
+
+       memset(&data, '\0', sizeof(data));
+       gd = &data;
+#ifdef CONFIG_SYS_MALLOC_F_LEN
+       gd->malloc_base = CONFIG_MALLOC_F_ADDR;
+#endif
+
        /* Do pre- and post-relocation init */
        board_init_f(0);