mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-30 00:13:43 +02:00
Factor out CLI code by moving generic stuff out of main()
Add a generic programmer list output function to be used by alternative frontends. The interface between main() and doit is a hack and should get a clean design, but for now it serves the purpose of shortening main() by 120 lines. The rest of main() needs to be refactored a bit more before moving main() away. Corresponding to flashrom svn r821. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Sean Nelson <audiohacked@gmail.com>
This commit is contained in:
parent
cd8404dd9d
commit
552420b0d6
1
flash.h
1
flash.h
@ -481,6 +481,7 @@ char *extract_param(char **haystack, char *needle, char *delim);
|
||||
int check_erased_range(struct flashchip *flash, int start, int len);
|
||||
int verify_range(struct flashchip *flash, uint8_t *cmpbuf, int start, int len, char *message);
|
||||
char *strcat_realloc(char *dest, const char *src);
|
||||
int doit(struct flashchip *flash, int force, char *filename, int read_it, int write_it, int erase_it, int verify_it);
|
||||
|
||||
#define OK 0
|
||||
#define NT 1 /* Not tested */
|
||||
|
158
flashrom.c
158
flashrom.c
@ -899,14 +899,26 @@ void emergency_help_message(void)
|
||||
"DO NOT REBOOT OR POWEROFF!\n");
|
||||
}
|
||||
|
||||
void usage(const char *name)
|
||||
/* The way to go if you want a delimited list of programmers*/
|
||||
void list_programmers(char *delim)
|
||||
{
|
||||
enum programmer p;
|
||||
for (p = 0; p < PROGRAMMER_INVALID; p++) {
|
||||
printf("%s", programmer_table[p].name);
|
||||
if (p < PROGRAMMER_INVALID - 1)
|
||||
printf("%s", delim);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void cli_usage(const char *name)
|
||||
{
|
||||
const char *pname;
|
||||
int pnamelen;
|
||||
int remaining = 0;
|
||||
enum programmer p;
|
||||
|
||||
printf("usage: %s [-VfLzhR] [-E|-r file|-w file|-v file] [-c chipname]\n"
|
||||
printf("cli_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 "
|
||||
@ -971,11 +983,70 @@ void print_version(void)
|
||||
printf("flashrom v%s\n", flashrom_version);
|
||||
}
|
||||
|
||||
int selfcheck(void)
|
||||
{
|
||||
/* Safety check. */
|
||||
if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
|
||||
fprintf(stderr, "Programmer table miscompilation!\n");
|
||||
return 1;
|
||||
}
|
||||
if (spi_programmer_count - 1 != SPI_CONTROLLER_INVALID) {
|
||||
fprintf(stderr, "SPI programmer table miscompilation!\n");
|
||||
return 1;
|
||||
}
|
||||
#if BITBANG_SPI_SUPPORT == 1
|
||||
if (bitbang_spi_master_count - 1 != BITBANG_SPI_INVALID) {
|
||||
fprintf(stderr, "Bitbanging SPI master table miscompilation!\n");
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
void check_chip_supported(struct flashchip *flash)
|
||||
{
|
||||
if (TEST_OK_MASK != (flash->tested & TEST_OK_MASK)) {
|
||||
printf("===\n");
|
||||
if (flash->tested & TEST_BAD_MASK) {
|
||||
printf("This flash part has status NOT WORKING for operations:");
|
||||
if (flash->tested & TEST_BAD_PROBE)
|
||||
printf(" PROBE");
|
||||
if (flash->tested & TEST_BAD_READ)
|
||||
printf(" READ");
|
||||
if (flash->tested & TEST_BAD_ERASE)
|
||||
printf(" ERASE");
|
||||
if (flash->tested & TEST_BAD_WRITE)
|
||||
printf(" WRITE");
|
||||
printf("\n");
|
||||
}
|
||||
if ((!(flash->tested & TEST_BAD_PROBE) && !(flash->tested & TEST_OK_PROBE)) ||
|
||||
(!(flash->tested & TEST_BAD_READ) && !(flash->tested & TEST_OK_READ)) ||
|
||||
(!(flash->tested & TEST_BAD_ERASE) && !(flash->tested & TEST_OK_ERASE)) ||
|
||||
(!(flash->tested & TEST_BAD_WRITE) && !(flash->tested & TEST_OK_WRITE))) {
|
||||
printf("This flash part has status UNTESTED for operations:");
|
||||
if (!(flash->tested & TEST_BAD_PROBE) && !(flash->tested & TEST_OK_PROBE))
|
||||
printf(" PROBE");
|
||||
if (!(flash->tested & TEST_BAD_READ) && !(flash->tested & TEST_OK_READ))
|
||||
printf(" READ");
|
||||
if (!(flash->tested & TEST_BAD_ERASE) && !(flash->tested & TEST_OK_ERASE))
|
||||
printf(" ERASE");
|
||||
if (!(flash->tested & TEST_BAD_WRITE) && !(flash->tested & TEST_OK_WRITE))
|
||||
printf(" WRITE");
|
||||
printf("\n");
|
||||
}
|
||||
printf("Please email a report to flashrom@flashrom.org if any "
|
||||
"of the above operations\nwork correctly for you with "
|
||||
"this flash part. Please include the flashrom\noutput "
|
||||
"with the additional -V option for all operations you "
|
||||
"tested (-V, -rV,\n-wV, -EV), and mention which "
|
||||
"mainboard or programmer you tested. Thanks for your "
|
||||
"help!\n===\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
uint8_t *buf;
|
||||
unsigned long size, numbytes;
|
||||
FILE *image;
|
||||
unsigned long size;
|
||||
/* Probe for up to three flash chips. */
|
||||
struct flashchip *flash, *flashes[3];
|
||||
const char *name;
|
||||
@ -989,7 +1060,7 @@ int main(int argc, char *argv[])
|
||||
int list_supported_wiki = 0;
|
||||
#endif
|
||||
int operation_specified = 0;
|
||||
int ret = 0, i;
|
||||
int i;
|
||||
|
||||
#if PRINT_WIKI_SUPPORT == 1
|
||||
const char *optstring = "rRwvnVEfc:m:l:i:p:Lzh";
|
||||
@ -1032,21 +1103,8 @@ int main(int argc, char *argv[])
|
||||
printf_debug("%s\n", argv[i]);
|
||||
}
|
||||
|
||||
/* Safety check. */
|
||||
if (ARRAY_SIZE(programmer_table) - 1 != PROGRAMMER_INVALID) {
|
||||
fprintf(stderr, "Programmer table miscompilation!\n");
|
||||
if (selfcheck())
|
||||
exit(1);
|
||||
}
|
||||
if (spi_programmer_count - 1 != SPI_CONTROLLER_INVALID) {
|
||||
fprintf(stderr, "SPI programmer table miscompilation!\n");
|
||||
exit(1);
|
||||
}
|
||||
#if BITBANG_SPI_SUPPORT == 1
|
||||
if (bitbang_spi_master_count - 1 != BITBANG_SPI_INVALID) {
|
||||
fprintf(stderr, "Bitbanging SPI master table miscompilation!\n");
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
setbuf(stdout, NULL);
|
||||
while ((opt = getopt_long(argc, argv, optstring,
|
||||
@ -1163,7 +1221,7 @@ int main(int argc, char *argv[])
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
usage(argv[0]);
|
||||
cli_usage(argv[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1182,7 +1240,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (read_it && write_it) {
|
||||
printf("Error: -r and -w are mutually exclusive.\n");
|
||||
usage(argv[0]);
|
||||
cli_usage(argv[0]);
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
@ -1190,7 +1248,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (optind < argc) {
|
||||
printf("Error: Extra parameter found.\n");
|
||||
usage(argv[0]);
|
||||
cli_usage(argv[0]);
|
||||
}
|
||||
|
||||
if (programmer_init()) {
|
||||
@ -1198,6 +1256,7 @@ int main(int argc, char *argv[])
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// FIXME: Delay calibration should happen in programmer code.
|
||||
myusec_calibrate_delay();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(flashes); i++) {
|
||||
@ -1242,43 +1301,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
flash = flashes[0];
|
||||
|
||||
if (TEST_OK_MASK != (flash->tested & TEST_OK_MASK)) {
|
||||
printf("===\n");
|
||||
if (flash->tested & TEST_BAD_MASK) {
|
||||
printf("This flash part has status NOT WORKING for operations:");
|
||||
if (flash->tested & TEST_BAD_PROBE)
|
||||
printf(" PROBE");
|
||||
if (flash->tested & TEST_BAD_READ)
|
||||
printf(" READ");
|
||||
if (flash->tested & TEST_BAD_ERASE)
|
||||
printf(" ERASE");
|
||||
if (flash->tested & TEST_BAD_WRITE)
|
||||
printf(" WRITE");
|
||||
printf("\n");
|
||||
}
|
||||
if ((!(flash->tested & TEST_BAD_PROBE) && !(flash->tested & TEST_OK_PROBE)) ||
|
||||
(!(flash->tested & TEST_BAD_READ) && !(flash->tested & TEST_OK_READ)) ||
|
||||
(!(flash->tested & TEST_BAD_ERASE) && !(flash->tested & TEST_OK_ERASE)) ||
|
||||
(!(flash->tested & TEST_BAD_WRITE) && !(flash->tested & TEST_OK_WRITE))) {
|
||||
printf("This flash part has status UNTESTED for operations:");
|
||||
if (!(flash->tested & TEST_BAD_PROBE) && !(flash->tested & TEST_OK_PROBE))
|
||||
printf(" PROBE");
|
||||
if (!(flash->tested & TEST_BAD_READ) && !(flash->tested & TEST_OK_READ))
|
||||
printf(" READ");
|
||||
if (!(flash->tested & TEST_BAD_ERASE) && !(flash->tested & TEST_OK_ERASE))
|
||||
printf(" ERASE");
|
||||
if (!(flash->tested & TEST_BAD_WRITE) && !(flash->tested & TEST_OK_WRITE))
|
||||
printf(" WRITE");
|
||||
printf("\n");
|
||||
}
|
||||
printf("Please email a report to flashrom@flashrom.org if any "
|
||||
"of the above operations\nwork correctly for you with "
|
||||
"this flash part. Please include the flashrom\noutput "
|
||||
"with the additional -V option for all operations you "
|
||||
"tested (-V, -rV,\n-wV, -EV), and mention which "
|
||||
"mainboard or programmer you tested. Thanks for your "
|
||||
"help!\n===\n");
|
||||
}
|
||||
check_chip_supported(flash);
|
||||
|
||||
size = flash->total_size * 1024;
|
||||
if (check_max_decode((buses_supported & flash->bustype), size) &&
|
||||
@ -1307,6 +1330,21 @@ int main(int argc, char *argv[])
|
||||
if (write_it && !dont_verify_it)
|
||||
verify_it = 1;
|
||||
|
||||
return doit(flash, force, filename, read_it, write_it, erase_it, verify_it);
|
||||
}
|
||||
|
||||
/* This function signature is horrible. We need to design a better interface,
|
||||
* but right now it allows us to split off the CLI code.
|
||||
*/
|
||||
int doit(struct flashchip *flash, int force, char *filename, int read_it, int write_it, int erase_it, int verify_it)
|
||||
{
|
||||
uint8_t *buf;
|
||||
unsigned long numbytes;
|
||||
FILE *image;
|
||||
int ret = 0;
|
||||
unsigned long size;
|
||||
|
||||
size = flash->total_size * 1024;
|
||||
buf = (uint8_t *) calloc(size, sizeof(char));
|
||||
|
||||
if (erase_it) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user