summaryrefslogtreecommitdiffstats
path: root/cli_classic.c
diff options
context:
space:
mode:
Diffstat (limited to 'cli_classic.c')
-rw-r--r--cli_classic.c202
1 files changed, 130 insertions, 72 deletions
diff --git a/cli_classic.c b/cli_classic.c
index 24762fe..6e8f098 100644
--- a/cli_classic.c
+++ b/cli_classic.c
@@ -37,33 +37,53 @@ void cli_classic_usage(const char *name)
int remaining = 0;
enum programmer p;
- printf("Usage: %s [-VfLzhR] [-E|-r file|-w file|-v file] [-c chipname]\n"
- " [-m [vendor:]part] [-l file] [-i image] [-p programmer]\n\n", name);
-
- printf("Please note that the command line interface for flashrom will "
- "change before\nflashrom 1.0. Do not use flashrom in scripts "
- "or other automated tools without\nchecking that your flashrom"
- " version won't interpret options in a different way.\n\n");
-
- printf
- (" -r | --read: read flash and save into file\n"
- " -w | --write: write file into flash\n"
- " -v | --verify: verify flash against file\n"
- " -n | --noverify: don't verify flash against file\n"
- " -E | --erase: erase flash device\n"
- " -V | --verbose: more verbose output\n"
- " -c | --chip <chipname>: probe only for specified flash chip\n"
+ printf("Usage: %s [-n] [-V] [-f] [-h|-R|-L|"
+#if PRINT_WIKI_SUPPORT == 1
+ "-z|"
+#endif
+ "-E|-r <file>|-w <file>|-v <file>]\n"
+ " [-c <chipname>] [-m [<vendor>:]<part>] [-l <file>]\n"
+ " [-i <image>] [-p <programmername>[:<parameters>]]\n",
+ name);
+
+ printf("Please note that the command line interface for flashrom has "
+ "changed between\n"
+ "0.9.1 and 0.9.2 and will change again before flashrom 1.0.\n"
+ "Do not use flashrom in scripts or other automated tools "
+ "without checking\n"
+ "that your flashrom version won't interpret options in a "
+ "different way.\n\n");
+
+ printf(" -h | --help print this help text\n"
+ " -R | --version print version (release)\n"
+ " -r | --read <file> read flash and save to "
+ "<file>\n"
+ " -w | --write <file> write <file> to flash\n"
+ " -v | --verify <file> verify flash against "
+ "<file>\n"
+ " -E | --erase erase flash device\n"
+ " -V | --verbose more verbose output\n"
+ " -c | --chip <chipname> probe only for specified "
+ "flash chip\n"
#if INTERNAL_SUPPORT == 1
- " -m | --mainboard <[vendor:]part>: override mainboard settings\n"
+ /* FIXME: --mainboard should be a programmer parameter */
+ " -m | --mainboard <[vendor:]part> override mainboard "
+ "detection\n"
#endif
- " -f | --force: force write without checking image\n"
- " -l | --layout <file.layout>: read ROM layout from file\n"
- " -i | --image <name>: only flash image name from flash layout\n"
- " -L | --list-supported: print supported devices\n"
+ " -f | --force force specific operations "
+ "(see man page)\n"
+ " -n | --noverify don't auto-verify\n"
+ " -l | --layout <file> read ROM layout from "
+ "<file>\n"
+ " -i | --image <name> only flash image <name> "
+ "from flash layout\n"
+ " -L | --list-supported print supported devices\n"
#if PRINT_WIKI_SUPPORT == 1
- " -z | --list-supported-wiki: print supported devices in wiki syntax\n"
+ " -z | --list-supported-wiki print supported devices "
+ "in wiki syntax\n"
#endif
- " -p | --programmer <name>: specify the programmer device");
+ " -p | --programmer <name>[:<param>] specify the programmer "
+ "device");
for (p = 0; p < PROGRAMMER_INVALID; p++) {
pname = programmer_table[p].name;
@@ -88,12 +108,19 @@ void cli_classic_usage(const char *name)
printf(")\n");
}
}
-
- printf(
- " -h | --help: print this help text\n"
- " -R | --version: print the version (release)\n"
- "\nYou can specify one of -E, -r, -w, -v or no operation. If no operation is\n"
- "specified, then all that happens is that flash info is dumped.\n\n");
+
+ printf("\nYou can specify one of -h, -R, -L, "
+#if PRINT_WIKI_SUPPORT == 1
+ "-z, "
+#endif
+ "-E, -r, -w, -v or no operation.\n"
+ "If no operation is specified, flashrom will only probe for "
+ "flash chips.\n\n");
+}
+
+void cli_classic_abort_usage(const char *name)
+{
+ printf("Please run \"%s --help\" for usage info.\n", name);
exit(1);
}
@@ -115,16 +142,12 @@ int cli_classic(int argc, char *argv[])
int operation_specified = 0;
int i;
-#if PRINT_WIKI_SUPPORT == 1
- const char *optstring = "rRwvnVEfc:m:l:i:p:Lzh";
-#else
- const char *optstring = "rRwvnVEfc:m:l:i:p:Lh";
-#endif
+ const char *optstring = "r:Rw:v:nVEfc:m:l:i:p:Lzh";
static struct option long_options[] = {
- {"read", 0, 0, 'r'},
- {"write", 0, 0, 'w'},
+ {"read", 1, 0, 'r'},
+ {"write", 1, 0, 'w'},
{"erase", 0, 0, 'E'},
- {"verify", 0, 0, 'v'},
+ {"verify", 1, 0, 'v'},
{"noverify", 0, 0, 'n'},
{"chip", 1, 0, 'c'},
{"mainboard", 1, 0, 'm'},
@@ -133,9 +156,7 @@ int cli_classic(int argc, char *argv[])
{"layout", 1, 0, 'l'},
{"image", 1, 0, 'i'},
{"list-supported", 0, 0, 'L'},
-#if PRINT_WIKI_SUPPORT == 1
{"list-supported-wiki", 0, 0, 'z'},
-#endif
{"programmer", 1, 0, 'p'},
{"help", 0, 0, 'h'},
{"version", 0, 0, 'R'},
@@ -147,18 +168,15 @@ int cli_classic(int argc, char *argv[])
char *tempstr = NULL;
print_version();
-
- if (argc > 1) {
- /* Yes, print them. */
- printf_debug("The arguments are:\n");
- for (i = 1; i < argc; ++i)
- printf_debug("%s\n", argv[i]);
- }
+ print_banner();
if (selfcheck())
exit(1);
setbuf(stdout, NULL);
+ /* FIXME: Delay all operation_specified checks until after command
+ * line parsing to allow --help overriding everything else.
+ */
while ((opt = getopt_long(argc, argv, optstring,
long_options, &option_index)) != EOF) {
switch (opt) {
@@ -166,16 +184,18 @@ int cli_classic(int argc, char *argv[])
if (++operation_specified > 1) {
fprintf(stderr, "More than one operation "
"specified. Aborting.\n");
- exit(1);
+ cli_classic_abort_usage(argv[0]);
}
+ filename = strdup(optarg);
read_it = 1;
break;
case 'w':
if (++operation_specified > 1) {
fprintf(stderr, "More than one operation "
"specified. Aborting.\n");
- exit(1);
+ cli_classic_abort_usage(argv[0]);
}
+ filename = strdup(optarg);
write_it = 1;
break;
case 'v':
@@ -183,20 +203,21 @@ int cli_classic(int argc, char *argv[])
if (++operation_specified > 1) {
fprintf(stderr, "More than one operation "
"specified. Aborting.\n");
- exit(1);
+ cli_classic_abort_usage(argv[0]);
}
if (dont_verify_it) {
fprintf(stderr, "--verify and --noverify are"
"mutually exclusive. Aborting.\n");
- exit(1);
+ cli_classic_abort_usage(argv[0]);
}
+ filename = strdup(optarg);
verify_it = 1;
break;
case 'n':
if (verify_it) {
fprintf(stderr, "--verify and --noverify are"
"mutually exclusive. Aborting.\n");
- exit(1);
+ cli_classic_abort_usage(argv[0]);
}
dont_verify_it = 1;
break;
@@ -210,36 +231,55 @@ int cli_classic(int argc, char *argv[])
if (++operation_specified > 1) {
fprintf(stderr, "More than one operation "
"specified. Aborting.\n");
- exit(1);
+ cli_classic_abort_usage(argv[0]);
}
erase_it = 1;
break;
-#if INTERNAL_SUPPORT == 1
case 'm':
+#if INTERNAL_SUPPORT == 1
tempstr = strdup(optarg);
lb_vendor_dev_from_string(tempstr);
- break;
+#else
+ fprintf(stderr, "Error: Internal programmer support "
+ "was not compiled in and --mainboard only\n"
+ "applies to the internal programmer. Aborting.\n");
+ cli_classic_abort_usage(argv[0]);
#endif
+ break;
case 'f':
force = 1;
break;
case 'l':
tempstr = strdup(optarg);
if (read_romlayout(tempstr))
- exit(1);
+ cli_classic_abort_usage(argv[0]);
break;
case 'i':
tempstr = strdup(optarg);
find_romentry(tempstr);
break;
case 'L':
+ if (++operation_specified > 1) {
+ fprintf(stderr, "More than one operation "
+ "specified. Aborting.\n");
+ cli_classic_abort_usage(argv[0]);
+ }
list_supported = 1;
break;
-#if PRINT_WIKI_SUPPORT == 1
case 'z':
+#if PRINT_WIKI_SUPPORT == 1
+ if (++operation_specified > 1) {
+ fprintf(stderr, "More than one operation "
+ "specified. Aborting.\n");
+ cli_classic_abort_usage(argv[0]);
+ }
list_supported_wiki = 1;
- break;
+#else
+ fprintf(stderr, "Error: Wiki output was not compiled "
+ "in. Aborting.\n");
+ cli_classic_abort_usage(argv[0]);
#endif
+ break;
case 'p':
for (programmer = 0; programmer < PROGRAMMER_INVALID; programmer++) {
name = programmer_table[programmer].name;
@@ -267,21 +307,37 @@ int cli_classic(int argc, char *argv[])
}
}
if (programmer == PROGRAMMER_INVALID) {
- printf("Error: Unknown programmer %s.\n", optarg);
- exit(1);
+ fprintf(stderr, "Error: Unknown programmer "
+ "%s.\n", optarg);
+ cli_classic_abort_usage(argv[0]);
}
break;
case 'R':
/* print_version() is always called during startup. */
+ if (++operation_specified > 1) {
+ fprintf(stderr, "More than one operation "
+ "specified. Aborting.\n");
+ cli_classic_abort_usage(argv[0]);
+ }
exit(0);
break;
case 'h':
- default:
+ if (++operation_specified > 1) {
+ fprintf(stderr, "More than one operation "
+ "specified. Aborting.\n");
+ cli_classic_abort_usage(argv[0]);
+ }
cli_classic_usage(argv[0]);
+ exit(0);
+ break;
+ default:
+ cli_classic_abort_usage(argv[0]);
break;
}
}
+ /* FIXME: Print the actions flashrom will take. */
+
if (list_supported) {
print_supported();
exit(0);
@@ -294,18 +350,18 @@ int cli_classic(int argc, char *argv[])
}
#endif
- if (read_it && write_it) {
- printf("Error: -r and -w are mutually exclusive.\n");
- cli_classic_usage(argv[0]);
+ if (optind < argc) {
+ fprintf(stderr, "Error: Extra parameter found.\n");
+ cli_classic_abort_usage(argv[0]);
}
- if (optind < argc)
- filename = argv[optind++];
-
- if (optind < argc) {
- printf("Error: Extra parameter found.\n");
- cli_classic_usage(argv[0]);
+#if INTERNAL_SUPPORT == 1
+ if ((programmer != PROGRAMMER_INTERNAL) && (lb_part || lb_vendor)) {
+ fprintf(stderr, "Error: --mainboard requires the internal "
+ "programmer. Aborting.\n");
+ cli_classic_abort_usage(argv[0]);
}
+#endif
if (chip_to_probe) {
for (flash = flashchips; flash && flash->name; flash++)
@@ -321,13 +377,15 @@ int cli_classic(int argc, char *argv[])
/* Clean up after the check. */
flash = NULL;
}
-
+
+ msg_pdbg("Initializing %s programmer\n",
+ programmer_table[programmer].name);
if (programmer_init()) {
fprintf(stderr, "Error: Programmer initialization failed.\n");
exit(1);
}
- // FIXME: Delay calibration should happen in programmer code.
+ /* FIXME: Delay calibration should happen in programmer code. */
myusec_calibrate_delay();
for (i = 0; i < ARRAY_SIZE(flashes); i++) {
@@ -383,7 +441,7 @@ int cli_classic(int argc, char *argv[])
printf("No operations were specified.\n");
// FIXME: flash writes stay enabled!
programmer_shutdown();
- exit(1);
+ exit(0);
}
if (!filename && !erase_it) {
OpenPOWER on IntegriCloud