0c36874586aa2be8fdff2398e86e48e972eaba59
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 flash_read_status()
204 uint8_t data
[2] = { FC_RSR1
};
209 fprintf(stderr
, "SR1: 0x%02X\n", data
[1]);
210 fprintf(stderr
, " - SPRL: %s\n",
211 ((data
[1] & (1 << 7)) == 0) ?
214 fprintf(stderr
, " - SPM: %s\n",
215 ((data
[1] & (1 << 6)) == 0) ?
216 "Byte/Page Prog Mode" :
217 "Sequential Prog Mode");
218 fprintf(stderr
, " - EPE: %s\n",
219 ((data
[1] & (1 << 5)) == 0) ?
220 "Erase/Prog success" :
222 fprintf(stderr
, "- SPM: %s\n",
223 ((data
[1] & (1 << 4)) == 0) ?
226 fprintf(stderr
, " - SWP: ");
227 switch((data
[1] >> 2) & 0x3) {
229 fprintf(stderr
, "All sectors unprotected\n");
232 fprintf(stderr
, "Some sectors protected\n");
235 fprintf(stderr
, "Reserved (xxxx 10xx)\n");
238 fprintf(stderr
, "All sectors protected\n");
241 fprintf(stderr
, " - WEL: %s\n",
242 ((data
[1] & (1 << 1)) == 0) ?
243 "Not write enabled" :
245 fprintf(stderr
, " - ~RDY: %s\n",
246 ((data
[1] & (1 << 0)) == 0) ?
254 static void flash_write_enable()
257 fprintf(stderr
, "status before enable:\n");
262 fprintf(stderr
, "write enable..\n");
264 uint8_t data
[1] = { FC_WE
};
268 fprintf(stderr
, "status after enable:\n");
273 static void flash_bulk_erase()
275 fprintf(stderr
, "bulk erase..\n");
277 uint8_t data
[1] = { FC_CE
};
281 static void flash_4kB_sector_erase(int addr
)
283 fprintf(stderr
, "erase 4kB sector at 0x%06X..\n", addr
);
285 uint8_t command
[4] = { FC_SE
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
287 xfer_spi(command
, 4);
290 static void flash_32kB_sector_erase(int addr
)
292 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
294 uint8_t command
[4] = { FC_BE32
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
296 xfer_spi(command
, 4);
299 static void flash_64kB_sector_erase(int addr
)
301 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
303 uint8_t command
[4] = { FC_BE64
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
305 xfer_spi(command
, 4);
308 static void flash_prog(int addr
, uint8_t *data
, int n
)
311 fprintf(stderr
, "prog 0x%06X +0x%03X..\n", addr
, n
);
313 uint8_t command
[4] = { FC_PP
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
315 send_spi(command
, 4);
319 for (int i
= 0; i
< n
; i
++)
320 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
324 static void flash_start_read(int addr
)
327 fprintf(stderr
, "Start Read 0x%06X\n", addr
);
329 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
331 send_spi(command
, 4);
334 static void flash_continue_read(uint8_t *data
, int n
)
337 fprintf(stderr
, "Contiune Read +0x%03X..\n", n
);
343 for (int i
= 0; i
< n
; i
++)
344 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
347 static void flash_read(int addr
, uint8_t *data
, int n
)
350 fprintf(stderr
, "read 0x%06X +0x%03X..\n", addr
, n
);
352 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
354 send_spi(command
, 4);
359 for (int i
= 0; i
< n
; i
++)
360 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
363 static void flash_wait()
366 fprintf(stderr
, "waiting..");
371 uint8_t data
[2] = { FC_RSR1
};
375 if ((data
[1] & 0x01) == 0) {
379 fprintf(stderr
, "r");
384 fprintf(stderr
, "R");
391 fprintf(stderr
, ".");
401 fprintf(stderr
, "\n");
405 static void flash_disable_protection()
407 fprintf(stderr
, "disable flash protection...\n");
409 // Write Status Register 1 <- 0x00
410 uint8_t data
[2] = { FC_WSR1
, 0x00 };
415 // Read Status Register 1
421 fprintf(stderr
, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data
[1]);
425 // ---------------------------------------------------------
426 // ECP5 specific JTAG functions
427 // ---------------------------------------------------------
430 static void print_idcode(uint32_t idcode
){
431 for(int i
= 0; i
< sizeof(ecp_devices
)/sizeof(struct ecp_device_id
); i
++){
432 if(idcode
== ecp_devices
[i
].device_id
)
434 printf("IDCODE: 0x%08x (%s)\n", idcode
,ecp_devices
[i
].device_name
);
438 printf("IDCODE: 0x%08x does not match :(\n", idcode
);
441 static void read_idcode(){
443 uint8_t data
[4] = {READ_ID
};
445 jtag_go_to_state(STATE_SHIFT_IR
);
446 jtag_tap_shift(data
, data
, 8, true);
449 jtag_go_to_state(STATE_SHIFT_DR
);
450 jtag_tap_shift(data
, data
, 32, true);
454 /* Format the IDCODE into a 32bit value */
455 for(int i
= 0; i
< 4; i
++)
456 idcode
= data
[i
] << 24 | idcode
>> 8;
458 print_idcode(idcode
);
462 static void print_status_register(uint32_t status
){
463 printf("ECP5 Status Register: 0x%08x\n", status
);
466 printf(" Transparent Mode: %s\n", status
& (1 << 0) ? "Yes" : "No" );
467 printf(" Config Target: %s\n", status
& (7 << 1) ? "eFuse" : "SRAM" );
468 printf(" JTAG Active: %s\n", status
& (1 << 4) ? "Yes" : "No" );
469 printf(" PWD Protection: %s\n", status
& (1 << 5) ? "Yes" : "No" );
470 printf(" Decrypt Enable: %s\n", status
& (1 << 7) ? "Yes" : "No" );
471 printf(" DONE: %s\n", status
& (1 << 8) ? "Yes" : "No" );
472 printf(" ISC Enable: %s\n", status
& (1 << 9) ? "Yes" : "No" );
473 printf(" Write Enable: %s\n", status
& (1 << 10) ? "Writable" : "Not Writable");
474 printf(" Read Enable: %s\n", status
& (1 << 11) ? "Readable" : "Not Readable");
475 printf(" Busy Flag: %s\n", status
& (1 << 12) ? "Yes" : "No" );
476 printf(" Fail Flag: %s\n", status
& (1 << 13) ? "Yes" : "No" );
477 printf(" Feature OTP: %s\n", status
& (1 << 14) ? "Yes" : "No" );
478 printf(" Decrypt Only: %s\n", status
& (1 << 15) ? "Yes" : "No" );
479 printf(" PWD Enable: %s\n", status
& (1 << 16) ? "Yes" : "No" );
480 printf(" Encrypt Preamble: %s\n", status
& (1 << 20) ? "Yes" : "No" );
481 printf(" Std Preamble: %s\n", status
& (1 << 21) ? "Yes" : "No" );
482 printf(" SPIm Fail 1: %s\n", status
& (1 << 22) ? "Yes" : "No" );
484 uint8_t bse_error
= (status
& (7 << 23)) >> 23;
486 case 0b000: printf(" BSE Error Code: No Error (0b000)\n"); break;
487 case 0b001: printf(" BSE Error Code: ID Error (0b001)\n"); break;
488 case 0b010: printf(" BSE Error Code: CMD Error - illegal command (0b010)\n"); break;
489 case 0b011: printf(" BSE Error Code: CRC Error (0b011)\n"); break;
490 case 0b100: printf(" BSE Error Code: PRMB Error - preamble error (0b100)\n"); break;
491 case 0b101: printf(" BSE Error Code: ABRT Error - configuration aborted by the user (0b101)\n"); break;
492 case 0b110: printf(" BSE Error Code: OVFL Error - data overflow error (0b110)\n"); break;
493 case 0b111: printf(" BSE Error Code: SDM Error - bitstream pass the size of SRAM array (0b111)\n"); break;
496 printf(" Execution Error: %s\n", status
& (1 << 26) ? "Yes" : "No" );
497 printf(" ID Error: %s\n", status
& (1 << 27) ? "Yes" : "No" );
498 printf(" Invalid Command: %s\n", status
& (1 << 28) ? "Yes" : "No" );
499 printf(" SED Error: %s\n", status
& (1 << 29) ? "Yes" : "No" );
500 printf(" Bypass Mode: %s\n", status
& (1 << 30) ? "Yes" : "No" );
501 printf(" Flow Through Mode: %s\n", status
& (1 << 31) ? "Yes" : "No" );
506 static void read_status_register(){
508 uint8_t data
[4] = {LSC_READ_STATUS
};
510 jtag_go_to_state(STATE_SHIFT_IR
);
511 jtag_tap_shift(data
, data
, 8, true);
514 jtag_go_to_state(STATE_SHIFT_DR
);
515 jtag_tap_shift(data
, data
, 32, true);
516 //jtag_go_to_state(STATE_PAUSE_DR);
520 /* Format the IDCODE into a 32bit value */
521 for(int i
= 0; i
< 4; i
++)
522 status
= data
[i
] << 24 | status
>> 8;
524 print_status_register(status
);
529 static void enter_spi_background_mode(){
531 uint8_t data_in
[4] = {0,0,0,0};
532 uint8_t data_out
[4] = {0,0,0,0};
535 jtag_go_to_state(STATE_SHIFT_IR
);
536 jtag_tap_shift(data_in
, data_out
, 8, true);
538 /* These bytes seem to be required to un-lock the SPI interface */
541 jtag_go_to_state(STATE_SHIFT_DR
);
542 jtag_tap_shift(data_in
, data_out
, 16, true);
544 /* Entering IDLE is essential */
545 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
549 void ecp_jtag_cmd(uint8_t cmd
){
550 uint8_t data
[1] = {cmd
};
552 jtag_go_to_state(STATE_SHIFT_IR
);
553 jtag_tap_shift(data
, data
, 8, true);
555 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
559 void ecp_jtag_cmd8(uint8_t cmd
, uint8_t param
){
560 uint8_t data
[1] = {cmd
};
562 jtag_go_to_state(STATE_SHIFT_IR
);
563 jtag_tap_shift(data
, data
, 8, true);
564 jtag_go_to_state(STATE_PAUSE_IR
);
567 jtag_go_to_state(STATE_SHIFT_DR
);
568 jtag_tap_shift(data
, data
, 8, true);
569 jtag_go_to_state(STATE_PAUSE_DR
);
571 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
575 // ---------------------------------------------------------
576 // iceprog implementation
577 // ---------------------------------------------------------
579 static void help(const char *progname
)
581 fprintf(stderr
, "Simple programming tool for FTDI-based Lattice ECP JTAG programmers.\n");
582 fprintf(stderr
, "Usage: %s [-b|-n|-c] <input file>\n", progname
);
583 fprintf(stderr
, " %s -r|-R<bytes> <output file>\n", progname
);
584 fprintf(stderr
, " %s -S <input file>\n", progname
);
585 fprintf(stderr
, " %s -t\n", progname
);
586 fprintf(stderr
, "\n");
587 fprintf(stderr
, "General options:\n");
588 fprintf(stderr
, " -d <device string> use the specified USB device [default: i:0x0403:0x6010 or i:0x0403:0x6014]\n");
589 fprintf(stderr
, " d:<devicenode> (e.g. d:002/005)\n");
590 fprintf(stderr
, " i:<vendor>:<product> (e.g. i:0x0403:0x6010)\n");
591 fprintf(stderr
, " i:<vendor>:<product>:<index> (e.g. i:0x0403:0x6010:0)\n");
592 fprintf(stderr
, " s:<vendor>:<product>:<serial-string>\n");
593 fprintf(stderr
, " -I [ABCD] connect to the specified interface on the FTDI chip\n");
594 fprintf(stderr
, " [default: A]\n");
595 fprintf(stderr
, " -o <offset in bytes> start address for read/write [default: 0]\n");
596 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
597 fprintf(stderr
, " or 'M' for size in megabytes)\n");
598 fprintf(stderr
, " -s slow SPI (50 kHz instead of 6 MHz)\n");
599 fprintf(stderr
, " -v verbose output\n");
600 fprintf(stderr
, " -i [4,32,64] select erase block size [default: 64k]\n");
601 fprintf(stderr
, "\n");
602 fprintf(stderr
, "Mode of operation:\n");
603 fprintf(stderr
, " [default] write file contents to flash, then verify\n");
604 fprintf(stderr
, " -X write file contents to flash only\n");
605 fprintf(stderr
, " -r read first 256 kB from flash and write to file\n");
606 fprintf(stderr
, " -R <size in bytes> read the specified number of bytes from flash\n");
607 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
608 fprintf(stderr
, " or 'M' for size in megabytes)\n");
609 fprintf(stderr
, " -c do not write flash, only verify (`check')\n");
610 fprintf(stderr
, " -S perform SRAM programming\n");
611 fprintf(stderr
, " -t just read the flash ID sequence\n");
612 fprintf(stderr
, "\n");
613 fprintf(stderr
, "Erase mode (only meaningful in default mode):\n");
614 fprintf(stderr
, " [default] erase aligned chunks of 64kB in write mode\n");
615 fprintf(stderr
, " This means that some data after the written data (or\n");
616 fprintf(stderr
, " even before when -o is used) may be erased as well.\n");
617 fprintf(stderr
, " -b bulk erase entire flash before writing\n");
618 fprintf(stderr
, " -e <size in bytes> erase flash as if we were writing that number of bytes\n");
619 fprintf(stderr
, " -n do not erase flash before writing\n");
620 fprintf(stderr
, " -p disable write protection before erasing or writing\n");
621 fprintf(stderr
, " This can be useful if flash memory appears to be\n");
622 fprintf(stderr
, " bricked and won't respond to erasing or programming.\n");
623 fprintf(stderr
, "\n");
624 fprintf(stderr
, "Miscellaneous options:\n");
625 fprintf(stderr
, " --help display this help and exit\n");
626 fprintf(stderr
, " -- treat all remaining arguments as filenames\n");
627 fprintf(stderr
, "\n");
628 fprintf(stderr
, "Exit status:\n");
629 fprintf(stderr
, " 0 on success,\n");
630 fprintf(stderr
, " 1 if a non-hardware error occurred (e.g., failure to read from or\n");
631 fprintf(stderr
, " write to a file, or invoked with invalid options),\n");
632 fprintf(stderr
, " 2 if communication with the hardware failed (e.g., cannot find the\n");
633 fprintf(stderr
, " iCE FTDI USB device),\n");
634 fprintf(stderr
, " 3 if verification of the data failed.\n");
635 fprintf(stderr
, "\n");
636 fprintf(stderr
, "If you have a bug report, please file an issue on github:\n");
637 fprintf(stderr
, " https://github.com/gregdavill/ecpprog/issues\n");
640 int main(int argc
, char **argv
)
642 /* used for error reporting */
643 const char *my_name
= argv
[0];
644 for (size_t i
= 0; argv
[0][i
]; i
++)
645 if (argv
[0][i
] == '/')
646 my_name
= argv
[0] + i
+ 1;
648 int read_size
= 256 * 1024;
649 int erase_block_size
= 64;
653 bool read_mode
= false;
654 bool check_mode
= false;
655 bool erase_mode
= false;
656 bool bulk_erase
= false;
657 bool dont_erase
= false;
658 bool prog_sram
= false;
659 bool test_mode
= false;
660 bool slow_clock
= false;
661 bool disable_protect
= false;
662 bool disable_verify
= false;
663 const char *filename
= NULL
;
664 const char *devstr
= NULL
;
668 _setmode(_fileno(stdin
), _O_BINARY
);
669 _setmode(_fileno(stdout
), _O_BINARY
);
672 static struct option long_options
[] = {
673 {"help", no_argument
, NULL
, -2},
677 /* Decode command line parameters */
680 while ((opt
= getopt_long(argc
, argv
, "d:i:I:rR:e:o:cbnStvspX", long_options
, NULL
)) != -1) {
682 case 'd': /* device string */
685 case 'i': /* block erase size */
686 if (!strcmp(optarg
, "4"))
687 erase_block_size
= 4;
688 else if (!strcmp(optarg
, "32"))
689 erase_block_size
= 32;
690 else if (!strcmp(optarg
, "64"))
691 erase_block_size
= 64;
693 fprintf(stderr
, "%s: `%s' is not a valid erase block size (must be `4', `32' or `64')\n", my_name
, optarg
);
697 case 'I': /* FTDI Chip interface select */
698 if (!strcmp(optarg
, "A"))
700 else if (!strcmp(optarg
, "B"))
702 else if (!strcmp(optarg
, "C"))
704 else if (!strcmp(optarg
, "D"))
707 fprintf(stderr
, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name
, optarg
);
711 case 'r': /* Read 256 bytes to file */
714 case 'R': /* Read n bytes to file */
716 read_size
= strtol(optarg
, &endptr
, 0);
719 else if (!strcmp(endptr
, "k"))
721 else if (!strcmp(endptr
, "M"))
722 read_size
*= 1024 * 1024;
724 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
728 case 'e': /* Erase blocks as if we were writing n bytes */
730 erase_size
= strtol(optarg
, &endptr
, 0);
733 else if (!strcmp(endptr
, "k"))
735 else if (!strcmp(endptr
, "M"))
736 erase_size
*= 1024 * 1024;
738 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
742 case 'o': /* set address offset */
743 rw_offset
= strtol(optarg
, &endptr
, 0);
746 else if (!strcmp(endptr
, "k"))
748 else if (!strcmp(endptr
, "M"))
749 rw_offset
*= 1024 * 1024;
751 fprintf(stderr
, "%s: `%s' is not a valid offset\n", my_name
, optarg
);
755 case 'c': /* do not write just check */
758 case 'b': /* bulk erase before writing */
761 case 'n': /* do not erase before writing */
764 case 'S': /* write to sram directly */
767 case 't': /* just read flash id */
770 case 'v': /* provide verbose output */
773 case 's': /* use slow SPI clock */
776 case 'p': /* disable flash protect before erase/write */
777 disable_protect
= true;
779 case 'X': /* disable verification */
780 disable_verify
= true;
786 /* error message has already been printed */
787 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
792 /* Make sure that the combination of provided parameters makes sense */
794 if (read_mode
+ erase_mode
+ check_mode
+ prog_sram
+ test_mode
> 1) {
795 fprintf(stderr
, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name
);
799 if (bulk_erase
&& dont_erase
) {
800 fprintf(stderr
, "%s: options `-b' and `-n' are mutually exclusive\n", my_name
);
804 if (disable_protect
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
805 fprintf(stderr
, "%s: option `-p' only valid in programming mode\n", my_name
);
809 if (bulk_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
810 fprintf(stderr
, "%s: option `-b' only valid in programming mode\n", my_name
);
814 if (dont_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
815 fprintf(stderr
, "%s: option `-n' only valid in programming mode\n", my_name
);
819 if (rw_offset
!= 0 && prog_sram
) {
820 fprintf(stderr
, "%s: option `-o' not supported in SRAM mode\n", my_name
);
824 if (rw_offset
!= 0 && test_mode
) {
825 fprintf(stderr
, "%s: option `-o' not supported in test mode\n", my_name
);
829 if (optind
+ 1 == argc
) {
831 fprintf(stderr
, "%s: test mode doesn't take a file name\n", my_name
);
832 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
835 filename
= argv
[optind
];
836 } else if (optind
!= argc
) {
837 fprintf(stderr
, "%s: too many arguments\n", my_name
);
838 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
840 } else if (bulk_erase
|| disable_protect
) {
841 filename
= "/dev/null";
842 } else if (!test_mode
&& !erase_mode
&& !disable_protect
) {
843 fprintf(stderr
, "%s: missing argument\n", my_name
);
844 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
848 /* open input/output file in advance
849 so we can fail before initializing the hardware */
856 } else if (erase_mode
) {
857 file_size
= erase_size
;
858 } else if (read_mode
) {
859 f
= (strcmp(filename
, "-") == 0) ? stdout
: fopen(filename
, "wb");
861 fprintf(stderr
, "%s: can't open '%s' for writing: ", my_name
, filename
);
866 f
= (strcmp(filename
, "-") == 0) ? stdin
: fopen(filename
, "rb");
868 fprintf(stderr
, "%s: can't open '%s' for reading: ", my_name
, filename
);
873 /* For regular programming, we need to read the file
874 twice--once for programming and once for verifying--and
875 need to know the file size in advance in order to erase
876 the correct amount of memory.
878 See if we can seek on the input file. Checking for "-"
879 as an argument isn't enough as we might be reading from a
880 named pipe, or contrarily, the standard input may be an
883 if (!prog_sram
&& !check_mode
) {
884 if (fseek(f
, 0L, SEEK_END
) != -1) {
885 file_size
= ftell(f
);
886 if (file_size
== -1) {
887 fprintf(stderr
, "%s: %s: ftell: ", my_name
, filename
);
891 if (fseek(f
, 0L, SEEK_SET
) == -1) {
892 fprintf(stderr
, "%s: %s: fseek: ", my_name
, filename
);
901 fprintf(stderr
, "%s: can't open temporary file\n", my_name
);
907 static unsigned char buffer
[4096];
908 size_t rc
= fread(buffer
, 1, 4096, pipe
);
911 size_t wc
= fwrite(buffer
, 1, rc
, f
);
913 fprintf(stderr
, "%s: can't write to temporary file\n", my_name
);
920 /* now seek to the beginning so we can
921 start reading again */
922 fseek(f
, 0, SEEK_SET
);
927 // ---------------------------------------------------------
928 // Initialize USB connection to FT2232H
929 // ---------------------------------------------------------
931 fprintf(stderr
, "init..");
932 jtag_init(ifnum
, devstr
, slow_clock
);
934 fprintf(stderr
, "idcode..\n");
937 fprintf(stderr
, "status..\n");
938 read_status_register();
946 /* Reset ECP5 to release SPI interface */
947 ecp_jtag_cmd(ISC_ENABLE
);
948 ecp_jtag_cmd(ISC_ERASE
);
949 ecp_jtag_cmd(ISC_DISABLE
);
951 /* Put device into SPI bypass mode */
952 enter_spi_background_mode();
959 // ---------------------------------------------------------
961 // ---------------------------------------------------------
963 fprintf(stderr
, "Not Supported yet\n");
964 fprintf(stderr
, "reset..\n");
968 uint8_t data
[1] = {LSC_BITSTREAM_BURST
};
971 fprintf(stderr
, "status..\n");
972 read_status_register();
974 ecp_jtag_cmd8(ISC_ENABLE
, 0);
977 ecp_jtag_cmd8(ISC_ERASE
, 0);
979 // ---------------------------------------------------------
981 // ---------------------------------------------------------
983 fprintf(stderr
, "programming..\n");
986 // ecp_jtag_cmd(LSC_BITSTREAM_BURST);
988 data
[0] = LSC_BITSTREAM_BURST
;
989 jtag_go_to_state(STATE_SHIFT_IR
);
990 jtag_tap_shift(data
, data
, 8, true);
992 jtag_go_to_state(STATE_PAUSE_IR
);
994 const uint32_t len
= 1024*1024;
995 static unsigned char buffer
[1024*1024];
996 int rc
= fread(buffer
, 1, len
, f
);
1000 //fprintf(stderr, "sending %d bytes.\n", rc);
1003 for(int i
= 0; i
< len
; i
++){
1004 buffer
[i
] = bit_reverse(buffer
[i
]);
1007 jtag_go_to_state(STATE_CAPTURE_DR
);
1008 jtag_tap_shift(buffer
, buffer
, len
*8, true);
1009 jtag_go_to_state(STATE_PAUSE_DR
);
1013 /* Entering IDLE is essential */
1014 //jtag_go_to_state(STATE_RUN_TEST_IDLE);
1017 //read_status_register();
1022 ecp_jtag_cmd(ISC_DISABLE
);
1023 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
1024 jtag_tap_shift(data
, data
, 8, true);
1026 //jtag_wait_time(1000);
1029 fprintf(stderr
, "status..\n");
1031 read_status_register();
1035 // jtag_wait_time(1000);
1039 //mpsse_send_dummy_bytes(6);
1040 //mpsse_send_dummy_bit();
1044 else /* program flash */
1046 // ---------------------------------------------------------
1048 // ---------------------------------------------------------
1050 fprintf(stderr
, "reset..\n");
1051 /* Reset ECP5 to release SPI interface */
1052 ecp_jtag_cmd(ISC_ENABLE
);
1053 ecp_jtag_cmd(ISC_ERASE
);
1054 ecp_jtag_cmd(ISC_DISABLE
);
1056 /* Put device into SPI bypass mode */
1057 enter_spi_background_mode();
1068 // ---------------------------------------------------------
1070 // ---------------------------------------------------------
1072 if (!read_mode
&& !check_mode
)
1074 if (disable_protect
)
1076 flash_write_enable();
1077 flash_disable_protection();
1084 flash_write_enable();
1090 fprintf(stderr
, "file size: %ld\n", file_size
);
1092 int block_size
= erase_block_size
<< 10;
1093 int block_mask
= block_size
- 1;
1094 int begin_addr
= rw_offset
& ~block_mask
;
1095 int end_addr
= (rw_offset
+ file_size
+ block_mask
) & ~block_mask
;
1097 for (int addr
= begin_addr
; addr
< end_addr
; addr
+= block_size
) {
1098 flash_write_enable();
1099 switch(erase_block_size
) {
1101 flash_4kB_sector_erase(addr
);
1104 flash_32kB_sector_erase(addr
);
1107 flash_64kB_sector_erase(addr
);
1111 fprintf(stderr
, "Status after block erase:\n");
1112 flash_read_status();
1121 fprintf(stderr
, "programming..\n");
1123 for (int rc
, addr
= 0; true; addr
+= rc
) {
1124 uint8_t buffer
[256];
1125 int page_size
= 256 - (rw_offset
+ addr
) % 256;
1126 rc
= fread(buffer
, 1, page_size
, f
);
1129 flash_write_enable();
1130 flash_prog(rw_offset
+ addr
, buffer
, rc
);
1134 /* seek to the beginning for second pass */
1135 fseek(f
, 0, SEEK_SET
);
1139 // ---------------------------------------------------------
1141 // ---------------------------------------------------------
1144 fprintf(stderr
, "reading..\n");
1146 flash_start_read(rw_offset
);
1147 for (int addr
= 0; addr
< read_size
; addr
+= 4096) {
1148 uint8_t buffer
[4096];
1149 flash_continue_read(buffer
, 4096);
1150 fwrite(buffer
, read_size
- addr
> 4096 ? 4096 : read_size
- addr
, 1, f
);
1152 } else if (!erase_mode
&& !disable_verify
) {
1153 fprintf(stderr
, "reading..\n");
1154 for (int addr
= 0; true; addr
+= 256) {
1155 uint8_t buffer_flash
[256], buffer_file
[256];
1156 int rc
= fread(buffer_file
, 1, 256, f
);
1159 flash_read(rw_offset
+ addr
, buffer_flash
, rc
);
1160 if (memcmp(buffer_file
, buffer_flash
, rc
)) {
1161 fprintf(stderr
, "Found difference between flash and file!\n");
1166 fprintf(stderr
, "VERIFY OK\n");
1170 if (f
!= NULL
&& f
!= stdin
&& f
!= stdout
)
1173 // ---------------------------------------------------------
1175 // ---------------------------------------------------------
1177 fprintf(stderr
, "Bye.\n");