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
){
138 /* Flip bit order of all bytes */
139 for(int i
= 0; i
< len
; i
++){
140 data
[i
] = bit_reverse(data
[i
]);
143 jtag_go_to_state(STATE_SHIFT_DR
);
144 /* Stay in SHIFT-DR state, this keep CS low */
145 jtag_tap_shift(data
, unused
, len
* 8, false);
148 // ---------------------------------------------------------
149 // FLASH function implementations
150 // ---------------------------------------------------------
152 static void flash_read_id()
154 /* JEDEC ID structure:
155 * Byte No. | Data Type
156 * ---------+----------
157 * 0 | FC_JEDECID Request Command
161 * 4 | Ext Dev Str Len
164 uint8_t data
[260] = { FC_JEDECID
};
165 int len
= 5; // command + 4 response bytes
168 fprintf(stderr
, "read flash ID..\n");
170 // Write command and read first 4 bytes
174 fprintf(stderr
, "Extended Device String Length is 0xFF, "
175 "this is likely a read error. Ignorig...\n");
177 // Read extended JEDEC ID bytes
180 data
[0] = FC_JEDECID
;
185 fprintf(stderr
, "flash ID:");
186 for (int i
= 1; i
< len
; i
++)
187 fprintf(stderr
, " 0x%02X", data
[i
]);
188 fprintf(stderr
, "\n");
191 static void flash_reset()
193 uint8_t data
[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
197 static uint8_t flash_read_status()
199 uint8_t data
[2] = { FC_RSR1
};
204 fprintf(stderr
, "SR1: 0x%02X\n", data
[1]);
205 fprintf(stderr
, " - SPRL: %s\n",
206 ((data
[1] & (1 << 7)) == 0) ?
209 fprintf(stderr
, " - SPM: %s\n",
210 ((data
[1] & (1 << 6)) == 0) ?
211 "Byte/Page Prog Mode" :
212 "Sequential Prog Mode");
213 fprintf(stderr
, " - EPE: %s\n",
214 ((data
[1] & (1 << 5)) == 0) ?
215 "Erase/Prog success" :
217 fprintf(stderr
, "- SPM: %s\n",
218 ((data
[1] & (1 << 4)) == 0) ?
221 fprintf(stderr
, " - SWP: ");
222 switch((data
[1] >> 2) & 0x3) {
224 fprintf(stderr
, "All sectors unprotected\n");
227 fprintf(stderr
, "Some sectors protected\n");
230 fprintf(stderr
, "Reserved (xxxx 10xx)\n");
233 fprintf(stderr
, "All sectors protected\n");
236 fprintf(stderr
, " - WEL: %s\n",
237 ((data
[1] & (1 << 1)) == 0) ?
238 "Not write enabled" :
240 fprintf(stderr
, " - ~RDY: %s\n",
241 ((data
[1] & (1 << 0)) == 0) ?
249 static void flash_write_enable()
252 fprintf(stderr
, "status before enable:\n");
257 fprintf(stderr
, "write enable..\n");
259 uint8_t data
[1] = { FC_WE
};
263 fprintf(stderr
, "status after enable:\n");
268 static void flash_bulk_erase()
270 fprintf(stderr
, "bulk erase..\n");
272 uint8_t data
[1] = { FC_CE
};
276 static void flash_4kB_sector_erase(int addr
)
278 fprintf(stderr
, "erase 4kB sector at 0x%06X..\n", addr
);
280 uint8_t command
[4] = { FC_SE
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
282 xfer_spi(command
, 4);
285 static void flash_32kB_sector_erase(int addr
)
287 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
289 uint8_t command
[4] = { FC_BE32
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
291 xfer_spi(command
, 4);
294 static void flash_64kB_sector_erase(int addr
)
296 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
298 uint8_t command
[4] = { FC_BE64
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
300 xfer_spi(command
, 4);
303 static void flash_prog(int addr
, uint8_t *data
, int n
)
306 fprintf(stderr
, "prog 0x%06X +0x%03X..\n", addr
, n
);
308 uint8_t command
[4] = { FC_PP
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
310 send_spi(command
, 4);
314 for (int i
= 0; i
< n
; i
++)
315 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
318 static void flash_read(int addr
, uint8_t *data
, int n
)
321 fprintf(stderr
, "read 0x%06X +0x%03X..\n", addr
, n
);
323 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
325 send_spi(command
, 4);
330 for (int i
= 0; i
< n
; i
++)
331 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
334 static void flash_wait()
337 fprintf(stderr
, "waiting..");
342 uint8_t data
[2] = { FC_RSR1
};
346 if ((data
[1] & 0x01) == 0) {
350 fprintf(stderr
, "r");
355 fprintf(stderr
, "R");
362 fprintf(stderr
, ".");
372 fprintf(stderr
, "\n");
376 static void flash_disable_protection()
378 fprintf(stderr
, "disable flash protection...\n");
380 // Write Status Register 1 <- 0x00
381 uint8_t data
[2] = { FC_WSR1
, 0x00 };
386 // Read Status Register 1
392 fprintf(stderr
, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data
[1]);
396 // ---------------------------------------------------------
397 // ECP5 specific JTAG functions
398 // ---------------------------------------------------------
401 static void print_idcode(uint32_t idcode
){
402 for(int i
= 0; i
< sizeof(ecp_devices
)/sizeof(struct ecp_device_id
); i
++){
403 if(idcode
== ecp_devices
[i
].device_id
)
405 printf("IDCODE: 0x%08x (%s)\n", idcode
,ecp_devices
[i
].device_name
);
409 printf("IDCODE: 0x%08x does not match :(\n", idcode
);
412 static void read_idcode(){
414 uint8_t data
[4] = {READ_ID
};
416 jtag_go_to_state(STATE_SHIFT_IR
);
417 jtag_tap_shift(data
, data
, 8, true);
420 jtag_go_to_state(STATE_SHIFT_DR
);
421 jtag_tap_shift(data
, data
, 32, true);
425 /* Format the IDCODE into a 32bit value */
426 for(int i
= 0; i
< 4; i
++)
427 idcode
= data
[i
] << 24 | idcode
>> 8;
429 print_idcode(idcode
);
433 static void print_status_register(uint32_t status
){
434 printf("ECP5 Status Register: 0x%08x\n", status
);
437 printf(" Transparent Mode: %s\n", status
& (1 << 0) ? "Yes" : "No" );
438 printf(" Config Target: %s\n", status
& (7 << 1) ? "eFuse" : "SRAM" );
439 printf(" JTAG Active: %s\n", status
& (1 << 4) ? "Yes" : "No" );
440 printf(" PWD Protection: %s\n", status
& (1 << 5) ? "Yes" : "No" );
441 printf(" Decrypt Enable: %s\n", status
& (1 << 7) ? "Yes" : "No" );
442 printf(" DONE: %s\n", status
& (1 << 8) ? "Yes" : "No" );
443 printf(" ISC Enable: %s\n", status
& (1 << 9) ? "Yes" : "No" );
444 printf(" Write Enable: %s\n", status
& (1 << 10) ? "Writable" : "Not Writable");
445 printf(" Read Enable: %s\n", status
& (1 << 11) ? "Readable" : "Not Readable");
446 printf(" Busy Flag: %s\n", status
& (1 << 12) ? "Yes" : "No" );
447 printf(" Fail Flag: %s\n", status
& (1 << 13) ? "Yes" : "No" );
448 printf(" Feature OTP: %s\n", status
& (1 << 14) ? "Yes" : "No" );
449 printf(" Decrypt Only: %s\n", status
& (1 << 15) ? "Yes" : "No" );
450 printf(" PWD Enable: %s\n", status
& (1 << 16) ? "Yes" : "No" );
451 printf(" Encrypt Preamble: %s\n", status
& (1 << 20) ? "Yes" : "No" );
452 printf(" Std Preamble: %s\n", status
& (1 << 21) ? "Yes" : "No" );
453 printf(" SPIm Fail 1: %s\n", status
& (1 << 22) ? "Yes" : "No" );
455 uint8_t bse_error
= (status
& (7 << 23)) >> 23;
457 case 0b000: printf(" BSE Error Code: No Error (0b000)\n"); break;
458 case 0b001: printf(" BSE Error Code: ID Error (0b001)\n"); break;
459 case 0b010: printf(" BSE Error Code: CMD Error - illegal command (0b010)\n"); break;
460 case 0b011: printf(" BSE Error Code: CRC Error (0b011)\n"); break;
461 case 0b100: printf(" BSE Error Code: PRMB Error - preamble error (0b100)\n"); break;
462 case 0b101: printf(" BSE Error Code: ABRT Error - configuration aborted by the user (0b101)\n"); break;
463 case 0b110: printf(" BSE Error Code: OVFL Error - data overflow error (0b110)\n"); break;
464 case 0b111: printf(" BSE Error Code: SDM Error - bitstream pass the size of SRAM array (0b111)\n"); break;
467 printf(" Execution Error: %s\n", status
& (1 << 26) ? "Yes" : "No" );
468 printf(" ID Error: %s\n", status
& (1 << 27) ? "Yes" : "No" );
469 printf(" Invalid Command: %s\n", status
& (1 << 28) ? "Yes" : "No" );
470 printf(" SED Error: %s\n", status
& (1 << 29) ? "Yes" : "No" );
471 printf(" Bypass Mode: %s\n", status
& (1 << 30) ? "Yes" : "No" );
472 printf(" Flow Through Mode: %s\n", status
& (1 << 31) ? "Yes" : "No" );
477 static void read_status_register(){
479 uint8_t data
[4] = {LSC_READ_STATUS
};
481 jtag_go_to_state(STATE_SHIFT_IR
);
482 jtag_tap_shift(data
, data
, 8, true);
485 jtag_go_to_state(STATE_SHIFT_DR
);
486 jtag_tap_shift(data
, data
, 32, true);
490 /* Format the IDCODE into a 32bit value */
491 for(int i
= 0; i
< 4; i
++)
492 status
= data
[i
] << 24 | status
>> 8;
494 print_status_register(status
);
499 static void enter_spi_background_mode(){
501 uint8_t data_in
[4] = {0,0,0,0};
502 uint8_t data_out
[4] = {0,0,0,0};
505 jtag_go_to_state(STATE_SHIFT_IR
);
506 jtag_tap_shift(data_in
, data_out
, 8, true);
508 /* These bytes seem to be required to un-lock the SPI interface */
511 jtag_go_to_state(STATE_SHIFT_DR
);
512 jtag_tap_shift(data_in
, data_out
, 16, true);
514 /* Entering IDLE is essential */
515 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
519 void ecp_jtag_cmd(uint8_t cmd
){
520 uint8_t data
[1] = {cmd
};
522 jtag_go_to_state(STATE_SHIFT_IR
);
523 jtag_tap_shift(data
, data
, 8, true);
525 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
529 // ---------------------------------------------------------
530 // iceprog implementation
531 // ---------------------------------------------------------
533 static void help(const char *progname
)
535 fprintf(stderr
, "Simple programming tool for FTDI-based Lattice ECP JTAG programmers.\n");
536 fprintf(stderr
, "Usage: %s [-b|-n|-c] <input file>\n", progname
);
537 fprintf(stderr
, " %s -r|-R<bytes> <output file>\n", progname
);
538 fprintf(stderr
, " %s -S <input file>\n", progname
);
539 fprintf(stderr
, " %s -t\n", progname
);
540 fprintf(stderr
, "\n");
541 fprintf(stderr
, "General options:\n");
542 fprintf(stderr
, " -d <device string> use the specified USB device [default: i:0x0403:0x6010 or i:0x0403:0x6014]\n");
543 fprintf(stderr
, " d:<devicenode> (e.g. d:002/005)\n");
544 fprintf(stderr
, " i:<vendor>:<product> (e.g. i:0x0403:0x6010)\n");
545 fprintf(stderr
, " i:<vendor>:<product>:<index> (e.g. i:0x0403:0x6010:0)\n");
546 fprintf(stderr
, " s:<vendor>:<product>:<serial-string>\n");
547 fprintf(stderr
, " -I [ABCD] connect to the specified interface on the FTDI chip\n");
548 fprintf(stderr
, " [default: A]\n");
549 fprintf(stderr
, " -o <offset in bytes> start address for read/write [default: 0]\n");
550 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
551 fprintf(stderr
, " or 'M' for size in megabytes)\n");
552 fprintf(stderr
, " -s slow SPI (50 kHz instead of 6 MHz)\n");
553 fprintf(stderr
, " -v verbose output\n");
554 fprintf(stderr
, " -i [4,32,64] select erase block size [default: 64k]\n");
555 fprintf(stderr
, "\n");
556 fprintf(stderr
, "Mode of operation:\n");
557 fprintf(stderr
, " [default] write file contents to flash, then verify\n");
558 fprintf(stderr
, " -X write file contents to flash only\n");
559 fprintf(stderr
, " -r read first 256 kB from flash and write to file\n");
560 fprintf(stderr
, " -R <size in bytes> read the specified number of bytes from flash\n");
561 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
562 fprintf(stderr
, " or 'M' for size in megabytes)\n");
563 fprintf(stderr
, " -c do not write flash, only verify (`check')\n");
564 fprintf(stderr
, " -S perform SRAM programming\n");
565 fprintf(stderr
, " -t just read the flash ID sequence\n");
566 fprintf(stderr
, "\n");
567 fprintf(stderr
, "Erase mode (only meaningful in default mode):\n");
568 fprintf(stderr
, " [default] erase aligned chunks of 64kB in write mode\n");
569 fprintf(stderr
, " This means that some data after the written data (or\n");
570 fprintf(stderr
, " even before when -o is used) may be erased as well.\n");
571 fprintf(stderr
, " -b bulk erase entire flash before writing\n");
572 fprintf(stderr
, " -e <size in bytes> erase flash as if we were writing that number of bytes\n");
573 fprintf(stderr
, " -n do not erase flash before writing\n");
574 fprintf(stderr
, " -p disable write protection before erasing or writing\n");
575 fprintf(stderr
, " This can be useful if flash memory appears to be\n");
576 fprintf(stderr
, " bricked and won't respond to erasing or programming.\n");
577 fprintf(stderr
, "\n");
578 fprintf(stderr
, "Miscellaneous options:\n");
579 fprintf(stderr
, " --help display this help and exit\n");
580 fprintf(stderr
, " -- treat all remaining arguments as filenames\n");
581 fprintf(stderr
, "\n");
582 fprintf(stderr
, "Exit status:\n");
583 fprintf(stderr
, " 0 on success,\n");
584 fprintf(stderr
, " 1 if a non-hardware error occurred (e.g., failure to read from or\n");
585 fprintf(stderr
, " write to a file, or invoked with invalid options),\n");
586 fprintf(stderr
, " 2 if communication with the hardware failed (e.g., cannot find the\n");
587 fprintf(stderr
, " iCE FTDI USB device),\n");
588 fprintf(stderr
, " 3 if verification of the data failed.\n");
589 fprintf(stderr
, "\n");
590 fprintf(stderr
, "If you have a bug report, please file an issue on github:\n");
591 fprintf(stderr
, " https://github.com/gregdavill/ecpprog/issues\n");
594 int main(int argc
, char **argv
)
596 /* used for error reporting */
597 const char *my_name
= argv
[0];
598 for (size_t i
= 0; argv
[0][i
]; i
++)
599 if (argv
[0][i
] == '/')
600 my_name
= argv
[0] + i
+ 1;
602 int read_size
= 256 * 1024;
603 int erase_block_size
= 64;
607 bool read_mode
= false;
608 bool check_mode
= false;
609 bool erase_mode
= false;
610 bool bulk_erase
= false;
611 bool dont_erase
= false;
612 bool prog_sram
= false;
613 bool test_mode
= false;
614 bool slow_clock
= false;
615 bool disable_protect
= false;
616 bool disable_verify
= false;
617 const char *filename
= NULL
;
618 const char *devstr
= NULL
;
622 _setmode(_fileno(stdin
), _O_BINARY
);
623 _setmode(_fileno(stdout
), _O_BINARY
);
626 static struct option long_options
[] = {
627 {"help", no_argument
, NULL
, -2},
631 /* Decode command line parameters */
634 while ((opt
= getopt_long(argc
, argv
, "d:i:I:rR:e:o:cbnStvspX", long_options
, NULL
)) != -1) {
636 case 'd': /* device string */
639 case 'i': /* block erase size */
640 if (!strcmp(optarg
, "4"))
641 erase_block_size
= 4;
642 else if (!strcmp(optarg
, "32"))
643 erase_block_size
= 32;
644 else if (!strcmp(optarg
, "64"))
645 erase_block_size
= 64;
647 fprintf(stderr
, "%s: `%s' is not a valid erase block size (must be `4', `32' or `64')\n", my_name
, optarg
);
651 case 'I': /* FTDI Chip interface select */
652 if (!strcmp(optarg
, "A"))
654 else if (!strcmp(optarg
, "B"))
656 else if (!strcmp(optarg
, "C"))
658 else if (!strcmp(optarg
, "D"))
661 fprintf(stderr
, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name
, optarg
);
665 case 'r': /* Read 256 bytes to file */
668 case 'R': /* Read n bytes to file */
670 read_size
= strtol(optarg
, &endptr
, 0);
673 else if (!strcmp(endptr
, "k"))
675 else if (!strcmp(endptr
, "M"))
676 read_size
*= 1024 * 1024;
678 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
682 case 'e': /* Erase blocks as if we were writing n bytes */
684 erase_size
= strtol(optarg
, &endptr
, 0);
687 else if (!strcmp(endptr
, "k"))
689 else if (!strcmp(endptr
, "M"))
690 erase_size
*= 1024 * 1024;
692 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
696 case 'o': /* set address offset */
697 rw_offset
= strtol(optarg
, &endptr
, 0);
700 else if (!strcmp(endptr
, "k"))
702 else if (!strcmp(endptr
, "M"))
703 rw_offset
*= 1024 * 1024;
705 fprintf(stderr
, "%s: `%s' is not a valid offset\n", my_name
, optarg
);
709 case 'c': /* do not write just check */
712 case 'b': /* bulk erase before writing */
715 case 'n': /* do not erase before writing */
718 case 'S': /* write to sram directly */
721 case 't': /* just read flash id */
724 case 'v': /* provide verbose output */
727 case 's': /* use slow SPI clock */
730 case 'p': /* disable flash protect before erase/write */
731 disable_protect
= true;
733 case 'X': /* disable verification */
734 disable_verify
= true;
740 /* error message has already been printed */
741 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
746 /* Make sure that the combination of provided parameters makes sense */
748 if (read_mode
+ erase_mode
+ check_mode
+ prog_sram
+ test_mode
> 1) {
749 fprintf(stderr
, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name
);
753 if (bulk_erase
&& dont_erase
) {
754 fprintf(stderr
, "%s: options `-b' and `-n' are mutually exclusive\n", my_name
);
758 if (disable_protect
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
759 fprintf(stderr
, "%s: option `-p' only valid in programming mode\n", my_name
);
763 if (bulk_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
764 fprintf(stderr
, "%s: option `-b' only valid in programming mode\n", my_name
);
768 if (dont_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
769 fprintf(stderr
, "%s: option `-n' only valid in programming mode\n", my_name
);
773 if (rw_offset
!= 0 && prog_sram
) {
774 fprintf(stderr
, "%s: option `-o' not supported in SRAM mode\n", my_name
);
778 if (rw_offset
!= 0 && test_mode
) {
779 fprintf(stderr
, "%s: option `-o' not supported in test mode\n", my_name
);
783 if (optind
+ 1 == argc
) {
785 fprintf(stderr
, "%s: test mode doesn't take a file name\n", my_name
);
786 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
789 filename
= argv
[optind
];
790 } else if (optind
!= argc
) {
791 fprintf(stderr
, "%s: too many arguments\n", my_name
);
792 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
794 } else if (bulk_erase
|| disable_protect
) {
795 filename
= "/dev/null";
796 } else if (!test_mode
&& !erase_mode
&& !disable_protect
) {
797 fprintf(stderr
, "%s: missing argument\n", my_name
);
798 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
802 /* open input/output file in advance
803 so we can fail before initializing the hardware */
810 } else if (erase_mode
) {
811 file_size
= erase_size
;
812 } else if (read_mode
) {
813 f
= (strcmp(filename
, "-") == 0) ? stdout
: fopen(filename
, "wb");
815 fprintf(stderr
, "%s: can't open '%s' for writing: ", my_name
, filename
);
820 f
= (strcmp(filename
, "-") == 0) ? stdin
: fopen(filename
, "rb");
822 fprintf(stderr
, "%s: can't open '%s' for reading: ", my_name
, filename
);
827 /* For regular programming, we need to read the file
828 twice--once for programming and once for verifying--and
829 need to know the file size in advance in order to erase
830 the correct amount of memory.
832 See if we can seek on the input file. Checking for "-"
833 as an argument isn't enough as we might be reading from a
834 named pipe, or contrarily, the standard input may be an
837 if (!prog_sram
&& !check_mode
) {
838 if (fseek(f
, 0L, SEEK_END
) != -1) {
839 file_size
= ftell(f
);
840 if (file_size
== -1) {
841 fprintf(stderr
, "%s: %s: ftell: ", my_name
, filename
);
845 if (fseek(f
, 0L, SEEK_SET
) == -1) {
846 fprintf(stderr
, "%s: %s: fseek: ", my_name
, filename
);
855 fprintf(stderr
, "%s: can't open temporary file\n", my_name
);
861 static unsigned char buffer
[4096];
862 size_t rc
= fread(buffer
, 1, 4096, pipe
);
865 size_t wc
= fwrite(buffer
, 1, rc
, f
);
867 fprintf(stderr
, "%s: can't write to temporary file\n", my_name
);
874 /* now seek to the beginning so we can
875 start reading again */
876 fseek(f
, 0, SEEK_SET
);
881 // ---------------------------------------------------------
882 // Initialize USB connection to FT2232H
883 // ---------------------------------------------------------
885 fprintf(stderr
, "init..");
886 jtag_init(ifnum
, devstr
, slow_clock
);
888 fprintf(stderr
, "idcode..\n");
891 fprintf(stderr
, "status..\n");
892 read_status_register();
895 /* Reset ECP5 to release SPI interface */
896 ecp_jtag_cmd(ISC_ENABLE
);
897 ecp_jtag_cmd(ISC_ERASE
);
898 ecp_jtag_cmd(ISC_DISABLE
);
900 /* Put device into SPI bypass mode */
901 enter_spi_background_mode();
913 // ---------------------------------------------------------
915 // ---------------------------------------------------------
917 fprintf(stderr
, "Not Supported yet\n");
918 fprintf(stderr
, "reset..\n");
923 //sram_chip_select();
927 // ---------------------------------------------------------
929 // ---------------------------------------------------------
931 fprintf(stderr
, "programming..\n");
933 static unsigned char buffer
[4096];
934 int rc
= fread(buffer
, 1, 4096, f
);
938 fprintf(stderr
, "sending %d bytes.\n", rc
);
939 //mpsse_send_spi(buffer, rc);
942 //mpsse_send_dummy_bytes(6);
943 //mpsse_send_dummy_bit();
947 else /* program flash */
949 // ---------------------------------------------------------
951 // ---------------------------------------------------------
953 fprintf(stderr
, "reset..\n");
955 //flash_chip_deselect();
965 // ---------------------------------------------------------
967 // ---------------------------------------------------------
969 if (!read_mode
&& !check_mode
)
973 flash_write_enable();
974 flash_disable_protection();
981 flash_write_enable();
987 fprintf(stderr
, "file size: %ld\n", file_size
);
989 int block_size
= erase_block_size
<< 10;
990 int block_mask
= block_size
- 1;
991 int begin_addr
= rw_offset
& ~block_mask
;
992 int end_addr
= (rw_offset
+ file_size
+ block_mask
) & ~block_mask
;
994 for (int addr
= begin_addr
; addr
< end_addr
; addr
+= block_size
) {
995 flash_write_enable();
996 switch(erase_block_size
) {
998 flash_4kB_sector_erase(addr
);
1001 flash_32kB_sector_erase(addr
);
1004 flash_64kB_sector_erase(addr
);
1008 fprintf(stderr
, "Status after block erase:\n");
1009 flash_read_status();
1018 fprintf(stderr
, "programming..\n");
1020 for (int rc
, addr
= 0; true; addr
+= rc
) {
1021 uint8_t buffer
[256];
1022 int page_size
= 256 - (rw_offset
+ addr
) % 256;
1023 rc
= fread(buffer
, 1, page_size
, f
);
1026 flash_write_enable();
1027 flash_prog(rw_offset
+ addr
, buffer
, rc
);
1031 /* seek to the beginning for second pass */
1032 fseek(f
, 0, SEEK_SET
);
1036 // ---------------------------------------------------------
1038 // ---------------------------------------------------------
1041 fprintf(stderr
, "reading..\n");
1042 for (int addr
= 0; addr
< read_size
; addr
+= 256) {
1043 uint8_t buffer
[256];
1044 flash_read(rw_offset
+ addr
, buffer
, 256);
1045 fwrite(buffer
, read_size
- addr
> 256 ? 256 : read_size
- addr
, 1, f
);
1047 } else if (!erase_mode
&& !disable_verify
) {
1048 fprintf(stderr
, "reading..\n");
1049 for (int addr
= 0; true; addr
+= 256) {
1050 uint8_t buffer_flash
[256], buffer_file
[256];
1051 int rc
= fread(buffer_file
, 1, 256, f
);
1054 flash_read(rw_offset
+ addr
, buffer_flash
, rc
);
1055 if (memcmp(buffer_file
, buffer_flash
, rc
)) {
1056 fprintf(stderr
, "Found difference between flash and file!\n");
1061 fprintf(stderr
, "VERIFY OK\n");
1065 if (f
!= NULL
&& f
!= stdin
&& f
!= stdout
)
1068 // ---------------------------------------------------------
1070 // ---------------------------------------------------------
1072 fprintf(stderr
, "Bye.\n");