2ac29e3503fff24fbd44d59144086bf7045b5a66
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 };
200 // This disables CRM is if it was enabled
201 jtag_go_to_state(STATE_SHIFT_DR
);
202 jtag_tap_shift(data
, data
, 64, true);
204 // This disables QPI if it was enabled
205 jtag_go_to_state(STATE_SHIFT_DR
);
206 jtag_tap_shift(data
, data
, 2, true);
208 // This issues a flash reset command
209 jtag_go_to_state(STATE_SHIFT_DR
);
210 jtag_tap_shift(data
, data
, 8, true);
213 static uint8_t read_status_1(){
214 uint8_t data
[2] = { FC_RSR1
};
219 fprintf(stderr
, "SR1: 0x%02X\n", data
[1]);
220 fprintf(stderr
, " - SPRL: %s\n",
221 ((data
[1] & (1 << 7)) == 0) ?
224 fprintf(stderr
, " - SPM: %s\n",
225 ((data
[1] & (1 << 6)) == 0) ?
226 "Byte/Page Prog Mode" :
227 "Sequential Prog Mode");
228 fprintf(stderr
, " - EPE: %s\n",
229 ((data
[1] & (1 << 5)) == 0) ?
230 "Erase/Prog success" :
232 fprintf(stderr
, "- SPM: %s\n",
233 ((data
[1] & (1 << 4)) == 0) ?
236 fprintf(stderr
, " - SWP: ");
237 switch((data
[1] >> 2) & 0x3) {
239 fprintf(stderr
, "All sectors unprotected\n");
242 fprintf(stderr
, "Some sectors protected\n");
245 fprintf(stderr
, "Reserved (xxxx 10xx)\n");
248 fprintf(stderr
, "All sectors protected\n");
251 fprintf(stderr
, " - WEL: %s\n",
252 ((data
[1] & (1 << 1)) == 0) ?
253 "Not write enabled" :
255 fprintf(stderr
, " - ~RDY: %s\n",
256 ((data
[1] & (1 << 0)) == 0) ?
264 static uint8_t read_status_2(){
265 uint8_t data
[2] = { FC_RSR2
};
270 fprintf(stderr
, "SR2: 0x%02X\n", data
[1]);
271 fprintf(stderr
, " - QE: %s\n",
272 ((data
[1] & (1 << 2)) == 0) ?
281 static uint8_t flash_read_status()
283 uint8_t ret
= read_status_1();
290 static void flash_write_enable()
293 fprintf(stderr
, "status before enable:\n");
298 fprintf(stderr
, "write enable..\n");
300 uint8_t data
[1] = { FC_WE
};
304 fprintf(stderr
, "status after enable:\n");
309 static void flash_bulk_erase()
311 fprintf(stderr
, "bulk erase..\n");
313 uint8_t data
[1] = { FC_CE
};
317 static void flash_4kB_sector_erase(int addr
)
319 fprintf(stderr
, "erase 4kB sector at 0x%06X..\n", addr
);
321 uint8_t command
[4] = { FC_SE
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
323 xfer_spi(command
, 4);
326 static void flash_32kB_sector_erase(int addr
)
328 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
330 uint8_t command
[4] = { FC_BE32
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
332 xfer_spi(command
, 4);
335 static void flash_64kB_sector_erase(int addr
)
337 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
339 uint8_t command
[4] = { FC_BE64
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
341 xfer_spi(command
, 4);
344 static void flash_prog(int addr
, uint8_t *data
, int n
)
347 fprintf(stderr
, "prog 0x%06X +0x%03X..\n", addr
, n
);
349 uint8_t command
[4] = { FC_PP
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
351 send_spi(command
, 4);
355 for (int i
= 0; i
< n
; i
++)
356 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
360 static void flash_start_read(int addr
)
363 fprintf(stderr
, "Start Read 0x%06X\n", addr
);
365 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
367 send_spi(command
, 4);
370 static void flash_continue_read(uint8_t *data
, int n
)
373 fprintf(stderr
, "Contiune Read +0x%03X..\n", n
);
379 for (int i
= 0; i
< n
; i
++)
380 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
383 static void flash_wait()
386 fprintf(stderr
, "waiting..");
391 uint8_t data
[2] = { FC_RSR1
};
395 if ((data
[1] & 0x01) == 0) {
399 fprintf(stderr
, "r");
404 fprintf(stderr
, "R");
411 fprintf(stderr
, ".");
421 fprintf(stderr
, "\n");
425 static void flash_disable_protection()
427 fprintf(stderr
, "disable flash protection...\n");
429 // Write Status Register 1 <- 0x00
430 uint8_t data
[2] = { FC_WSR1
, 0x00 };
435 // Read Status Register 1
441 fprintf(stderr
, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data
[1]);
445 // ---------------------------------------------------------
446 // ECP5 specific JTAG functions
447 // ---------------------------------------------------------
450 static void print_idcode(uint32_t idcode
){
451 for(int i
= 0; i
< sizeof(ecp_devices
)/sizeof(struct ecp_device_id
); i
++){
452 if(idcode
== ecp_devices
[i
].device_id
)
454 printf("IDCODE: 0x%08x (%s)\n", idcode
,ecp_devices
[i
].device_name
);
458 printf("IDCODE: 0x%08x does not match :(\n", idcode
);
461 static void read_idcode(){
463 uint8_t data
[4] = {READ_ID
};
465 jtag_go_to_state(STATE_SHIFT_IR
);
466 jtag_tap_shift(data
, data
, 8, true);
469 jtag_go_to_state(STATE_SHIFT_DR
);
470 jtag_tap_shift(data
, data
, 32, true);
474 /* Format the IDCODE into a 32bit value */
475 for(int i
= 0; i
< 4; i
++)
476 idcode
= data
[i
] << 24 | idcode
>> 8;
478 print_idcode(idcode
);
482 static void print_status_register(uint32_t status
){
483 printf("ECP5 Status Register: 0x%08x\n", status
);
486 printf(" Transparent Mode: %s\n", status
& (1 << 0) ? "Yes" : "No" );
487 printf(" Config Target: %s\n", status
& (7 << 1) ? "eFuse" : "SRAM" );
488 printf(" JTAG Active: %s\n", status
& (1 << 4) ? "Yes" : "No" );
489 printf(" PWD Protection: %s\n", status
& (1 << 5) ? "Yes" : "No" );
490 printf(" Decrypt Enable: %s\n", status
& (1 << 7) ? "Yes" : "No" );
491 printf(" DONE: %s\n", status
& (1 << 8) ? "Yes" : "No" );
492 printf(" ISC Enable: %s\n", status
& (1 << 9) ? "Yes" : "No" );
493 printf(" Write Enable: %s\n", status
& (1 << 10) ? "Writable" : "Not Writable");
494 printf(" Read Enable: %s\n", status
& (1 << 11) ? "Readable" : "Not Readable");
495 printf(" Busy Flag: %s\n", status
& (1 << 12) ? "Yes" : "No" );
496 printf(" Fail Flag: %s\n", status
& (1 << 13) ? "Yes" : "No" );
497 printf(" Feature OTP: %s\n", status
& (1 << 14) ? "Yes" : "No" );
498 printf(" Decrypt Only: %s\n", status
& (1 << 15) ? "Yes" : "No" );
499 printf(" PWD Enable: %s\n", status
& (1 << 16) ? "Yes" : "No" );
500 printf(" Encrypt Preamble: %s\n", status
& (1 << 20) ? "Yes" : "No" );
501 printf(" Std Preamble: %s\n", status
& (1 << 21) ? "Yes" : "No" );
502 printf(" SPIm Fail 1: %s\n", status
& (1 << 22) ? "Yes" : "No" );
504 uint8_t bse_error
= (status
& (7 << 23)) >> 23;
506 case 0b000: printf(" BSE Error Code: No Error (0b000)\n"); break;
507 case 0b001: printf(" BSE Error Code: ID Error (0b001)\n"); break;
508 case 0b010: printf(" BSE Error Code: CMD Error - illegal command (0b010)\n"); break;
509 case 0b011: printf(" BSE Error Code: CRC Error (0b011)\n"); break;
510 case 0b100: printf(" BSE Error Code: PRMB Error - preamble error (0b100)\n"); break;
511 case 0b101: printf(" BSE Error Code: ABRT Error - configuration aborted by the user (0b101)\n"); break;
512 case 0b110: printf(" BSE Error Code: OVFL Error - data overflow error (0b110)\n"); break;
513 case 0b111: printf(" BSE Error Code: SDM Error - bitstream pass the size of SRAM array (0b111)\n"); break;
516 printf(" Execution Error: %s\n", status
& (1 << 26) ? "Yes" : "No" );
517 printf(" ID Error: %s\n", status
& (1 << 27) ? "Yes" : "No" );
518 printf(" Invalid Command: %s\n", status
& (1 << 28) ? "Yes" : "No" );
519 printf(" SED Error: %s\n", status
& (1 << 29) ? "Yes" : "No" );
520 printf(" Bypass Mode: %s\n", status
& (1 << 30) ? "Yes" : "No" );
521 printf(" Flow Through Mode: %s\n", status
& (1 << 31) ? "Yes" : "No" );
526 static void read_status_register(){
528 uint8_t data
[4] = {LSC_READ_STATUS
};
530 jtag_go_to_state(STATE_SHIFT_IR
);
531 jtag_tap_shift(data
, data
, 8, true);
534 jtag_go_to_state(STATE_SHIFT_DR
);
535 jtag_tap_shift(data
, data
, 32, true);
536 //jtag_go_to_state(STATE_PAUSE_DR);
540 /* Format the IDCODE into a 32bit value */
541 for(int i
= 0; i
< 4; i
++)
542 status
= data
[i
] << 24 | status
>> 8;
544 print_status_register(status
);
549 static void enter_spi_background_mode(){
551 uint8_t data
[4] = {0x3A};
553 jtag_go_to_state(STATE_SHIFT_IR
);
554 jtag_tap_shift(data
, data
, 8, true);
556 /* These bytes seem to be required to un-lock the SPI interface */
559 jtag_go_to_state(STATE_SHIFT_DR
);
560 jtag_tap_shift(data
, data
, 16, true);
562 /* Entering IDLE is essential */
563 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
567 void ecp_jtag_cmd(uint8_t cmd
){
568 uint8_t data
[1] = {cmd
};
570 jtag_go_to_state(STATE_SHIFT_IR
);
571 jtag_tap_shift(data
, data
, 8, true);
573 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
577 void ecp_jtag_cmd8(uint8_t cmd
, uint8_t param
){
578 uint8_t data
[1] = {cmd
};
580 jtag_go_to_state(STATE_SHIFT_IR
);
581 jtag_tap_shift(data
, data
, 8, true);
584 jtag_go_to_state(STATE_SHIFT_DR
);
585 jtag_tap_shift(data
, data
, 8, true);
587 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
591 // ---------------------------------------------------------
592 // iceprog implementation
593 // ---------------------------------------------------------
595 static void help(const char *progname
)
597 fprintf(stderr
, "Simple programming tool for FTDI-based Lattice ECP JTAG programmers.\n");
598 fprintf(stderr
, "Usage: %s [-b|-n|-c] <input file>\n", progname
);
599 fprintf(stderr
, " %s -r|-R<bytes> <output file>\n", progname
);
600 fprintf(stderr
, " %s -S <input file>\n", progname
);
601 fprintf(stderr
, " %s -t\n", progname
);
602 fprintf(stderr
, "\n");
603 fprintf(stderr
, "General options:\n");
604 fprintf(stderr
, " -d <device string> use the specified USB device [default: i:0x0403:0x6010 or i:0x0403:0x6014]\n");
605 fprintf(stderr
, " d:<devicenode> (e.g. d:002/005)\n");
606 fprintf(stderr
, " i:<vendor>:<product> (e.g. i:0x0403:0x6010)\n");
607 fprintf(stderr
, " i:<vendor>:<product>:<index> (e.g. i:0x0403:0x6010:0)\n");
608 fprintf(stderr
, " s:<vendor>:<product>:<serial-string>\n");
609 fprintf(stderr
, " -I [ABCD] connect to the specified interface on the FTDI chip\n");
610 fprintf(stderr
, " [default: A]\n");
611 fprintf(stderr
, " -o <offset in bytes> start address for read/write [default: 0]\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
, " -s slow SPI (50 kHz instead of 6 MHz)\n");
615 fprintf(stderr
, " -v verbose output\n");
616 fprintf(stderr
, " -i [4,32,64] select erase block size [default: 64k]\n");
617 fprintf(stderr
, " -a reinitialize the device after any operation\n");
618 fprintf(stderr
, "\n");
619 fprintf(stderr
, "Mode of operation:\n");
620 fprintf(stderr
, " [default] write file contents to flash, then verify\n");
621 fprintf(stderr
, " -X write file contents to flash only\n");
622 fprintf(stderr
, " -r read first 256 kB from flash and write to file\n");
623 fprintf(stderr
, " -R <size in bytes> read the specified number of bytes from flash\n");
624 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
625 fprintf(stderr
, " or 'M' for size in megabytes)\n");
626 fprintf(stderr
, " -c do not write flash, only verify (`check')\n");
627 fprintf(stderr
, " -S perform SRAM programming\n");
628 fprintf(stderr
, " -t just read the flash ID sequence\n");
629 fprintf(stderr
, "\n");
630 fprintf(stderr
, "Erase mode (only meaningful in default mode):\n");
631 fprintf(stderr
, " [default] erase aligned chunks of 64kB in write mode\n");
632 fprintf(stderr
, " This means that some data after the written data (or\n");
633 fprintf(stderr
, " even before when -o is used) may be erased as well.\n");
634 fprintf(stderr
, " -b bulk erase entire flash before writing\n");
635 fprintf(stderr
, " -e <size in bytes> erase flash as if we were writing that number of bytes\n");
636 fprintf(stderr
, " -n do not erase flash before writing\n");
637 fprintf(stderr
, " -p disable write protection before erasing or writing\n");
638 fprintf(stderr
, " This can be useful if flash memory appears to be\n");
639 fprintf(stderr
, " bricked and won't respond to erasing or programming.\n");
640 fprintf(stderr
, "\n");
641 fprintf(stderr
, "Miscellaneous options:\n");
642 fprintf(stderr
, " --help display this help and exit\n");
643 fprintf(stderr
, " -- treat all remaining arguments as filenames\n");
644 fprintf(stderr
, "\n");
645 fprintf(stderr
, "Exit status:\n");
646 fprintf(stderr
, " 0 on success,\n");
647 fprintf(stderr
, " 1 if a non-hardware error occurred (e.g., failure to read from or\n");
648 fprintf(stderr
, " write to a file, or invoked with invalid options),\n");
649 fprintf(stderr
, " 2 if communication with the hardware failed (e.g., cannot find the\n");
650 fprintf(stderr
, " iCE FTDI USB device),\n");
651 fprintf(stderr
, " 3 if verification of the data failed.\n");
652 fprintf(stderr
, "\n");
653 fprintf(stderr
, "If you have a bug report, please file an issue on github:\n");
654 fprintf(stderr
, " https://github.com/gregdavill/ecpprog/issues\n");
657 int main(int argc
, char **argv
)
659 /* used for error reporting */
660 const char *my_name
= argv
[0];
661 for (size_t i
= 0; argv
[0][i
]; i
++)
662 if (argv
[0][i
] == '/')
663 my_name
= argv
[0] + i
+ 1;
665 int read_size
= 256 * 1024;
666 int erase_block_size
= 64;
670 bool reinitialize
= false;
671 bool read_mode
= false;
672 bool check_mode
= false;
673 bool erase_mode
= false;
674 bool bulk_erase
= false;
675 bool dont_erase
= false;
676 bool prog_sram
= false;
677 bool test_mode
= false;
678 bool slow_clock
= false;
679 bool disable_protect
= false;
680 bool disable_verify
= false;
681 const char *filename
= NULL
;
682 const char *devstr
= NULL
;
686 _setmode(_fileno(stdin
), _O_BINARY
);
687 _setmode(_fileno(stdout
), _O_BINARY
);
690 static struct option long_options
[] = {
691 {"help", no_argument
, NULL
, -2},
695 /* Decode command line parameters */
698 while ((opt
= getopt_long(argc
, argv
, "d:i:I:rR:e:o:cabnStvspX", long_options
, NULL
)) != -1) {
700 case 'd': /* device string */
703 case 'i': /* block erase size */
704 if (!strcmp(optarg
, "4"))
705 erase_block_size
= 4;
706 else if (!strcmp(optarg
, "32"))
707 erase_block_size
= 32;
708 else if (!strcmp(optarg
, "64"))
709 erase_block_size
= 64;
711 fprintf(stderr
, "%s: `%s' is not a valid erase block size (must be `4', `32' or `64')\n", my_name
, optarg
);
715 case 'I': /* FTDI Chip interface select */
716 if (!strcmp(optarg
, "A"))
718 else if (!strcmp(optarg
, "B"))
720 else if (!strcmp(optarg
, "C"))
722 else if (!strcmp(optarg
, "D"))
725 fprintf(stderr
, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name
, optarg
);
729 case 'r': /* Read 256 bytes to file */
732 case 'R': /* Read n bytes to file */
734 read_size
= strtol(optarg
, &endptr
, 0);
737 else if (!strcmp(endptr
, "k"))
739 else if (!strcmp(endptr
, "M"))
740 read_size
*= 1024 * 1024;
742 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
746 case 'e': /* Erase blocks as if we were writing n bytes */
748 erase_size
= strtol(optarg
, &endptr
, 0);
751 else if (!strcmp(endptr
, "k"))
753 else if (!strcmp(endptr
, "M"))
754 erase_size
*= 1024 * 1024;
756 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
760 case 'o': /* set address offset */
761 rw_offset
= strtol(optarg
, &endptr
, 0);
764 else if (!strcmp(endptr
, "k"))
766 else if (!strcmp(endptr
, "M"))
767 rw_offset
*= 1024 * 1024;
769 fprintf(stderr
, "%s: `%s' is not a valid offset\n", my_name
, optarg
);
773 case 'c': /* do not write just check */
776 case 'a': /* reinitialize ECP5 device reading new configuration */
779 case 'b': /* bulk erase before writing */
782 case 'n': /* do not erase before writing */
785 case 'S': /* write to sram directly */
788 case 't': /* just read flash id */
791 case 'v': /* provide verbose output */
794 case 's': /* use slow SPI clock */
797 case 'p': /* disable flash protect before erase/write */
798 disable_protect
= true;
800 case 'X': /* disable verification */
801 disable_verify
= true;
807 /* error message has already been printed */
808 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
813 /* Make sure that the combination of provided parameters makes sense */
815 if (read_mode
+ erase_mode
+ check_mode
+ prog_sram
+ test_mode
> 1) {
816 fprintf(stderr
, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name
);
820 if (bulk_erase
&& dont_erase
) {
821 fprintf(stderr
, "%s: options `-b' and `-n' are mutually exclusive\n", my_name
);
825 if (disable_protect
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
826 fprintf(stderr
, "%s: option `-p' only valid in programming mode\n", my_name
);
830 if (bulk_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
831 fprintf(stderr
, "%s: option `-b' only valid in programming mode\n", my_name
);
835 if (dont_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
836 fprintf(stderr
, "%s: option `-n' only valid in programming mode\n", my_name
);
840 if (rw_offset
!= 0 && prog_sram
) {
841 fprintf(stderr
, "%s: option `-o' not supported in SRAM mode\n", my_name
);
845 if (rw_offset
!= 0 && test_mode
) {
846 fprintf(stderr
, "%s: option `-o' not supported in test mode\n", my_name
);
850 if (optind
+ 1 == argc
) {
852 fprintf(stderr
, "%s: test mode doesn't take a file name\n", my_name
);
853 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
856 filename
= argv
[optind
];
857 } else if (optind
!= argc
) {
858 fprintf(stderr
, "%s: too many arguments\n", my_name
);
859 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
861 } else if (bulk_erase
|| disable_protect
) {
862 filename
= "/dev/null";
863 } else if (!test_mode
&& !erase_mode
&& !disable_protect
) {
864 fprintf(stderr
, "%s: missing argument\n", my_name
);
865 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
869 /* open input/output file in advance
870 so we can fail before initializing the hardware */
877 } else if (erase_mode
) {
878 file_size
= erase_size
;
879 } else if (read_mode
) {
880 f
= (strcmp(filename
, "-") == 0) ? stdout
: fopen(filename
, "wb");
882 fprintf(stderr
, "%s: can't open '%s' for writing: ", my_name
, filename
);
886 file_size
= read_size
;
888 f
= (strcmp(filename
, "-") == 0) ? stdin
: fopen(filename
, "rb");
890 fprintf(stderr
, "%s: can't open '%s' for reading: ", my_name
, filename
);
895 /* For regular programming, we need to read the file
896 twice--once for programming and once for verifying--and
897 need to know the file size in advance in order to erase
898 the correct amount of memory.
900 See if we can seek on the input file. Checking for "-"
901 as an argument isn't enough as we might be reading from a
902 named pipe, or contrarily, the standard input may be an
905 if (!prog_sram
&& !check_mode
) {
906 if (fseek(f
, 0L, SEEK_END
) != -1) {
907 file_size
= ftell(f
);
908 if (file_size
== -1) {
909 fprintf(stderr
, "%s: %s: ftell: ", my_name
, filename
);
913 if (fseek(f
, 0L, SEEK_SET
) == -1) {
914 fprintf(stderr
, "%s: %s: fseek: ", my_name
, filename
);
923 fprintf(stderr
, "%s: can't open temporary file\n", my_name
);
929 static unsigned char buffer
[4096];
930 size_t rc
= fread(buffer
, 1, 4096, pipe
);
933 size_t wc
= fwrite(buffer
, 1, rc
, f
);
935 fprintf(stderr
, "%s: can't write to temporary file\n", my_name
);
942 /* now seek to the beginning so we can
943 start reading again */
944 fseek(f
, 0, SEEK_SET
);
949 // ---------------------------------------------------------
950 // Initialize USB connection to FT2232H
951 // ---------------------------------------------------------
953 fprintf(stderr
, "init..\n");
954 jtag_init(ifnum
, devstr
, slow_clock
);
957 read_status_register();
961 /* Reset ECP5 to release SPI interface */
962 ecp_jtag_cmd(ISC_ENABLE
);
963 ecp_jtag_cmd(ISC_ERASE
);
964 ecp_jtag_cmd(ISC_DISABLE
);
966 /* Put device into SPI bypass mode */
967 enter_spi_background_mode();
976 // ---------------------------------------------------------
978 // ---------------------------------------------------------
979 fprintf(stderr
, "reset..\n");
981 ecp_jtag_cmd8(ISC_ENABLE
, 0);
982 ecp_jtag_cmd8(ISC_ERASE
, 0);
983 ecp_jtag_cmd8(LSC_RESET_CRC
, 0);
985 read_status_register();
987 // ---------------------------------------------------------
989 // ---------------------------------------------------------
991 fprintf(stderr
, "programming..\n");
992 ecp_jtag_cmd(LSC_BITSTREAM_BURST
);
994 const uint32_t len
= 16*1024;
995 static unsigned char buffer
[16*1024];
996 int rc
= fread(buffer
, 1, len
, f
);
1000 fprintf(stderr
, "sending %d bytes.\n", rc
);
1002 for(int i
= 0; i
< rc
; i
++){
1003 buffer
[i
] = bit_reverse(buffer
[i
]);
1006 jtag_go_to_state(STATE_CAPTURE_DR
);
1007 jtag_tap_shift(buffer
, buffer
, rc
*8, false);
1010 ecp_jtag_cmd(ISC_DISABLE
);
1011 read_status_register();
1013 else /* program flash */
1015 // ---------------------------------------------------------
1017 // ---------------------------------------------------------
1019 fprintf(stderr
, "reset..\n");
1020 /* Reset ECP5 to release SPI interface */
1021 ecp_jtag_cmd8(ISC_ENABLE
, 0);
1022 ecp_jtag_cmd8(ISC_ERASE
, 0);
1023 ecp_jtag_cmd8(ISC_DISABLE
, 0);
1025 /* Put device into SPI bypass mode */
1026 enter_spi_background_mode();
1033 // ---------------------------------------------------------
1035 // ---------------------------------------------------------
1037 if (!read_mode
&& !check_mode
)
1039 if (disable_protect
)
1041 flash_write_enable();
1042 flash_disable_protection();
1049 flash_write_enable();
1055 fprintf(stderr
, "file size: %ld\n", file_size
);
1057 int block_size
= erase_block_size
<< 10;
1058 int block_mask
= block_size
- 1;
1059 int begin_addr
= rw_offset
& ~block_mask
;
1060 int end_addr
= (rw_offset
+ file_size
+ block_mask
) & ~block_mask
;
1062 for (int addr
= begin_addr
; addr
< end_addr
; addr
+= block_size
) {
1063 flash_write_enable();
1064 switch(erase_block_size
) {
1066 flash_4kB_sector_erase(addr
);
1069 flash_32kB_sector_erase(addr
);
1072 flash_64kB_sector_erase(addr
);
1076 fprintf(stderr
, "Status after block erase:\n");
1077 flash_read_status();
1086 for (int rc
, addr
= 0; true; addr
+= rc
) {
1087 uint8_t buffer
[256];
1090 fprintf(stderr
, "\r\033[0Kprogramming.. %04u/%04lu", addr
, file_size
);
1092 int page_size
= 256 - (rw_offset
+ addr
) % 256;
1093 rc
= fread(buffer
, 1, page_size
, f
);
1096 flash_write_enable();
1097 flash_prog(rw_offset
+ addr
, buffer
, rc
);
1102 fprintf(stderr
, "\n");
1103 /* seek to the beginning for second pass */
1104 fseek(f
, 0, SEEK_SET
);
1108 // ---------------------------------------------------------
1110 // ---------------------------------------------------------
1114 flash_start_read(rw_offset
);
1115 for (int addr
= 0; addr
< read_size
; addr
+= 4096) {
1116 uint8_t buffer
[4096];
1119 fprintf(stderr
, "\r\033[0Kreading.. %04u/%04lu", addr
, file_size
);
1121 flash_continue_read(buffer
, 4096);
1122 fwrite(buffer
, read_size
- addr
> 4096 ? 4096 : read_size
- addr
, 1, f
);
1124 fprintf(stderr
, "\n");
1125 } else if (!erase_mode
&& !disable_verify
) {
1127 flash_start_read(rw_offset
);
1128 for (int addr
= 0; addr
< read_size
; addr
+= 4096) {
1129 uint8_t buffer_flash
[4096], buffer_file
[4096];
1131 int rc
= fread(buffer_file
, 1, 4096, f
);
1135 flash_continue_read(buffer_flash
, rc
);
1138 fprintf(stderr
, "\r\033[0Kverify.. %04u/%04lu", addr
+ rc
, file_size
);
1139 if (memcmp(buffer_file
, buffer_flash
, rc
)) {
1140 fprintf(stderr
, "Found difference between flash and file!\n");
1145 fprintf(stderr
, " VERIFY OK\n");
1150 fprintf(stderr
, "rebooting ECP5...\n");
1151 ecp_jtag_cmd(LSC_REFRESH
);
1154 if (f
!= NULL
&& f
!= stdin
&& f
!= stdout
)
1157 // ---------------------------------------------------------
1159 // ---------------------------------------------------------
1161 fprintf(stderr
, "Bye.\n");