2 * iceprog -- simple programming tool for FTDI-based Lattice iCE programmers
4 * Copyright (C) 2015 Clifford Wolf <clifford@clifford.at>
5 * Copyright (C) 2018 Piotr Esden-Tempski <piotr@esden.net>
7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 * http://www.latticesemi.com/~/media/Documents/UserManuals/EI/icestickusermanual.pdf
22 * http://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_32mb_3v_65nm.pdf
35 #include <sys/types.h>
39 #include <io.h> /* _setmode() */
40 #include <fcntl.h> /* _O_BINARY */
46 static bool verbose
= false;
48 // ---------------------------------------------------------
50 // ---------------------------------------------------------
52 /* Flash command definitions */
53 /* This command list is based on the Winbond W25Q128JV Datasheet */
55 FC_WE
= 0x06, /* Write Enable */
56 FC_SRWE
= 0x50, /* Volatile SR Write Enable */
57 FC_WD
= 0x04, /* Write Disable */
58 FC_RPD
= 0xAB, /* Release Power-Down, returns Device ID */
59 FC_MFGID
= 0x90, /* Read Manufacturer/Device ID */
60 FC_JEDECID
= 0x9F, /* Read JEDEC ID */
61 FC_UID
= 0x4B, /* Read Unique ID */
62 FC_RD
= 0x03, /* Read Data */
63 FC_FR
= 0x0B, /* Fast Read */
64 FC_PP
= 0x02, /* Page Program */
65 FC_SE
= 0x20, /* Sector Erase 4kb */
66 FC_BE32
= 0x52, /* Block Erase 32kb */
67 FC_BE64
= 0xD8, /* Block Erase 64kb */
68 FC_CE
= 0xC7, /* Chip Erase */
69 FC_RSR1
= 0x05, /* Read Status Register 1 */
70 FC_WSR1
= 0x01, /* Write Status Register 1 */
71 FC_RSR2
= 0x35, /* Read Status Register 2 */
72 FC_WSR2
= 0x31, /* Write Status Register 2 */
73 FC_RSR3
= 0x15, /* Read Status Register 3 */
74 FC_WSR3
= 0x11, /* Write Status Register 3 */
75 FC_RSFDP
= 0x5A, /* Read SFDP Register */
76 FC_ESR
= 0x44, /* Erase Security Register */
77 FC_PSR
= 0x42, /* Program Security Register */
78 FC_RSR
= 0x48, /* Read Security Register */
79 FC_GBL
= 0x7E, /* Global Block Lock */
80 FC_GBU
= 0x98, /* Global Block Unlock */
81 FC_RBL
= 0x3D, /* Read Block Lock */
82 FC_RPR
= 0x3C, /* Read Sector Protection Registers (adesto) */
83 FC_IBL
= 0x36, /* Individual Block Lock */
84 FC_IBU
= 0x39, /* Individual Block Unlock */
85 FC_EPS
= 0x75, /* Erase / Program Suspend */
86 FC_EPR
= 0x7A, /* Erase / Program Resume */
87 FC_PD
= 0xB9, /* Power-down */
88 FC_QPI
= 0x38, /* Enter QPI mode */
89 FC_ERESET
= 0x66, /* Enable Reset */
90 FC_RESET
= 0x99, /* Reset Device */
93 // ---------------------------------------------------------
94 // Hardware specific CS, CReset, CDone functions
95 // ---------------------------------------------------------
97 static void set_cs_creset(int cs_b
, int creset_b
)
100 uint8_t direction
= 0x93;
112 mpsse_set_gpio(gpio
, direction
);
115 static bool get_cdone(void)
118 return (mpsse_readb_low() & 0x40) != 0;
121 // ---------------------------------------------------------
122 // FLASH function implementations
123 // ---------------------------------------------------------
125 // the FPGA reset is released so also FLASH chip select should be deasserted
126 static void flash_release_reset()
131 // FLASH chip select assert
132 // should only happen while FPGA reset is asserted
133 static void flash_chip_select()
138 // FLASH chip select deassert
139 static void flash_chip_deselect()
144 // SRAM reset is the same as flash_chip_select()
145 // For ease of code reading we use this function instead
146 static void sram_reset()
148 // Asserting chip select and reset lines
152 // SRAM chip select assert
153 // When accessing FPGA SRAM the reset should be released
154 static void sram_chip_select()
159 static void flash_read_id()
161 /* JEDEC ID structure:
162 * Byte No. | Data Type
163 * ---------+----------
164 * 0 | FC_JEDECID Request Command
168 * 4 | Ext Dev Str Len
171 uint8_t data
[260] = { FC_JEDECID
};
172 int len
= 5; // command + 4 response bytes
175 fprintf(stderr
, "read flash ID..\n");
179 // Write command and read first 4 bytes
180 mpsse_xfer_spi(data
, len
);
183 fprintf(stderr
, "Extended Device String Length is 0xFF, "
184 "this is likely a read error. Ignorig...\n");
186 // Read extended JEDEC ID bytes
189 mpsse_xfer_spi(data
+ 5, len
- 5);
193 flash_chip_deselect();
195 // TODO: Add full decode of the JEDEC ID.
196 fprintf(stderr
, "flash ID:");
197 for (int i
= 1; i
< len
; i
++)
198 fprintf(stderr
, " 0x%02X", data
[i
]);
199 fprintf(stderr
, "\n");
202 static void flash_reset()
204 uint8_t data
[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
207 mpsse_xfer_spi(data
, 8);
208 flash_chip_deselect();
211 static void flash_power_up()
213 uint8_t data_rpd
[1] = { FC_RPD
};
215 mpsse_xfer_spi(data_rpd
, 1);
216 flash_chip_deselect();
219 static void flash_power_down()
221 uint8_t data
[1] = { FC_PD
};
223 mpsse_xfer_spi(data
, 1);
224 flash_chip_deselect();
227 static uint8_t flash_read_status()
229 uint8_t data
[2] = { FC_RSR1
};
232 mpsse_xfer_spi(data
, 2);
233 flash_chip_deselect();
236 fprintf(stderr
, "SR1: 0x%02X\n", data
[1]);
237 fprintf(stderr
, " - SPRL: %s\n",
238 ((data
[1] & (1 << 7)) == 0) ?
241 fprintf(stderr
, " - SPM: %s\n",
242 ((data
[1] & (1 << 6)) == 0) ?
243 "Byte/Page Prog Mode" :
244 "Sequential Prog Mode");
245 fprintf(stderr
, " - EPE: %s\n",
246 ((data
[1] & (1 << 5)) == 0) ?
247 "Erase/Prog success" :
249 fprintf(stderr
, "- SPM: %s\n",
250 ((data
[1] & (1 << 4)) == 0) ?
253 fprintf(stderr
, " - SWP: ");
254 switch((data
[1] >> 2) & 0x3) {
256 fprintf(stderr
, "All sectors unprotected\n");
259 fprintf(stderr
, "Some sectors protected\n");
262 fprintf(stderr
, "Reserved (xxxx 10xx)\n");
265 fprintf(stderr
, "All sectors protected\n");
268 fprintf(stderr
, " - WEL: %s\n",
269 ((data
[1] & (1 << 1)) == 0) ?
270 "Not write enabled" :
272 fprintf(stderr
, " - ~RDY: %s\n",
273 ((data
[1] & (1 << 0)) == 0) ?
283 static void flash_write_enable()
286 fprintf(stderr
, "status before enable:\n");
291 fprintf(stderr
, "write enable..\n");
293 uint8_t data
[1] = { FC_WE
};
295 mpsse_xfer_spi(data
, 1);
296 flash_chip_deselect();
299 fprintf(stderr
, "status after enable:\n");
304 static void flash_bulk_erase()
306 fprintf(stderr
, "bulk erase..\n");
308 uint8_t data
[1] = { FC_CE
};
310 mpsse_xfer_spi(data
, 1);
311 flash_chip_deselect();
314 static void flash_4kB_sector_erase(int addr
)
316 fprintf(stderr
, "erase 4kB sector at 0x%06X..\n", addr
);
318 uint8_t command
[4] = { FC_SE
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
321 mpsse_send_spi(command
, 4);
322 flash_chip_deselect();
325 static void flash_32kB_sector_erase(int addr
)
327 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
329 uint8_t command
[4] = { FC_BE32
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
332 mpsse_send_spi(command
, 4);
333 flash_chip_deselect();
336 static void flash_64kB_sector_erase(int addr
)
338 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
340 uint8_t command
[4] = { FC_BE64
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
343 mpsse_send_spi(command
, 4);
344 flash_chip_deselect();
347 static void flash_prog(int addr
, uint8_t *data
, int n
)
350 fprintf(stderr
, "prog 0x%06X +0x%03X..\n", addr
, n
);
352 uint8_t command
[4] = { FC_PP
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
355 mpsse_send_spi(command
, 4);
356 mpsse_send_spi(data
, n
);
357 flash_chip_deselect();
360 for (int i
= 0; i
< n
; i
++)
361 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
364 static void flash_read(int addr
, uint8_t *data
, int n
)
367 fprintf(stderr
, "read 0x%06X +0x%03X..\n", addr
, n
);
369 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
372 mpsse_send_spi(command
, 4);
374 mpsse_xfer_spi(data
, n
);
375 flash_chip_deselect();
378 for (int i
= 0; i
< n
; i
++)
379 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
382 static void flash_wait()
385 fprintf(stderr
, "waiting..");
390 uint8_t data
[2] = { FC_RSR1
};
393 mpsse_xfer_spi(data
, 2);
394 flash_chip_deselect();
396 if ((data
[1] & 0x01) == 0) {
400 fprintf(stderr
, "r");
405 fprintf(stderr
, "R");
412 fprintf(stderr
, ".");
422 fprintf(stderr
, "\n");
426 static void flash_disable_protection()
428 fprintf(stderr
, "disable flash protection...\n");
430 // Write Status Register 1 <- 0x00
431 uint8_t data
[2] = { FC_WSR1
, 0x00 };
433 mpsse_xfer_spi(data
, 2);
434 flash_chip_deselect();
438 // Read Status Register 1
442 mpsse_xfer_spi(data
, 2);
443 flash_chip_deselect();
446 fprintf(stderr
, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data
[1]);
450 // ---------------------------------------------------------
451 // iceprog implementation
452 // ---------------------------------------------------------
454 static void help(const char *progname
)
456 fprintf(stderr
, "Simple programming tool for FTDI-based Lattice iCE programmers.\n");
457 fprintf(stderr
, "Usage: %s [-b|-n|-c] <input file>\n", progname
);
458 fprintf(stderr
, " %s -r|-R<bytes> <output file>\n", progname
);
459 fprintf(stderr
, " %s -S <input file>\n", progname
);
460 fprintf(stderr
, " %s -t\n", progname
);
461 fprintf(stderr
, "\n");
462 fprintf(stderr
, "General options:\n");
463 fprintf(stderr
, " -d <device string> use the specified USB device [default: i:0x0403:0x6010 or i:0x0403:0x6014]\n");
464 fprintf(stderr
, " d:<devicenode> (e.g. d:002/005)\n");
465 fprintf(stderr
, " i:<vendor>:<product> (e.g. i:0x0403:0x6010)\n");
466 fprintf(stderr
, " i:<vendor>:<product>:<index> (e.g. i:0x0403:0x6010:0)\n");
467 fprintf(stderr
, " s:<vendor>:<product>:<serial-string>\n");
468 fprintf(stderr
, " -I [ABCD] connect to the specified interface on the FTDI chip\n");
469 fprintf(stderr
, " [default: A]\n");
470 fprintf(stderr
, " -o <offset in bytes> start address for read/write [default: 0]\n");
471 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
472 fprintf(stderr
, " or 'M' for size in megabytes)\n");
473 fprintf(stderr
, " -s slow SPI (50 kHz instead of 6 MHz)\n");
474 fprintf(stderr
, " -v verbose output\n");
475 fprintf(stderr
, " -i [4,32,64] select erase block size [default: 64k]\n");
476 fprintf(stderr
, "\n");
477 fprintf(stderr
, "Mode of operation:\n");
478 fprintf(stderr
, " [default] write file contents to flash, then verify\n");
479 fprintf(stderr
, " -X write file contents to flash only\n");
480 fprintf(stderr
, " -r read first 256 kB from flash and write to file\n");
481 fprintf(stderr
, " -R <size in bytes> read the specified number of bytes from flash\n");
482 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
483 fprintf(stderr
, " or 'M' for size in megabytes)\n");
484 fprintf(stderr
, " -c do not write flash, only verify (`check')\n");
485 fprintf(stderr
, " -S perform SRAM programming\n");
486 fprintf(stderr
, " -t just read the flash ID sequence\n");
487 fprintf(stderr
, "\n");
488 fprintf(stderr
, "Erase mode (only meaningful in default mode):\n");
489 fprintf(stderr
, " [default] erase aligned chunks of 64kB in write mode\n");
490 fprintf(stderr
, " This means that some data after the written data (or\n");
491 fprintf(stderr
, " even before when -o is used) may be erased as well.\n");
492 fprintf(stderr
, " -b bulk erase entire flash before writing\n");
493 fprintf(stderr
, " -e <size in bytes> erase flash as if we were writing that number of bytes\n");
494 fprintf(stderr
, " -n do not erase flash before writing\n");
495 fprintf(stderr
, " -p disable write protection before erasing or writing\n");
496 fprintf(stderr
, " This can be useful if flash memory appears to be\n");
497 fprintf(stderr
, " bricked and won't respond to erasing or programming.\n");
498 fprintf(stderr
, "\n");
499 fprintf(stderr
, "Miscellaneous options:\n");
500 fprintf(stderr
, " --help display this help and exit\n");
501 fprintf(stderr
, " -- treat all remaining arguments as filenames\n");
502 fprintf(stderr
, "\n");
503 fprintf(stderr
, "Exit status:\n");
504 fprintf(stderr
, " 0 on success,\n");
505 fprintf(stderr
, " 1 if a non-hardware error occurred (e.g., failure to read from or\n");
506 fprintf(stderr
, " write to a file, or invoked with invalid options),\n");
507 fprintf(stderr
, " 2 if communication with the hardware failed (e.g., cannot find the\n");
508 fprintf(stderr
, " iCE FTDI USB device),\n");
509 fprintf(stderr
, " 3 if verification of the data failed.\n");
510 fprintf(stderr
, "\n");
511 fprintf(stderr
, "Notes for iCEstick (iCE40HX-1k devel board):\n");
512 fprintf(stderr
, " An unmodified iCEstick can only be programmed via the serial flash.\n");
513 fprintf(stderr
, " Direct programming of the SRAM is not supported. For direct SRAM\n");
514 fprintf(stderr
, " programming the flash chip and one zero ohm resistor must be desoldered\n");
515 fprintf(stderr
, " and the FT2232H SI pin must be connected to the iCE SPI_SI pin, as shown\n");
516 fprintf(stderr
, " in this picture:\n");
517 fprintf(stderr
, " http://www.clifford.at/gallery/2014-elektronik/IMG_20141115_183838\n");
518 fprintf(stderr
, "\n");
519 fprintf(stderr
, "Notes for the iCE40-HX8K Breakout Board:\n");
520 fprintf(stderr
, " Make sure that the jumper settings on the board match the selected\n");
521 fprintf(stderr
, " mode (SRAM or FLASH). See the iCE40-HX8K user manual for details.\n");
522 fprintf(stderr
, "\n");
523 fprintf(stderr
, "If you have a bug report, please file an issue on github:\n");
524 fprintf(stderr
, " https://github.com/cliffordwolf/icestorm/issues\n");
527 int main(int argc
, char **argv
)
529 /* used for error reporting */
530 const char *my_name
= argv
[0];
531 for (size_t i
= 0; argv
[0][i
]; i
++)
532 if (argv
[0][i
] == '/')
533 my_name
= argv
[0] + i
+ 1;
535 int read_size
= 256 * 1024;
536 int erase_block_size
= 64;
540 bool read_mode
= false;
541 bool check_mode
= false;
542 bool erase_mode
= false;
543 bool bulk_erase
= false;
544 bool dont_erase
= false;
545 bool prog_sram
= false;
546 bool test_mode
= false;
547 bool slow_clock
= false;
548 bool disable_protect
= false;
549 bool disable_verify
= false;
550 const char *filename
= NULL
;
551 const char *devstr
= NULL
;
555 _setmode(_fileno(stdin
), _O_BINARY
);
556 _setmode(_fileno(stdout
), _O_BINARY
);
559 static struct option long_options
[] = {
560 {"help", no_argument
, NULL
, -2},
564 /* Decode command line parameters */
567 while ((opt
= getopt_long(argc
, argv
, "d:i:I:rR:e:o:cbnStvspX", long_options
, NULL
)) != -1) {
569 case 'd': /* device string */
572 case 'i': /* block erase size */
573 if (!strcmp(optarg
, "4"))
574 erase_block_size
= 4;
575 else if (!strcmp(optarg
, "32"))
576 erase_block_size
= 32;
577 else if (!strcmp(optarg
, "64"))
578 erase_block_size
= 64;
580 fprintf(stderr
, "%s: `%s' is not a valid erase block size (must be `4', `32' or `64')\n", my_name
, optarg
);
584 case 'I': /* FTDI Chip interface select */
585 if (!strcmp(optarg
, "A"))
587 else if (!strcmp(optarg
, "B"))
589 else if (!strcmp(optarg
, "C"))
591 else if (!strcmp(optarg
, "D"))
594 fprintf(stderr
, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name
, optarg
);
598 case 'r': /* Read 256 bytes to file */
601 case 'R': /* Read n bytes to file */
603 read_size
= strtol(optarg
, &endptr
, 0);
606 else if (!strcmp(endptr
, "k"))
608 else if (!strcmp(endptr
, "M"))
609 read_size
*= 1024 * 1024;
611 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
615 case 'e': /* Erase blocks as if we were writing n bytes */
617 erase_size
= strtol(optarg
, &endptr
, 0);
620 else if (!strcmp(endptr
, "k"))
622 else if (!strcmp(endptr
, "M"))
623 erase_size
*= 1024 * 1024;
625 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
629 case 'o': /* set address offset */
630 rw_offset
= strtol(optarg
, &endptr
, 0);
633 else if (!strcmp(endptr
, "k"))
635 else if (!strcmp(endptr
, "M"))
636 rw_offset
*= 1024 * 1024;
638 fprintf(stderr
, "%s: `%s' is not a valid offset\n", my_name
, optarg
);
642 case 'c': /* do not write just check */
645 case 'b': /* bulk erase before writing */
648 case 'n': /* do not erase before writing */
651 case 'S': /* write to sram directly */
654 case 't': /* just read flash id */
657 case 'v': /* provide verbose output */
660 case 's': /* use slow SPI clock */
663 case 'p': /* disable flash protect before erase/write */
664 disable_protect
= true;
666 case 'X': /* disable verification */
667 disable_verify
= true;
673 /* error message has already been printed */
674 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
679 /* Make sure that the combination of provided parameters makes sense */
681 if (read_mode
+ erase_mode
+ check_mode
+ prog_sram
+ test_mode
> 1) {
682 fprintf(stderr
, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name
);
686 if (bulk_erase
&& dont_erase
) {
687 fprintf(stderr
, "%s: options `-b' and `-n' are mutually exclusive\n", my_name
);
691 if (disable_protect
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
692 fprintf(stderr
, "%s: option `-p' only valid in programming mode\n", my_name
);
696 if (bulk_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
697 fprintf(stderr
, "%s: option `-b' only valid in programming mode\n", my_name
);
701 if (dont_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
702 fprintf(stderr
, "%s: option `-n' only valid in programming mode\n", my_name
);
706 if (rw_offset
!= 0 && prog_sram
) {
707 fprintf(stderr
, "%s: option `-o' not supported in SRAM mode\n", my_name
);
711 if (rw_offset
!= 0 && test_mode
) {
712 fprintf(stderr
, "%s: option `-o' not supported in test mode\n", my_name
);
716 if (optind
+ 1 == argc
) {
718 fprintf(stderr
, "%s: test mode doesn't take a file name\n", my_name
);
719 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
722 filename
= argv
[optind
];
723 } else if (optind
!= argc
) {
724 fprintf(stderr
, "%s: too many arguments\n", my_name
);
725 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
727 } else if (bulk_erase
|| disable_protect
) {
728 filename
= "/dev/null";
729 } else if (!test_mode
&& !erase_mode
&& !disable_protect
) {
730 fprintf(stderr
, "%s: missing argument\n", my_name
);
731 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
735 /* open input/output file in advance
736 so we can fail before initializing the hardware */
743 } else if (erase_mode
) {
744 file_size
= erase_size
;
745 } else if (read_mode
) {
746 f
= (strcmp(filename
, "-") == 0) ? stdout
: fopen(filename
, "wb");
748 fprintf(stderr
, "%s: can't open '%s' for writing: ", my_name
, filename
);
753 f
= (strcmp(filename
, "-") == 0) ? stdin
: fopen(filename
, "rb");
755 fprintf(stderr
, "%s: can't open '%s' for reading: ", my_name
, filename
);
760 /* For regular programming, we need to read the file
761 twice--once for programming and once for verifying--and
762 need to know the file size in advance in order to erase
763 the correct amount of memory.
765 See if we can seek on the input file. Checking for "-"
766 as an argument isn't enough as we might be reading from a
767 named pipe, or contrarily, the standard input may be an
770 if (!prog_sram
&& !check_mode
) {
771 if (fseek(f
, 0L, SEEK_END
) != -1) {
772 file_size
= ftell(f
);
773 if (file_size
== -1) {
774 fprintf(stderr
, "%s: %s: ftell: ", my_name
, filename
);
778 if (fseek(f
, 0L, SEEK_SET
) == -1) {
779 fprintf(stderr
, "%s: %s: fseek: ", my_name
, filename
);
788 fprintf(stderr
, "%s: can't open temporary file\n", my_name
);
794 static unsigned char buffer
[4096];
795 size_t rc
= fread(buffer
, 1, 4096, pipe
);
798 size_t wc
= fwrite(buffer
, 1, rc
, f
);
800 fprintf(stderr
, "%s: can't write to temporary file\n", my_name
);
807 /* now seek to the beginning so we can
808 start reading again */
809 fseek(f
, 0, SEEK_SET
);
814 // ---------------------------------------------------------
815 // Initialize USB connection to FT2232H
816 // ---------------------------------------------------------
818 fprintf(stderr
, "init..\n");
820 mpsse_init(ifnum
, devstr
, slow_clock
);
824 jtag_go_to_state(STATE_SHIFT_IR
);
826 uint8_t data_in
[4] = {0,0,0,0};
827 uint8_t data_out
[4] = {0,0,0,0};
830 jtag_tap_shift(data_in
, data_out
, 8, true);
831 fprintf(stderr
, " %02x\n", data_out
[0]);
833 jtag_go_to_state(STATE_SHIFT_DR
);
834 jtag_tap_shift(data_in
, data_out
, 32, true);
837 fprintf(stderr
, "Data: ");
838 for(int i
= 0; i
< 4; i
++)
839 fprintf(stderr
, " %02x", data_out
[i
]);
840 fprintf(stderr
, "\n");
842 //flash_release_reset();
851 // ---------------------------------------------------------
853 // ---------------------------------------------------------
855 fprintf(stderr
, "reset..\n");
863 fprintf(stderr
, "cdone: %s\n", get_cdone() ? "high" : "low");
866 // ---------------------------------------------------------
868 // ---------------------------------------------------------
870 fprintf(stderr
, "programming..\n");
872 static unsigned char buffer
[4096];
873 int rc
= fread(buffer
, 1, 4096, f
);
877 fprintf(stderr
, "sending %d bytes.\n", rc
);
878 mpsse_send_spi(buffer
, rc
);
881 mpsse_send_dummy_bytes(6);
882 mpsse_send_dummy_bit();
884 fprintf(stderr
, "cdone: %s\n", get_cdone() ? "high" : "low");
886 else /* program flash */
888 // ---------------------------------------------------------
890 // ---------------------------------------------------------
892 fprintf(stderr
, "reset..\n");
894 flash_chip_deselect();
897 fprintf(stderr
, "cdone: %s\n", get_cdone() ? "high" : "low");
905 // ---------------------------------------------------------
907 // ---------------------------------------------------------
909 if (!read_mode
&& !check_mode
)
913 flash_write_enable();
914 flash_disable_protection();
921 flash_write_enable();
927 fprintf(stderr
, "file size: %ld\n", file_size
);
929 int block_size
= erase_block_size
<< 10;
930 int block_mask
= block_size
- 1;
931 int begin_addr
= rw_offset
& ~block_mask
;
932 int end_addr
= (rw_offset
+ file_size
+ block_mask
) & ~block_mask
;
934 for (int addr
= begin_addr
; addr
< end_addr
; addr
+= block_size
) {
935 flash_write_enable();
936 switch(erase_block_size
) {
938 flash_4kB_sector_erase(addr
);
941 flash_32kB_sector_erase(addr
);
944 flash_64kB_sector_erase(addr
);
948 fprintf(stderr
, "Status after block erase:\n");
958 fprintf(stderr
, "programming..\n");
960 for (int rc
, addr
= 0; true; addr
+= rc
) {
962 int page_size
= 256 - (rw_offset
+ addr
) % 256;
963 rc
= fread(buffer
, 1, page_size
, f
);
966 flash_write_enable();
967 flash_prog(rw_offset
+ addr
, buffer
, rc
);
971 /* seek to the beginning for second pass */
972 fseek(f
, 0, SEEK_SET
);
976 // ---------------------------------------------------------
978 // ---------------------------------------------------------
981 fprintf(stderr
, "reading..\n");
982 for (int addr
= 0; addr
< read_size
; addr
+= 256) {
984 flash_read(rw_offset
+ addr
, buffer
, 256);
985 fwrite(buffer
, read_size
- addr
> 256 ? 256 : read_size
- addr
, 1, f
);
987 } else if (!erase_mode
&& !disable_verify
) {
988 fprintf(stderr
, "reading..\n");
989 for (int addr
= 0; true; addr
+= 256) {
990 uint8_t buffer_flash
[256], buffer_file
[256];
991 int rc
= fread(buffer_file
, 1, 256, f
);
994 flash_read(rw_offset
+ addr
, buffer_flash
, rc
);
995 if (memcmp(buffer_file
, buffer_flash
, rc
)) {
996 fprintf(stderr
, "Found difference between flash and file!\n");
1001 fprintf(stderr
, "VERIFY OK\n");
1005 // ---------------------------------------------------------
1007 // ---------------------------------------------------------
1011 set_cs_creset(1, 1);
1014 fprintf(stderr
, "cdone: %s\n", get_cdone() ? "high" : "low");
1017 if (f
!= NULL
&& f
!= stdin
&& f
!= stdout
)
1020 // ---------------------------------------------------------
1022 // ---------------------------------------------------------
1024 fprintf(stderr
, "Bye.\n");