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 */
46 #include "lattice_cmds.h"
48 static bool verbose
= false;
50 // ---------------------------------------------------------
52 // ---------------------------------------------------------
54 /* Flash command definitions */
55 /* This command list is based on the Winbond W25Q128JV Datasheet */
57 FC_WE
= 0x06, /* Write Enable */
58 FC_SRWE
= 0x50, /* Volatile SR Write Enable */
59 FC_WD
= 0x04, /* Write Disable */
60 FC_RPD
= 0xAB, /* Release Power-Down, returns Device ID */
61 FC_MFGID
= 0x90, /* Read Manufacturer/Device ID */
62 FC_JEDECID
= 0x9F, /* Read JEDEC ID */
63 FC_UID
= 0x4B, /* Read Unique ID */
64 FC_RD
= 0x03, /* Read Data */
65 FC_FR
= 0x0B, /* Fast Read */
66 FC_PP
= 0x02, /* Page Program */
67 FC_SE
= 0x20, /* Sector Erase 4kb */
68 FC_BE32
= 0x52, /* Block Erase 32kb */
69 FC_BE64
= 0xD8, /* Block Erase 64kb */
70 FC_CE
= 0xC7, /* Chip Erase */
71 FC_RSR1
= 0x05, /* Read Status Register 1 */
72 FC_WSR1
= 0x01, /* Write Status Register 1 */
73 FC_RSR2
= 0x35, /* Read Status Register 2 */
74 FC_WSR2
= 0x31, /* Write Status Register 2 */
75 FC_RSR3
= 0x15, /* Read Status Register 3 */
76 FC_WSR3
= 0x11, /* Write Status Register 3 */
77 FC_RSFDP
= 0x5A, /* Read SFDP Register */
78 FC_ESR
= 0x44, /* Erase Security Register */
79 FC_PSR
= 0x42, /* Program Security Register */
80 FC_RSR
= 0x48, /* Read Security Register */
81 FC_GBL
= 0x7E, /* Global Block Lock */
82 FC_GBU
= 0x98, /* Global Block Unlock */
83 FC_RBL
= 0x3D, /* Read Block Lock */
84 FC_RPR
= 0x3C, /* Read Sector Protection Registers (adesto) */
85 FC_IBL
= 0x36, /* Individual Block Lock */
86 FC_IBU
= 0x39, /* Individual Block Unlock */
87 FC_EPS
= 0x75, /* Erase / Program Suspend */
88 FC_EPR
= 0x7A, /* Erase / Program Resume */
89 FC_PD
= 0xB9, /* Power-down */
90 FC_QPI
= 0x38, /* Enter QPI mode */
91 FC_ERESET
= 0x66, /* Enable Reset */
92 FC_RESET
= 0x99, /* Reset Device */
96 // ---------------------------------------------------------
97 // JTAG -> SPI functions
98 // ---------------------------------------------------------
101 * JTAG performrs all shifts LSB first, our FLSAH is expeting bytes MSB first,
102 * There are a few ways to fix this, for now we just bit-reverse all the input data to the JTAG core
104 uint8_t bit_reverse(uint8_t in
){
106 uint8_t out
= (in
& 0x01) ? 0x80 : 0x00;
107 out
|= (in
& 0x02) ? 0x40 : 0x00;
108 out
|= (in
& 0x04) ? 0x20 : 0x00;
109 out
|= (in
& 0x08) ? 0x10 : 0x00;
110 out
|= (in
& 0x10) ? 0x08 : 0x00;
111 out
|= (in
& 0x20) ? 0x04 : 0x00;
112 out
|= (in
& 0x40) ? 0x02 : 0x00;
113 out
|= (in
& 0x80) ? 0x01 : 0x00;
118 void xfer_spi(uint8_t* data
, uint32_t len
){
119 /* Reverse bit order of all bytes */
120 for(int i
= 0; i
< len
; i
++){
121 data
[i
] = bit_reverse(data
[i
]);
124 /* Don't switch states if we're already in SHIFT-DR */
125 if(jtag_current_state() != STATE_SHIFT_DR
)
126 jtag_go_to_state(STATE_SHIFT_DR
);
127 jtag_tap_shift(data
, data
, len
* 8, true);
129 /* Reverse bit order of all return bytes */
130 for(int i
= 0; i
< len
; i
++){
131 data
[i
] = bit_reverse(data
[i
]);
135 void send_spi(uint8_t* data
, uint32_t len
){
137 /* Flip bit order of all bytes */
138 for(int i
= 0; i
< len
; i
++){
139 data
[i
] = bit_reverse(data
[i
]);
142 jtag_go_to_state(STATE_SHIFT_DR
);
143 /* Stay in SHIFT-DR state, this keep CS low */
144 jtag_tap_shift(data
, data
, len
* 8, false);
146 /* Flip bit order of all bytes */
147 for(int i
= 0; i
< len
; i
++){
148 data
[i
] = bit_reverse(data
[i
]);
153 // ---------------------------------------------------------
154 // FLASH function implementations
155 // ---------------------------------------------------------
157 static void flash_read_id()
159 /* JEDEC ID structure:
160 * Byte No. | Data Type
161 * ---------+----------
162 * 0 | FC_JEDECID Request Command
166 * 4 | Ext Dev Str Len
169 uint8_t data
[260] = { FC_JEDECID
};
170 int len
= 5; // command + 4 response bytes
173 fprintf(stderr
, "read flash ID..\n");
175 // Write command and read first 4 bytes
179 fprintf(stderr
, "Extended Device String Length is 0xFF, "
180 "this is likely a read error. Ignorig...\n");
182 // Read extended JEDEC ID bytes
185 data
[0] = FC_JEDECID
;
190 fprintf(stderr
, "flash ID:");
191 for (int i
= 1; i
< len
; i
++)
192 fprintf(stderr
, " 0x%02X", data
[i
]);
193 fprintf(stderr
, "\n");
196 static void flash_reset()
198 uint8_t data
[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
202 static uint8_t read_status_1(){
203 uint8_t data
[2] = { FC_RSR1
};
208 fprintf(stderr
, "SR1: 0x%02X\n", data
[1]);
209 fprintf(stderr
, " - SPRL: %s\n",
210 ((data
[1] & (1 << 7)) == 0) ?
213 fprintf(stderr
, " - SPM: %s\n",
214 ((data
[1] & (1 << 6)) == 0) ?
215 "Byte/Page Prog Mode" :
216 "Sequential Prog Mode");
217 fprintf(stderr
, " - EPE: %s\n",
218 ((data
[1] & (1 << 5)) == 0) ?
219 "Erase/Prog success" :
221 fprintf(stderr
, "- SPM: %s\n",
222 ((data
[1] & (1 << 4)) == 0) ?
225 fprintf(stderr
, " - SWP: ");
226 switch((data
[1] >> 2) & 0x3) {
228 fprintf(stderr
, "All sectors unprotected\n");
231 fprintf(stderr
, "Some sectors protected\n");
234 fprintf(stderr
, "Reserved (xxxx 10xx)\n");
237 fprintf(stderr
, "All sectors protected\n");
240 fprintf(stderr
, " - WEL: %s\n",
241 ((data
[1] & (1 << 1)) == 0) ?
242 "Not write enabled" :
244 fprintf(stderr
, " - ~RDY: %s\n",
245 ((data
[1] & (1 << 0)) == 0) ?
253 static uint8_t read_status_2(){
254 uint8_t data
[2] = { FC_RSR2
};
259 fprintf(stderr
, "SR2: 0x%02X\n", data
[1]);
260 fprintf(stderr
, " - QE: %s\n",
261 ((data
[1] & (1 << 2)) == 0) ?
270 static uint8_t flash_read_status()
272 uint8_t ret
= read_status_1();
279 static void flash_write_enable()
282 fprintf(stderr
, "status before enable:\n");
287 fprintf(stderr
, "write enable..\n");
289 uint8_t data
[1] = { FC_WE
};
293 fprintf(stderr
, "status after enable:\n");
298 static void flash_bulk_erase()
300 fprintf(stderr
, "bulk erase..\n");
302 uint8_t data
[1] = { FC_CE
};
306 static void flash_4kB_sector_erase(int addr
)
308 fprintf(stderr
, "erase 4kB sector at 0x%06X..\n", addr
);
310 uint8_t command
[4] = { FC_SE
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
312 xfer_spi(command
, 4);
315 static void flash_32kB_sector_erase(int addr
)
317 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
319 uint8_t command
[4] = { FC_BE32
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
321 xfer_spi(command
, 4);
324 static void flash_64kB_sector_erase(int addr
)
326 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
328 uint8_t command
[4] = { FC_BE64
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
330 xfer_spi(command
, 4);
333 static void flash_prog(int addr
, uint8_t *data
, int n
)
336 fprintf(stderr
, "prog 0x%06X +0x%03X..\n", addr
, n
);
338 uint8_t command
[4] = { FC_PP
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
340 send_spi(command
, 4);
344 for (int i
= 0; i
< n
; i
++)
345 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
349 static void flash_start_read(int addr
)
352 fprintf(stderr
, "Start Read 0x%06X\n", addr
);
354 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
356 send_spi(command
, 4);
359 static void flash_continue_read(uint8_t *data
, int n
)
362 fprintf(stderr
, "Contiune Read +0x%03X..\n", n
);
368 for (int i
= 0; i
< n
; i
++)
369 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
372 static void flash_wait()
375 fprintf(stderr
, "waiting..");
380 uint8_t data
[2] = { FC_RSR1
};
384 if ((data
[1] & 0x01) == 0) {
388 fprintf(stderr
, "r");
393 fprintf(stderr
, "R");
400 fprintf(stderr
, ".");
410 fprintf(stderr
, "\n");
414 static void flash_disable_protection()
416 fprintf(stderr
, "disable flash protection...\n");
418 // Write Status Register 1 <- 0x00
419 uint8_t data
[2] = { FC_WSR1
, 0x00 };
424 // Read Status Register 1
430 fprintf(stderr
, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data
[1]);
434 // ---------------------------------------------------------
435 // ECP5 specific JTAG functions
436 // ---------------------------------------------------------
439 static void print_idcode(uint32_t idcode
){
440 for(int i
= 0; i
< sizeof(ecp_devices
)/sizeof(struct ecp_device_id
); i
++){
441 if(idcode
== ecp_devices
[i
].device_id
)
443 printf("IDCODE: 0x%08x (%s)\n", idcode
,ecp_devices
[i
].device_name
);
447 printf("IDCODE: 0x%08x does not match :(\n", idcode
);
450 static void read_idcode(){
452 uint8_t data
[4] = {READ_ID
};
454 jtag_go_to_state(STATE_SHIFT_IR
);
455 jtag_tap_shift(data
, data
, 8, true);
458 jtag_go_to_state(STATE_SHIFT_DR
);
459 jtag_tap_shift(data
, data
, 32, true);
463 /* Format the IDCODE into a 32bit value */
464 for(int i
= 0; i
< 4; i
++)
465 idcode
= data
[i
] << 24 | idcode
>> 8;
467 print_idcode(idcode
);
471 static void print_status_register(uint32_t status
){
472 printf("ECP5 Status Register: 0x%08x\n", status
);
475 printf(" Transparent Mode: %s\n", status
& (1 << 0) ? "Yes" : "No" );
476 printf(" Config Target: %s\n", status
& (7 << 1) ? "eFuse" : "SRAM" );
477 printf(" JTAG Active: %s\n", status
& (1 << 4) ? "Yes" : "No" );
478 printf(" PWD Protection: %s\n", status
& (1 << 5) ? "Yes" : "No" );
479 printf(" Decrypt Enable: %s\n", status
& (1 << 7) ? "Yes" : "No" );
480 printf(" DONE: %s\n", status
& (1 << 8) ? "Yes" : "No" );
481 printf(" ISC Enable: %s\n", status
& (1 << 9) ? "Yes" : "No" );
482 printf(" Write Enable: %s\n", status
& (1 << 10) ? "Writable" : "Not Writable");
483 printf(" Read Enable: %s\n", status
& (1 << 11) ? "Readable" : "Not Readable");
484 printf(" Busy Flag: %s\n", status
& (1 << 12) ? "Yes" : "No" );
485 printf(" Fail Flag: %s\n", status
& (1 << 13) ? "Yes" : "No" );
486 printf(" Feature OTP: %s\n", status
& (1 << 14) ? "Yes" : "No" );
487 printf(" Decrypt Only: %s\n", status
& (1 << 15) ? "Yes" : "No" );
488 printf(" PWD Enable: %s\n", status
& (1 << 16) ? "Yes" : "No" );
489 printf(" Encrypt Preamble: %s\n", status
& (1 << 20) ? "Yes" : "No" );
490 printf(" Std Preamble: %s\n", status
& (1 << 21) ? "Yes" : "No" );
491 printf(" SPIm Fail 1: %s\n", status
& (1 << 22) ? "Yes" : "No" );
493 uint8_t bse_error
= (status
& (7 << 23)) >> 23;
495 case 0b000: printf(" BSE Error Code: No Error (0b000)\n"); break;
496 case 0b001: printf(" BSE Error Code: ID Error (0b001)\n"); break;
497 case 0b010: printf(" BSE Error Code: CMD Error - illegal command (0b010)\n"); break;
498 case 0b011: printf(" BSE Error Code: CRC Error (0b011)\n"); break;
499 case 0b100: printf(" BSE Error Code: PRMB Error - preamble error (0b100)\n"); break;
500 case 0b101: printf(" BSE Error Code: ABRT Error - configuration aborted by the user (0b101)\n"); break;
501 case 0b110: printf(" BSE Error Code: OVFL Error - data overflow error (0b110)\n"); break;
502 case 0b111: printf(" BSE Error Code: SDM Error - bitstream pass the size of SRAM array (0b111)\n"); break;
505 printf(" Execution Error: %s\n", status
& (1 << 26) ? "Yes" : "No" );
506 printf(" ID Error: %s\n", status
& (1 << 27) ? "Yes" : "No" );
507 printf(" Invalid Command: %s\n", status
& (1 << 28) ? "Yes" : "No" );
508 printf(" SED Error: %s\n", status
& (1 << 29) ? "Yes" : "No" );
509 printf(" Bypass Mode: %s\n", status
& (1 << 30) ? "Yes" : "No" );
510 printf(" Flow Through Mode: %s\n", status
& (1 << 31) ? "Yes" : "No" );
515 static void read_status_register(){
517 uint8_t data
[4] = {LSC_READ_STATUS
};
519 jtag_go_to_state(STATE_SHIFT_IR
);
520 jtag_tap_shift(data
, data
, 8, true);
523 jtag_go_to_state(STATE_SHIFT_DR
);
524 jtag_tap_shift(data
, data
, 32, true);
525 //jtag_go_to_state(STATE_PAUSE_DR);
529 /* Format the IDCODE into a 32bit value */
530 for(int i
= 0; i
< 4; i
++)
531 status
= data
[i
] << 24 | status
>> 8;
533 print_status_register(status
);
538 static void enter_spi_background_mode(){
540 uint8_t data
[4] = {0x3A};
542 jtag_go_to_state(STATE_SHIFT_IR
);
543 jtag_tap_shift(data
, data
, 8, true);
545 /* These bytes seem to be required to un-lock the SPI interface */
548 jtag_go_to_state(STATE_SHIFT_DR
);
549 jtag_tap_shift(data
, data
, 16, true);
551 /* Entering IDLE is essential */
552 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
556 void ecp_jtag_cmd(uint8_t cmd
){
557 uint8_t data
[1] = {cmd
};
559 jtag_go_to_state(STATE_SHIFT_IR
);
560 jtag_tap_shift(data
, data
, 8, true);
562 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
566 void ecp_jtag_cmd8(uint8_t cmd
, uint8_t param
){
567 uint8_t data
[1] = {cmd
};
569 jtag_go_to_state(STATE_SHIFT_IR
);
570 jtag_tap_shift(data
, data
, 8, true);
573 jtag_go_to_state(STATE_SHIFT_DR
);
574 jtag_tap_shift(data
, data
, 8, true);
576 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
580 // ---------------------------------------------------------
581 // iceprog implementation
582 // ---------------------------------------------------------
584 static void help(const char *progname
)
586 fprintf(stderr
, "Simple programming tool for FTDI-based Lattice ECP JTAG programmers.\n");
587 fprintf(stderr
, "Usage: %s [-b|-n|-c] <input file>\n", progname
);
588 fprintf(stderr
, " %s -r|-R<bytes> <output file>\n", progname
);
589 fprintf(stderr
, " %s -S <input file>\n", progname
);
590 fprintf(stderr
, " %s -t\n", progname
);
591 fprintf(stderr
, "\n");
592 fprintf(stderr
, "General options:\n");
593 fprintf(stderr
, " -d <device string> use the specified USB device [default: i:0x0403:0x6010 or i:0x0403:0x6014]\n");
594 fprintf(stderr
, " d:<devicenode> (e.g. d:002/005)\n");
595 fprintf(stderr
, " i:<vendor>:<product> (e.g. i:0x0403:0x6010)\n");
596 fprintf(stderr
, " i:<vendor>:<product>:<index> (e.g. i:0x0403:0x6010:0)\n");
597 fprintf(stderr
, " s:<vendor>:<product>:<serial-string>\n");
598 fprintf(stderr
, " -I [ABCD] connect to the specified interface on the FTDI chip\n");
599 fprintf(stderr
, " [default: A]\n");
600 fprintf(stderr
, " -o <offset in bytes> start address for read/write [default: 0]\n");
601 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
602 fprintf(stderr
, " or 'M' for size in megabytes)\n");
603 fprintf(stderr
, " -s slow SPI (50 kHz instead of 6 MHz)\n");
604 fprintf(stderr
, " -v verbose output\n");
605 fprintf(stderr
, " -i [4,32,64] select erase block size [default: 64k]\n");
606 fprintf(stderr
, "\n");
607 fprintf(stderr
, "Mode of operation:\n");
608 fprintf(stderr
, " [default] write file contents to flash, then verify\n");
609 fprintf(stderr
, " -X write file contents to flash only\n");
610 fprintf(stderr
, " -r read first 256 kB from flash and write to file\n");
611 fprintf(stderr
, " -R <size in bytes> read the specified number of bytes from flash\n");
612 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
613 fprintf(stderr
, " or 'M' for size in megabytes)\n");
614 fprintf(stderr
, " -c do not write flash, only verify (`check')\n");
615 fprintf(stderr
, " -S perform SRAM programming\n");
616 fprintf(stderr
, " -t just read the flash ID sequence\n");
617 fprintf(stderr
, "\n");
618 fprintf(stderr
, "Erase mode (only meaningful in default mode):\n");
619 fprintf(stderr
, " [default] erase aligned chunks of 64kB in write mode\n");
620 fprintf(stderr
, " This means that some data after the written data (or\n");
621 fprintf(stderr
, " even before when -o is used) may be erased as well.\n");
622 fprintf(stderr
, " -b bulk erase entire flash before writing\n");
623 fprintf(stderr
, " -e <size in bytes> erase flash as if we were writing that number of bytes\n");
624 fprintf(stderr
, " -n do not erase flash before writing\n");
625 fprintf(stderr
, " -p disable write protection before erasing or writing\n");
626 fprintf(stderr
, " This can be useful if flash memory appears to be\n");
627 fprintf(stderr
, " bricked and won't respond to erasing or programming.\n");
628 fprintf(stderr
, "\n");
629 fprintf(stderr
, "Miscellaneous options:\n");
630 fprintf(stderr
, " --help display this help and exit\n");
631 fprintf(stderr
, " -- treat all remaining arguments as filenames\n");
632 fprintf(stderr
, "\n");
633 fprintf(stderr
, "Exit status:\n");
634 fprintf(stderr
, " 0 on success,\n");
635 fprintf(stderr
, " 1 if a non-hardware error occurred (e.g., failure to read from or\n");
636 fprintf(stderr
, " write to a file, or invoked with invalid options),\n");
637 fprintf(stderr
, " 2 if communication with the hardware failed (e.g., cannot find the\n");
638 fprintf(stderr
, " iCE FTDI USB device),\n");
639 fprintf(stderr
, " 3 if verification of the data failed.\n");
640 fprintf(stderr
, "\n");
641 fprintf(stderr
, "If you have a bug report, please file an issue on github:\n");
642 fprintf(stderr
, " https://github.com/gregdavill/ecpprog/issues\n");
645 int main(int argc
, char **argv
)
647 /* used for error reporting */
648 const char *my_name
= argv
[0];
649 for (size_t i
= 0; argv
[0][i
]; i
++)
650 if (argv
[0][i
] == '/')
651 my_name
= argv
[0] + i
+ 1;
653 int read_size
= 256 * 1024;
654 int erase_block_size
= 64;
658 bool read_mode
= false;
659 bool check_mode
= false;
660 bool erase_mode
= false;
661 bool bulk_erase
= false;
662 bool dont_erase
= false;
663 bool prog_sram
= false;
664 bool test_mode
= false;
665 bool slow_clock
= false;
666 bool disable_protect
= false;
667 bool disable_verify
= false;
668 const char *filename
= NULL
;
669 const char *devstr
= NULL
;
673 _setmode(_fileno(stdin
), _O_BINARY
);
674 _setmode(_fileno(stdout
), _O_BINARY
);
677 static struct option long_options
[] = {
678 {"help", no_argument
, NULL
, -2},
682 /* Decode command line parameters */
685 while ((opt
= getopt_long(argc
, argv
, "d:i:I:rR:e:o:cbnStvspX", long_options
, NULL
)) != -1) {
687 case 'd': /* device string */
690 case 'i': /* block erase size */
691 if (!strcmp(optarg
, "4"))
692 erase_block_size
= 4;
693 else if (!strcmp(optarg
, "32"))
694 erase_block_size
= 32;
695 else if (!strcmp(optarg
, "64"))
696 erase_block_size
= 64;
698 fprintf(stderr
, "%s: `%s' is not a valid erase block size (must be `4', `32' or `64')\n", my_name
, optarg
);
702 case 'I': /* FTDI Chip interface select */
703 if (!strcmp(optarg
, "A"))
705 else if (!strcmp(optarg
, "B"))
707 else if (!strcmp(optarg
, "C"))
709 else if (!strcmp(optarg
, "D"))
712 fprintf(stderr
, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name
, optarg
);
716 case 'r': /* Read 256 bytes to file */
719 case 'R': /* Read n bytes to file */
721 read_size
= strtol(optarg
, &endptr
, 0);
724 else if (!strcmp(endptr
, "k"))
726 else if (!strcmp(endptr
, "M"))
727 read_size
*= 1024 * 1024;
729 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
733 case 'e': /* Erase blocks as if we were writing n bytes */
735 erase_size
= strtol(optarg
, &endptr
, 0);
738 else if (!strcmp(endptr
, "k"))
740 else if (!strcmp(endptr
, "M"))
741 erase_size
*= 1024 * 1024;
743 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
747 case 'o': /* set address offset */
748 rw_offset
= strtol(optarg
, &endptr
, 0);
751 else if (!strcmp(endptr
, "k"))
753 else if (!strcmp(endptr
, "M"))
754 rw_offset
*= 1024 * 1024;
756 fprintf(stderr
, "%s: `%s' is not a valid offset\n", my_name
, optarg
);
760 case 'c': /* do not write just check */
763 case 'b': /* bulk erase before writing */
766 case 'n': /* do not erase before writing */
769 case 'S': /* write to sram directly */
772 case 't': /* just read flash id */
775 case 'v': /* provide verbose output */
778 case 's': /* use slow SPI clock */
781 case 'p': /* disable flash protect before erase/write */
782 disable_protect
= true;
784 case 'X': /* disable verification */
785 disable_verify
= true;
791 /* error message has already been printed */
792 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
797 /* Make sure that the combination of provided parameters makes sense */
799 if (read_mode
+ erase_mode
+ check_mode
+ prog_sram
+ test_mode
> 1) {
800 fprintf(stderr
, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name
);
804 if (bulk_erase
&& dont_erase
) {
805 fprintf(stderr
, "%s: options `-b' and `-n' are mutually exclusive\n", my_name
);
809 if (disable_protect
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
810 fprintf(stderr
, "%s: option `-p' only valid in programming mode\n", my_name
);
814 if (bulk_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
815 fprintf(stderr
, "%s: option `-b' only valid in programming mode\n", my_name
);
819 if (dont_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
820 fprintf(stderr
, "%s: option `-n' only valid in programming mode\n", my_name
);
824 if (rw_offset
!= 0 && prog_sram
) {
825 fprintf(stderr
, "%s: option `-o' not supported in SRAM mode\n", my_name
);
829 if (rw_offset
!= 0 && test_mode
) {
830 fprintf(stderr
, "%s: option `-o' not supported in test mode\n", my_name
);
834 if (optind
+ 1 == argc
) {
836 fprintf(stderr
, "%s: test mode doesn't take a file name\n", my_name
);
837 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
840 filename
= argv
[optind
];
841 } else if (optind
!= argc
) {
842 fprintf(stderr
, "%s: too many arguments\n", my_name
);
843 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
845 } else if (bulk_erase
|| disable_protect
) {
846 filename
= "/dev/null";
847 } else if (!test_mode
&& !erase_mode
&& !disable_protect
) {
848 fprintf(stderr
, "%s: missing argument\n", my_name
);
849 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
853 /* open input/output file in advance
854 so we can fail before initializing the hardware */
861 } else if (erase_mode
) {
862 file_size
= erase_size
;
863 } else if (read_mode
) {
864 f
= (strcmp(filename
, "-") == 0) ? stdout
: fopen(filename
, "wb");
866 fprintf(stderr
, "%s: can't open '%s' for writing: ", my_name
, filename
);
870 file_size
= read_size
;
872 f
= (strcmp(filename
, "-") == 0) ? stdin
: fopen(filename
, "rb");
874 fprintf(stderr
, "%s: can't open '%s' for reading: ", my_name
, filename
);
879 /* For regular programming, we need to read the file
880 twice--once for programming and once for verifying--and
881 need to know the file size in advance in order to erase
882 the correct amount of memory.
884 See if we can seek on the input file. Checking for "-"
885 as an argument isn't enough as we might be reading from a
886 named pipe, or contrarily, the standard input may be an
889 if (!prog_sram
&& !check_mode
) {
890 if (fseek(f
, 0L, SEEK_END
) != -1) {
891 file_size
= ftell(f
);
892 if (file_size
== -1) {
893 fprintf(stderr
, "%s: %s: ftell: ", my_name
, filename
);
897 if (fseek(f
, 0L, SEEK_SET
) == -1) {
898 fprintf(stderr
, "%s: %s: fseek: ", my_name
, filename
);
907 fprintf(stderr
, "%s: can't open temporary file\n", my_name
);
913 static unsigned char buffer
[4096];
914 size_t rc
= fread(buffer
, 1, 4096, pipe
);
917 size_t wc
= fwrite(buffer
, 1, rc
, f
);
919 fprintf(stderr
, "%s: can't write to temporary file\n", my_name
);
926 /* now seek to the beginning so we can
927 start reading again */
928 fseek(f
, 0, SEEK_SET
);
933 // ---------------------------------------------------------
934 // Initialize USB connection to FT2232H
935 // ---------------------------------------------------------
937 fprintf(stderr
, "init..\n");
938 jtag_init(ifnum
, devstr
, slow_clock
);
941 read_status_register();
945 /* Reset ECP5 to release SPI interface */
946 ecp_jtag_cmd(ISC_ENABLE
);
947 ecp_jtag_cmd(ISC_ERASE
);
948 ecp_jtag_cmd(ISC_DISABLE
);
950 /* Put device into SPI bypass mode */
951 enter_spi_background_mode();
960 // ---------------------------------------------------------
962 // ---------------------------------------------------------
963 fprintf(stderr
, "reset..\n");
965 ecp_jtag_cmd8(ISC_ENABLE
, 0);
966 ecp_jtag_cmd8(ISC_ERASE
, 0);
967 ecp_jtag_cmd8(LSC_RESET_CRC
, 0);
969 read_status_register();
971 // ---------------------------------------------------------
973 // ---------------------------------------------------------
975 fprintf(stderr
, "programming..\n");
976 ecp_jtag_cmd(LSC_BITSTREAM_BURST
);
978 const uint32_t len
= 16*1024;
979 static unsigned char buffer
[16*1024];
980 int rc
= fread(buffer
, 1, len
, f
);
984 fprintf(stderr
, "sending %d bytes.\n", rc
);
986 for(int i
= 0; i
< len
; i
++){
987 buffer
[i
] = bit_reverse(buffer
[i
]);
990 jtag_go_to_state(STATE_CAPTURE_DR
);
991 jtag_tap_shift(buffer
, buffer
, len
*8, false);
994 ecp_jtag_cmd(ISC_DISABLE
);
995 read_status_register();
997 else /* program flash */
999 // ---------------------------------------------------------
1001 // ---------------------------------------------------------
1003 fprintf(stderr
, "reset..\n");
1004 /* Reset ECP5 to release SPI interface */
1005 ecp_jtag_cmd8(ISC_ENABLE
, 0);
1006 ecp_jtag_cmd8(ISC_ERASE
, 0);
1007 ecp_jtag_cmd8(ISC_DISABLE
, 0);
1009 /* Put device into SPI bypass mode */
1010 enter_spi_background_mode();
1017 // ---------------------------------------------------------
1019 // ---------------------------------------------------------
1021 if (!read_mode
&& !check_mode
)
1023 if (disable_protect
)
1025 flash_write_enable();
1026 flash_disable_protection();
1033 flash_write_enable();
1039 fprintf(stderr
, "file size: %ld\n", file_size
);
1041 int block_size
= erase_block_size
<< 10;
1042 int block_mask
= block_size
- 1;
1043 int begin_addr
= rw_offset
& ~block_mask
;
1044 int end_addr
= (rw_offset
+ file_size
+ block_mask
) & ~block_mask
;
1046 for (int addr
= begin_addr
; addr
< end_addr
; addr
+= block_size
) {
1047 flash_write_enable();
1048 switch(erase_block_size
) {
1050 flash_4kB_sector_erase(addr
);
1053 flash_32kB_sector_erase(addr
);
1056 flash_64kB_sector_erase(addr
);
1060 fprintf(stderr
, "Status after block erase:\n");
1061 flash_read_status();
1070 for (int rc
, addr
= 0; true; addr
+= rc
) {
1071 uint8_t buffer
[256];
1074 fprintf(stderr
, "\r\033[0Kprogramming.. %04u/%04lu", addr
, file_size
);
1076 int page_size
= 256 - (rw_offset
+ addr
) % 256;
1077 rc
= fread(buffer
, 1, page_size
, f
);
1080 flash_write_enable();
1081 flash_prog(rw_offset
+ addr
, buffer
, rc
);
1086 fprintf(stderr
, "\n");
1087 /* seek to the beginning for second pass */
1088 fseek(f
, 0, SEEK_SET
);
1092 // ---------------------------------------------------------
1094 // ---------------------------------------------------------
1098 flash_start_read(rw_offset
);
1099 for (int addr
= 0; addr
< read_size
; addr
+= 4096) {
1100 uint8_t buffer
[4096];
1103 fprintf(stderr
, "\r\033[0Kreading.. %04u/%04lu", addr
, file_size
);
1105 flash_continue_read(buffer
, 4096);
1106 fwrite(buffer
, read_size
- addr
> 4096 ? 4096 : read_size
- addr
, 1, f
);
1108 fprintf(stderr
, "\n");
1109 } else if (!erase_mode
&& !disable_verify
) {
1111 flash_start_read(rw_offset
);
1112 for (int addr
= 0; addr
< read_size
; addr
+= 4096) {
1113 uint8_t buffer_flash
[4096], buffer_file
[4096];
1115 int rc
= fread(buffer_file
, 1, 4096, f
);
1119 flash_continue_read(buffer_flash
, rc
);
1122 fprintf(stderr
, "\r\033[0Kverify.. %04u/%04lu", addr
+ rc
, file_size
);
1123 if (memcmp(buffer_file
, buffer_flash
, rc
)) {
1124 fprintf(stderr
, "Found difference between flash and file!\n");
1129 fprintf(stderr
, " VERIFY OK\n");
1133 if (f
!= NULL
&& f
!= stdin
&& f
!= stdout
)
1136 // ---------------------------------------------------------
1138 // ---------------------------------------------------------
1140 fprintf(stderr
, "Bye.\n");