From dbdc65b65b6862af3b7afdb4ef6c3d2a153541e5 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 7 Jun 2017 19:40:54 +0200 Subject: iceprog: Give more information about invocation errors --- iceprog/iceprog.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 5db6dc9..8f93427 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -373,7 +374,10 @@ int main(int argc, char **argv) else if (!strcmp(optarg, "B")) ifnum = INTERFACE_B; else if (!strcmp(optarg, "C")) ifnum = INTERFACE_C; else if (!strcmp(optarg, "D")) ifnum = INTERFACE_D; - else help(argv[0]); + else + errx(EXIT_FAILURE, + "`%s' is not a valid interface (must be " + "`A', `B', `C', or `D')", optarg); break; case 'r': read_mode = true; @@ -413,18 +417,29 @@ int main(int argc, char **argv) } if (read_mode + check_mode + prog_sram + test_mode > 1) - help(argv[0]); + errx(EXIT_FAILURE, + "options `-r'/`-R', `-c', `-S', and `-t' are mutually " + "exclusive"); if (bulk_erase && dont_erase) - help(argv[0]); + errx(EXIT_FAILURE, + "options `-b' and `-n' are mutually exclusive"); - if (optind+1 != argc && !test_mode) { - if (bulk_erase && optind == argc) - filename = "/dev/null"; - else - help(argv[0]); - } else + if (optind + 1 == argc) { filename = argv[optind]; + } else if (optind != argc) { + warnx("too many arguments"); + fprintf(stderr, "Try `%s --help' " + "for more information.\n", argv[0]); + return EXIT_FAILURE; + } else if (bulk_erase) { + filename = "/dev/null"; + } else if (!test_mode) { + warnx("missing argument"); + fprintf(stderr, "Try `%s --help' " + "for more information.\n", argv[0]); + return EXIT_FAILURE; + } // --------------------------------------------------------- // Initialize USB connection to FT2232H -- cgit v1.2.3 From 90381332e2063618431fa42cf5028870c5453cb4 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 7 Jun 2017 20:11:43 +0200 Subject: iceprog: Check for invalid offset/size arguments --- iceprog/iceprog.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 8f93427..7886811 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -385,13 +385,21 @@ int main(int argc, char **argv) case 'R': read_mode = true; read_size = strtol(optarg, &endptr, 0); - if (!strcmp(endptr, "k")) read_size *= 1024; - if (!strcmp(endptr, "M")) read_size *= 1024 * 1024; + if (*endptr == '\0') /* ok */; + else if (!strcmp(endptr, "k")) read_size *= 1024; + else if (!strcmp(endptr, "M")) read_size *= 1024 * 1024; + else + errx(EXIT_FAILURE, + "`%s' is not a valid size", optarg); break; case 'o': rw_offset = strtol(optarg, &endptr, 0); - if (!strcmp(endptr, "k")) rw_offset *= 1024; - if (!strcmp(endptr, "M")) rw_offset *= 1024 * 1024; + if (*endptr == '\0') /* ok */; + else if (!strcmp(endptr, "k")) rw_offset *= 1024; + else if (!strcmp(endptr, "M")) rw_offset *= 1024 * 1024; + else + errx(EXIT_FAILURE, + "`%s' is not a valid offset", optarg); break; case 'c': check_mode = true; -- cgit v1.2.3 From 86af65cc32f2902e1f8b3bb5d8f2ce0412a94217 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 7 Jun 2017 19:41:35 +0200 Subject: iceprog: Check for non-applicable options --- iceprog/iceprog.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 7886811..31b7a2f 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -433,7 +433,25 @@ int main(int argc, char **argv) errx(EXIT_FAILURE, "options `-b' and `-n' are mutually exclusive"); + if (bulk_erase && (read_mode || check_mode || prog_sram || test_mode)) + errx(EXIT_FAILURE, + "option `-b' only valid in programming mode"); + if (dont_erase && (read_mode || check_mode || prog_sram || test_mode)) + errx(EXIT_FAILURE, + "option `-n' only valid in programming mode"); + + if (rw_offset != 0 && prog_sram) + errx(EXIT_FAILURE, "option `-o' not supported in SRAM mode"); + if (rw_offset != 0 && test_mode) + errx(EXIT_FAILURE, "option `-o' not supported in test mode"); + if (optind + 1 == argc) { + if (test_mode) { + warnx("test mode doesn't take a file name"); + fprintf(stderr, "Try `%s --help' " + "for more information.\n", argv[0]); + return EXIT_FAILURE; + } filename = argv[optind]; } else if (optind != argc) { warnx("too many arguments"); -- cgit v1.2.3 From 703a913bd188f1338d3f2cb27428227006e916aa Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 7 Jun 2017 19:46:08 +0200 Subject: iceprog: Add option `--help' --- iceprog/iceprog.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 31b7a2f..7f0830c 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -342,7 +343,6 @@ void help(const char *progname) fprintf(stderr, "This means that some data after the written data (or even before when -o is\n"); fprintf(stderr, "used) may be erased as well.\n"); fprintf(stderr, "\n"); - exit(1); } int main(int argc, char **argv) @@ -360,9 +360,15 @@ int main(int argc, char **argv) const char *devstr = NULL; enum ftdi_interface ifnum = INTERFACE_A; + static struct option long_options[] = { + {"help", no_argument, NULL, -2}, + {NULL, 0, NULL, 0} + }; + int opt; char *endptr; - while ((opt = getopt(argc, argv, "d:I:rR:o:cbnStv")) != -1) + while ((opt = getopt_long(argc, argv, "d:I:rR:o:cbnStv", + long_options, NULL)) != -1) { switch (opt) { @@ -419,8 +425,14 @@ int main(int argc, char **argv) case 'v': verbose = true; break; - default: + case -2: help(argv[0]); + return EXIT_SUCCESS; + default: + /* error message has already been printed */ + fprintf(stderr, "Try `%s --help' " + "for more information.\n", argv[0]); + return EXIT_FAILURE; } } -- cgit v1.2.3 From 6741d93245c3e080ef43d2c4c2ac525749c2eb76 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 7 Jun 2017 17:33:59 +0200 Subject: iceprog: Overhaul `--help' text --- iceprog/iceprog.c | 93 ++++++++++++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 52 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 7f0830c..a38e113 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -278,71 +278,60 @@ void flash_wait() void help(const char *progname) { + fprintf(stderr, "Simple programming tool for FTDI-based Lattice iCE programmers.\n"); + fprintf(stderr, "Usage: %s [-b|-n|-c] \n", progname); + fprintf(stderr, " %s -r|-R \n", progname); + fprintf(stderr, " %s -S \n", progname); + fprintf(stderr, " %s -t\n", progname); fprintf(stderr, "\n"); - fprintf(stderr, "iceprog -- simple programming tool for FTDI-based Lattice iCE programmers\n"); + fprintf(stderr, "General options:\n"); + fprintf(stderr, " -d use the specified USB device [default: i:0x0403:0x6010]\n"); + fprintf(stderr, " d: (e.g. d:002/005)\n"); + fprintf(stderr, " i:: (e.g. i:0x0403:0x6010)\n"); + fprintf(stderr, " i::: (e.g. i:0x0403:0x6010:0)\n"); + fprintf(stderr, " s:::\n"); + fprintf(stderr, " -I [ABCD] connect to the specified interface on the FTDI chip\n"); + fprintf(stderr, " [default: A]\n"); + fprintf(stderr, " -o start address for read/write [default: 0]\n"); + fprintf(stderr, " (append 'k' to the argument for size in kilobytes,\n"); + fprintf(stderr, " or 'M' for size in megabytes)\n"); + fprintf(stderr, " -v verbose output\n"); fprintf(stderr, "\n"); + fprintf(stderr, "Mode of operation:\n"); + fprintf(stderr, " [default] write file contents to flash, then verify\n"); + fprintf(stderr, " -r read first 256 kB from flash and write to file\n"); + fprintf(stderr, " -R read the specified number of bytes from flash\n"); + fprintf(stderr, " (append 'k' to the argument for size in kilobytes,\n"); + fprintf(stderr, " or 'M' for size in megabytes)\n"); + fprintf(stderr, " -c do not write flash, only verify (`check')\n"); + fprintf(stderr, " -S perform SRAM programming\n"); + fprintf(stderr, " -t just read the flash ID sequence\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Erase mode (only meaningful in default mode):\n"); + fprintf(stderr, " [default] erase aligned chunks of 64kB in write mode\n"); + fprintf(stderr, " This means that some data after the written data (or\n"); + fprintf(stderr, " even before when -o is used) may be erased as well.\n"); + fprintf(stderr, " -b bulk erase entire flash before writing\n"); + fprintf(stderr, " -n do not erase flash before writing\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Miscellaneous options:\n"); + fprintf(stderr, " --help display this help and exit\n"); + fprintf(stderr, " -- treat all remaining arguments as filenames\n"); fprintf(stderr, "\n"); fprintf(stderr, "Notes for iCEstick (iCE40HX-1k devel board):\n"); fprintf(stderr, " An unmodified iCEstick can only be programmed via the serial flash.\n"); fprintf(stderr, " Direct programming of the SRAM is not supported. For direct SRAM\n"); fprintf(stderr, " programming the flash chip and one zero ohm resistor must be desoldered\n"); fprintf(stderr, " and the FT2232H SI pin must be connected to the iCE SPI_SI pin, as shown\n"); - fprintf(stderr, " in this picture: http://www.clifford.at/gallery/2014-elektronik/IMG_20141115_183838\n"); - fprintf(stderr, "\n"); + fprintf(stderr, " in this picture:\n"); + fprintf(stderr, " http://www.clifford.at/gallery/2014-elektronik/IMG_20141115_183838\n"); fprintf(stderr, "\n"); fprintf(stderr, "Notes for the iCE40-HX8K Breakout Board:\n"); fprintf(stderr, " Make sure that the jumper settings on the board match the selected\n"); fprintf(stderr, " mode (SRAM or FLASH). See the iCE40-HX8K user manual for details.\n"); fprintf(stderr, "\n"); - fprintf(stderr, "\n"); - fprintf(stderr, "Usage: %s [options] \n", progname); - fprintf(stderr, "\n"); - fprintf(stderr, " -d \n"); - fprintf(stderr, " use the specified USB device:\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " d: (e.g. d:002/005)\n"); - fprintf(stderr, " i:: (e.g. i:0x0403:0x6010)\n"); - fprintf(stderr, " i::: (e.g. i:0x0403:0x6010:0)\n"); - fprintf(stderr, " s:::\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -I [ABCD]\n"); - fprintf(stderr, " connect to the specified interface on the FTDI chip\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -r\n"); - fprintf(stderr, " read first 256 kB from flash and write to file\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -R \n"); - fprintf(stderr, " read the specified number of bytes from flash\n"); - fprintf(stderr, " (append 'k' to the argument for size in kilobytes, or\n"); - fprintf(stderr, " 'M' for size in megabytes)\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -o \n"); - fprintf(stderr, " start address for read/write (instead of zero)\n"); - fprintf(stderr, " (append 'k' to the argument for size in kilobytes, or\n"); - fprintf(stderr, " 'M' for size in megabytes)\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -c\n"); - fprintf(stderr, " do not write flash, only verify (check)\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -b\n"); - fprintf(stderr, " bulk erase entire flash before writing\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -n\n"); - fprintf(stderr, " do not erase flash before writing\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -S\n"); - fprintf(stderr, " perform SRAM programming\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -t\n"); - fprintf(stderr, " just read the flash ID sequence\n"); - fprintf(stderr, "\n"); - fprintf(stderr, " -v\n"); - fprintf(stderr, " verbose output\n"); - fprintf(stderr, "\n"); - fprintf(stderr, "Without -b or -n, iceprog will erase aligned chunks of 64kB in write mode.\n"); - fprintf(stderr, "This means that some data after the written data (or even before when -o is\n"); - fprintf(stderr, "used) may be erased as well.\n"); - fprintf(stderr, "\n"); + fprintf(stderr, "If you have a bug report, please file an issue on github:\n"); + fprintf(stderr, " https://github.com/cliffordwolf/icestorm/issues\n"); } int main(int argc, char **argv) -- cgit v1.2.3 From 47c9cd4ac1335f04ad84feae45f493b7db46bde8 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Thu, 8 Jun 2017 19:08:42 +0200 Subject: iceprog: Open input/output files before talking to hardware --- iceprog/iceprog.c | 82 ++++++++++++++++++++++++------------------------------- 1 file changed, 35 insertions(+), 47 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index a38e113..d5356b9 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -468,6 +468,35 @@ int main(int argc, char **argv) return EXIT_FAILURE; } + /* open input/output file in advance + so we can fail before initializing the hardware */ + + FILE *f = NULL; + int file_size = -1; + + if (test_mode) + /* nop */; + else if (read_mode) { + f = (strcmp(filename, "-") == 0) ? stdout + : fopen(filename, "wb"); + if (f == NULL) + err(EXIT_FAILURE, + "can't open '%s' for writing", filename); + } else { + f = (strcmp(filename, "-") == 0) ? stdin + : fopen(filename, "rb"); + if (f == NULL) + err(EXIT_FAILURE, + "can't open '%s' for reading", filename); + + if (!prog_sram && !check_mode && !dont_erase && !bulk_erase) { + struct stat st_buf; + if (stat(filename, &st_buf) == -1) + err(EXIT_FAILURE, "can't stat '%s'", filename); + file_size = (int)st_buf.st_size; + } + } + // --------------------------------------------------------- // Initialize USB connection to FT2232H // --------------------------------------------------------- @@ -574,13 +603,6 @@ int main(int argc, char **argv) // Program // --------------------------------------------------------- - FILE *f = (strcmp(filename, "-") == 0) ? stdin : - fopen(filename, "rb"); - if (f == NULL) { - fprintf(stderr, "Error: Can't open '%s' for reading: %s\n", filename, strerror(errno)); - error(); - } - fprintf(stderr, "programming..\n"); while (1) { @@ -592,9 +614,6 @@ int main(int argc, char **argv) send_spi(buffer, rc); } - if (f != stdin) - fclose(f); - // add 48 dummy bits send_byte(0x8f); send_byte(0x05); @@ -630,13 +649,6 @@ int main(int argc, char **argv) if (!read_mode && !check_mode) { - FILE *f = (strcmp(filename, "-") == 0) ? stdin : - fopen(filename, "rb"); - if (f == NULL) { - fprintf(stderr, "Error: Can't open '%s' for reading: %s\n", filename, strerror(errno)); - error(); - } - if (!dont_erase) { if (bulk_erase) @@ -647,16 +659,10 @@ int main(int argc, char **argv) } else { - struct stat st_buf; - if (stat(filename, &st_buf)) { - fprintf(stderr, "Error: Can't stat '%s': %s\n", filename, strerror(errno)); - error(); - } - - fprintf(stderr, "file size: %d\n", (int)st_buf.st_size); + fprintf(stderr, "file size: %d\n", file_size); int begin_addr = rw_offset & ~0xffff; - int end_addr = (rw_offset + (int)st_buf.st_size + 0xffff) & ~0xffff; + int end_addr = (rw_offset + file_size + 0xffff) & ~0xffff; for (int addr = begin_addr; addr < end_addr; addr += 0x10000) { flash_write_enable(); @@ -678,8 +684,8 @@ int main(int argc, char **argv) flash_wait(); } - if (f != stdin) - fclose(f); + /* seek to the beginning for second pass */ + fseek(f, 0, SEEK_SET); } @@ -689,32 +695,15 @@ int main(int argc, char **argv) if (read_mode) { - FILE *f = (strcmp(filename, "-") == 0) ? stdout : - fopen(filename, "wb"); - if (f == NULL) { - fprintf(stderr, "Error: Can't open '%s' for writing: %s\n", filename, strerror(errno)); - error(); - } - fprintf(stderr, "reading..\n"); for (int addr = 0; addr < read_size; addr += 256) { uint8_t buffer[256]; flash_read(rw_offset + addr, buffer, 256); fwrite(buffer, 256, 1, f); } - - if (f != stdout) - fclose(f); } else { - FILE *f = (strcmp(filename, "-") == 0) ? stdin : - fopen(filename, "rb"); - if (f == NULL) { - fprintf(stderr, "Error: Can't open '%s' for reading: %s\n", filename, strerror(errno)); - error(); - } - fprintf(stderr, "reading..\n"); for (int addr = 0; true; addr += 256) { uint8_t buffer_flash[256], buffer_file[256]; @@ -728,9 +717,6 @@ int main(int argc, char **argv) } fprintf(stderr, "VERIFY OK\n"); - - if (f != stdin) - fclose(f); } @@ -746,6 +732,8 @@ int main(int argc, char **argv) fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low"); } + if (f != NULL && f != stdin && f != stdout) + fclose(f); // --------------------------------------------------------- // Exit -- cgit v1.2.3 From 0bd8876d7f5dad7abf8918b33d0d8e30d33b0aa0 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Thu, 22 Jun 2017 21:36:11 +0200 Subject: iceprog: Allow programming from standard input --- iceprog/iceprog.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index d5356b9..cd19ca0 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -472,7 +472,7 @@ int main(int argc, char **argv) so we can fail before initializing the hardware */ FILE *f = NULL; - int file_size = -1; + long file_size = -1; if (test_mode) /* nop */; @@ -490,10 +490,13 @@ int main(int argc, char **argv) "can't open '%s' for reading", filename); if (!prog_sram && !check_mode && !dont_erase && !bulk_erase) { - struct stat st_buf; - if (stat(filename, &st_buf) == -1) - err(EXIT_FAILURE, "can't stat '%s'", filename); - file_size = (int)st_buf.st_size; + if (fseek(f, 0L, SEEK_END) == -1) + err(EXIT_FAILURE, "%s: fseek", filename); + file_size = ftell(f); + if (file_size == -1) + err(EXIT_FAILURE, "%s: ftell", filename); + if (fseek(f, 0L, SEEK_SET) == -1) + err(EXIT_FAILURE, "%s: fseek", filename); } } @@ -659,7 +662,7 @@ int main(int argc, char **argv) } else { - fprintf(stderr, "file size: %d\n", file_size); + fprintf(stderr, "file size: %ld\n", file_size); int begin_addr = rw_offset & ~0xffff; int end_addr = (rw_offset + file_size + 0xffff) & ~0xffff; -- cgit v1.2.3 From 8413b2c68977b76cc17e01df299337d3f2aeba6f Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Thu, 8 Jun 2017 14:11:53 +0200 Subject: iceprog: Allow programming from pipe --- iceprog/iceprog.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 8 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index cd19ca0..e4e6f49 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -489,14 +489,54 @@ int main(int argc, char **argv) err(EXIT_FAILURE, "can't open '%s' for reading", filename); - if (!prog_sram && !check_mode && !dont_erase && !bulk_erase) { - if (fseek(f, 0L, SEEK_END) == -1) - err(EXIT_FAILURE, "%s: fseek", filename); - file_size = ftell(f); - if (file_size == -1) - err(EXIT_FAILURE, "%s: ftell", filename); - if (fseek(f, 0L, SEEK_SET) == -1) - err(EXIT_FAILURE, "%s: fseek", filename); + /* For regular programming, we need to read the file + twice--once for programming and once for verifying--and + need to know the file size in advance in order to erase + the correct amount of memory. + + See if we can seek on the input file. Checking for "-" + as an argument isn't enough as we might be reading from a + named pipe, or contrarily, the standard input may be an + ordinary file. */ + + if (!prog_sram && !check_mode) { + if (fseek(f, 0L, SEEK_END) != -1) { + file_size = ftell(f); + if (file_size == -1) + err(EXIT_FAILURE, + "%s: ftell", filename); + if (fseek(f, 0L, SEEK_SET) == -1) + err(EXIT_FAILURE, + "%s: fseek", filename); + } else { + FILE *pipe = f; + + f = tmpfile(); + if (f == NULL) + errx(EXIT_FAILURE, + "can't open temporary file"); + file_size = 0; + + while (true) { + static unsigned char buffer[4096]; + size_t rc = + fread(buffer, 1, 4096, pipe); + if (rc <= 0) + break; + size_t wc = + fwrite(buffer, 1, rc, f); + if (wc != rc) + errx(EXIT_FAILURE, + "can't write to " + "temporary file"); + file_size += rc; + } + fclose(pipe); + + /* now seek to the beginning so we can + start reading again */ + fseek(f, 0, SEEK_SET); + } } } -- cgit v1.2.3 From 7b97eb41774019443f552ca1d49766b9798fee32 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Thu, 8 Jun 2017 19:40:08 +0200 Subject: iceprog: When reading, don't write more bytes than requested --- iceprog/iceprog.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index e4e6f49..5233c46 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -742,7 +742,8 @@ int main(int argc, char **argv) for (int addr = 0; addr < read_size; addr += 256) { uint8_t buffer[256]; flash_read(rw_offset + addr, buffer, 256); - fwrite(buffer, 256, 1, f); + fwrite(buffer, read_size - addr > 256 ? 256 : + read_size - addr, 1, f); } } else -- cgit v1.2.3 From eef1731d2b114273f7b4d55475e5b2aa021d6308 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Sun, 11 Jun 2017 14:38:43 +0200 Subject: iceprog: Return a meaningful exit status --- iceprog/iceprog.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 5233c46..430c58d 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -53,7 +53,7 @@ void check_rx() } } -void error() +void error(int status) { check_rx(); fprintf(stderr, "ABORT.\n"); @@ -63,7 +63,7 @@ void error() ftdi_usb_close(&ftdic); } ftdi_deinit(&ftdic); - exit(1); + exit(status); } uint8_t recv_byte() @@ -73,7 +73,7 @@ uint8_t recv_byte() int rc = ftdi_read_data(&ftdic, &data, 1); if (rc < 0) { fprintf(stderr, "Read error.\n"); - error(); + error(2); } if (rc == 1) break; @@ -87,7 +87,7 @@ void send_byte(uint8_t data) int rc = ftdi_write_data(&ftdic, &data, 1); if (rc != 1) { fprintf(stderr, "Write error (single byte, rc=%d, expected %d).\n", rc, 1); - error(); + error(2); } } @@ -103,7 +103,7 @@ void send_spi(uint8_t *data, int n) int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { fprintf(stderr, "Write error (chunk, rc=%d, expected %d).\n", rc, n); - error(); + error(2); } } @@ -119,7 +119,7 @@ void xfer_spi(uint8_t *data, int n) int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { fprintf(stderr, "Write error (chunk, rc=%d, expected %d).\n", rc, n); - error(); + error(2); } for (int i = 0; i < n; i++) @@ -318,6 +318,14 @@ void help(const char *progname) fprintf(stderr, " --help display this help and exit\n"); fprintf(stderr, " -- treat all remaining arguments as filenames\n"); fprintf(stderr, "\n"); + fprintf(stderr, "Exit status:\n"); + fprintf(stderr, " 0 on success,\n"); + fprintf(stderr, " 1 if a non-hardware error occurred (e.g., failure to read from or\n"); + fprintf(stderr, " write to a file, or invoked with invalid options),\n"); + fprintf(stderr, " 2 if communication with the hardware failed (e.g., cannot find the\n"); + fprintf(stderr, " iCE FTDI USB device),\n"); + fprintf(stderr, " 3 if verification of the data failed.\n"); + fprintf(stderr, "\n"); fprintf(stderr, "Notes for iCEstick (iCE40HX-1k devel board):\n"); fprintf(stderr, " An unmodified iCEstick can only be programmed via the serial flash.\n"); fprintf(stderr, " Direct programming of the SRAM is not supported. For direct SRAM\n"); @@ -552,12 +560,12 @@ int main(int argc, char **argv) if (devstr != NULL) { if (ftdi_usb_open_string(&ftdic, devstr)) { fprintf(stderr, "Can't find iCE FTDI USB device (device string %s).\n", devstr); - error(); + error(2); } } else { if (ftdi_usb_open(&ftdic, 0x0403, 0x6010)) { fprintf(stderr, "Can't find iCE FTDI USB device (vedor_id 0x0403, device_id 0x6010).\n"); - error(); + error(2); } } @@ -565,30 +573,30 @@ int main(int argc, char **argv) if (ftdi_usb_reset(&ftdic)) { fprintf(stderr, "Failed to reset iCE FTDI USB device.\n"); - error(); + error(2); } if (ftdi_usb_purge_buffers(&ftdic)) { fprintf(stderr, "Failed to purge buffers on iCE FTDI USB device.\n"); - error(); + error(2); } if (ftdi_get_latency_timer(&ftdic, &ftdi_latency) < 0) { fprintf(stderr, "Failed to get latency timer (%s).\n", ftdi_get_error_string(&ftdic)); - error(); + error(2); } /* 1 is the fastest polling, it means 1 kHz polling */ if (ftdi_set_latency_timer(&ftdic, 1) < 0) { fprintf(stderr, "Failed to set latency timer (%s).\n", ftdi_get_error_string(&ftdic)); - error(); + error(2); } ftdic_latency_set = true; if (ftdi_set_bitmode(&ftdic, 0xff, BITMODE_MPSSE) < 0) { fprintf(stderr, "Failed set BITMODE_MPSSE on iCE FTDI USB device.\n"); - error(); + error(2); } // enable clock divide by 5 @@ -756,7 +764,7 @@ int main(int argc, char **argv) flash_read(rw_offset + addr, buffer_flash, rc); if (memcmp(buffer_file, buffer_flash, rc)) { fprintf(stderr, "Found difference between flash and file!\n"); - error(); + error(3); } } -- cgit v1.2.3 From 0a8d98f36a19082eb303a1d42d951c82848b79bb Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 28 Jun 2017 22:18:10 +0200 Subject: iceprog: Fix error messages --- iceprog/iceprog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 430c58d..1c2820c 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -564,7 +564,7 @@ int main(int argc, char **argv) } } else { if (ftdi_usb_open(&ftdic, 0x0403, 0x6010)) { - fprintf(stderr, "Can't find iCE FTDI USB device (vedor_id 0x0403, device_id 0x6010).\n"); + fprintf(stderr, "Can't find iCE FTDI USB device (vendor_id 0x0403, device_id 0x6010).\n"); error(2); } } @@ -595,7 +595,7 @@ int main(int argc, char **argv) ftdic_latency_set = true; if (ftdi_set_bitmode(&ftdic, 0xff, BITMODE_MPSSE) < 0) { - fprintf(stderr, "Failed set BITMODE_MPSSE on iCE FTDI USB device.\n"); + fprintf(stderr, "Failed to set BITMODE_MPSSE on iCE FTDI USB device.\n"); error(2); } -- cgit v1.2.3 From 64e129bee9da96738dad416787d543a9711ac6c3 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 28 Jun 2017 16:53:45 +0200 Subject: iceprog: Fix coding style inconsistencies --- iceprog/iceprog.c | 98 ++++++++++++++++++++++++++----------------------------- 1 file changed, 47 insertions(+), 51 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 1c2820c..ec71fd0 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -48,7 +48,8 @@ void check_rx() while (1) { uint8_t data; int rc = ftdi_read_data(&ftdic, &data, 1); - if (rc <= 0) break; + if (rc <= 0) + break; fprintf(stderr, "unexpected rx byte: %02X\n", data); } } @@ -97,8 +98,8 @@ void send_spi(uint8_t *data, int n) return; send_byte(0x11); - send_byte(n-1); - send_byte((n-1) >> 8); + send_byte(n - 1); + send_byte((n - 1) >> 8); int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { @@ -113,8 +114,8 @@ void xfer_spi(uint8_t *data, int n) return; send_byte(0x31); - send_byte(n-1); - send_byte((n-1) >> 8); + send_byte(n - 1); + send_byte((n - 1) >> 8); int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { @@ -229,7 +230,7 @@ void flash_prog(int addr, uint8_t *data, int n) if (verbose) for (int i = 0; i < n; i++) - fprintf(stderr, "%02x%c", data[i], i == n-1 || i % 32 == 31 ? '\n' : ' '); + fprintf(stderr, "%02x%c", data[i], i == n - 1 || i % 32 == 31 ? '\n' : ' '); } void flash_read(int addr, uint8_t *data, int n) @@ -246,7 +247,7 @@ void flash_read(int addr, uint8_t *data, int n) if (verbose) for (int i = 0; i < n; i++) - fprintf(stderr, "%02x%c", data[i], i == n-1 || i % 32 == 31 ? '\n' : ' '); + fprintf(stderr, "%02x%c", data[i], i == n - 1 || i % 32 == 31 ? '\n' : ' '); } void flash_wait() @@ -254,8 +255,7 @@ void flash_wait() if (verbose) fprintf(stderr, "waiting.."); - while (1) - { + while (1) { uint8_t data[2] = { 0x05 }; set_gpio(0, 0); @@ -365,18 +365,20 @@ int main(int argc, char **argv) int opt; char *endptr; while ((opt = getopt_long(argc, argv, "d:I:rR:o:cbnStv", - long_options, NULL)) != -1) - { - switch (opt) - { + long_options, NULL)) != -1) { + switch (opt) { case 'd': devstr = optarg; break; case 'I': - if (!strcmp(optarg, "A")) ifnum = INTERFACE_A; - else if (!strcmp(optarg, "B")) ifnum = INTERFACE_B; - else if (!strcmp(optarg, "C")) ifnum = INTERFACE_C; - else if (!strcmp(optarg, "D")) ifnum = INTERFACE_D; + if (!strcmp(optarg, "A")) + ifnum = INTERFACE_A; + else if (!strcmp(optarg, "B")) + ifnum = INTERFACE_B; + else if (!strcmp(optarg, "C")) + ifnum = INTERFACE_C; + else if (!strcmp(optarg, "D")) + ifnum = INTERFACE_D; else errx(EXIT_FAILURE, "`%s' is not a valid interface (must be " @@ -388,18 +390,24 @@ int main(int argc, char **argv) case 'R': read_mode = true; read_size = strtol(optarg, &endptr, 0); - if (*endptr == '\0') /* ok */; - else if (!strcmp(endptr, "k")) read_size *= 1024; - else if (!strcmp(endptr, "M")) read_size *= 1024 * 1024; + if (*endptr == '\0') + /* ok */; + else if (!strcmp(endptr, "k")) + read_size *= 1024; + else if (!strcmp(endptr, "M")) + read_size *= 1024 * 1024; else errx(EXIT_FAILURE, "`%s' is not a valid size", optarg); break; case 'o': rw_offset = strtol(optarg, &endptr, 0); - if (*endptr == '\0') /* ok */; - else if (!strcmp(endptr, "k")) rw_offset *= 1024; - else if (!strcmp(endptr, "M")) rw_offset *= 1024 * 1024; + if (*endptr == '\0') + /* ok */; + else if (!strcmp(endptr, "k")) + rw_offset *= 1024; + else if (!strcmp(endptr, "M")) + rw_offset *= 1024 * 1024; else errx(EXIT_FAILURE, "`%s' is not a valid offset", optarg); @@ -613,8 +621,7 @@ int main(int argc, char **argv) usleep(100000); - if (test_mode) - { + if (test_mode) { fprintf(stderr, "reset..\n"); set_gpio(1, 0); @@ -632,9 +639,7 @@ int main(int argc, char **argv) usleep(250000); fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low"); - } - else if (prog_sram) - { + } else if (prog_sram) { // --------------------------------------------------------- // Reset // --------------------------------------------------------- @@ -655,11 +660,11 @@ int main(int argc, char **argv) // --------------------------------------------------------- fprintf(stderr, "programming..\n"); - while (1) - { + while (1) { static unsigned char buffer[4096]; int rc = fread(buffer, 1, 4096, f); - if (rc <= 0) break; + if (rc <= 0) + break; if (verbose) fprintf(stderr, "sending %d bytes.\n", rc); send_spi(buffer, rc); @@ -675,9 +680,7 @@ int main(int argc, char **argv) send_byte(0x00); fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low"); - } - else - { + } else { // --------------------------------------------------------- // Reset // --------------------------------------------------------- @@ -698,18 +701,13 @@ int main(int argc, char **argv) // Program // --------------------------------------------------------- - if (!read_mode && !check_mode) - { - if (!dont_erase) - { - if (bulk_erase) - { + if (!read_mode && !check_mode) { + if (!dont_erase) { + if (bulk_erase) { flash_write_enable(); flash_bulk_erase(); flash_wait(); - } - else - { + } else { fprintf(stderr, "file size: %ld\n", file_size); int begin_addr = rw_offset & ~0xffff; @@ -729,7 +727,8 @@ int main(int argc, char **argv) uint8_t buffer[256]; int page_size = 256 - (rw_offset + addr) % 256; rc = fread(buffer, 1, page_size, f); - if (rc <= 0) break; + if (rc <= 0) + break; flash_write_enable(); flash_prog(rw_offset + addr, buffer, rc); flash_wait(); @@ -739,13 +738,11 @@ int main(int argc, char **argv) fseek(f, 0, SEEK_SET); } - // --------------------------------------------------------- // Read/Verify // --------------------------------------------------------- - if (read_mode) - { + if (read_mode) { fprintf(stderr, "reading..\n"); for (int addr = 0; addr < read_size; addr += 256) { uint8_t buffer[256]; @@ -753,14 +750,13 @@ int main(int argc, char **argv) fwrite(buffer, read_size - addr > 256 ? 256 : read_size - addr, 1, f); } - } - else - { + } else { fprintf(stderr, "reading..\n"); for (int addr = 0; true; addr += 256) { uint8_t buffer_flash[256], buffer_file[256]; int rc = fread(buffer_file, 1, 256, f); - if (rc <= 0) break; + if (rc <= 0) + break; flash_read(rw_offset + addr, buffer_flash, rc); if (memcmp(buffer_file, buffer_flash, rc)) { fprintf(stderr, "Found difference between flash and file!\n"); -- cgit v1.2.3 From f36652689fd4cd5acc03b653175cc81c5e758baa Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 28 Jun 2017 16:57:45 +0200 Subject: iceprog: Break overlong lines --- iceprog/iceprog.c | 58 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 18 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index ec71fd0..8321a3d 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -87,7 +87,8 @@ void send_byte(uint8_t data) { int rc = ftdi_write_data(&ftdic, &data, 1); if (rc != 1) { - fprintf(stderr, "Write error (single byte, rc=%d, expected %d).\n", rc, 1); + fprintf(stderr, "Write error (single byte, " + "rc=%d, expected %d).\n", rc, 1); error(2); } } @@ -103,7 +104,8 @@ void send_spi(uint8_t *data, int n) int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { - fprintf(stderr, "Write error (chunk, rc=%d, expected %d).\n", rc, n); + fprintf(stderr, "Write error (chunk, " + "rc=%d, expected %d).\n", rc, n); error(2); } } @@ -119,7 +121,8 @@ void xfer_spi(uint8_t *data, int n) int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { - fprintf(stderr, "Write error (chunk, rc=%d, expected %d).\n", rc, n); + fprintf(stderr, "Write error (chunk, " + "rc=%d, expected %d).\n", rc, n); error(2); } @@ -211,7 +214,9 @@ void flash_64kB_sector_erase(int addr) { fprintf(stderr, "erase 64kB sector at 0x%06X..\n", addr); - uint8_t command[4] = { 0xd8, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr }; + uint8_t command[4] = { 0xd8, (uint8_t)(addr >> 16), + (uint8_t)(addr >> 8), + (uint8_t)addr }; set_gpio(0, 0); send_spi(command, 4); set_gpio(1, 0); @@ -222,7 +227,9 @@ void flash_prog(int addr, uint8_t *data, int n) if (verbose) fprintf(stderr, "prog 0x%06X +0x%03X..\n", addr, n); - uint8_t command[4] = { 0x02, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr }; + uint8_t command[4] = { 0x02, (uint8_t)(addr >> 16), + (uint8_t)(addr >> 8), + (uint8_t)addr }; set_gpio(0, 0); send_spi(command, 4); send_spi(data, n); @@ -230,7 +237,8 @@ void flash_prog(int addr, uint8_t *data, int n) if (verbose) for (int i = 0; i < n; i++) - fprintf(stderr, "%02x%c", data[i], i == n - 1 || i % 32 == 31 ? '\n' : ' '); + fprintf(stderr, "%02x%c", data[i], + i == n - 1 || i % 32 == 31 ? '\n' : ' '); } void flash_read(int addr, uint8_t *data, int n) @@ -238,7 +246,9 @@ void flash_read(int addr, uint8_t *data, int n) if (verbose) fprintf(stderr, "read 0x%06X +0x%03X..\n", addr, n); - uint8_t command[4] = { 0x03, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr }; + uint8_t command[4] = { 0x03, (uint8_t)(addr >> 16), + (uint8_t)(addr >> 8), + (uint8_t)addr }; set_gpio(0, 0); send_spi(command, 4); memset(data, 0, n); @@ -247,7 +257,8 @@ void flash_read(int addr, uint8_t *data, int n) if (verbose) for (int i = 0; i < n; i++) - fprintf(stderr, "%02x%c", data[i], i == n - 1 || i % 32 == 31 ? '\n' : ' '); + fprintf(stderr, "%02x%c", data[i], + i == n - 1 || i % 32 == 31 ? '\n' : ' '); } void flash_wait() @@ -567,12 +578,15 @@ int main(int argc, char **argv) if (devstr != NULL) { if (ftdi_usb_open_string(&ftdic, devstr)) { - fprintf(stderr, "Can't find iCE FTDI USB device (device string %s).\n", devstr); + fprintf(stderr, "Can't find iCE FTDI USB device " + "(device string %s).\n", devstr); error(2); } } else { if (ftdi_usb_open(&ftdic, 0x0403, 0x6010)) { - fprintf(stderr, "Can't find iCE FTDI USB device (vendor_id 0x0403, device_id 0x6010).\n"); + fprintf(stderr, "Can't find iCE FTDI USB device " + "(vendor_id 0x0403, " + "device_id 0x6010).\n"); error(2); } } @@ -585,25 +599,29 @@ int main(int argc, char **argv) } if (ftdi_usb_purge_buffers(&ftdic)) { - fprintf(stderr, "Failed to purge buffers on iCE FTDI USB device.\n"); + fprintf(stderr, "Failed to purge buffers " + "on iCE FTDI USB device.\n"); error(2); } if (ftdi_get_latency_timer(&ftdic, &ftdi_latency) < 0) { - fprintf(stderr, "Failed to get latency timer (%s).\n", ftdi_get_error_string(&ftdic)); + fprintf(stderr, "Failed to get latency timer (%s).\n", + ftdi_get_error_string(&ftdic)); error(2); } /* 1 is the fastest polling, it means 1 kHz polling */ if (ftdi_set_latency_timer(&ftdic, 1) < 0) { - fprintf(stderr, "Failed to set latency timer (%s).\n", ftdi_get_error_string(&ftdic)); + fprintf(stderr, "Failed to set latency timer (%s).\n", + ftdi_get_error_string(&ftdic)); error(2); } ftdic_latency_set = true; if (ftdi_set_bitmode(&ftdic, 0xff, BITMODE_MPSSE) < 0) { - fprintf(stderr, "Failed to set BITMODE_MPSSE on iCE FTDI USB device.\n"); + fprintf(stderr, "Failed to set BITMODE_MPSSE " + "on iCE FTDI USB device.\n"); error(2); } @@ -708,12 +726,15 @@ int main(int argc, char **argv) flash_bulk_erase(); flash_wait(); } else { - fprintf(stderr, "file size: %ld\n", file_size); + fprintf(stderr, "file size: %ld\n", + file_size); int begin_addr = rw_offset & ~0xffff; - int end_addr = (rw_offset + file_size + 0xffff) & ~0xffff; + int end_addr = (rw_offset + file_size + + 0xffff) & ~0xffff; - for (int addr = begin_addr; addr < end_addr; addr += 0x10000) { + for (int addr = begin_addr; + addr < end_addr; addr += 0x10000) { flash_write_enable(); flash_64kB_sector_erase(addr); flash_wait(); @@ -759,7 +780,8 @@ int main(int argc, char **argv) break; flash_read(rw_offset + addr, buffer_flash, rc); if (memcmp(buffer_file, buffer_flash, rc)) { - fprintf(stderr, "Found difference between flash and file!\n"); + fprintf(stderr, "Found difference " + "between flash and file!\n"); error(3); } } -- cgit v1.2.3 From 62e70897102cbb07e2174658c6030d7403dc7121 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 28 Jun 2017 16:59:53 +0200 Subject: iceprog: Remove trailing newline --- iceprog/iceprog.c | 1 - 1 file changed, 1 deletion(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 8321a3d..2234247 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -816,4 +816,3 @@ int main(int argc, char **argv) ftdi_deinit(&ftdic); return 0; } - -- cgit v1.2.3 From 53a8bcce3532bd93b2cbb54a83767df34a28a907 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 28 Jun 2017 17:04:02 +0200 Subject: iceprog: Keep name space clean --- iceprog/iceprog.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 2234247..9dd9f17 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -37,13 +37,13 @@ #include #include -struct ftdi_context ftdic; -bool ftdic_open = false; -bool verbose = false; -bool ftdic_latency_set = false; -unsigned char ftdi_latency; +static struct ftdi_context ftdic; +static bool ftdic_open = false; +static bool verbose = false; +static bool ftdic_latency_set = false; +static unsigned char ftdi_latency; -void check_rx() +static void check_rx() { while (1) { uint8_t data; @@ -54,7 +54,7 @@ void check_rx() } } -void error(int status) +static void error(int status) { check_rx(); fprintf(stderr, "ABORT.\n"); @@ -67,7 +67,7 @@ void error(int status) exit(status); } -uint8_t recv_byte() +static uint8_t recv_byte() { uint8_t data; while (1) { @@ -83,7 +83,7 @@ uint8_t recv_byte() return data; } -void send_byte(uint8_t data) +static void send_byte(uint8_t data) { int rc = ftdi_write_data(&ftdic, &data, 1); if (rc != 1) { @@ -93,7 +93,7 @@ void send_byte(uint8_t data) } } -void send_spi(uint8_t *data, int n) +static void send_spi(uint8_t *data, int n) { if (n < 1) return; @@ -110,7 +110,7 @@ void send_spi(uint8_t *data, int n) } } -void xfer_spi(uint8_t *data, int n) +static void xfer_spi(uint8_t *data, int n) { if (n < 1) return; @@ -130,7 +130,7 @@ void xfer_spi(uint8_t *data, int n) data[i] = recv_byte(); } -void set_gpio(int slavesel_b, int creset_b) +static void set_gpio(int slavesel_b, int creset_b) { uint8_t gpio = 1; @@ -149,7 +149,7 @@ void set_gpio(int slavesel_b, int creset_b) send_byte(0x93); } -int get_cdone() +static int get_cdone() { uint8_t data; send_byte(0x81); @@ -158,7 +158,7 @@ int get_cdone() return (data & 0x40) != 0; } -void flash_read_id() +static void flash_read_id() { // fprintf(stderr, "read flash ID..\n"); @@ -173,7 +173,7 @@ void flash_read_id() fprintf(stderr, "\n"); } -void flash_power_up() +static void flash_power_up() { uint8_t data[1] = { 0xAB }; set_gpio(0, 0); @@ -181,7 +181,7 @@ void flash_power_up() set_gpio(1, 0); } -void flash_power_down() +static void flash_power_down() { uint8_t data[1] = { 0xB9 }; set_gpio(0, 0); @@ -189,7 +189,7 @@ void flash_power_down() set_gpio(1, 0); } -void flash_write_enable() +static void flash_write_enable() { if (verbose) fprintf(stderr, "write enable..\n"); @@ -200,7 +200,7 @@ void flash_write_enable() set_gpio(1, 0); } -void flash_bulk_erase() +static void flash_bulk_erase() { fprintf(stderr, "bulk erase..\n"); @@ -210,7 +210,7 @@ void flash_bulk_erase() set_gpio(1, 0); } -void flash_64kB_sector_erase(int addr) +static void flash_64kB_sector_erase(int addr) { fprintf(stderr, "erase 64kB sector at 0x%06X..\n", addr); @@ -222,7 +222,7 @@ void flash_64kB_sector_erase(int addr) set_gpio(1, 0); } -void flash_prog(int addr, uint8_t *data, int n) +static void flash_prog(int addr, uint8_t *data, int n) { if (verbose) fprintf(stderr, "prog 0x%06X +0x%03X..\n", addr, n); @@ -241,7 +241,7 @@ void flash_prog(int addr, uint8_t *data, int n) i == n - 1 || i % 32 == 31 ? '\n' : ' '); } -void flash_read(int addr, uint8_t *data, int n) +static void flash_read(int addr, uint8_t *data, int n) { if (verbose) fprintf(stderr, "read 0x%06X +0x%03X..\n", addr, n); @@ -261,7 +261,7 @@ void flash_read(int addr, uint8_t *data, int n) i == n - 1 || i % 32 == 31 ? '\n' : ' '); } -void flash_wait() +static void flash_wait() { if (verbose) fprintf(stderr, "waiting.."); @@ -287,7 +287,7 @@ void flash_wait() fprintf(stderr, "\n"); } -void help(const char *progname) +static void help(const char *progname) { fprintf(stderr, "Simple programming tool for FTDI-based Lattice iCE programmers.\n"); fprintf(stderr, "Usage: %s [-b|-n|-c] \n", progname); -- cgit v1.2.3 From 3c42bdbf666d155f8703eda8ebf6dbd20a4e771b Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 5 Jul 2017 18:34:57 +0200 Subject: Fix coding style in iceprog.c (mostly line breaks and indenting) --- iceprog/iceprog.c | 162 ++++++++++++++++++++++-------------------------------- 1 file changed, 65 insertions(+), 97 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index 9dd9f17..e7aab93 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -87,8 +87,7 @@ static void send_byte(uint8_t data) { int rc = ftdi_write_data(&ftdic, &data, 1); if (rc != 1) { - fprintf(stderr, "Write error (single byte, " - "rc=%d, expected %d).\n", rc, 1); + fprintf(stderr, "Write error (single byte, rc=%d, expected %d).\n", rc, 1); error(2); } } @@ -104,8 +103,7 @@ static void send_spi(uint8_t *data, int n) int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { - fprintf(stderr, "Write error (chunk, " - "rc=%d, expected %d).\n", rc, n); + fprintf(stderr, "Write error (chunk, rc=%d, expected %d).\n", rc, n); error(2); } } @@ -121,8 +119,7 @@ static void xfer_spi(uint8_t *data, int n) int rc = ftdi_write_data(&ftdic, data, n); if (rc != n) { - fprintf(stderr, "Write error (chunk, " - "rc=%d, expected %d).\n", rc, n); + fprintf(stderr, "Write error (chunk, rc=%d, expected %d).\n", rc, n); error(2); } @@ -214,9 +211,8 @@ static void flash_64kB_sector_erase(int addr) { fprintf(stderr, "erase 64kB sector at 0x%06X..\n", addr); - uint8_t command[4] = { 0xd8, (uint8_t)(addr >> 16), - (uint8_t)(addr >> 8), - (uint8_t)addr }; + uint8_t command[4] = { 0xd8, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr }; + set_gpio(0, 0); send_spi(command, 4); set_gpio(1, 0); @@ -227,9 +223,8 @@ static void flash_prog(int addr, uint8_t *data, int n) if (verbose) fprintf(stderr, "prog 0x%06X +0x%03X..\n", addr, n); - uint8_t command[4] = { 0x02, (uint8_t)(addr >> 16), - (uint8_t)(addr >> 8), - (uint8_t)addr }; + uint8_t command[4] = { 0x02, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr }; + set_gpio(0, 0); send_spi(command, 4); send_spi(data, n); @@ -237,8 +232,7 @@ static void flash_prog(int addr, uint8_t *data, int n) if (verbose) for (int i = 0; i < n; i++) - fprintf(stderr, "%02x%c", data[i], - i == n - 1 || i % 32 == 31 ? '\n' : ' '); + fprintf(stderr, "%02x%c", data[i], i == n - 1 || i % 32 == 31 ? '\n' : ' '); } static void flash_read(int addr, uint8_t *data, int n) @@ -246,9 +240,8 @@ static void flash_read(int addr, uint8_t *data, int n) if (verbose) fprintf(stderr, "read 0x%06X +0x%03X..\n", addr, n); - uint8_t command[4] = { 0x03, (uint8_t)(addr >> 16), - (uint8_t)(addr >> 8), - (uint8_t)addr }; + uint8_t command[4] = { 0x03, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr }; + set_gpio(0, 0); send_spi(command, 4); memset(data, 0, n); @@ -257,8 +250,7 @@ static void flash_read(int addr, uint8_t *data, int n) if (verbose) for (int i = 0; i < n; i++) - fprintf(stderr, "%02x%c", data[i], - i == n - 1 || i % 32 == 31 ? '\n' : ' '); + fprintf(stderr, "%02x%c", data[i], i == n - 1 || i % 32 == 31 ? '\n' : ' '); } static void flash_wait() @@ -266,7 +258,8 @@ static void flash_wait() if (verbose) fprintf(stderr, "waiting.."); - while (1) { + while (1) + { uint8_t data[2] = { 0x05 }; set_gpio(0, 0); @@ -375,8 +368,7 @@ int main(int argc, char **argv) int opt; char *endptr; - while ((opt = getopt_long(argc, argv, "d:I:rR:o:cbnStv", - long_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "d:I:rR:o:cbnStv", long_options, NULL)) != -1) { switch (opt) { case 'd': devstr = optarg; @@ -391,9 +383,7 @@ int main(int argc, char **argv) else if (!strcmp(optarg, "D")) ifnum = INTERFACE_D; else - errx(EXIT_FAILURE, - "`%s' is not a valid interface (must be " - "`A', `B', `C', or `D')", optarg); + errx(EXIT_FAILURE, "`%s' is not a valid interface (must be `A', `B', `C', or `D')", optarg); break; case 'r': read_mode = true; @@ -408,8 +398,7 @@ int main(int argc, char **argv) else if (!strcmp(endptr, "M")) read_size *= 1024 * 1024; else - errx(EXIT_FAILURE, - "`%s' is not a valid size", optarg); + errx(EXIT_FAILURE, "`%s' is not a valid size", optarg); break; case 'o': rw_offset = strtol(optarg, &endptr, 0); @@ -420,8 +409,7 @@ int main(int argc, char **argv) else if (!strcmp(endptr, "M")) rw_offset *= 1024 * 1024; else - errx(EXIT_FAILURE, - "`%s' is not a valid offset", optarg); + errx(EXIT_FAILURE, "`%s' is not a valid offset", optarg); break; case 'c': check_mode = true; @@ -446,52 +434,45 @@ int main(int argc, char **argv) return EXIT_SUCCESS; default: /* error message has already been printed */ - fprintf(stderr, "Try `%s --help' " - "for more information.\n", argv[0]); + fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } } if (read_mode + check_mode + prog_sram + test_mode > 1) - errx(EXIT_FAILURE, - "options `-r'/`-R', `-c', `-S', and `-t' are mutually " - "exclusive"); + errx(EXIT_FAILURE, "options `-r'/`-R', `-c', `-S', and `-t' are mutually exclusive"); if (bulk_erase && dont_erase) - errx(EXIT_FAILURE, - "options `-b' and `-n' are mutually exclusive"); + errx(EXIT_FAILURE, "options `-b' and `-n' are mutually exclusive"); if (bulk_erase && (read_mode || check_mode || prog_sram || test_mode)) - errx(EXIT_FAILURE, - "option `-b' only valid in programming mode"); + errx(EXIT_FAILURE, "option `-b' only valid in programming mode"); + if (dont_erase && (read_mode || check_mode || prog_sram || test_mode)) - errx(EXIT_FAILURE, - "option `-n' only valid in programming mode"); + errx(EXIT_FAILURE, "option `-n' only valid in programming mode"); if (rw_offset != 0 && prog_sram) errx(EXIT_FAILURE, "option `-o' not supported in SRAM mode"); + if (rw_offset != 0 && test_mode) errx(EXIT_FAILURE, "option `-o' not supported in test mode"); if (optind + 1 == argc) { if (test_mode) { warnx("test mode doesn't take a file name"); - fprintf(stderr, "Try `%s --help' " - "for more information.\n", argv[0]); + fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } filename = argv[optind]; } else if (optind != argc) { warnx("too many arguments"); - fprintf(stderr, "Try `%s --help' " - "for more information.\n", argv[0]); + fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } else if (bulk_erase) { filename = "/dev/null"; } else if (!test_mode) { warnx("missing argument"); - fprintf(stderr, "Try `%s --help' " - "for more information.\n", argv[0]); + fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } @@ -504,17 +485,13 @@ int main(int argc, char **argv) if (test_mode) /* nop */; else if (read_mode) { - f = (strcmp(filename, "-") == 0) ? stdout - : fopen(filename, "wb"); + f = (strcmp(filename, "-") == 0) ? stdout : fopen(filename, "wb"); if (f == NULL) - err(EXIT_FAILURE, - "can't open '%s' for writing", filename); + err(EXIT_FAILURE, "can't open '%s' for writing", filename); } else { - f = (strcmp(filename, "-") == 0) ? stdin - : fopen(filename, "rb"); + f = (strcmp(filename, "-") == 0) ? stdin : fopen(filename, "rb"); if (f == NULL) - err(EXIT_FAILURE, - "can't open '%s' for reading", filename); + err(EXIT_FAILURE, "can't open '%s' for reading", filename); /* For regular programming, we need to read the file twice--once for programming and once for verifying--and @@ -530,32 +507,25 @@ int main(int argc, char **argv) if (fseek(f, 0L, SEEK_END) != -1) { file_size = ftell(f); if (file_size == -1) - err(EXIT_FAILURE, - "%s: ftell", filename); + err(EXIT_FAILURE, "%s: ftell", filename); if (fseek(f, 0L, SEEK_SET) == -1) - err(EXIT_FAILURE, - "%s: fseek", filename); + err(EXIT_FAILURE, "%s: fseek", filename); } else { FILE *pipe = f; f = tmpfile(); if (f == NULL) - errx(EXIT_FAILURE, - "can't open temporary file"); + errx(EXIT_FAILURE, "can't open temporary file"); file_size = 0; while (true) { static unsigned char buffer[4096]; - size_t rc = - fread(buffer, 1, 4096, pipe); + size_t rc = fread(buffer, 1, 4096, pipe); if (rc <= 0) break; - size_t wc = - fwrite(buffer, 1, rc, f); + size_t wc = fwrite(buffer, 1, rc, f); if (wc != rc) - errx(EXIT_FAILURE, - "can't write to " - "temporary file"); + errx(EXIT_FAILURE, "can't write to temporary file"); file_size += rc; } fclose(pipe); @@ -578,15 +548,12 @@ int main(int argc, char **argv) if (devstr != NULL) { if (ftdi_usb_open_string(&ftdic, devstr)) { - fprintf(stderr, "Can't find iCE FTDI USB device " - "(device string %s).\n", devstr); + fprintf(stderr, "Can't find iCE FTDI USB device (device string %s).\n", devstr); error(2); } } else { if (ftdi_usb_open(&ftdic, 0x0403, 0x6010)) { - fprintf(stderr, "Can't find iCE FTDI USB device " - "(vendor_id 0x0403, " - "device_id 0x6010).\n"); + fprintf(stderr, "Can't find iCE FTDI USB device (vendor_id 0x0403, device_id 0x6010).\n"); error(2); } } @@ -599,29 +566,25 @@ int main(int argc, char **argv) } if (ftdi_usb_purge_buffers(&ftdic)) { - fprintf(stderr, "Failed to purge buffers " - "on iCE FTDI USB device.\n"); + fprintf(stderr, "Failed to purge buffers on iCE FTDI USB device.\n"); error(2); } if (ftdi_get_latency_timer(&ftdic, &ftdi_latency) < 0) { - fprintf(stderr, "Failed to get latency timer (%s).\n", - ftdi_get_error_string(&ftdic)); + fprintf(stderr, "Failed to get latency timer (%s).\n", ftdi_get_error_string(&ftdic)); error(2); } /* 1 is the fastest polling, it means 1 kHz polling */ if (ftdi_set_latency_timer(&ftdic, 1) < 0) { - fprintf(stderr, "Failed to set latency timer (%s).\n", - ftdi_get_error_string(&ftdic)); + fprintf(stderr, "Failed to set latency timer (%s).\n", ftdi_get_error_string(&ftdic)); error(2); } ftdic_latency_set = true; if (ftdi_set_bitmode(&ftdic, 0xff, BITMODE_MPSSE) < 0) { - fprintf(stderr, "Failed to set BITMODE_MPSSE " - "on iCE FTDI USB device.\n"); + fprintf(stderr, "Failed to set BITMODE_MPSSE on iCE FTDI USB device.\n"); error(2); } @@ -639,7 +602,8 @@ int main(int argc, char **argv) usleep(100000); - if (test_mode) { + if (test_mode) + { fprintf(stderr, "reset..\n"); set_gpio(1, 0); @@ -657,7 +621,9 @@ int main(int argc, char **argv) usleep(250000); fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low"); - } else if (prog_sram) { + } + else if (prog_sram) + { // --------------------------------------------------------- // Reset // --------------------------------------------------------- @@ -698,7 +664,9 @@ int main(int argc, char **argv) send_byte(0x00); fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low"); - } else { + } + else + { // --------------------------------------------------------- // Reset // --------------------------------------------------------- @@ -719,22 +687,24 @@ int main(int argc, char **argv) // Program // --------------------------------------------------------- - if (!read_mode && !check_mode) { - if (!dont_erase) { - if (bulk_erase) { + if (!read_mode && !check_mode) + { + if (!dont_erase) + { + if (bulk_erase) + { flash_write_enable(); flash_bulk_erase(); flash_wait(); - } else { - fprintf(stderr, "file size: %ld\n", - file_size); + } + else + { + fprintf(stderr, "file size: %ld\n", file_size); int begin_addr = rw_offset & ~0xffff; - int end_addr = (rw_offset + file_size - + 0xffff) & ~0xffff; + int end_addr = (rw_offset + file_size + 0xffff) & ~0xffff; - for (int addr = begin_addr; - addr < end_addr; addr += 0x10000) { + for (int addr = begin_addr; addr < end_addr; addr += 0x10000) { flash_write_enable(); flash_64kB_sector_erase(addr); flash_wait(); @@ -768,8 +738,7 @@ int main(int argc, char **argv) for (int addr = 0; addr < read_size; addr += 256) { uint8_t buffer[256]; flash_read(rw_offset + addr, buffer, 256); - fwrite(buffer, read_size - addr > 256 ? 256 : - read_size - addr, 1, f); + fwrite(buffer, read_size - addr > 256 ? 256 : read_size - addr, 1, f); } } else { fprintf(stderr, "reading..\n"); @@ -780,8 +749,7 @@ int main(int argc, char **argv) break; flash_read(rw_offset + addr, buffer_flash, rc); if (memcmp(buffer_file, buffer_flash, rc)) { - fprintf(stderr, "Found difference " - "between flash and file!\n"); + fprintf(stderr, "Found difference between flash and file!\n"); error(3); } } -- cgit v1.2.3 From 9acaac752ac53b51b9b33290394b7811048221fa Mon Sep 17 00:00:00 2001 From: Robert Ou Date: Mon, 17 Jul 2017 01:28:59 -0700 Subject: iceprog: Do not use nonstandard err.h This header does not exist under MinGW. Replace these functions with standard functions. --- iceprog/iceprog.c | 101 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 34 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index e7aab93..a01d51e 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -382,8 +381,10 @@ int main(int argc, char **argv) ifnum = INTERFACE_C; else if (!strcmp(optarg, "D")) ifnum = INTERFACE_D; - else - errx(EXIT_FAILURE, "`%s' is not a valid interface (must be `A', `B', `C', or `D')", optarg); + else { + fprintf(stderr, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", argv[0], optarg); + return EXIT_FAILURE; + } break; case 'r': read_mode = true; @@ -397,8 +398,10 @@ int main(int argc, char **argv) read_size *= 1024; else if (!strcmp(endptr, "M")) read_size *= 1024 * 1024; - else - errx(EXIT_FAILURE, "`%s' is not a valid size", optarg); + else { + fprintf(stderr, "%s: `%s' is not a valid size\n", argv[0], optarg); + return EXIT_FAILURE; + } break; case 'o': rw_offset = strtol(optarg, &endptr, 0); @@ -408,8 +411,10 @@ int main(int argc, char **argv) rw_offset *= 1024; else if (!strcmp(endptr, "M")) rw_offset *= 1024 * 1024; - else - errx(EXIT_FAILURE, "`%s' is not a valid offset", optarg); + else { + fprintf(stderr, "%s: `%s' is not a valid offset\n", argv[0], optarg); + return EXIT_FAILURE; + } break; case 'c': check_mode = true; @@ -439,39 +444,51 @@ int main(int argc, char **argv) } } - if (read_mode + check_mode + prog_sram + test_mode > 1) - errx(EXIT_FAILURE, "options `-r'/`-R', `-c', `-S', and `-t' are mutually exclusive"); + if (read_mode + check_mode + prog_sram + test_mode > 1) { + fprintf(stderr, "%s: options `-r'/`-R', `-c', `-S', and `-t' are mutually exclusive\n", argv[0]); + return EXIT_FAILURE; + } - if (bulk_erase && dont_erase) - errx(EXIT_FAILURE, "options `-b' and `-n' are mutually exclusive"); + if (bulk_erase && dont_erase) { + fprintf(stderr, "%s: options `-b' and `-n' are mutually exclusive\n", argv[0]); + return EXIT_FAILURE; + } - if (bulk_erase && (read_mode || check_mode || prog_sram || test_mode)) - errx(EXIT_FAILURE, "option `-b' only valid in programming mode"); + if (bulk_erase && (read_mode || check_mode || prog_sram || test_mode)) { + fprintf(stderr, "%s: option `-b' only valid in programming mode\n", argv[0]); + return EXIT_FAILURE; + } - if (dont_erase && (read_mode || check_mode || prog_sram || test_mode)) - errx(EXIT_FAILURE, "option `-n' only valid in programming mode"); + if (dont_erase && (read_mode || check_mode || prog_sram || test_mode)) { + fprintf(stderr, "%s: option `-n' only valid in programming mode\n", argv[0]); + return EXIT_FAILURE; + } - if (rw_offset != 0 && prog_sram) - errx(EXIT_FAILURE, "option `-o' not supported in SRAM mode"); + if (rw_offset != 0 && prog_sram) { + fprintf(stderr, "%s: option `-o' not supported in SRAM mode\n", argv[0]); + return EXIT_FAILURE; + } - if (rw_offset != 0 && test_mode) - errx(EXIT_FAILURE, "option `-o' not supported in test mode"); + if (rw_offset != 0 && test_mode) { + fprintf(stderr, "%s: option `-o' not supported in test mode\n", argv[0]); + return EXIT_FAILURE; + } if (optind + 1 == argc) { if (test_mode) { - warnx("test mode doesn't take a file name"); + fprintf(stderr, "%s: test mode doesn't take a file name\n", argv[0]); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } filename = argv[optind]; } else if (optind != argc) { - warnx("too many arguments"); + fprintf(stderr, "%s: too many arguments\n", argv[0]); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } else if (bulk_erase) { filename = "/dev/null"; } else if (!test_mode) { - warnx("missing argument"); + fprintf(stderr, "%s: missing argument\n", argv[0]); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } @@ -486,12 +503,18 @@ int main(int argc, char **argv) /* nop */; else if (read_mode) { f = (strcmp(filename, "-") == 0) ? stdout : fopen(filename, "wb"); - if (f == NULL) - err(EXIT_FAILURE, "can't open '%s' for writing", filename); + if (f == NULL) { + fprintf(stderr, "%s: can't open '%s' for writing: ", argv[0], filename); + perror(0); + return EXIT_FAILURE; + } } else { f = (strcmp(filename, "-") == 0) ? stdin : fopen(filename, "rb"); - if (f == NULL) - err(EXIT_FAILURE, "can't open '%s' for reading", filename); + if (f == NULL) { + fprintf(stderr, "%s: can't open '%s' for reading: ", argv[0], filename); + perror(0); + return EXIT_FAILURE; + } /* For regular programming, we need to read the file twice--once for programming and once for verifying--and @@ -506,16 +529,24 @@ int main(int argc, char **argv) if (!prog_sram && !check_mode) { if (fseek(f, 0L, SEEK_END) != -1) { file_size = ftell(f); - if (file_size == -1) - err(EXIT_FAILURE, "%s: ftell", filename); - if (fseek(f, 0L, SEEK_SET) == -1) - err(EXIT_FAILURE, "%s: fseek", filename); + if (file_size == -1) { + fprintf(stderr, "%s: %s: ftell: ", argv[0], filename); + perror(0); + return EXIT_FAILURE; + } + if (fseek(f, 0L, SEEK_SET) == -1) { + fprintf(stderr, "%s: %s: fseek: ", argv[0], filename); + perror(0); + return EXIT_FAILURE; + } } else { FILE *pipe = f; f = tmpfile(); - if (f == NULL) - errx(EXIT_FAILURE, "can't open temporary file"); + if (f == NULL) { + fprintf(stderr, "%s: can't open temporary file\n", argv[0]); + return EXIT_FAILURE; + } file_size = 0; while (true) { @@ -524,8 +555,10 @@ int main(int argc, char **argv) if (rc <= 0) break; size_t wc = fwrite(buffer, 1, rc, f); - if (wc != rc) - errx(EXIT_FAILURE, "can't write to temporary file"); + if (wc != rc) { + fprintf(stderr, "%s: can't write to temporary file\n", argv[0]); + return EXIT_FAILURE; + } file_size += rc; } fclose(pipe); -- cgit v1.2.3 From 4e653c3b7ed6779247c5456bbf63277f027530ce Mon Sep 17 00:00:00 2001 From: Robert Ou Date: Mon, 17 Jul 2017 01:40:57 -0700 Subject: iceprog: Make errors print only the program name Previously, the entire argv[0] would be printed. --- iceprog/iceprog.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'iceprog/iceprog.c') diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c index a01d51e..eca9496 100644 --- a/iceprog/iceprog.c +++ b/iceprog/iceprog.c @@ -347,6 +347,12 @@ static void help(const char *progname) int main(int argc, char **argv) { + /* used for error reporting */ + const char *my_name = argv[0]; + for (size_t i = 0; argv[0][i]; i++) + if (argv[0][i] == '/') + my_name = argv[0] + i + 1; + int read_size = 256 * 1024; int rw_offset = 0; @@ -382,7 +388,7 @@ int main(int argc, char **argv) else if (!strcmp(optarg, "D")) ifnum = INTERFACE_D; else { - fprintf(stderr, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", argv[0], optarg); + fprintf(stderr, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name, optarg); return EXIT_FAILURE; } break; @@ -399,7 +405,7 @@ int main(int argc, char **argv) else if (!strcmp(endptr, "M")) read_size *= 1024 * 1024; else { - fprintf(stderr, "%s: `%s' is not a valid size\n", argv[0], optarg); + fprintf(stderr, "%s: `%s' is not a valid size\n", my_name, optarg); return EXIT_FAILURE; } break; @@ -412,7 +418,7 @@ int main(int argc, char **argv) else if (!strcmp(endptr, "M")) rw_offset *= 1024 * 1024; else { - fprintf(stderr, "%s: `%s' is not a valid offset\n", argv[0], optarg); + fprintf(stderr, "%s: `%s' is not a valid offset\n", my_name, optarg); return EXIT_FAILURE; } break; @@ -445,50 +451,50 @@ int main(int argc, char **argv) } if (read_mode + check_mode + prog_sram + test_mode > 1) { - fprintf(stderr, "%s: options `-r'/`-R', `-c', `-S', and `-t' are mutually exclusive\n", argv[0]); + fprintf(stderr, "%s: options `-r'/`-R', `-c', `-S', and `-t' are mutually exclusive\n", my_name); return EXIT_FAILURE; } if (bulk_erase && dont_erase) { - fprintf(stderr, "%s: options `-b' and `-n' are mutually exclusive\n", argv[0]); + fprintf(stderr, "%s: options `-b' and `-n' are mutually exclusive\n", my_name); return EXIT_FAILURE; } if (bulk_erase && (read_mode || check_mode || prog_sram || test_mode)) { - fprintf(stderr, "%s: option `-b' only valid in programming mode\n", argv[0]); + fprintf(stderr, "%s: option `-b' only valid in programming mode\n", my_name); return EXIT_FAILURE; } if (dont_erase && (read_mode || check_mode || prog_sram || test_mode)) { - fprintf(stderr, "%s: option `-n' only valid in programming mode\n", argv[0]); + fprintf(stderr, "%s: option `-n' only valid in programming mode\n", my_name); return EXIT_FAILURE; } if (rw_offset != 0 && prog_sram) { - fprintf(stderr, "%s: option `-o' not supported in SRAM mode\n", argv[0]); + fprintf(stderr, "%s: option `-o' not supported in SRAM mode\n", my_name); return EXIT_FAILURE; } if (rw_offset != 0 && test_mode) { - fprintf(stderr, "%s: option `-o' not supported in test mode\n", argv[0]); + fprintf(stderr, "%s: option `-o' not supported in test mode\n", my_name); return EXIT_FAILURE; } if (optind + 1 == argc) { if (test_mode) { - fprintf(stderr, "%s: test mode doesn't take a file name\n", argv[0]); + fprintf(stderr, "%s: test mode doesn't take a file name\n", my_name); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } filename = argv[optind]; } else if (optind != argc) { - fprintf(stderr, "%s: too many arguments\n", argv[0]); + fprintf(stderr, "%s: too many arguments\n", my_name); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } else if (bulk_erase) { filename = "/dev/null"; } else if (!test_mode) { - fprintf(stderr, "%s: missing argument\n", argv[0]); + fprintf(stderr, "%s: missing argument\n", my_name); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return EXIT_FAILURE; } @@ -504,14 +510,14 @@ int main(int argc, char **argv) else if (read_mode) { f = (strcmp(filename, "-") == 0) ? stdout : fopen(filename, "wb"); if (f == NULL) { - fprintf(stderr, "%s: can't open '%s' for writing: ", argv[0], filename); + fprintf(stderr, "%s: can't open '%s' for writing: ", my_name, filename); perror(0); return EXIT_FAILURE; } } else { f = (strcmp(filename, "-") == 0) ? stdin : fopen(filename, "rb"); if (f == NULL) { - fprintf(stderr, "%s: can't open '%s' for reading: ", argv[0], filename); + fprintf(stderr, "%s: can't open '%s' for reading: ", my_name, filename); perror(0); return EXIT_FAILURE; } @@ -530,12 +536,12 @@ int main(int argc, char **argv) if (fseek(f, 0L, SEEK_END) != -1) { file_size = ftell(f); if (file_size == -1) { - fprintf(stderr, "%s: %s: ftell: ", argv[0], filename); + fprintf(stderr, "%s: %s: ftell: ", my_name, filename); perror(0); return EXIT_FAILURE; } if (fseek(f, 0L, SEEK_SET) == -1) { - fprintf(stderr, "%s: %s: fseek: ", argv[0], filename); + fprintf(stderr, "%s: %s: fseek: ", my_name, filename); perror(0); return EXIT_FAILURE; } @@ -544,7 +550,7 @@ int main(int argc, char **argv) f = tmpfile(); if (f == NULL) { - fprintf(stderr, "%s: can't open temporary file\n", argv[0]); + fprintf(stderr, "%s: can't open temporary file\n", my_name); return EXIT_FAILURE; } file_size = 0; @@ -556,7 +562,7 @@ int main(int argc, char **argv) break; size_t wc = fwrite(buffer, 1, rc, f); if (wc != rc) { - fprintf(stderr, "%s: can't write to temporary file\n", argv[0]); + fprintf(stderr, "%s: can't write to temporary file\n", my_name); return EXIT_FAILURE; } file_size += rc; -- cgit v1.2.3