2 * iceprog -- simple programming tool for FTDI-based Lattice iCE programmers
4 * Copyright (C) 2015 Clifford Wolf <clifford@clifford.at>
5 * Copyright (C) 2018 Piotr Esden-Tempski <piotr@esden.net>
7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 * http://www.latticesemi.com/~/media/Documents/UserManuals/EI/icestickusermanual.pdf
22 * http://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_32mb_3v_65nm.pdf
35 #include <sys/types.h>
39 #include <io.h> /* _setmode() */
40 #include <fcntl.h> /* _O_BINARY */
45 #include "lattice_cmds.h"
47 static bool verbose
= false;
49 // ---------------------------------------------------------
51 // ---------------------------------------------------------
53 /* Flash command definitions */
54 /* This command list is based on the Winbond W25Q128JV Datasheet */
56 FC_WE
= 0x06, /* Write Enable */
57 FC_SRWE
= 0x50, /* Volatile SR Write Enable */
58 FC_WD
= 0x04, /* Write Disable */
59 FC_RPD
= 0xAB, /* Release Power-Down, returns Device ID */
60 FC_MFGID
= 0x90, /* Read Manufacturer/Device ID */
61 FC_JEDECID
= 0x9F, /* Read JEDEC ID */
62 FC_UID
= 0x4B, /* Read Unique ID */
63 FC_RD
= 0x03, /* Read Data */
64 FC_FR
= 0x0B, /* Fast Read */
65 FC_PP
= 0x02, /* Page Program */
66 FC_SE
= 0x20, /* Sector Erase 4kb */
67 FC_BE32
= 0x52, /* Block Erase 32kb */
68 FC_BE64
= 0xD8, /* Block Erase 64kb */
69 FC_CE
= 0xC7, /* Chip Erase */
70 FC_RSR1
= 0x05, /* Read Status Register 1 */
71 FC_WSR1
= 0x01, /* Write Status Register 1 */
72 FC_RSR2
= 0x35, /* Read Status Register 2 */
73 FC_WSR2
= 0x31, /* Write Status Register 2 */
74 FC_RSR3
= 0x15, /* Read Status Register 3 */
75 FC_WSR3
= 0x11, /* Write Status Register 3 */
76 FC_RSFDP
= 0x5A, /* Read SFDP Register */
77 FC_ESR
= 0x44, /* Erase Security Register */
78 FC_PSR
= 0x42, /* Program Security Register */
79 FC_RSR
= 0x48, /* Read Security Register */
80 FC_GBL
= 0x7E, /* Global Block Lock */
81 FC_GBU
= 0x98, /* Global Block Unlock */
82 FC_RBL
= 0x3D, /* Read Block Lock */
83 FC_RPR
= 0x3C, /* Read Sector Protection Registers (adesto) */
84 FC_IBL
= 0x36, /* Individual Block Lock */
85 FC_IBU
= 0x39, /* Individual Block Unlock */
86 FC_EPS
= 0x75, /* Erase / Program Suspend */
87 FC_EPR
= 0x7A, /* Erase / Program Resume */
88 FC_PD
= 0xB9, /* Power-down */
89 FC_QPI
= 0x38, /* Enter QPI mode */
90 FC_ERESET
= 0x66, /* Enable Reset */
91 FC_RESET
= 0x99, /* Reset Device */
94 // ---------------------------------------------------------
95 // Hardware specific CS, CReset, CDone functions
96 // ---------------------------------------------------------
98 static void set_cs_creset(int cs_b
, int creset_b
)
101 uint8_t direction
= 0x93;
113 mpsse_set_gpio(gpio
, direction
);
116 static bool get_cdone(void)
119 return (mpsse_readb_low() & 0x40) != 0;
122 // ---------------------------------------------------------
123 // FLASH function implementations
124 // ---------------------------------------------------------
126 // the FPGA reset is released so also FLASH chip select should be deasserted
127 static void flash_release_reset()
132 // FLASH chip select assert
133 // should only happen while FPGA reset is asserted
134 static void flash_chip_select()
139 // FLASH chip select deassert
140 static void flash_chip_deselect()
145 // SRAM reset is the same as flash_chip_select()
146 // For ease of code reading we use this function instead
147 static void sram_reset()
149 // Asserting chip select and reset lines
153 // SRAM chip select assert
154 // When accessing FPGA SRAM the reset should be released
155 static void sram_chip_select()
160 static void flash_read_id()
162 /* JEDEC ID structure:
163 * Byte No. | Data Type
164 * ---------+----------
165 * 0 | FC_JEDECID Request Command
169 * 4 | Ext Dev Str Len
172 uint8_t data
[260] = { FC_JEDECID
};
173 int len
= 5; // command + 4 response bytes
176 fprintf(stderr
, "read flash ID..\n");
178 //flash_chip_select();
180 // Write command and read first 4 bytes
181 //mpsse_xfer_spi(data, len);
183 //jtag_go_to_state(STATE_SHIFT_DR);
184 //jtag_tap_shift(data, data, 8*5, false);
187 fprintf(stderr
, "Extended Device String Length is 0xFF, "
188 "this is likely a read error. Ignorig...\n");
190 // Read extended JEDEC ID bytes
193 data
[0] = FC_JEDECID
;
198 //flash_chip_deselect();
200 // TODO: Add full decode of the JEDEC ID.
201 fprintf(stderr
, "flash ID:");
202 for (int i
= 1; i
< len
; i
++)
203 fprintf(stderr
, " 0x%02X", data
[i
]);
204 fprintf(stderr
, "\n");
207 static void flash_reset()
209 uint8_t data
[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
213 static void flash_power_up()
215 uint8_t data_rpd
[1] = { FC_RPD
};
216 xfer_spi(data_rpd
, 1);
219 static void flash_power_down()
221 uint8_t data
[1] = { FC_PD
};
222 jtag_go_to_state(STATE_SHIFT_DR
);
223 jtag_tap_shift(data
, data
, 8, true);
226 static uint8_t flash_read_status()
228 uint8_t data
[2] = { FC_RSR1
};
233 fprintf(stderr
, "SR1: 0x%02X\n", data
[1]);
234 fprintf(stderr
, " - SPRL: %s\n",
235 ((data
[1] & (1 << 7)) == 0) ?
238 fprintf(stderr
, " - SPM: %s\n",
239 ((data
[1] & (1 << 6)) == 0) ?
240 "Byte/Page Prog Mode" :
241 "Sequential Prog Mode");
242 fprintf(stderr
, " - EPE: %s\n",
243 ((data
[1] & (1 << 5)) == 0) ?
244 "Erase/Prog success" :
246 fprintf(stderr
, "- SPM: %s\n",
247 ((data
[1] & (1 << 4)) == 0) ?
250 fprintf(stderr
, " - SWP: ");
251 switch((data
[1] >> 2) & 0x3) {
253 fprintf(stderr
, "All sectors unprotected\n");
256 fprintf(stderr
, "Some sectors protected\n");
259 fprintf(stderr
, "Reserved (xxxx 10xx)\n");
262 fprintf(stderr
, "All sectors protected\n");
265 fprintf(stderr
, " - WEL: %s\n",
266 ((data
[1] & (1 << 1)) == 0) ?
267 "Not write enabled" :
269 fprintf(stderr
, " - ~RDY: %s\n",
270 ((data
[1] & (1 << 0)) == 0) ?
280 static void flash_write_enable()
283 fprintf(stderr
, "status before enable:\n");
288 fprintf(stderr
, "write enable..\n");
290 uint8_t data
[1] = { FC_WE
};
292 mpsse_xfer_spi(data
, 1);
293 flash_chip_deselect();
296 fprintf(stderr
, "status after enable:\n");
301 static void flash_bulk_erase()
303 fprintf(stderr
, "bulk erase..\n");
305 uint8_t data
[1] = { FC_CE
};
307 mpsse_xfer_spi(data
, 1);
308 flash_chip_deselect();
311 static void flash_4kB_sector_erase(int addr
)
313 fprintf(stderr
, "erase 4kB sector at 0x%06X..\n", addr
);
315 uint8_t command
[4] = { FC_SE
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
318 mpsse_send_spi(command
, 4);
319 flash_chip_deselect();
322 static void flash_32kB_sector_erase(int addr
)
324 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
326 uint8_t command
[4] = { FC_BE32
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
329 mpsse_send_spi(command
, 4);
330 flash_chip_deselect();
333 static void flash_64kB_sector_erase(int addr
)
335 fprintf(stderr
, "erase 64kB sector at 0x%06X..\n", addr
);
337 uint8_t command
[4] = { FC_BE64
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
340 mpsse_send_spi(command
, 4);
341 flash_chip_deselect();
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
};
352 mpsse_send_spi(command
, 4);
353 mpsse_send_spi(data
, n
);
354 flash_chip_deselect();
357 for (int i
= 0; i
< n
; i
++)
358 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
361 static void flash_read(int addr
, uint8_t *data
, int n
)
364 fprintf(stderr
, "read 0x%06X +0x%03X..\n", addr
, n
);
366 uint8_t command
[4] = { FC_RD
, (uint8_t)(addr
>> 16), (uint8_t)(addr
>> 8), (uint8_t)addr
};
369 mpsse_send_spi(command
, 4);
371 mpsse_xfer_spi(data
, n
);
372 flash_chip_deselect();
375 for (int i
= 0; i
< n
; i
++)
376 fprintf(stderr
, "%02x%c", data
[i
], i
== n
- 1 || i
% 32 == 31 ? '\n' : ' ');
379 static void flash_wait()
382 fprintf(stderr
, "waiting..");
387 uint8_t data
[2] = { FC_RSR1
};
390 mpsse_xfer_spi(data
, 2);
391 flash_chip_deselect();
393 if ((data
[1] & 0x01) == 0) {
397 fprintf(stderr
, "r");
402 fprintf(stderr
, "R");
409 fprintf(stderr
, ".");
419 fprintf(stderr
, "\n");
423 static void flash_disable_protection()
425 fprintf(stderr
, "disable flash protection...\n");
427 // Write Status Register 1 <- 0x00
428 uint8_t data
[2] = { FC_WSR1
, 0x00 };
430 mpsse_xfer_spi(data
, 2);
431 flash_chip_deselect();
435 // Read Status Register 1
439 mpsse_xfer_spi(data
, 2);
440 flash_chip_deselect();
443 fprintf(stderr
, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data
[1]);
447 static void print_idcode(uint32_t idcode
){
448 for(int i
= 0; i
< sizeof(ecp_devices
)/sizeof(struct ecp_device_id
); i
++){
449 if(idcode
== ecp_devices
[i
].device_id
)
451 printf("IDCODE: 0x%08x (%s)\n", idcode
,ecp_devices
[i
].device_name
);
455 printf("IDCODE: 0x%08x does not match :(\n", idcode
);
458 static void read_idcode(){
460 uint8_t data_in
[4] = {0,0,0,0};
461 uint8_t data_out
[4] = {0,0,0,0};
463 data_in
[0] = READ_ID
;
464 jtag_go_to_state(STATE_SHIFT_IR
);
465 jtag_tap_shift(data_in
, data_out
, 8, true);
468 jtag_go_to_state(STATE_SHIFT_DR
);
469 jtag_tap_shift(data_in
, data_out
, 32, true);
473 for(int i
= 0; i
< 4; i
++)
474 idcode
= data_out
[i
] << 24 | idcode
>> 8;
476 print_idcode(idcode
);
481 static void enter_spi_background_mode(){
483 uint8_t data_in
[4] = {0,0,0,0};
484 uint8_t data_out
[4] = {0,0,0,0};
487 jtag_go_to_state(STATE_SHIFT_IR
);
488 jtag_tap_shift(data_in
, data_out
, 8, true);
490 /* These bytes seem to be required to un-lock the SPI interface */
493 jtag_go_to_state(STATE_SHIFT_DR
);
494 jtag_tap_shift(data_in
, data_out
, 16, true);
496 /* Entering IDLE is essential */
497 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
502 void ecp_jtag_cmd(uint8_t cmd
){
503 uint8_t data_in
[1] = {0};
504 uint8_t data_out
[1] = {0};
507 jtag_go_to_state(STATE_SHIFT_IR
);
508 jtag_tap_shift(data_in
, data_out
, 8, true);
510 jtag_go_to_state(STATE_RUN_TEST_IDLE
);
515 uint8_t bit_reverse(uint8_t in
){
517 uint8_t out
= (in
& 0x01) ? 0x80 : 0x00;
518 out
|= (in
& 0x02) ? 0x40 : 0x00;
519 out
|= (in
& 0x04) ? 0x20 : 0x00;
520 out
|= (in
& 0x08) ? 0x10 : 0x00;
521 out
|= (in
& 0x10) ? 0x08 : 0x00;
522 out
|= (in
& 0x20) ? 0x04 : 0x00;
523 out
|= (in
& 0x40) ? 0x02 : 0x00;
524 out
|= (in
& 0x80) ? 0x01 : 0x00;
529 void xfer_spi(uint8_t* data
, uint32_t len
){
530 /* Flip bit order of all bytes */
531 for(int i
= 0; i
< len
; i
++){
532 data
[i
] = bit_reverse(data
[i
]);
535 jtag_go_to_state(STATE_SHIFT_DR
);
536 jtag_tap_shift(data
, data
, len
* 8, true);
538 /* Flip bit order of all bytes */
539 for(int i
= 0; i
< len
; i
++){
540 data
[i
] = bit_reverse(data
[i
]);
544 // ---------------------------------------------------------
545 // iceprog implementation
546 // ---------------------------------------------------------
548 static void help(const char *progname
)
550 fprintf(stderr
, "Simple programming tool for FTDI-based Lattice iCE programmers.\n");
551 fprintf(stderr
, "Usage: %s [-b|-n|-c] <input file>\n", progname
);
552 fprintf(stderr
, " %s -r|-R<bytes> <output file>\n", progname
);
553 fprintf(stderr
, " %s -S <input file>\n", progname
);
554 fprintf(stderr
, " %s -t\n", progname
);
555 fprintf(stderr
, "\n");
556 fprintf(stderr
, "General options:\n");
557 fprintf(stderr
, " -d <device string> use the specified USB device [default: i:0x0403:0x6010 or i:0x0403:0x6014]\n");
558 fprintf(stderr
, " d:<devicenode> (e.g. d:002/005)\n");
559 fprintf(stderr
, " i:<vendor>:<product> (e.g. i:0x0403:0x6010)\n");
560 fprintf(stderr
, " i:<vendor>:<product>:<index> (e.g. i:0x0403:0x6010:0)\n");
561 fprintf(stderr
, " s:<vendor>:<product>:<serial-string>\n");
562 fprintf(stderr
, " -I [ABCD] connect to the specified interface on the FTDI chip\n");
563 fprintf(stderr
, " [default: A]\n");
564 fprintf(stderr
, " -o <offset in bytes> start address for read/write [default: 0]\n");
565 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
566 fprintf(stderr
, " or 'M' for size in megabytes)\n");
567 fprintf(stderr
, " -s slow SPI (50 kHz instead of 6 MHz)\n");
568 fprintf(stderr
, " -v verbose output\n");
569 fprintf(stderr
, " -i [4,32,64] select erase block size [default: 64k]\n");
570 fprintf(stderr
, "\n");
571 fprintf(stderr
, "Mode of operation:\n");
572 fprintf(stderr
, " [default] write file contents to flash, then verify\n");
573 fprintf(stderr
, " -X write file contents to flash only\n");
574 fprintf(stderr
, " -r read first 256 kB from flash and write to file\n");
575 fprintf(stderr
, " -R <size in bytes> read the specified number of bytes from flash\n");
576 fprintf(stderr
, " (append 'k' to the argument for size in kilobytes,\n");
577 fprintf(stderr
, " or 'M' for size in megabytes)\n");
578 fprintf(stderr
, " -c do not write flash, only verify (`check')\n");
579 fprintf(stderr
, " -S perform SRAM programming\n");
580 fprintf(stderr
, " -t just read the flash ID sequence\n");
581 fprintf(stderr
, "\n");
582 fprintf(stderr
, "Erase mode (only meaningful in default mode):\n");
583 fprintf(stderr
, " [default] erase aligned chunks of 64kB in write mode\n");
584 fprintf(stderr
, " This means that some data after the written data (or\n");
585 fprintf(stderr
, " even before when -o is used) may be erased as well.\n");
586 fprintf(stderr
, " -b bulk erase entire flash before writing\n");
587 fprintf(stderr
, " -e <size in bytes> erase flash as if we were writing that number of bytes\n");
588 fprintf(stderr
, " -n do not erase flash before writing\n");
589 fprintf(stderr
, " -p disable write protection before erasing or writing\n");
590 fprintf(stderr
, " This can be useful if flash memory appears to be\n");
591 fprintf(stderr
, " bricked and won't respond to erasing or programming.\n");
592 fprintf(stderr
, "\n");
593 fprintf(stderr
, "Miscellaneous options:\n");
594 fprintf(stderr
, " --help display this help and exit\n");
595 fprintf(stderr
, " -- treat all remaining arguments as filenames\n");
596 fprintf(stderr
, "\n");
597 fprintf(stderr
, "Exit status:\n");
598 fprintf(stderr
, " 0 on success,\n");
599 fprintf(stderr
, " 1 if a non-hardware error occurred (e.g., failure to read from or\n");
600 fprintf(stderr
, " write to a file, or invoked with invalid options),\n");
601 fprintf(stderr
, " 2 if communication with the hardware failed (e.g., cannot find the\n");
602 fprintf(stderr
, " iCE FTDI USB device),\n");
603 fprintf(stderr
, " 3 if verification of the data failed.\n");
604 fprintf(stderr
, "\n");
605 fprintf(stderr
, "Notes for iCEstick (iCE40HX-1k devel board):\n");
606 fprintf(stderr
, " An unmodified iCEstick can only be programmed via the serial flash.\n");
607 fprintf(stderr
, " Direct programming of the SRAM is not supported. For direct SRAM\n");
608 fprintf(stderr
, " programming the flash chip and one zero ohm resistor must be desoldered\n");
609 fprintf(stderr
, " and the FT2232H SI pin must be connected to the iCE SPI_SI pin, as shown\n");
610 fprintf(stderr
, " in this picture:\n");
611 fprintf(stderr
, " http://www.clifford.at/gallery/2014-elektronik/IMG_20141115_183838\n");
612 fprintf(stderr
, "\n");
613 fprintf(stderr
, "Notes for the iCE40-HX8K Breakout Board:\n");
614 fprintf(stderr
, " Make sure that the jumper settings on the board match the selected\n");
615 fprintf(stderr
, " mode (SRAM or FLASH). See the iCE40-HX8K user manual for details.\n");
616 fprintf(stderr
, "\n");
617 fprintf(stderr
, "If you have a bug report, please file an issue on github:\n");
618 fprintf(stderr
, " https://github.com/cliffordwolf/icestorm/issues\n");
621 int main(int argc
, char **argv
)
623 /* used for error reporting */
624 const char *my_name
= argv
[0];
625 for (size_t i
= 0; argv
[0][i
]; i
++)
626 if (argv
[0][i
] == '/')
627 my_name
= argv
[0] + i
+ 1;
629 int read_size
= 256 * 1024;
630 int erase_block_size
= 64;
634 bool read_mode
= false;
635 bool check_mode
= false;
636 bool erase_mode
= false;
637 bool bulk_erase
= false;
638 bool dont_erase
= false;
639 bool prog_sram
= false;
640 bool test_mode
= false;
641 bool slow_clock
= false;
642 bool disable_protect
= false;
643 bool disable_verify
= false;
644 const char *filename
= NULL
;
645 const char *devstr
= NULL
;
649 _setmode(_fileno(stdin
), _O_BINARY
);
650 _setmode(_fileno(stdout
), _O_BINARY
);
653 static struct option long_options
[] = {
654 {"help", no_argument
, NULL
, -2},
658 /* Decode command line parameters */
661 while ((opt
= getopt_long(argc
, argv
, "d:i:I:rR:e:o:cbnStvspX", long_options
, NULL
)) != -1) {
663 case 'd': /* device string */
666 case 'i': /* block erase size */
667 if (!strcmp(optarg
, "4"))
668 erase_block_size
= 4;
669 else if (!strcmp(optarg
, "32"))
670 erase_block_size
= 32;
671 else if (!strcmp(optarg
, "64"))
672 erase_block_size
= 64;
674 fprintf(stderr
, "%s: `%s' is not a valid erase block size (must be `4', `32' or `64')\n", my_name
, optarg
);
678 case 'I': /* FTDI Chip interface select */
679 if (!strcmp(optarg
, "A"))
681 else if (!strcmp(optarg
, "B"))
683 else if (!strcmp(optarg
, "C"))
685 else if (!strcmp(optarg
, "D"))
688 fprintf(stderr
, "%s: `%s' is not a valid interface (must be `A', `B', `C', or `D')\n", my_name
, optarg
);
692 case 'r': /* Read 256 bytes to file */
695 case 'R': /* Read n bytes to file */
697 read_size
= strtol(optarg
, &endptr
, 0);
700 else if (!strcmp(endptr
, "k"))
702 else if (!strcmp(endptr
, "M"))
703 read_size
*= 1024 * 1024;
705 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
709 case 'e': /* Erase blocks as if we were writing n bytes */
711 erase_size
= strtol(optarg
, &endptr
, 0);
714 else if (!strcmp(endptr
, "k"))
716 else if (!strcmp(endptr
, "M"))
717 erase_size
*= 1024 * 1024;
719 fprintf(stderr
, "%s: `%s' is not a valid size\n", my_name
, optarg
);
723 case 'o': /* set address offset */
724 rw_offset
= strtol(optarg
, &endptr
, 0);
727 else if (!strcmp(endptr
, "k"))
729 else if (!strcmp(endptr
, "M"))
730 rw_offset
*= 1024 * 1024;
732 fprintf(stderr
, "%s: `%s' is not a valid offset\n", my_name
, optarg
);
736 case 'c': /* do not write just check */
739 case 'b': /* bulk erase before writing */
742 case 'n': /* do not erase before writing */
745 case 'S': /* write to sram directly */
748 case 't': /* just read flash id */
751 case 'v': /* provide verbose output */
754 case 's': /* use slow SPI clock */
757 case 'p': /* disable flash protect before erase/write */
758 disable_protect
= true;
760 case 'X': /* disable verification */
761 disable_verify
= true;
767 /* error message has already been printed */
768 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
773 /* Make sure that the combination of provided parameters makes sense */
775 if (read_mode
+ erase_mode
+ check_mode
+ prog_sram
+ test_mode
> 1) {
776 fprintf(stderr
, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name
);
780 if (bulk_erase
&& dont_erase
) {
781 fprintf(stderr
, "%s: options `-b' and `-n' are mutually exclusive\n", my_name
);
785 if (disable_protect
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
786 fprintf(stderr
, "%s: option `-p' only valid in programming mode\n", my_name
);
790 if (bulk_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
791 fprintf(stderr
, "%s: option `-b' only valid in programming mode\n", my_name
);
795 if (dont_erase
&& (read_mode
|| check_mode
|| prog_sram
|| test_mode
)) {
796 fprintf(stderr
, "%s: option `-n' only valid in programming mode\n", my_name
);
800 if (rw_offset
!= 0 && prog_sram
) {
801 fprintf(stderr
, "%s: option `-o' not supported in SRAM mode\n", my_name
);
805 if (rw_offset
!= 0 && test_mode
) {
806 fprintf(stderr
, "%s: option `-o' not supported in test mode\n", my_name
);
810 if (optind
+ 1 == argc
) {
812 fprintf(stderr
, "%s: test mode doesn't take a file name\n", my_name
);
813 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
816 filename
= argv
[optind
];
817 } else if (optind
!= argc
) {
818 fprintf(stderr
, "%s: too many arguments\n", my_name
);
819 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
821 } else if (bulk_erase
|| disable_protect
) {
822 filename
= "/dev/null";
823 } else if (!test_mode
&& !erase_mode
&& !disable_protect
) {
824 fprintf(stderr
, "%s: missing argument\n", my_name
);
825 fprintf(stderr
, "Try `%s --help' for more information.\n", argv
[0]);
829 /* open input/output file in advance
830 so we can fail before initializing the hardware */
837 } else if (erase_mode
) {
838 file_size
= erase_size
;
839 } else if (read_mode
) {
840 f
= (strcmp(filename
, "-") == 0) ? stdout
: fopen(filename
, "wb");
842 fprintf(stderr
, "%s: can't open '%s' for writing: ", my_name
, filename
);
847 f
= (strcmp(filename
, "-") == 0) ? stdin
: fopen(filename
, "rb");
849 fprintf(stderr
, "%s: can't open '%s' for reading: ", my_name
, filename
);
854 /* For regular programming, we need to read the file
855 twice--once for programming and once for verifying--and
856 need to know the file size in advance in order to erase
857 the correct amount of memory.
859 See if we can seek on the input file. Checking for "-"
860 as an argument isn't enough as we might be reading from a
861 named pipe, or contrarily, the standard input may be an
864 if (!prog_sram
&& !check_mode
) {
865 if (fseek(f
, 0L, SEEK_END
) != -1) {
866 file_size
= ftell(f
);
867 if (file_size
== -1) {
868 fprintf(stderr
, "%s: %s: ftell: ", my_name
, filename
);
872 if (fseek(f
, 0L, SEEK_SET
) == -1) {
873 fprintf(stderr
, "%s: %s: fseek: ", my_name
, filename
);
882 fprintf(stderr
, "%s: can't open temporary file\n", my_name
);
888 static unsigned char buffer
[4096];
889 size_t rc
= fread(buffer
, 1, 4096, pipe
);
892 size_t wc
= fwrite(buffer
, 1, rc
, f
);
894 fprintf(stderr
, "%s: can't write to temporary file\n", my_name
);
901 /* now seek to the beginning so we can
902 start reading again */
903 fseek(f
, 0, SEEK_SET
);
908 // ---------------------------------------------------------
909 // Initialize USB connection to FT2232H
910 // ---------------------------------------------------------
912 fprintf(stderr
, "init..\n");
914 mpsse_init(ifnum
, devstr
, slow_clock
);
919 /* Reset ECP5 to release SPI interface */
920 ecp_jtag_cmd(ISC_ENABLE
);
921 ecp_jtag_cmd(ISC_ERASE
);
922 ecp_jtag_cmd(ISC_DISABLE
);
924 /* Put device into SPI bypass mode */
925 //ecp_jtag_cmd(0x3A);
927 enter_spi_background_mode();
929 // uint8_t data[1] = {0x3A};
931 // jtag_go_to_state(STATE_SHIFT_IR);
932 // jtag_tap_shift(data, data, 8, true);
934 // //jtag_wait_time(8);
936 // //jtag_go_to_state(STATE_SHIFT_DR);
937 // uint8_t data_0[4] = {0x9F, 0, 0,0};
939 // jtag_go_to_state(STATE_SHIFT_DR);
940 // jtag_tap_shift(data_0, data_0, 8*4, true);
942 //flash_release_reset();
953 // ---------------------------------------------------------
955 // ---------------------------------------------------------
957 fprintf(stderr
, "reset..\n");
965 fprintf(stderr
, "cdone: %s\n", get_cdone() ? "high" : "low");
968 // ---------------------------------------------------------
970 // ---------------------------------------------------------
972 fprintf(stderr
, "programming..\n");
974 static unsigned char buffer
[4096];
975 int rc
= fread(buffer
, 1, 4096, f
);
979 fprintf(stderr
, "sending %d bytes.\n", rc
);
980 mpsse_send_spi(buffer
, rc
);
983 mpsse_send_dummy_bytes(6);
984 mpsse_send_dummy_bit();
986 fprintf(stderr
, "cdone: %s\n", get_cdone() ? "high" : "low");
988 else /* program flash */
990 // ---------------------------------------------------------
992 // ---------------------------------------------------------
994 fprintf(stderr
, "reset..\n");
996 flash_chip_deselect();
999 fprintf(stderr
, "cdone: %s\n", get_cdone() ? "high" : "low");
1007 // ---------------------------------------------------------
1009 // ---------------------------------------------------------
1011 if (!read_mode
&& !check_mode
)
1013 if (disable_protect
)
1015 flash_write_enable();
1016 flash_disable_protection();
1023 flash_write_enable();
1029 fprintf(stderr
, "file size: %ld\n", file_size
);
1031 int block_size
= erase_block_size
<< 10;
1032 int block_mask
= block_size
- 1;
1033 int begin_addr
= rw_offset
& ~block_mask
;
1034 int end_addr
= (rw_offset
+ file_size
+ block_mask
) & ~block_mask
;
1036 for (int addr
= begin_addr
; addr
< end_addr
; addr
+= block_size
) {
1037 flash_write_enable();
1038 switch(erase_block_size
) {
1040 flash_4kB_sector_erase(addr
);
1043 flash_32kB_sector_erase(addr
);
1046 flash_64kB_sector_erase(addr
);
1050 fprintf(stderr
, "Status after block erase:\n");
1051 flash_read_status();
1060 fprintf(stderr
, "programming..\n");
1062 for (int rc
, addr
= 0; true; addr
+= rc
) {
1063 uint8_t buffer
[256];
1064 int page_size
= 256 - (rw_offset
+ addr
) % 256;
1065 rc
= fread(buffer
, 1, page_size
, f
);
1068 flash_write_enable();
1069 flash_prog(rw_offset
+ addr
, buffer
, rc
);
1073 /* seek to the beginning for second pass */
1074 fseek(f
, 0, SEEK_SET
);
1078 // ---------------------------------------------------------
1080 // ---------------------------------------------------------
1083 fprintf(stderr
, "reading..\n");
1084 for (int addr
= 0; addr
< read_size
; addr
+= 256) {
1085 uint8_t buffer
[256];
1086 flash_read(rw_offset
+ addr
, buffer
, 256);
1087 fwrite(buffer
, read_size
- addr
> 256 ? 256 : read_size
- addr
, 1, f
);
1089 } else if (!erase_mode
&& !disable_verify
) {
1090 fprintf(stderr
, "reading..\n");
1091 for (int addr
= 0; true; addr
+= 256) {
1092 uint8_t buffer_flash
[256], buffer_file
[256];
1093 int rc
= fread(buffer_file
, 1, 256, f
);
1096 flash_read(rw_offset
+ addr
, buffer_flash
, rc
);
1097 if (memcmp(buffer_file
, buffer_flash
, rc
)) {
1098 fprintf(stderr
, "Found difference between flash and file!\n");
1103 fprintf(stderr
, "VERIFY OK\n");
1107 // ---------------------------------------------------------
1109 // ---------------------------------------------------------
1111 //flash_power_down();
1118 if (f
!= NULL
&& f
!= stdin
&& f
!= stdout
)
1121 // ---------------------------------------------------------
1123 // ---------------------------------------------------------
1125 fprintf(stderr
, "Bye.\n");