xref: /rk3399_rockchip-uboot/arch/sandbox/cpu/start.c (revision 8ec21bbe5c45fc80ca74eb403ab5b00a9e1f699f)
1bace3d00SSimon Glass /*
26fb62078SSimon Glass  * Copyright (c) 2011-2012 The Chromium OS Authors.
3bace3d00SSimon Glass  * See file CREDITS for list of people who contributed to this
4bace3d00SSimon Glass  * project.
5bace3d00SSimon Glass  *
6bace3d00SSimon Glass  * This program is free software; you can redistribute it and/or
7bace3d00SSimon Glass  * modify it under the terms of the GNU General Public License as
8bace3d00SSimon Glass  * published by the Free Software Foundation; either version 2 of
9bace3d00SSimon Glass  * the License, or (at your option) any later version.
10bace3d00SSimon Glass  *
11bace3d00SSimon Glass  * This program is distributed in the hope that it will be useful,
12bace3d00SSimon Glass  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13bace3d00SSimon Glass  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14bace3d00SSimon Glass  * GNU General Public License for more details.
15bace3d00SSimon Glass  *
16bace3d00SSimon Glass  * You should have received a copy of the GNU General Public License
17bace3d00SSimon Glass  * along with this program; if not, write to the Free Software
18bace3d00SSimon Glass  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19bace3d00SSimon Glass  * MA 02111-1307 USA
20bace3d00SSimon Glass  */
21bace3d00SSimon Glass 
22bace3d00SSimon Glass #include <common.h>
2370db4212SSimon Glass #include <asm/getopt.h>
2470db4212SSimon Glass #include <asm/sections.h>
256fb62078SSimon Glass #include <asm/state.h>
26bace3d00SSimon Glass 
2770db4212SSimon Glass #include <os.h>
2870db4212SSimon Glass 
2970db4212SSimon Glass int sandbox_early_getopt_check(void)
3070db4212SSimon Glass {
3170db4212SSimon Glass 	struct sandbox_state *state = state_get_current();
3270db4212SSimon Glass 	struct sb_cmdline_option **sb_opt = __u_boot_sandbox_option_start;
3370db4212SSimon Glass 	size_t num_options = __u_boot_sandbox_option_count();
3470db4212SSimon Glass 	size_t i;
3570db4212SSimon Glass 	int max_arg_len, max_noarg_len;
3670db4212SSimon Glass 
3770db4212SSimon Glass 	/* parse_err will be a string of the faulting option */
3870db4212SSimon Glass 	if (!state->parse_err)
3970db4212SSimon Glass 		return 0;
4070db4212SSimon Glass 
4170db4212SSimon Glass 	if (strcmp(state->parse_err, "help")) {
4270db4212SSimon Glass 		printf("u-boot: error: failed while parsing option: %s\n"
4370db4212SSimon Glass 			"\ttry running with --help for more information.\n",
4470db4212SSimon Glass 			state->parse_err);
4570db4212SSimon Glass 		os_exit(1);
4670db4212SSimon Glass 	}
4770db4212SSimon Glass 
4870db4212SSimon Glass 	printf(
4970db4212SSimon Glass 		"u-boot, a command line test interface to U-Boot\n\n"
5070db4212SSimon Glass 		"Usage: u-boot [options]\n"
5170db4212SSimon Glass 		"Options:\n");
5270db4212SSimon Glass 
5370db4212SSimon Glass 	max_arg_len = 0;
5470db4212SSimon Glass 	for (i = 0; i < num_options; ++i)
5570db4212SSimon Glass 		max_arg_len = max(strlen(sb_opt[i]->flag), max_arg_len);
5670db4212SSimon Glass 	max_noarg_len = max_arg_len + 7;
5770db4212SSimon Glass 
5870db4212SSimon Glass 	for (i = 0; i < num_options; ++i) {
5970db4212SSimon Glass 		struct sb_cmdline_option *opt = sb_opt[i];
6070db4212SSimon Glass 
6170db4212SSimon Glass 		/* first output the short flag if it has one */
6270db4212SSimon Glass 		if (opt->flag_short >= 0x100)
6370db4212SSimon Glass 			printf("      ");
6470db4212SSimon Glass 		else
6570db4212SSimon Glass 			printf("  -%c, ", opt->flag_short);
6670db4212SSimon Glass 
6770db4212SSimon Glass 		/* then the long flag */
6870db4212SSimon Glass 		if (opt->has_arg)
6970db4212SSimon Glass 			printf("--%-*s", max_noarg_len, opt->flag);
7070db4212SSimon Glass 		else
7170db4212SSimon Glass 			printf("--%-*s <arg> ", max_arg_len, opt->flag);
7270db4212SSimon Glass 
7370db4212SSimon Glass 		/* finally the help text */
7470db4212SSimon Glass 		printf("  %s\n", opt->help);
7570db4212SSimon Glass 	}
7670db4212SSimon Glass 
7770db4212SSimon Glass 	os_exit(0);
7870db4212SSimon Glass }
7970db4212SSimon Glass 
8070db4212SSimon Glass static int sb_cmdline_cb_help(struct sandbox_state *state, const char *arg)
8170db4212SSimon Glass {
8270db4212SSimon Glass 	/* just flag to sandbox_early_getopt_check to show usage */
8370db4212SSimon Glass 	return 1;
8470db4212SSimon Glass }
8570db4212SSimon Glass SB_CMDLINE_OPT_SHORT(help, 'h', 0, "Display help");
8670db4212SSimon Glass 
87ab4e07ebSSimon Glass int sandbox_main_loop_init(void)
88ab4e07ebSSimon Glass {
8970db4212SSimon Glass 	struct sandbox_state *state = state_get_current();
9070db4212SSimon Glass 
9170db4212SSimon Glass 	/* Execute command if required */
9270db4212SSimon Glass 	if (state->cmd) {
9370db4212SSimon Glass 		run_command(state->cmd, 0);
9470db4212SSimon Glass 		os_exit(state->exit_type);
9570db4212SSimon Glass 	}
9670db4212SSimon Glass 
97ab4e07ebSSimon Glass 	return 0;
98ab4e07ebSSimon Glass }
99ab4e07ebSSimon Glass 
10070db4212SSimon Glass static int sb_cmdline_cb_command(struct sandbox_state *state, const char *arg)
10170db4212SSimon Glass {
10270db4212SSimon Glass 	state->cmd = arg;
10370db4212SSimon Glass 	return 0;
10470db4212SSimon Glass }
10570db4212SSimon Glass SB_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command");
10670db4212SSimon Glass 
107bace3d00SSimon Glass int main(int argc, char *argv[])
108bace3d00SSimon Glass {
10970db4212SSimon Glass 	struct sandbox_state *state;
1106fb62078SSimon Glass 	int err;
1116fb62078SSimon Glass 
1126fb62078SSimon Glass 	err = state_init();
1136fb62078SSimon Glass 	if (err)
1146fb62078SSimon Glass 		return err;
1156fb62078SSimon Glass 
11670db4212SSimon Glass 	state = state_get_current();
11770db4212SSimon Glass 	if (os_parse_args(state, argc, argv))
11870db4212SSimon Glass 		return 1;
11970db4212SSimon Glass 
120bace3d00SSimon Glass 	/*
121bace3d00SSimon Glass 	 * Do pre- and post-relocation init, then start up U-Boot. This will
122bace3d00SSimon Glass 	 * never return.
123bace3d00SSimon Glass 	 */
124bace3d00SSimon Glass 	board_init_f(0);
125*8ec21bbeSAllen Martin 
126*8ec21bbeSAllen Martin 	/* NOTREACHED - board_init_f() does not return */
127*8ec21bbeSAllen Martin 	return 0;
128bace3d00SSimon Glass }
129