mirror of https://github.com/YosysHQ/icestorm.git
Added more code comments.
Main point was to group the code into three logical segments: * MPSSE/FTDI defines and functions * FLASH defines and functions * iceprog implementation core While I was at it I also added a few comments for stuff that was not immediately obvious what it does.
This commit is contained in:
parent
7e732889f0
commit
96b1a90f28
|
|
@ -2,6 +2,7 @@
|
||||||
* iceprog -- simple programming tool for FTDI-based Lattice iCE programmers
|
* iceprog -- simple programming tool for FTDI-based Lattice iCE programmers
|
||||||
*
|
*
|
||||||
* Copyright (C) 2015 Clifford Wolf <clifford@clifford.at>
|
* Copyright (C) 2015 Clifford Wolf <clifford@clifford.at>
|
||||||
|
* Copyright (C) 2018 Piotr Esden-Tempski <piotr@esden.net>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
@ -19,7 +20,6 @@
|
||||||
* -------------------
|
* -------------------
|
||||||
* http://www.latticesemi.com/~/media/Documents/UserManuals/EI/icestickusermanual.pdf
|
* http://www.latticesemi.com/~/media/Documents/UserManuals/EI/icestickusermanual.pdf
|
||||||
* http://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_32mb_3v_65nm.pdf
|
* http://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_32mb_3v_65nm.pdf
|
||||||
* http://www.ftdichip.com/Support/Documents/AppNotes/AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
@ -36,6 +36,10 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// MPSSE / FTDI definitions
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
static struct ftdi_context ftdic;
|
static struct ftdi_context ftdic;
|
||||||
static bool ftdic_open = false;
|
static bool ftdic_open = false;
|
||||||
static bool verbose = false;
|
static bool verbose = false;
|
||||||
|
|
@ -76,6 +80,10 @@ enum mpsse_cmd
|
||||||
MC_CPU_WE = 0x93, /* CPUMode write extended address */
|
MC_CPU_WE = 0x93, /* CPUMode write extended address */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// FLASH definitions
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
/* Transfer Command bits */
|
/* Transfer Command bits */
|
||||||
|
|
||||||
/* All byte based commands consist of:
|
/* All byte based commands consist of:
|
||||||
|
|
@ -146,6 +154,7 @@ enum flash_cmd {
|
||||||
FC_GBL = 0x7E, /* Global Block Lock */
|
FC_GBL = 0x7E, /* Global Block Lock */
|
||||||
FC_GBU = 0x98, /* Global Block Unlock */
|
FC_GBU = 0x98, /* Global Block Unlock */
|
||||||
FC_RBL = 0x3D, /* Read Block Lock */
|
FC_RBL = 0x3D, /* Read Block Lock */
|
||||||
|
FC_RPR = 0x3C, /* Read Sector Protection Registers (adesto) */
|
||||||
FC_IBL = 0x36, /* Individual Block Lock */
|
FC_IBL = 0x36, /* Individual Block Lock */
|
||||||
FC_IBU = 0x39, /* Individual Block Unlock */
|
FC_IBU = 0x39, /* Individual Block Unlock */
|
||||||
FC_EPS = 0x75, /* Erase / Program Suspend */
|
FC_EPS = 0x75, /* Erase / Program Suspend */
|
||||||
|
|
@ -156,6 +165,10 @@ enum flash_cmd {
|
||||||
FC_RESET = 0x99, /* Reset Device */
|
FC_RESET = 0x99, /* Reset Device */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// MPSSE / FTDI function implementations
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
static void check_rx()
|
static void check_rx()
|
||||||
{
|
{
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
@ -270,6 +283,10 @@ static int get_cdone()
|
||||||
return (data & 0x40) != 0;
|
return (data & 0x40) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// FLASH function implementations
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
static void flash_read_id()
|
static void flash_read_id()
|
||||||
{
|
{
|
||||||
// fprintf(stderr, "read flash ID..\n");
|
// fprintf(stderr, "read flash ID..\n");
|
||||||
|
|
@ -399,7 +416,7 @@ static void flash_disable_protection()
|
||||||
{
|
{
|
||||||
fprintf(stderr, "disable flash protection...\n");
|
fprintf(stderr, "disable flash protection...\n");
|
||||||
|
|
||||||
//WRSR 0x00
|
//WRSR 0x00
|
||||||
uint8_t data[2] = { 0x01, 0x00 };
|
uint8_t data[2] = { 0x01, 0x00 };
|
||||||
set_gpio(0, 0);
|
set_gpio(0, 0);
|
||||||
xfer_spi(data, 2);
|
xfer_spi(data, 2);
|
||||||
|
|
@ -419,6 +436,9 @@ static void flash_disable_protection()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// iceprog implementation
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
static void help(const char *progname)
|
static void help(const char *progname)
|
||||||
{
|
{
|
||||||
|
|
@ -519,14 +539,15 @@ int main(int argc, char **argv)
|
||||||
{NULL, 0, NULL, 0}
|
{NULL, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Decode command line parameters */
|
||||||
int opt;
|
int opt;
|
||||||
char *endptr;
|
char *endptr;
|
||||||
while ((opt = getopt_long(argc, argv, "d:I:rR:e:o:cbnStvp", long_options, NULL)) != -1) {
|
while ((opt = getopt_long(argc, argv, "d:I:rR:e:o:cbnStvp", long_options, NULL)) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'd':
|
case 'd': /* device string */
|
||||||
devstr = optarg;
|
devstr = optarg;
|
||||||
break;
|
break;
|
||||||
case 'I':
|
case 'I': /* FTDI Chip interface select */
|
||||||
if (!strcmp(optarg, "A"))
|
if (!strcmp(optarg, "A"))
|
||||||
ifnum = INTERFACE_A;
|
ifnum = INTERFACE_A;
|
||||||
else if (!strcmp(optarg, "B"))
|
else if (!strcmp(optarg, "B"))
|
||||||
|
|
@ -540,10 +561,10 @@ int main(int argc, char **argv)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r': /* Read 256 bytes to file */
|
||||||
read_mode = true;
|
read_mode = true;
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R': /* Read n bytes to file */
|
||||||
read_mode = true;
|
read_mode = true;
|
||||||
read_size = strtol(optarg, &endptr, 0);
|
read_size = strtol(optarg, &endptr, 0);
|
||||||
if (*endptr == '\0')
|
if (*endptr == '\0')
|
||||||
|
|
@ -557,7 +578,7 @@ int main(int argc, char **argv)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e': /* Erase blocks as if we were writing n bytes */
|
||||||
erase_mode = true;
|
erase_mode = true;
|
||||||
erase_size = strtol(optarg, &endptr, 0);
|
erase_size = strtol(optarg, &endptr, 0);
|
||||||
if (*endptr == '\0')
|
if (*endptr == '\0')
|
||||||
|
|
@ -571,7 +592,7 @@ int main(int argc, char **argv)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o': /* set address offset */
|
||||||
rw_offset = strtol(optarg, &endptr, 0);
|
rw_offset = strtol(optarg, &endptr, 0);
|
||||||
if (*endptr == '\0')
|
if (*endptr == '\0')
|
||||||
/* ok */;
|
/* ok */;
|
||||||
|
|
@ -584,25 +605,25 @@ int main(int argc, char **argv)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c': /* do not write just check */
|
||||||
check_mode = true;
|
check_mode = true;
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b': /* bulk erase before writing */
|
||||||
bulk_erase = true;
|
bulk_erase = true;
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n': /* do not erase before writing */
|
||||||
dont_erase = true;
|
dont_erase = true;
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S': /* write to sram directly */
|
||||||
prog_sram = true;
|
prog_sram = true;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't': /* just read flash id */
|
||||||
test_mode = true;
|
test_mode = true;
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v': /* provide verbose output */
|
||||||
verbose = true;
|
verbose = true;
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p': /* disable flash protect before erase/write */
|
||||||
disable_protect = true;
|
disable_protect = true;
|
||||||
break;
|
break;
|
||||||
case -2:
|
case -2:
|
||||||
|
|
@ -615,6 +636,8 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make sure that the combination of provided parameters makes sense */
|
||||||
|
|
||||||
if (read_mode + erase_mode + check_mode + prog_sram + test_mode > 1) {
|
if (read_mode + erase_mode + check_mode + prog_sram + test_mode > 1) {
|
||||||
fprintf(stderr, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name);
|
fprintf(stderr, "%s: options `-r'/`-R', `-e`, `-c', `-S', and `-t' are mutually exclusive\n", my_name);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
@ -877,7 +900,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low");
|
fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low");
|
||||||
}
|
}
|
||||||
else
|
else /* program flash */
|
||||||
{
|
{
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
// Reset
|
// Reset
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue