This adds simple command-line parssing to sandbox. The idea is that it
sets up the state with options provided, and this state can then be
queried as needed later.

Signed-off-by: Simon Glass <s...@chromium.org>
---
 arch/sandbox/cpu/Makefile |    2 +-
 arch/sandbox/cpu/parse.c  |   67 +++++++++++++++++++++++++++++++++++++++++++++
 arch/sandbox/cpu/parse.h  |   38 +++++++++++++++++++++++++
 arch/sandbox/cpu/start.c  |   33 ++++++++++++++++++++++
 4 files changed, 139 insertions(+), 1 deletions(-)
 create mode 100644 arch/sandbox/cpu/parse.c
 create mode 100644 arch/sandbox/cpu/parse.h

diff --git a/arch/sandbox/cpu/Makefile b/arch/sandbox/cpu/Makefile
index e5e860b..783a2c8 100644
--- a/arch/sandbox/cpu/Makefile
+++ b/arch/sandbox/cpu/Makefile
@@ -30,7 +30,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(CPU).o
 
-COBJS  := cpu.o start.o os.o
+COBJS  := cpu.o os.o parse.o start.o
 
 SRCS   := $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
diff --git a/arch/sandbox/cpu/parse.c b/arch/sandbox/cpu/parse.c
new file mode 100644
index 0000000..38426fb
--- /dev/null
+++ b/arch/sandbox/cpu/parse.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <getopt.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <asm/arch/state.h>
+
+#include "parse.h"
+
+static struct option long_options[] = {
+       {"command", required_argument, NULL, 'c'},
+       {"help", no_argument, NULL, 'h'},
+       {NULL, 0, NULL, 0}
+};
+
+void usage(void)
+{
+       fprintf(stderr, "u-boot, "
+               "a command line test interface to U-Boot\n\n"
+               "usage:\tu-boot [-ch]\n"
+               "Options:\n"
+               "\t-h\tDisplay help\n"
+               "\t-c <command>\tExecute U-Boot command\n"
+       );
+}
+
+int parse_args(struct sandbox_state *state, int argc, char *argv[])
+{
+       int c;
+
+       while ((c = getopt_long (argc, argv, "c:h",
+               long_options, NULL)) != EOF) {
+               switch (c) {
+               case 'c':
+                       state->cmd = optarg;
+                       break;
+               case 'h':
+                       usage();
+                       return 1;
+               default: /* '?' */
+                       fprintf(stderr, "Try `--help' for more information."
+                               "\n");
+                       return -1;
+               }
+       }
+       return 0;
+}
diff --git a/arch/sandbox/cpu/parse.h b/arch/sandbox/cpu/parse.h
new file mode 100644
index 0000000..08e5ceb
--- /dev/null
+++ b/arch/sandbox/cpu/parse.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __SANDBOX_PARSE_H
+#define __SANDBOX_PARSE_H
+struct sandbox_state;
+
+/**
+ * Parse arguments and update sandbox state.
+ *
+ * @param state                Sandbox state to update
+ * @param argc         Argument count
+ * @param argv         Argument vector
+ * @return 0 if ok, and program should continue;
+ *     1 if ok, but program should stop;
+ *     -1 on error: program should terminate.
+ */
+int parse_args(struct sandbox_state *state, int argc, char *argv[]);
+
+#endif
diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
index 685793e..a13e9d0 100644
--- a/arch/sandbox/cpu/start.c
+++ b/arch/sandbox/cpu/start.c
@@ -20,14 +20,47 @@
  */
 
 #include <common.h>
+#include <asm/arch/state.h>
+
+#include "parse.h"
 
 int main(int argc, char *argv[])
 {
+       struct sandbox_state *state = NULL;
+       int err;
+
+       err = state_init();
+       if (!err) {
+               state = state_get_current();
+               err = parse_args(state, argc, argv);
+       }
+       if (err < 0)
+               return 1;
+       else if (err)   /* success return, but nothing to do */
+               return 0;
+       assert(state);
+
        /*
         * Do pre- and post-relocation init, then start up U-Boot. This will
         * never return.
         */
        board_init_f(0);
 
+       /* TODO: this code is not reached! */
+
+       /* Execute command if required */
+       if (state->cmd) {
+#ifdef CONFIG_SYS_HUSH_PARSER
+               run_command(state->cmd, 0);
+#else
+               parse_string_outer(state->cmd, FLAG_PARSE_SEMICOLON |
+                                   FLAG_EXIT_FROM_LOOP);
+#endif
+       } else {
+               for (;;)
+                       main_loop();
+       }
+       printf("U-Boot exited with state %d\n", state->exit_type);
+
        return 0;
 }
-- 
1.7.3.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to