From 1fefe355459123f7c253a4ac649ccb584a080459 Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Wed, 7 Jun 2017 16:30:29 +0200 Subject: Fix I/O tile documentation --- docs/io_tile.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/io_tile.html b/docs/io_tile.html index c683ff7..82cf65b 100644 --- a/docs/io_tile.html +++ b/docs/io_tile.html @@ -47,9 +47,9 @@ to span12_horz_23.

-A top/bottom io cell has 16 connections named span4_vert_l_0 to span4_vert_l_15 on its top edge and -16 connections named span4_vert_r_0 to span4_vert_r_15 on its bottom edge. The nets span4_vert_l_0 -to span4_vert_l_11 are connected to span4_vert_r_4 to span4_vert_r_15. The span-4 and span-12 wires +A top/bottom io cell has 16 connections named span4_horz_l_0 to span4_horz_l_15 on its left edge and +16 connections named span4_horz_r_0 to span4_horz_r_15 on its right edge. The nets span4_horz_l_0 +to span4_horz_l_11 are connected to span4_horz_r_4 to span4_horz_r_15. The span-4 and span-12 wires of the adjacent logic cell are connected to the nets span4_vert_0 to span4_vert_47 and span12_vert_0 to span12_vert_23.

@@ -489,9 +489,9 @@ of the 1k chip: 1 0faboutBYPASS 2 0faboutRESETB 5 0faboutLATCHINPUTVALUE -12 1neigh_op_bnl_1SDO +12 1neigh_op_bnr_3SDO 4 0faboutSDI -5 0faboutSCLK +3 0faboutSCLK

-- cgit v1.2.3 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(-) 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(-) 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(+) 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(-) 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(-) 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(-) 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(-) 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(-) 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(-) 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(-) 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 b61cfb8a011330b3621734b134ce3b56d7507b2e Mon Sep 17 00:00:00 2001 From: Roland Lutz Date: Mon, 12 Jun 2017 20:02:34 +0200 Subject: iceprog: Add manpage --- iceprog/Makefile | 3 ++ iceprog/iceprog.1 | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 iceprog/iceprog.1 diff --git a/iceprog/Makefile b/iceprog/Makefile index 286460f..c61b470 100644 --- a/iceprog/Makefile +++ b/iceprog/Makefile @@ -24,9 +24,12 @@ iceprog$(EXE): iceprog.o install: all mkdir -p $(DESTDIR)$(PREFIX)/bin cp iceprog $(DESTDIR)$(PREFIX)/bin/iceprog + mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1 + install -c -m 644 iceprog.1 $(DESTDIR)$(PREFIX)/share/man/man1 uninstall: rm -f $(DESTDIR)$(PREFIX)/bin/iceprog + rm -f $(DESTDIR)$(PREFIX)/share/man/man1/iceprog.1 clean: rm -f iceprog diff --git a/iceprog/iceprog.1 b/iceprog/iceprog.1 new file mode 100644 index 0000000..22d3882 --- /dev/null +++ b/iceprog/iceprog.1 @@ -0,0 +1,155 @@ +.\" Manpage for iceprog(1) +.\" Copyright (C) 2017 Roland Lutz +.\" +.\" Permission is granted to copy, distribute and/or modify this document +.\" under the terms of the GNU Free Documentation License, Version 1.3 or +.\" any later version published by the Free Software Foundation; with no +.\" Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +.\" +.TH ICEPROG "1" "June 2017" "IceStorm" "User Commands" +.SH NAME +iceprog \- simple programming tool for FTDI\-based Lattice iCE programmers +.SH SYNOPSIS +.B iceprog +[\-b|\-n|\-c] \fIINPUT\-FILE\fR + +.B iceprog +\-r|\-R\fI\,BYTES\fR \fIOUTPUT\-FILE\fR + +.B iceprog +\-S \fIINPUT\-FILE\fR + +.B iceprog +\-t +.SH DESCRIPTION +The \fBiceprog\fR program is a simple programming tool for FTDI\-based +Lattice iCE programmers which can read, write and erase the flash and +write the SRAM of an FPGA. It is typically invoked after the +bitstream has been converted by \fBicepack\fR to the iCE40 \fB.bin\fR +format as the last step of the build process to transfer the bitstream +to the FPGA. +.SS Operation mode +When no special option is given, \fBiceprog\fR erases all 64kB sectors +which would be touched by the written data, writes the data to the +flash, and then reads it back and verifies it. + +\fIPlease note:\fR If the data is not aligned to 64kB, some data +before (if \fB\-o\fR is used) and after the written data may be erased +as well. + +The way the flash is erased can be changed with the following options: +.TP +\fB\-b\fR +Bulk erase the entire flash before writing. When using this option, +\fBiceprog\fR can be invoked without an \fIINPUT\-FILE\fR; in this +case, the flash is just bulk erased, and nothing is written. +.TP +\fB\-n\fR +Don't erase the flash before writing. +.PP +Instead of the default erase/write/verify, \fBiceprog\fR can perform +some other operations: +.TP +\fB\-c\fR +Just read the data which would have been written from the flash and +verify it (`check'). +.TP +\fB\-r\fR +Read the first 256 kB from flash and write them to a file. +.TP +\fB\-R\fR \fISIZE\-IN\-BYTES\fR +Read the specified number of bytes from the flash and write them to a +file. You can append `\fBk\fR' to the size to specify it in kilobytes +and `\fBM\fR' to specify it in megabytes. +.TP +\fB\-S\fR +Perform SRAM programming. +.TP +\fB\-t\fR +Just read the flash ID sequence. +.PP +All of the above options are mutually exclusive. +.SS General options +.TP +\fB\-d\fR \fIDEVICE\-STRING\fR +Use the specified USB device instead of the default one (which is +vendor ID 0x0403 and device ID 0x6010). The supported notations for +\fIDEVICE\-STRING\fR are: + +\fBd:\,\f(BIdevicenode\fR \- path of the bus and device node within +USB device tree (usually at /proc/bus/usb/); e.g., `d:002/005' + +\fBi:\,\f(BIvendor\/\fB:\,\f(BIproduct\fR \- first device with given +vendor and product ID. IDs can be decimal, octal (preceded by +`\fB0\fR'), or hex (preceded by `\fB0x\fR'); e.g., `i:0x0403:0x6010' + +\fBi:\,\f(BIvendor\/\fB:\,\f(BIproduct\/\fB:\,\f(BIindex\fR \- same as +above, with index being the number of the device (starting with 0) if +there is more than one device with this vendor and product ID; e.g., +`i:0x0403:0x6010:0' + +\fBs:\,\f(BIvendor\/\fB:\,\f(BIproduct\/\fB:\,\f(BIserial\-string\fR +\- first device with given vendor ID, product ID and serial string. +.TP +\fB\-I\fR A|B|C|D +Connect to the specified interface on the FTDI chip. If this option +is omitted, interface A is used. +.TP +\fB\-o\fR \fIOFFSET\-IN\-BYTES\fR +Start reading/writing at address \fIOFFSET\-IN\-BYTES\fR instead of the +beginning of the memory. You can append `\fBk\fR' to the offset to +specify it in kilobytes and `\fBM\fR' to specify it in megabytes. +.TP +\fB\-v\fR +Write more verbose messages. +.TP +\fB\-\-help\fR +Display a help text and exit. +.SS Exit status +.TP +.B 0 +on success, +.TP +.B 1 +if a non\-hardware error occurred (e.g., failure to read from or write +to a file, or invoked with invalid options), +.TP +.B 2 +if communication with the hardware failed (e.g., cannot find the iCE +FTDI USB device), +.TP +.B 3 +if verification of the data failed. +.SS Notes for iCEstick (iCE40HX\-1k devel board) +An unmodified iCEstick can only be programmed via the serial flash. +Direct programming of the SRAM is not supported. For direct SRAM +programming the flash chip and one zero ohm resistor must be +desoldered and the FT2232H SI pin must be connected to the iCE SPI_SI +pin, as shown in this picture: + +.SS Notes for the iCE40\-HX8K Breakout Board +Make sure that the jumper settings on the board match the selected +mode (SRAM or FLASH). See the iCE40\-HX8K user manual for details. +.SH AUTHOR +Written by Clifford Wolf. +.SH REPORTING BUGS +If you have a bug report, please file an issue on github: + +.SH COPYRIGHT +Most of Project IceStorm is licensed under the ISC license: + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.SH SEE ALSO +Full documentation at: +.br +or available locally via: info \(aq(icestorm) iceprog invocation\(aq -- 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(-) 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(-) 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(-) 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(-) 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(-) 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