2 * ecpprog -- simple programming tool for FTDI-based JTAG programmers
5 * Copyright (C) 2015 Clifford Wolf <clifford@clifford.at>
6 * Copyright (C) 2018 Piotr Esden-Tempski <piotr@esden.net>
7 * Copyright (C) 2020 Gregory Davill <greg.davill@gmail.com>
9 * Permission to use, copy, modify, and/or distribute this software for any
10 * purpose with or without fee is hereby granted, provided that the above
11 * copyright notice and this permission notice appear in all copies.
13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 * http://www.latticesemi.com/~/media/Documents/UserManuals/EI/icestickusermanual.pdf
24 * http://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_32mb_3v_65nm.pdf
37 #include <sys/types.h>
41 #include <io.h> /* _setmode() */
42 #include <fcntl.h> /* _O_BINARY */
47 #include "lattice_cmds.h"
49 static bool verbose
= false;
51 // ---------------------------------------------------------
53 // ---------------------------------------------------------
55 /* Flash command definitions */
56 /* This command list is based on the Winbond W25Q128JV Datasheet */
58 FC_WE
= 0x06, /* Write Enable */
59 FC_SRWE
= 0x50, /* Volatile SR Write Enable */
60 FC_WD
= 0x04, /* Write Disable */
61 FC_RPD
= 0xAB, /* Release Power-Down, returns Device ID */
62 FC_MFGID
= 0x90, /* Read Manufacturer/Device ID */
63 FC_JEDECID
= 0x9F, /* Read JEDEC ID */
64 FC_UID
= 0x4B, /* Read Unique ID */
65 FC_RD
= 0x03, /* Read Data */
66 FC_FR
= 0x0B, /* Fast Read */
67 FC_PP
= 0x02, /* Page Program */
68 FC_SE
= 0x20, /* Sector Erase 4kb */
69 FC_BE32
= 0x52, /* Block Erase 32kb */
70 FC_BE64
= 0xD8, /* Block Erase 64kb */
71 FC_CE
= 0xC7, /* Chip Erase */
72 FC_RSR1
= 0x05, /* Read Status Register 1 */
73 FC_WSR1
= 0x01, /* Write Status Register 1 */
74 FC_RSR2
= 0x35, /* Read Status Register 2 */
75 FC_WSR2
= 0x31, /* Write Status Register 2 */
76 FC_RSR3
= 0x15, /* Read Status Register 3 */
77 FC_WSR3
= 0x11, /* Write Status Register 3 */
78 FC_RSFDP
= 0x5A, /* Read SFDP Register */
79 FC_ESR
= 0x44, /* Erase Security Register */
80 FC_PSR
= 0x42, /* Program Security Register */
81 FC_RSR
= 0x48, /* Read Security Register */
82 FC_GBL
= 0x7E, /* Global Block Lock */
83 FC_GBU
= 0x98, /* Global Block Unlock */
84 FC_RBL
= 0x3D, /* Read Block Lock */
85 FC_RPR
= 0x3C, /* Read Sector Protection Registers (adesto) */
86 FC_IBL
= 0x36, /* Individual Block Lock */
87 FC_IBU
= 0x39, /* Individual Block Unlock */
88 FC_EPS
= 0x75, /* Erase / Program Suspend */
89 FC_EPR
= 0x7A, /* Erase / Program Resume */
90 FC_PD
= 0xB9, /* Power-down */
91 FC_QPI
= 0x38, /* Enter QPI mode */
92 FC_ERESET
= 0x66, /* Enable Reset */
93 FC_RESET
= 0x99, /* Reset Device */
96 // ---------------------------------------------------------
97 // FLASH function implementations
98 // ---------------------------------------------------------
100 static void flash_read_id()
102 /* JEDEC ID structure:
103 * Byte No. | Data Type
104 * ---------+----------
105 * 0 | FC_JEDECID Request Command
109 * 4 | Ext Dev Str Len
112 uint8_t data
[260] = { FC_JEDECID
};
113 int len
= 5; // command + 4 response bytes
116 fprintf(stderr
, "read flash ID..\n");
118 //flash_chip_select();
120 // Write command and read first 4 bytes
121 //mpsse_xfer_spi(data, len);
123 //jtag_go_to_state(STATE_SHIFT_DR);
124 //jtag_tap_shift(data, data, 8*5, false);
127 fprintf(stderr
, "Extended Device String Length is 0xFF, "
128 "this is likely a read error. Ignorig...\n");
130 // Read extended JEDEC ID bytes
133 data
[0] = FC_JEDECID
;
138 ////flash_chip_deselect();
140 // TODO: Add full decode of the JEDEC ID.
141 fprintf(stderr
, "flash ID:");
142 for (int i
= 1; i
< len
; i
++)
143 fprintf(stderr
, " 0x%02X", data
[i
]);
144 fprintf(stderr
, "\n");
147 static void flash_reset()
149 uint8_t data
[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
153 static void flash_power_up()
155 uint8_t data_rpd
[1] = { FC_RPD
};
156 xfer_spi(data_rpd
, 1);
159 static void flash_power_down()
161 uint8_t data
[1] = { FC_PD
};
162 jtag_go_to_state(STATE_SHIFT_DR
);
163 jtag_tap_shift(data
, data
, 8, true);
166 static uint8_t flash_read_status()
168 uint8_t data
[2] = { FC_RSR1
};
173 fprintf(stderr
, "SR1: 0x%02X\n", data
[1]);
174 fprintf(stderr
, " - SPRL: %s\n",
175 ((data
[1] & (1 << 7)) == 0) ?
178 fprintf(stderr
, " - SPM: %s\n",
179 ((data
[1] & (1 << 6)) == 0) ?
180 "Byte/Page Prog Mode" :
181 "Sequential Prog Mode");
182 fprintf(stderr
, " - EPE: %s\n",
183 ((data
[1] & (1 << 5)) == 0) ?
184 "Erase/Prog success" :
186 fprintf(stderr
, "- SPM: %s\n",
187 ((data
[1] & (1 << 4)) == 0) ?
190 fprintf(stderr
, " - SWP: ");
191 switch((data
[1] >> 2) & 0x3) {
193 fprintf(stderr
, "All sectors unprotected\n");
196 fprintf(stderr
, "Some sectors protected\n");
199 fprintf(stderr
, "Reserved (xxxx 10xx)\n");
202 fprintf(stderr
, "All sectors protected\n");
205 fprintf(stderr
, " - WEL: %s\n",
206 ((data
[1] & (1 << 1)) == 0) ?
207 "Not write enabled" :
209 fprintf(stderr
, " - ~RDY: %s\n",
210 ((data
[1] & (1 << 0)) == 0) ?
220 static void flash_write_enable()
223 fprintf(stderr
, "status before enable:\n");
228 fprintf(stderr
, "write enable..\n");
230 uint8_t data
[1] = { FC_WE
};
231 //flash_chip_select();
232 mpsse_xfer_spi(data
, 1);
233 //flash_chip_deselect();
236 fprintf(stderr
, "status after enable:\n");
241 static void flash_bulk_erase()
243 fprintf(stderr
, "bulk erase..\n");
245 uint8_t data
[1] = { FC_CE
};
246 //flash_chip_select();
247 mpsse_xfer_spi(data
, 1);
248 //flash_chip_deselect();
251 static void flash_4kB_sector_erase(int addr
)
253 fprintf(stderr
, "erase 4kB sector at 0x%06X..\n", addr
);
255 uint8_t command
[4] = { FC_SE
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
257 //flash_chip_select();
258 mpsse_send_spi(command
, 4);
259 //flash_chip_deselect();
262 static void flash_32kB_sector_erase(int addr
)
264 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
266 uint8_t command
[4] = { FC_BE32
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
268 //flash_chip_select();
269 mpsse_send_spi(command
, 4);
270 //flash_chip_deselect();
273 static void flash_64kB_sector_erase(int addr
)
275 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
277 uint8_t command
[4] = { FC_BE64
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
279 //flash_chip_select();
280 mpsse_send_spi(command
, 4);
281 //flash_chip_deselect();
284 static void flash_prog(int addr
, uint8_t *data
, int n
)
287 fprintf(stderr
, "prog 0x%06X +0x%03X..\n", addr
, n
);
289 uint8_t command
[4] = { FC_PP
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
291 //flash_chip_select();
292 mpsse_send_spi(command
, 4);
293 mpsse_send_spi(data
, n
);
294 //flash_chip_deselect();
297 for (int i
= 0; i
< n
; i
++)
298 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
301 static void flash_read(int addr
, uint8_t *data
, int n
)
304 fprintf(stderr
, "read 0x%06X +0x%03X..\n", addr
, n
);
306 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
308 //flash_chip_select();
309 mpsse_send_spi(command
, 4);
311 mpsse_xfer_spi(data
, n
);
312 //flash_chip_deselect();
315 for (int i
= 0; i
< n
; i
++)
316 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
319 static void flash_wait()
322 fprintf(stderr
, "waiting..");
327 uint8_t data
[2] = { FC_RSR1
};
329 //flash_chip_select();
330 mpsse_xfer_spi(data
, 2);
331 //flash_chip_deselect();
333 if ((data
[1] & 0x01) == 0) {
337 fprintf(stderr
, "r");
342 fprintf(stderr
, "R");
349 fprintf(stderr
, ".");
359 fprintf(stderr
, "\n");
363 static void flash_disable_protection()
365 fprintf(stderr
, "disable flash protection...\n");
367 // Write Status Register 1 <- 0x00
368 uint8_t data
[2] = { FC_WSR1
, 0x00 };
369 //flash_chip_select();
370 mpsse_xfer_spi(data
, 2);
371 //flash_chip_deselect();
375 // Read Status Register 1
378 //flash_chip_select();
379 mpsse_xfer_spi(data
, 2);
380 //flash_chip_deselect();
383 fprintf(stderr
, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data
[1]);
387 // ---------------------------------------------------------
388 // JTAG -> SPI functions
389 // ---------------------------------------------------------
392 * JTAG performrs all shifts LSB first, our FLSAH is expeting bytes MSB first,
393 * There are a few ways to fix this, for now we just bit-reverse all the input data to the JTAG core
395 uint8_t bit_reverse(uint8_t in
){
397 uint8_t out
= (in
& 0x01) ? 0x80 : 0x00;
398 out
|= (in
& 0x02) ? 0x40 : 0x00;
399 out
|= (in
& 0x04) ? 0x20 : 0x00;
400 out
|= (in
& 0x08) ? 0x10 : 0x00;
401 out
|= (in
& 0x10) ? 0x08 : 0x00;
402 out
|= (in
& 0x20) ? 0x04 : 0x00;
403 out
|= (in
& 0x40) ? 0x02 : 0x00;
404 out
|= (in
& 0x80) ? 0x01 : 0x00;
409 void xfer_spi(uint8_t* data
, uint32_t len
){
410 /* Flip bit order of all bytes */
411 for(int i
= 0; i
< len
; i
++){
412 data
[i
] = bit_reverse(data
[i
]);
415 jtag_go_to_state(STATE_SHIFT_DR
);
416 jtag_tap_shift(data
, data
, len
* 8, true);
418 /* Flip bit order of all bytes */
419 for(int i
= 0; i
< len
; i
++){
420 data
[i
] = bit_reverse(data
[i
]);
424 // ---------------------------------------------------------
425 // ECP5 specific JTAG functions
426 // ---------------------------------------------------------
429 static void print_idcode(uint32_t idcode
){
430 for(int i
= 0; i
< sizeof(ecp_devices
)/sizeof(struct ecp_device_id
); i
++){
431 if(idcode
== ecp_devices
[i
].device_id
)
433 printf("IDCODE: 0x%08x (%s)\n", idcode
,ecp_devices
[i
].device_name
);
437 printf("IDCODE: 0x%08x does not match :(\n", idcode
);
440 static void read_idcode(){
442 uint8_t data
[4] = {READ_ID
};
444 jtag_go_to_state(STATE_SHIFT_IR
);
445 jtag_tap_shift(data
, data
, 8, true);
448 jtag_go_to_state(STATE_SHIFT_DR
);
449 jtag_tap_shift(data
, data
, 32, true);
453 /* Format the IDCODE into a 32bit value */
454 for(int i
= 0; i
< 4; i
++)
455 idcode
= data
[i
] << 24 | idcode
>> 8;
457 print_idcode(idcode
);
462 static void enter_spi_background_mode(){
464 uint8_t data_in
[4] = {0,0,0,0};
465 uint8_t data_out
[4] = {0,0,0,0};
468 jtag_go_to_state(STATE_SHIFT_IR
);
469 jtag_tap_shift(data_in
, data_out
, 8, true);
471 /* These bytes seem to be required to un-lock the SPI interface */
474 jtag_go_to_state(STATE_SHIFT_DR
);
475 jtag_tap_shift(data_in
, data_out
, 16, true);
477 /* Entering IDLE is essential */
478 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
483 void ecp_jtag_cmd(uint8_t cmd
){
484 uint8_t data_in
[1] = {0};
485 uint8_t data_out
[1] = {0};
488 jtag_go_to_state(STATE_SHIFT_IR
);
489 jtag_tap_shift(data_in
, data_out
, 8, true);
491 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
495 // ---------------------------------------------------------
496 // iceprog implementation
497 // ---------------------------------------------------------
499 static void help(const char *progname
)
501 fprintf(stderr
, "Simple programming tool for FTDI-based Lattice iCE programmers.\n");
502 fprintf(stderr
, "Usage: %s [-b|-n|-c] <input file>\n", progname
);
503 fprintf(stderr
, " %s -r|-R<bytes> <output file>\n", progname
);
504 fprintf(stderr
, " %s -S <input file>\n", progname
);
505 fprintf(stderr
, " %s -t\n", progname
);
506 fprintf(stderr
, "\n");
507 fprintf(stderr
, "General options:\n");
508 fprintf(stderr
, " -d <device string> use the specified USB device [default: i:0x0403:0x6010 or i:0x0403:0x6014]\n");
509 fprintf(stderr
, " d:<devicenode> (e.g. d:002/005)\n");
510 fprintf(stderr
, " i:<vendor>:<product> (e.g. i:0x0403:0x6010)\n");
511 fprintf(stderr
, " i:<vendor>:<product>:<index> (e.g. i:0x0403:0x6010:0)\n");
512 fprintf(stderr
, " s:<vendor>:<product>:<serial-string>\n");
513 fprintf(stderr
, " -I [ABCD] connect to the specified interface on the FTDI chip\n");
514 fprintf(stderr
, " [default: A]\n");
515 fprintf(stderr
, " -o <offset in bytes> start address for read/write [default: 0]\n");
516 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
517 fprintf(stderr
, " or 'M' for size in megabytes)\n");
518 fprintf(stderr
, " -s slow SPI (50 kHz instead of 6 MHz)\n");
519 fprintf(stderr
, " -v verbose output\n");
520 fprintf(stderr
, " -i [4,32,64] select erase block size [default: 64k]\n");
521 fprintf(stderr
, "\n");
522 fprintf(stderr
, "Mode of operation:\n");
523 fprintf(stderr
, " [default] write file contents to flash, then verify\n");
524 fprintf(stderr
, " -X write file contents to flash only\n");
525 fprintf(stderr
, " -r read first 256 kB from flash and write to file\n");
526 fprintf(stderr
, " -R <size in bytes> read the specified number of bytes from flash\n");
527 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
528 fprintf(stderr
, " or 'M' for size in megabytes)\n");
529 fprintf(stderr
, " -c do not write flash, only verify (`check')\n");
530 fprintf(stderr
, " -S perform SRAM programming\n");
531 fprintf(stderr
, " -t just read the flash ID sequence\n");
532 fprintf(stderr
, "\n");
533 fprintf(stderr
, "Erase mode (only meaningful in default mode):\n");
534 fprintf(stderr
, " [default] erase aligned chunks of 64kB in write mode\n");
535 fprintf(stderr
, " This means that some data after the written data (or\n");
536 fprintf(stderr
, " even before when -o is used) may be erased as well.\n");
537 fprintf(stderr
, " -b bulk erase entire flash before writing\n");
538 fprintf(stderr
, " -e <size in bytes> erase flash as if we were writing that number of bytes\n");
539 fprintf(stderr
, " -n do not erase flash before writing\n");
540 fprintf(stderr
, " -p disable write protection before erasing or writing\n");
541 fprintf(stderr
, " This can be useful if flash memory appears to be\n");
542 fprintf(stderr
, " bricked and won't respond to erasing or programming.\n");
543 fprintf(stderr
, "\n");
544 fprintf(stderr
, "Miscellaneous options:\n");
545 fprintf(stderr
, " --help display this help and exit\n");
546 fprintf(stderr
, " -- treat all remaining arguments as filenames\n");
547 fprintf(stderr
, "\n");
548 fprintf(stderr
, "Exit status:\n");
549 fprintf(stderr
, " 0 on success,\n");
550 fprintf(stderr
, " 1 if a non-hardware error occurred (e.g., failure to read from or\n");
551 fprintf(stderr
, " write to a file, or invoked with invalid options),\n");
552 fprintf(stderr
, " 2 if communication with the hardware failed (e.g., cannot find the\n");
553 fprintf(stderr
, " iCE FTDI USB device),\n");
554 fprintf(stderr
, " 3 if verification of the data failed.\n");
555 fprintf(stderr
, "\n");
556 fprintf(stderr
, "Notes for iCEstick (iCE40HX-1k devel board):\n");
557 fprintf(stderr
, " An unmodified iCEstick can only be programmed via the serial flash.\n");
558 fprintf(stderr
, " Direct programming of the SRAM is not supported. For direct SRAM\n");
559 fprintf(stderr
, " programming the flash chip and one zero ohm resistor must be desoldered\n");
560 fprintf(stderr
, " and the FT2232H SI pin must be connected to the iCE SPI_SI pin, as shown\n");
561 fprintf(stderr
, " in this picture:\n");
562 fprintf(stderr
, " http://www.clifford.at/gallery/2014-elektronik/IMG_20141115_183838\n");
563 fprintf(stderr
, "\n");
564 fprintf(stderr
, "Notes for the iCE40-HX8K Breakout Board:\n");
565 fprintf(stderr
, " Make sure that the jumper settings on the board match the selected\n");
566 fprintf(stderr
, " mode (SRAM or FLASH). See the iCE40-HX8K user manual for details.\n");
567 fprintf(stderr
, "\n");
568 fprintf(stderr
, "If you have a bug report, please file an issue on github:\n");
569 fprintf(stderr
, " https://github.com/cliffordwolf/icestorm/issues\n");
572 int main(int argc
, char **argv
)
574 /* used for error reporting */
575 const char *my_name
= argv
[0];
576 for (size_t i
= 0; argv
[0][i
]; i
++)
577 if (argv
[0][i
] == '/')
578 my_name
= argv
[0] + i
+ 1;
580 int read_size
= 256 * 1024;
581 int erase_block_size
= 64;
585 bool read_mode
= false;
586 bool check_mode
= false;
587 bool erase_mode
= false;
588 bool bulk_erase
= false;
589 bool dont_erase
= false;
590 bool prog_sram
= false;
591 bool test_mode
= false;
592 bool slow_clock
= false;
593 bool disable_protect
= false;
594 bool disable_verify
= false;
595 const char *filename
= NULL
;
596 const char *devstr
= NULL
;
600 _setmode(_fileno(stdin
), _O_BINARY
);
601 _setmode(_fileno(stdout
), _O_BINARY
);
604 static struct option long_options
[] = {
605 {"help", no_argument
, NULL
, -2},
609 /* Decode command line parameters */
612 while ((opt
= getopt_long(argc
, argv
, "d:i:I:rR:e:o:cbnStvspX", long_options
, NULL
)) != -1) {
614 case 'd': /* device string */
617 case 'i': /* block erase size */
618 if (!strcmp(optarg
, "4"))
619 erase_block_size
= 4;
620 else if (!strcmp(optarg
, "32"))
621 erase_block_size
= 32;
622 else if (!strcmp(optarg
, "64"))
623 erase_block_size
= 64;
625 fprintf(stderr
, "%s: `%s' is not a valid erase block size (must be `4', `32' or `64')\n", my_name
, optarg
);
629 case 'I': /* FTDI Chip interface select */
630 if (!strcmp(optarg
, "A"))
632 else if (!strcmp(optarg
, "B"))
634 else if (!strcmp(optarg
, "C"))
636 else if (!strcmp(optarg
, "D"))
639 fprintf(stderr
, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name
, optarg
);
643 case 'r': /* Read 256 bytes to file */
646 case 'R': /* Read n bytes to file */
648 read_size
= strtol(optarg
, &endptr
, 0);
651 else if (!strcmp(endptr
, "k"))
653 else if (!strcmp(endptr
, "M"))
654 read_size
*= 1024 * 1024;
656 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
660 case 'e': /* Erase blocks as if we were writing n bytes */
662 erase_size
= strtol(optarg
, &endptr
, 0);
665 else if (!strcmp(endptr
, "k"))
667 else if (!strcmp(endptr
, "M"))
668 erase_size
*= 1024 * 1024;
670 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
674 case 'o': /* set address offset */
675 rw_offset
= strtol(optarg
, &endptr
, 0);
678 else if (!strcmp(endptr
, "k"))
680 else if (!strcmp(endptr
, "M"))
681 rw_offset
*= 1024 * 1024;
683 fprintf(stderr
, "%s: `%s' is not a valid offset\n", my_name
, optarg
);
687 case 'c': /* do not write just check */
690 case 'b': /* bulk erase before writing */
693 case 'n': /* do not erase before writing */
696 case 'S': /* write to sram directly */
699 case 't': /* just read flash id */
702 case 'v': /* provide verbose output */
705 case 's': /* use slow SPI clock */
708 case 'p': /* disable flash protect before erase/write */
709 disable_protect
= true;
711 case 'X': /* disable verification */
712 disable_verify
= true;
718 /* error message has already been printed */
719 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
724 /* Make sure that the combination of provided parameters makes sense */
726 if (read_mode
+ erase_mode
+ check_mode
+ prog_sram
+ test_mode
> 1) {
727 fprintf(stderr
, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name
);
731 if (bulk_erase
&& dont_erase
) {
732 fprintf(stderr
, "%s: options `-b' and `-n' are mutually exclusive\n", my_name
);
736 if (disable_protect
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
737 fprintf(stderr
, "%s: option `-p' only valid in programming mode\n", my_name
);
741 if (bulk_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
742 fprintf(stderr
, "%s: option `-b' only valid in programming mode\n", my_name
);
746 if (dont_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
747 fprintf(stderr
, "%s: option `-n' only valid in programming mode\n", my_name
);
751 if (rw_offset
!= 0 && prog_sram
) {
752 fprintf(stderr
, "%s: option `-o' not supported in SRAM mode\n", my_name
);
756 if (rw_offset
!= 0 && test_mode
) {
757 fprintf(stderr
, "%s: option `-o' not supported in test mode\n", my_name
);
761 if (optind
+ 1 == argc
) {
763 fprintf(stderr
, "%s: test mode doesn't take a file name\n", my_name
);
764 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
767 filename
= argv
[optind
];
768 } else if (optind
!= argc
) {
769 fprintf(stderr
, "%s: too many arguments\n", my_name
);
770 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
772 } else if (bulk_erase
|| disable_protect
) {
773 filename
= "/dev/null";
774 } else if (!test_mode
&& !erase_mode
&& !disable_protect
) {
775 fprintf(stderr
, "%s: missing argument\n", my_name
);
776 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
780 /* open input/output file in advance
781 so we can fail before initializing the hardware */
788 } else if (erase_mode
) {
789 file_size
= erase_size
;
790 } else if (read_mode
) {
791 f
= (strcmp(filename
, "-") == 0) ? stdout
: fopen(filename
, "wb");
793 fprintf(stderr
, "%s: can't open '%s' for writing: ", my_name
, filename
);
798 f
= (strcmp(filename
, "-") == 0) ? stdin
: fopen(filename
, "rb");
800 fprintf(stderr
, "%s: can't open '%s' for reading: ", my_name
, filename
);
805 /* For regular programming, we need to read the file
806 twice--once for programming and once for verifying--and
807 need to know the file size in advance in order to erase
808 the correct amount of memory.
810 See if we can seek on the input file. Checking for "-"
811 as an argument isn't enough as we might be reading from a
812 named pipe, or contrarily, the standard input may be an
815 if (!prog_sram
&& !check_mode
) {
816 if (fseek(f
, 0L, SEEK_END
) != -1) {
817 file_size
= ftell(f
);
818 if (file_size
== -1) {
819 fprintf(stderr
, "%s: %s: ftell: ", my_name
, filename
);
823 if (fseek(f
, 0L, SEEK_SET
) == -1) {
824 fprintf(stderr
, "%s: %s: fseek: ", my_name
, filename
);
833 fprintf(stderr
, "%s: can't open temporary file\n", my_name
);
839 static unsigned char buffer
[4096];
840 size_t rc
= fread(buffer
, 1, 4096, pipe
);
843 size_t wc
= fwrite(buffer
, 1, rc
, f
);
845 fprintf(stderr
, "%s: can't write to temporary file\n", my_name
);
852 /* now seek to the beginning so we can
853 start reading again */
854 fseek(f
, 0, SEEK_SET
);
859 // ---------------------------------------------------------
860 // Initialize USB connection to FT2232H
861 // ---------------------------------------------------------
863 fprintf(stderr
, "init..\n");
865 mpsse_init(ifnum
, devstr
, slow_clock
);
870 /* Reset ECP5 to release SPI interface */
871 ecp_jtag_cmd(ISC_ENABLE
);
872 ecp_jtag_cmd(ISC_ERASE
);
873 ecp_jtag_cmd(ISC_DISABLE
);
875 /* Put device into SPI bypass mode */
876 enter_spi_background_mode();
886 // ---------------------------------------------------------
888 // ---------------------------------------------------------
890 fprintf(stderr
, "reset..\n");
895 //sram_chip_select();
899 // ---------------------------------------------------------
901 // ---------------------------------------------------------
903 fprintf(stderr
, "programming..\n");
905 static unsigned char buffer
[4096];
906 int rc
= fread(buffer
, 1, 4096, f
);
910 fprintf(stderr
, "sending %d bytes.\n", rc
);
911 mpsse_send_spi(buffer
, rc
);
914 mpsse_send_dummy_bytes(6);
915 mpsse_send_dummy_bit();
919 else /* program flash */
921 // ---------------------------------------------------------
923 // ---------------------------------------------------------
925 fprintf(stderr
, "reset..\n");
927 //flash_chip_deselect();
938 // ---------------------------------------------------------
940 // ---------------------------------------------------------
942 if (!read_mode
&& !check_mode
)
946 flash_write_enable();
947 flash_disable_protection();
954 flash_write_enable();
960 fprintf(stderr
, "file size: %ld\n", file_size
);
962 int block_size
= erase_block_size
<< 10;
963 int block_mask
= block_size
- 1;
964 int begin_addr
= rw_offset
& ~block_mask
;
965 int end_addr
= (rw_offset
+ file_size
+ block_mask
) & ~block_mask
;
967 for (int addr
= begin_addr
; addr
< end_addr
; addr
+= block_size
) {
968 flash_write_enable();
969 switch(erase_block_size
) {
971 flash_4kB_sector_erase(addr
);
974 flash_32kB_sector_erase(addr
);
977 flash_64kB_sector_erase(addr
);
981 fprintf(stderr
, "Status after block erase:\n");
991 fprintf(stderr
, "programming..\n");
993 for (int rc
, addr
= 0; true; addr
+= rc
) {
995 int page_size
= 256 - (rw_offset
+ addr
) % 256;
996 rc
= fread(buffer
, 1, page_size
, f
);
999 flash_write_enable();
1000 flash_prog(rw_offset
+ addr
, buffer
, rc
);
1004 /* seek to the beginning for second pass */
1005 fseek(f
, 0, SEEK_SET
);
1009 // ---------------------------------------------------------
1011 // ---------------------------------------------------------
1014 fprintf(stderr
, "reading..\n");
1015 for (int addr
= 0; addr
< read_size
; addr
+= 256) {
1016 uint8_t buffer
[256];
1017 flash_read(rw_offset
+ addr
, buffer
, 256);
1018 fwrite(buffer
, read_size
- addr
> 256 ? 256 : read_size
- addr
, 1, f
);
1020 } else if (!erase_mode
&& !disable_verify
) {
1021 fprintf(stderr
, "reading..\n");
1022 for (int addr
= 0; true; addr
+= 256) {
1023 uint8_t buffer_flash
[256], buffer_file
[256];
1024 int rc
= fread(buffer_file
, 1, 256, f
);
1027 flash_read(rw_offset
+ addr
, buffer_flash
, rc
);
1028 if (memcmp(buffer_file
, buffer_flash
, rc
)) {
1029 fprintf(stderr
, "Found difference between flash and file!\n");
1034 fprintf(stderr
, "VERIFY OK\n");
1038 // ---------------------------------------------------------
1040 // ---------------------------------------------------------
1042 //flash_power_down();
1049 if (f
!= NULL
&& f
!= stdin
&& f
!= stdout
)
1052 // ---------------------------------------------------------
1054 // ---------------------------------------------------------
1056 fprintf(stderr
, "Bye.\n");